Skip to content

The consoles on Loom and Graphite, artifacts, providers and engines, chat context - #62

Open
Zarathos94 wants to merge 17 commits into
mainfrom
feat/themes-artifacts
Open

Zarathos94 wants to merge 17 commits into
mainfrom
feat/themes-artifacts

Conversation

@Zarathos94

@Zarathos94 Zarathos94 commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #61 (feat/project-modes), which is stacked on #60 (feat/weft). Merge bottom-up.

The look: Loom and Graphite, on the web and the desktop

  • apz-theme (skins, palettes, backgrounds, VS Code theme import) and the shared tokens; the old look and its CSS are gone.
  • Web: the prototype shell (sidebar, top bar, Settings frame, Ctrl K palette, live pill), the kit (ui/components.ts) and every screen ported to the prototype markup.
  • Desktop: the kit (console/ui.rs: cards, chips, buttons, tabs, inputs, dialogs via ui::modal), the shell and every screen redrawn to match the web, with capture hooks (APZ_WIZARD, APZ_ARTIFACT, APZ_ONBOARD=<step> …).
  • One backdrop shader (backdrop.wgsl, CPU twin for WebGL2): drifting fields, Loom dots, Graphite grid, grain.

Artifacts and sharing

  • apz-view bodies (charts, tiles, tables, graphs, datasets, code, HTML), shares through the hub and agentplaza.io/artifact/{id}.
  • HTML artifacts run in an opaque-origin sandbox served from the hub's content origin; the console page now allows that origin as a frame source.

Providers & models

  • API provider instances: label, accent, enable/disable (a disabled one takes no calls), several of one kind.
  • Coding engines as instances (/v1/engines): the built-in ones, ACP registry agents (/v1/acp/registry) and local ACP commands. Versions are pinned when saved (npm integrity, PyPI or archive sha256); Update all runs a dry run first. The VM honours the launch spec the hub sends with each code_engine call (ToolDecision.engine).
  • Background health checks every health_interval_s (0 turns them off), published as providers.health / engines.health.
  • Usage providers: CLIProxyAPI hubs (the management key stays in the vault).
  • No key ever enters an engine: engines reach models only through the gateway; subscription accounts come in through a CLIProxyAPI hub added as a provider.
  • Web, desktop and TUI: the Providers screen (list and detail, Add provider in three steps, the model picker with favourites); CLI agentplaza models ….

