Problem
The current Workbench exposes a large number of framework-oriented pages (Overview, Routes, MCP, Hooks, Playground, Artifacts, Comparisons, Evals, Logs, Hosts, etc.) and much of the useful application behavior is split across them.
That makes the dev experience feel like an administrative console for Agent Bundle internals rather than the dev server for the plugin being built.
For a meta-framework whose product intent is roughly "Next.js for agent-host plugins", the default development experience should answer four questions immediately:
- What surfaces does my plugin expose?
- What does this route actually render/return?
- What happens when Claude/Codex/Cursor invokes it?
- Which hooks/events/MCP calls fired, in what order, with what context/result?
Today the Routes page is primarily a table/catalog with source/config/input information. Tool routes can hand off to a separate MCP session, while non-tool routes often stop at validation. Hooks, MCP, logs, runtime/App preview, and host behavior live in separate top-level pages. That is technically powerful but cognitively fragmented.
Direction
Reframe Workbench as an application explorer + live host lab over the canonical Application IR / manifest from #592.
The primary UI should be centered around one navigable tree of the plugin's actual surfaces, not around Agent Bundle subsystems.
Illustrative shell:
┌─────────────────────────────────────────────────────────────────────────────┐
│ cargo-hauler build ✓ Claude ● Codex ○ │
├──────────────────────┬─────────────────────────────────────┬────────────────┤
│ APPLICATION │ ROUTE / SURFACE │ INSPECTOR │
│ │ │ │
│ MCP │ hauler_status │ Input │
│ Tools │ │ Context │
│ hauler_status ◀ │ [ rendered Agent document ] │ Trace │
│ hauler_request │ │ Projection │
│ hauler_result │ daemon running ... │ Raw MCP │
│ Resources │ ... │ Source │
│ Prompts │ │ │
│ Apps │ ─────────────────────────────────── │ │
│ dashboard │ Structured result │ │
│ │ { ... } │ │
│ Events / Hooks │ │ │
│ session/start │ [ Run ] [ Open in host ] │ │
│ tool/before │ │ │
│ tool/after │ │ │
│ stop │ │ │
│ │ │ │
│ CLI │ │ │
│ request │ │ │
│ status │ │ │
│ Scripts │ │ │
├──────────────────────┴─────────────────────────────────────┴────────────────┤
│ TRACE session/start → tool/before → tools/call hauler_status → tool/after │
└─────────────────────────────────────────────────────────────────────────────┘
The exact visual design is open. The information architecture is the important part.
1. One application navigation tree
Replace most top-level product navigation with a route/surface tree derived from the compiled application graph.
Suggested groups:
MCP
Tools
Resources
Prompts
Apps
Events / Hooks
session/start
agent/start
tool/before
tool/after
stop
...
CLI
Scripts
Skills
Rules / Commands
Each leaf is a first-class application surface.
Selecting a leaf opens the same central route workspace regardless of kind.
Do not make users think "Routes page vs MCP page vs Hooks page" to inspect one logical route.
Keep framework/admin views secondary
Artifacts, diagnostics, projection comparisons, eval management, raw logs, and build internals remain useful, but should move behind an Inspect, Build, or advanced/devtools area instead of defining the primary navigation.
2. Render the route as the primary result
For executable/rendered routes, the center pane should show what the plugin author actually created.
For a tool route:
Input controls
↓
Run
↓
Rendered Agent Document
Structured result
Metadata
Progress stream
The rendered Agent Document should be visually rendered, not primarily shown as JSON/protocol envelopes.
Allow tabs/toggles for:
- Rendered
- Structured result
- Raw AgentDocument
- MCP projection
- CLI projection, when available
But Rendered should be the default.
This is analogous to a web framework dev server showing the page before showing request headers or compiled chunks.
3. Every executable route should be directly runnable
The current Routes UX has a significant distinction where tools can open in MCP while other route kinds often provide validation only.
Workbench should have one invocation abstraction capable of running any route that Agent Bundle can execute safely in dev:
- MCP tools;
- prompts/resources where meaningful;
- CLI routes;
- scripts;
- semantic event routes/hooks;
- App/browser routes;
- future page routes.
For event routes, provide generated event-input forms plus host fixtures/presets:
Event: tool/before
Host fixture: Claude | Codex | Cursor | Canonical
Payload: {...}
[ Run event ]
Then render:
Canonical input
Observed request context
Providers
Returned decision / Agent document
Projected Claude hook result
Projected Codex result
Projected Cursor result
4. Treat MCP as a route projection, not a separate product page
The existing MCP tooling is extensive and should be reused, not discarded.
Move its useful pieces into contextual panes around MCP surfaces:
When selecting MCP > Tools > hauler_status:
- list schema/config;
- invoke it directly;
- render the result;
- show structuredContent/content/_meta;
- show MCP protocol trace;
- preview its bound MCP App;
- inspect/list related resources/prompts;
- optionally open the full raw MCP session inspector.
The standalone "MCP page" can survive as an advanced protocol session view, but normal tool development should not require navigating away from the route.
5. Treat hooks/events the same way
Hooks should appear beside tools in the application tree.
Selecting Events > tool/before should show:
- semantic event name;
- source;
- supported host projections/capabilities;
- canonical payload schema;
- host-specific input examples;
- Run button;
- rendered/context result;
- host-lowered hook response;
- recent live invocations of that hook.
The current separate Hooks area becomes a contextual event simulator/live history rather than a parallel navigation universe.
6. Add a unified live invocation trace
The most useful debugging surface is not a generic log stream. It is a correlated timeline of application activity.
For example:
22:41:04.101 Claude session started
22:41:04.118 event session/start
context.host = claude
result = continue + context
22:41:09.532 tool/before
tool = Bash
22:41:09.541 MCP tools/call hauler_status
input = {...}
provider haulerDaemon 3.2ms
render shell 8.1ms
render complete 14.7ms
22:41:09.558 tool/after
22:41:09.562 notice delivered
Each trace entry should be clickable and open the corresponding route with that invocation snapshot loaded.
Trace should correlate:
- host session / conversation;
- semantic event routes;
- MCP requests;
- route execution;
- providers;
- state/notices where relevant;
- render events/progress;
- projection/lowering;
- diagnostics/errors.
This should consume the same execution tracing from the one execution kernel described by #592 rather than adding Workbench-only instrumentation semantics.
7. Embedded real host sessions
Add an optional Hosts panel based on PTY + terminal rendering (for example xterm.js or equivalent) so developers can launch real Claude Code / Codex / other CLI hosts already attached to the dev plugin.
Illustrative layout:
Hosts
Claude ●
Codex ●
Cursor external
┌────────────────────────────────────────────┐
│ Claude │
│ > what cargo jobs are currently running? │
│ │
│ ... │
└────────────────────────────────────────────┘
Workbench/server responsibilities:
- allocate PTY;
- launch the real host process with the dev plugin already installed/attached through the existing stable dev proxy/epoch mechanism;
- stream PTY bytes to the browser terminal;
- resize terminal;
- terminate/restart explicitly;
- correlate the host process/session with the unified invocation trace.
The browser terminal should be a view onto a real local process, not a simulated chat UI.
Security / authority
This is explicitly developer-local functionality.
- no arbitrary remote PTY exposure;
- bind through the existing authenticated foreground dev server;
- explicit host launch action;
- project-root/workspace authority is visible;
- preserve host's own permission/consent behavior rather than bypassing it;
- terminal and route invocation share trace IDs but not hidden credentials/content beyond what the host actually emits.
8. "Open in host" from any relevant route
For a route, provide:
Run directly
Open in Claude
Open in Codex
Open in host should focus/start that host terminal and seed an appropriate developer prompt or invocation context where feasible.
For example a tool could seed:
Call the cargo-hauler hauler_status tool and explain the result.
The important point is not prompt generation. It is making the loop:
route source -> direct run -> real host run -> hook/MCP trace
one click apart.
9. Bound MCP Apps/browser previews to their routes
If a tool has _meta.ui.resourceUri -> dashboard, its App preview should appear directly in the selected tool's workspace.
Likewise selecting the App itself should show:
- actual browser view;
- bound tools;
- live client calls in the same trace;
- structured route data;
- host profile selector where MCP App hosts differ.
Do not require the user to mentally join Routes, MCP, and an App preview page.
This aligns with #564/#594.
10. Make the route URL-addressable
Workbench navigation should map naturally to URLs such as:
/routes/mcp/hauler/tool/hauler_status
/routes/events/tool/before
/routes/cli/status
/routes/apps/hauler/dashboard
/hosts/claude
/trace/<invocation-id>
Exact paths are non-normative.
Benefits:
- refresh preserves context;
- links in diagnostics jump directly to the route;
- trace entries deep-link;
- browser history works;
- tests can address a route deterministically.
11. Simplify the default nav aggressively
Target primary nav should be closer to:
Application
Host sessions
Trace
Diagnostics
with Application expanded into the route tree.
Advanced secondary surfaces can include:
Build / artifact
Projection comparison
Evals
Raw logs
Framework internals
A plugin author should not need to know which internal Workbench subsystem owns a capability.
12. Reuse current Workbench machinery
This is primarily an information-architecture consolidation, not a request to throw away existing implementation.
Existing useful systems include:
- compiled route catalog and generated schema editor;
- MCP session controller;
- MCP App renderer/preview;
- runtime bridge/trace;
- hook simulator/client;
- playground/script execution;
- live host dev proxy/adoption;
- diagnostics/log clients;
- artifact/projection inspection.
The problem is that these currently present as separate products.
Refactor them behind one route-centric shell.
Relationship to #592
This should be the Workbench manifestation of #592.
If #592 says:
one application graph, one execution kernel, many projections
then Workbench should visually present exactly that:
one application tree
↓
one selected route
↓
run/render
↓
inspect projections + live host executions
Workbench must consume the canonical Application IR/manifest and execution trace rather than maintaining independent MCP/hook/playground catalogs where that can be avoided.
Non-goals
- building a fake Claude/Codex chat clone;
- replacing the actual host UIs;
- making PTY hosting part of production plugin artifacts;
- exposing arbitrary system terminals remotely;
- turning Agent Bundle into an IDE/code editor;
- hiding raw MCP/hook protocol data from advanced users.
Acceptance criteria
Related: #592, #564, #594, #595, #596.
Problem
The current Workbench exposes a large number of framework-oriented pages (
Overview,Routes,MCP,Hooks,Playground,Artifacts,Comparisons,Evals,Logs,Hosts, etc.) and much of the useful application behavior is split across them.That makes the dev experience feel like an administrative console for Agent Bundle internals rather than the dev server for the plugin being built.
For a meta-framework whose product intent is roughly "Next.js for agent-host plugins", the default development experience should answer four questions immediately:
Today the
Routespage is primarily a table/catalog with source/config/input information. Tool routes can hand off to a separate MCP session, while non-tool routes often stop at validation. Hooks, MCP, logs, runtime/App preview, and host behavior live in separate top-level pages. That is technically powerful but cognitively fragmented.Direction
Reframe Workbench as an application explorer + live host lab over the canonical Application IR / manifest from #592.
The primary UI should be centered around one navigable tree of the plugin's actual surfaces, not around Agent Bundle subsystems.
Illustrative shell:
The exact visual design is open. The information architecture is the important part.
1. One application navigation tree
Replace most top-level product navigation with a route/surface tree derived from the compiled application graph.
Suggested groups:
Each leaf is a first-class application surface.
Selecting a leaf opens the same central route workspace regardless of kind.
Do not make users think "Routes page vs MCP page vs Hooks page" to inspect one logical route.
Keep framework/admin views secondary
Artifacts, diagnostics, projection comparisons, eval management, raw logs, and build internals remain useful, but should move behind an
Inspect,Build, or advanced/devtools area instead of defining the primary navigation.2. Render the route as the primary result
For executable/rendered routes, the center pane should show what the plugin author actually created.
For a tool route:
The rendered Agent Document should be visually rendered, not primarily shown as JSON/protocol envelopes.
Allow tabs/toggles for:
But
Renderedshould be the default.This is analogous to a web framework dev server showing the page before showing request headers or compiled chunks.
3. Every executable route should be directly runnable
The current Routes UX has a significant distinction where tools can open in MCP while other route kinds often provide validation only.
Workbench should have one invocation abstraction capable of running any route that Agent Bundle can execute safely in dev:
For event routes, provide generated event-input forms plus host fixtures/presets:
Then render:
4. Treat MCP as a route projection, not a separate product page
The existing MCP tooling is extensive and should be reused, not discarded.
Move its useful pieces into contextual panes around MCP surfaces:
When selecting
MCP > Tools > hauler_status:The standalone "MCP page" can survive as an advanced protocol session view, but normal tool development should not require navigating away from the route.
5. Treat hooks/events the same way
Hooks should appear beside tools in the application tree.
Selecting
Events > tool/beforeshould show:The current separate Hooks area becomes a contextual event simulator/live history rather than a parallel navigation universe.
6. Add a unified live invocation trace
The most useful debugging surface is not a generic log stream. It is a correlated timeline of application activity.
For example:
Each trace entry should be clickable and open the corresponding route with that invocation snapshot loaded.
Trace should correlate:
This should consume the same execution tracing from the one execution kernel described by #592 rather than adding Workbench-only instrumentation semantics.
7. Embedded real host sessions
Add an optional Hosts panel based on PTY + terminal rendering (for example xterm.js or equivalent) so developers can launch real Claude Code / Codex / other CLI hosts already attached to the dev plugin.
Illustrative layout:
Workbench/server responsibilities:
The browser terminal should be a view onto a real local process, not a simulated chat UI.
Security / authority
This is explicitly developer-local functionality.
8. "Open in host" from any relevant route
For a route, provide:
Open in hostshould focus/start that host terminal and seed an appropriate developer prompt or invocation context where feasible.For example a tool could seed:
The important point is not prompt generation. It is making the loop:
one click apart.
9. Bound MCP Apps/browser previews to their routes
If a tool has
_meta.ui.resourceUri -> dashboard, its App preview should appear directly in the selected tool's workspace.Likewise selecting the App itself should show:
Do not require the user to mentally join
Routes,MCP, and an App preview page.This aligns with #564/#594.
10. Make the route URL-addressable
Workbench navigation should map naturally to URLs such as:
Exact paths are non-normative.
Benefits:
11. Simplify the default nav aggressively
Target primary nav should be closer to:
with
Applicationexpanded into the route tree.Advanced secondary surfaces can include:
A plugin author should not need to know which internal Workbench subsystem owns a capability.
12. Reuse current Workbench machinery
This is primarily an information-architecture consolidation, not a request to throw away existing implementation.
Existing useful systems include:
The problem is that these currently present as separate products.
Refactor them behind one route-centric shell.
Relationship to #592
This should be the Workbench manifestation of #592.
If #592 says:
then Workbench should visually present exactly that:
Workbench must consume the canonical Application IR/manifest and execution trace rather than maintaining independent MCP/hook/playground catalogs where that can be avoided.
Non-goals
Acceptance criteria
Related: #592, #564, #594, #595, #596.