Chats

  • Every chat picks its model and effort (agent chats: the agent's model; owner conversations: their own model; one message: model on the chat call).
  • A context bar per chat: used against the window, split by context part, with the work item's tool calls (GET /v1/agents/{cid}/context, GET /v1/owner/conversations/{id}/context, live through the context event). Web, desktop and TUI.

The README and the terminal UI

  • README: a hero and six feature cards (animated SVG, light and dark), and "See it run": the desktop app recorded (the orchestrator chat with its effort and context breakdown, Machines in 3D, Models) and agentplaza tui recorded as animated SVG (a tour, a message to the orchestrator streaming its answer, Models with a favourite). scripts/readme/ makes all of it.
  • The terminal UI redesigned: the Loom palette (truecolour, 16 colours, NO_COLOR) and an animation clock; a header with a live dot and spinners, a tab bar that keeps the active tab in view, a status line with a mode chip and hints that fit, toasts; rounded panels, status dots and selected rows on every screen, stat tiles on the overview; chat with role gutters, tool lines, a streaming cursor and a thinking shimmer; a context bar that warns over 80% and 92%; a Ctrl+K command palette; the welcome and the tour as animated cards.
  • APZ_TUI_RECORD=<script.json> records the TUI as an animated SVG; the desktop app's APZ_RECORDING hides the software-rendering banner on virtual displays.

Checks run locally

  • cargo fmt --all -- --check, cargo clippy --workspace --all-targets --locked -D warnings, cargo test --workspace (all pass), web tsc, node test/run.mjs, the web build; the staged set verified in a clean worktree.
  • Screens compared with the prototype and the web side by side (headless captures, desktop snapshots).
  • The README rendered through GitHub's Markdown API and checked in Chromium; every TUI recording checked frame by frame; cargo test -p agentplaza-cli (408) and clippy in a clean worktree.

🤖 Generated with Claude Code

Zarathos94 and others added 4 commits October 20, 2026 00:01
…gine

On a Mac the hub's own machine has not reported its facts, so GET /v1/fleet
sends null for its kind, arch, OS, backend, CPU and sizes. The engine read
those fields as plain strings and numbers, refused the whole fleet ("invalid
type: null, expected a string"), and the Machines view fell back to "3D needs
WebGPU or WebGL2" in a browser that has both; the desktop's 3D had no fleet
either, as it reads the same types.

- apz-engine: every fleet field reads null as its default.
- Web: a feed the engine refuses is logged and skipped (the engine keeps the
  last one); a start that fails for another reason than a missing adapter
  says that reason instead of blaming the browser.
- Web: a WebGPU that is there but does not start (its device or surface
  fails) is retried on WebGL2, on a fresh canvas in the old one's place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng, files

- Modes: a project is in build (the default) or maintenance, one table
  (projects::MODES). POST /v1/projects/{id}/mode; back in build a delivered
  project reopens at implementation. A delivered project in maintenance stays
  worked: its members, its budget and the owner's picks as tasks.
- Maintenance (maintenance.rs): a project's signals (the owner's, a public
  ingest address whose token is kept as its hash, and agents' digests of the
  project's connectors and MCP servers), the map of the product, and the
  proposals: what would change, who it touches, risk, value 1-5 and why,
  size, evidence and acceptance; instruments when data is missing. Sweeps run
  on a schedule, on entering maintenance, or when the owner asks, by the
  project's agents in turn, with the focus, the new signals, the map, the
  waiting proposals and the declines' reasons. The owner's Do it posts a task
  of the project; Later and No (with a reason) are the others. Agents cannot
  post tasks to a project in maintenance (law T-024).
- Environments (environments.rs): kinds, tracks (main, releases, by hand),
  variables, secrets in the vault (project:<id>.<env>), deploys through a
  deploy hook; tracked ones deploy after a landing or a signed release; a
  protected one waits for the owner as a `deploy` approval. plaza_deploy for
  the delivery roles (law T-025).
- Adopting a project that exists (adopt.rs): from a granted platform
  repository, a public git URL, a folder on the hub, or nothing yet; opened
  delivered and in maintenance by default, with its environments.
- Files: uploads into Weft by hash and one owner change for many files
  (project_files.rs); the owner's attachments on chats, conversations and
  steers, readable by the agent the message goes to.
- The vault takes project:<id>.<env> bindings. OpenAPI blessed again.
- Tested end to end on a scratch hub with Weft (tests/maintenance.rs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…adopting, dropped files

Web:
- A Mode button on the project page; a Maintenance tab: what waits for the
  owner, the product map as an animated graph (areas by health, their links,
  the waiting proposals beside their area), an area or proposal opened beside
  it, the proposals ranked with Do it, Later and No, the inbox, the ingest
  address, what the watchers read; Expert for every field and the decisions.
- An Environments tab: each environment with what it runs and what was
  deployed, deploy, edit, secrets and the deploy hook.
- The New project dialog brings in a project that exists (a platform's
  repository, a git address, a folder on the hub, or files), and takes files
  for a new project; a project's Add files card takes dropped or picked files
  and folders (ui/file-drop.ts).
- The chat composers (IDE chat, conversations, agent page, overview) take
  dropped, pasted or picked attachments.

Desktop: the same tabs and Mode chooser, the adopt form, Add files (picker
and window drops), and attachments in the IDE composers.

CLI: agentplaza projects mode|modes|adopt|maintenance|env|upload, and
chat --attach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/guide/projects-after-launch.md (modes, maintenance, environments,
bringing a project in, files and attachments), the architecture's rows, a
README bullet, and api-tests/bruno/projects-life.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zarathos94 and others added 3 commits October 20, 2026 00:06
… on the web

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, chat context

The web console and the desktop app now draw every screen in the Loom/Graphite look (the shell, the kit, the
screens, dialogs and the shader backdrop), 1:1 between the two. HTML artifacts run in their sandboxed frame from
the hub content origin (the console page now allows it as a frame source).

Providers and models: API provider instances gain a label, an accent and an on/off switch; coding engines are
instances too (the built-in ones, ACP registry agents and local ACP commands), each version pinned to its npm
integrity, PyPI or archive sha256 when saved, with Update all as a dry run first. The hub checks every provider
and engine in the background (health_interval_s) and publishes the results. Usage providers read a CLIProxyAPI
hub (its management key stays in the vault); favourites go first in the model pickers. No key ever enters an
engine: engines run in agent VMs and reach models only through the gateway, and the VM honours the pinned
launch spec the hub sends with each code_engine call.

Chats choose their model and effort, and show a context bar: the latest call against the model window, split by
context part, with the tool calls of the work item (GET /v1/agents/{cid}/context and the owner-conversation
variant; a context event keeps the bars live). Web, desktop and the TUI draw the same.

The Claude engines use the Claude mark. Docs: providers guide, themes, artifacts, parity, the OpenAPI spec,
README screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
README: a hero and six feature cards (animated SVG, light and dark), a "See it run" section with the
desktop app recorded (the orchestrator chat, Machines in 3D, Models) and `agentplaza tui` recorded as
animated SVG (a tour, a message to the orchestrator streaming its answer, Models with a favourite). scripts/readme/ makes all of it: gen-art.mjs (the art), desktop-rec.py (the desktop app
on a private Xvfb display), tui-*.json with the TUI recorder, tui-font.py (embeds a Plex Mono subset).

The terminal UI: a Loom palette (truecolour, 16 colours, NO_COLOR) and an animation clock; a branded
header with a live dot and spinners, a tab bar that keeps the active tab in view, a status line with a
mode chip and hints that fit, toasts; rounded panels, status dots and selected rows on every screen,
stat tiles on the overview, which now polls the approvals; chat with role gutters, tool lines, a
streaming cursor and a thinking shimmer; a context bar in eighth blocks that warns over 80% and 92%;
providers grouped into API and engines; a Ctrl+K command palette; the welcome and the tour as
animated cards.

APZ_TUI_RECORD=<script.json> records the TUI as an animated SVG, with box drawing as geometry. In the
desktop app, APZ_RECORDING hides the software-rendering banner on virtual displays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Zarathos94
Zarathos94 force-pushed the feat/themes-artifacts branch from 05eebb4 to 2c0ac04 Compare October 19, 2026 22:10
Base automatically changed from feat/project-modes to main October 20, 2026 08:52
…s-artifacts

# Conflicts:
#	apps/desktop/src/console/new_project.rs
#	apps/desktop/src/console/screens/ide_chat.rs
#	apps/desktop/src/console/screens/ide_conversation.rs
#	apps/desktop/src/console/screens/ide_panels.rs
#	apps/desktop/src/console/screens/project_environments.rs
#	apps/desktop/src/console/screens/project_maintenance.rs
#	apps/desktop/src/console/screens/projects.rs
#	apps/web/src/store.ts
#	apps/web/src/styles/file-drop.css
#	apps/web/src/styles/ide-chat.css
#	apps/web/src/styles/ide-conversation.css
#	apps/web/src/styles/projects.css
#	apps/web/src/ui/new-project.ts
#	apps/web/src/views/agent-detail.ts
#	apps/web/src/views/ide-chat.ts
#	apps/web/src/views/ide-conversation.ts
#	apps/web/src/views/overview.ts
#	apps/web/src/views/project-environments.ts
#	apps/web/src/views/project-maintenance.ts
#	apps/web/src/views/projects.ts
#	apps/web/test/environments-tests.ts
#	apps/web/test/tests.ts
#	crates/apid/src/agents.rs
#	crates/apid/src/approvals.rs
#	crates/apid/src/main.rs
#	crates/apid/src/tools.rs
#	crates/jhrl/specs/laws/tools.jhrl
@Zarathos94
Zarathos94 marked this pull request as ready for review October 20, 2026 08:54
@Zarathos94
Zarathos94 marked this pull request as draft October 20, 2026 08:55
@Zarathos94
Zarathos94 marked this pull request as ready for review October 20, 2026 08:55
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Tests: failed

Where Result Passed Failed Time
Linux arm64 passed 669 0 10 s
Linux x86_64 failed 4000 1 153 s
macOS Intel passed 3453 0 79 s
macOS Apple Silicon: build only (cannot run here) passed
Windows arm64: build only (cannot run here) passed
Windows x64 failed 3492 1 176 s

Failures

Linux x86_64: `apid::weft_review a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph`
apid: Weft started a new store in /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/state/weft (owner key /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/xdg-config/agentplaza/owner.key)
weft: serving on 127.0.0.1:38593
apid: Weft serves on 127.0.0.1:38593 (process)
timing op=sleep id=305 total_ms=0.4
timing op=sleep id=306 total_ms=0.4
timing op=sleep id=307 total_ms=0.4

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

running 1 test
w-1 at root: 0 files in /tmp/apid-weft-review-5822-1792496973734381702/vms/vm300/pr1-queues
w-1.d1: 1 files from the base
w-1.d2: 2 files from the base
w-1.d3: 2 files from the base
test a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph has been running for over 60 seconds
test a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph ... FAILED

failures:

failures:
    a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 144.86s



thread 'a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph' (5823) panicked at crates/apid/tests/weft_review.rs:204:9:
the review did not finish
apid: owner token created: /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/state/owner-token (use it with `agentplaza hub login`)
db: no APZ_DATABASE_URL; components stay in their files; transcripts, infractions and the IDE audit go to files under the state dir
vault: initialised with a key file at /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/config/vault.key
apid: listening on http://127.0.0.1:36489
apid: Weft started a new store in /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/state/weft (owner key /tmp/apid-weft-review-5822-1792496973734381702/attempt-1/xdg-config/agentplaza/owner.key)
weft: serving on 127.0.0.1:38593
apid: Weft serves on 127.0.0.1:38593 (process)
timing op=sleep id=305 total_ms=0.4
timing op=sleep id=306 total_ms=0.4
timing op=sleep id=307 total_ms=0.4

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Windows x64: `apid::weft_review a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph`
apid: Weft started a new store in C:\Users\actions\AppData\Local\Temp\apid-weft-review-1700-1792496769136514700\attempt-1\state\weft (owner key C:\Users\actions\AppData\Local\AgentPlaza\config\owner.key)
weft: serving on 127.0.0.1:60018
apid: Weft serves on 127.0.0.1:60018 (process)
timing op=sleep id=305 total_ms=0.7
timing op=sleep id=307 total_ms=2.6
timing op=sleep id=306 total_ms=4.2

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

running 1 test
w-1 at root: 0 files in \\?\C:\Users\actions\AppData\Local\Temp\apid-weft-review-1700-1792496769136514700\vms\vm300\pr1-queues
w-1.d1: 1 files from the base
w-1.d2: 2 files from the base
w-1.d3: 2 files from the base
test a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph has been running for over 60 seconds
test a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph ... FAILED

failures:

failures:
    a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 111.21s



thread 'a_code_task_and_a_research_brief_go_from_claim_to_landed_through_the_review_graph' (3656) panicked at crates\apid\tests\weft_review.rs:204:9:
the review did not finish
apid: owner token created: C:\Users\actions\AppData\Local\Temp\apid-weft-review-1700-1792496769136514700\attempt-1\state\owner-token (use it with `agentplaza hub login`)
db: no APZ_DATABASE_URL; components stay in their files; transcripts, infractions and the IDE audit go to files under the state dir
vault: initialised with a key file at C:\Users\actions\AppData\Local\Temp\apid-weft-review-1700-1792496769136514700\attempt-1\config\vault.key
apid: listening on http://127.0.0.1:59957
apid: Weft started a new store in C:\Users\actions\AppData\Local\Temp\apid-weft-review-1700-1792496769136514700\attempt-1\state\weft (owner key C:\Users\actions\AppData\Local\AgentPlaza\config\owner.key)
weft: serving on 127.0.0.1:60018
apid: Weft serves on 127.0.0.1:60018 (process)
timing op=sleep id=305 total_ms=0.7
timing op=sleep id=307 total_ms=2.6
timing op=sleep id=306 total_ms=4.2

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Commit 8a0d9fa · the run

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Lint: passed

Check Result
rustfmt passed
clippy (warnings fail) passed
cargo deny (advisories, licences, sources) passed
migrations (applied ones unchanged, new ones in order) passed

Commit 8a0d9fa · the run

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Web console: passed

Check Result
type-check passed
build (with the wasm engine) passed
tests passed

Commit 8a0d9fa · the run

Zarathos94 and others added 5 commits October 20, 2026 11:44
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…for CRLF and the port error

- Archiving a project withdrew only its open tasks. A task an agent was working on is still claimed right after
  its agents are released (its work is only cancelled), so its escrow stayed out of both the project's budget and
  the plaza's. It is withdrawn too now; the agent's late answer finds the task ended, which settle_task ignores.
- apz-theme's generated-file check compares content: a Windows checkout holds the JSON with CRLF endings.
- owner_token_log retries when Windows says a port is taken ("os error 10048"), as it does for "in use".
- The drafts test prints the hub's log when the spawned agent does not claim its task in time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erde_json preserve_order) writes the same file

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hub's naming ask is not queued ahead of it

On a slow runner the hub asks an unnamed agent for its name (two seconds after it connects) before the work a
test waits for, and a fake agent never answers: Windows saw the maintenance builder hold only that ask.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 10 s for a first Weft parse

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Hub API (Bruno): passed

244/244 API requests pass · 158/575 operations tested · 17 fuzzing findings (reported, they do not fail the pull request)

The report

Commit 8a0d9fa · the run

Zarathos94 and others added 4 commits October 20, 2026 12:58
When a step's work item ends without a verdict the hub gives the step a new work item; the old one has no step and review_tree says so. On a slow Windows runner that happened while the test still held the old item.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…xport count

The export records where it began (the imported commit) before it pushes, so the count reaches 1 while the push is still going; a busy runner read the remote first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Patch releases of the wasmtime family that Weft's language packs run on: a panic lowering a host-created component stream, and a Cranelift aarch64 br_table miscompile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he maintenance chat waits 15 s

Each apid integration test starts a hub, Weft and fake daemons and plays several agents through a flow; on a runner busy with 4000 tests, weft_review ran past the 2-minute kill and a chat took over 5 s to reach the builder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant