cargo-hauler 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +20 -12
  3. package/dist/.claude-plugin/marketplace.json +1 -1
  4. package/dist/.claude-plugin/plugin.json +1 -1
  5. package/dist/.codex-plugin/plugin.json +1 -1
  6. package/dist/.cursor-plugin/plugin.json +1 -1
  7. package/dist/INSTALL.md +1 -1
  8. package/dist/README.md +20 -12
  9. package/dist/agent-bundle.compile-evidence.json +1 -1
  10. package/dist/agent-bundle.manifest.json +1 -1
  11. package/dist/agent-bundle.package-compile-evidence.json +1 -1
  12. package/dist/bin/cargo-hauler-flight.mjs +98 -882
  13. package/dist/bin/cargo-hauler.mjs +71 -668
  14. package/dist/bin/hauler.js +15 -15
  15. package/dist/hooks/event-route-session-start.claude.mjs +2 -2
  16. package/dist/hooks/event-route-session-start.codex.mjs +2 -2
  17. package/dist/hooks/event-route-session-start.cursor.mjs +2 -2
  18. package/dist/hooks/event-route-stop.claude.mjs +2 -2
  19. package/dist/hooks/event-route-stop.codex.mjs +2 -2
  20. package/dist/hooks/event-route-stop.cursor.mjs +2 -2
  21. package/dist/hooks/event-route-tool-after.claude.execute.mjs +2 -2
  22. package/dist/hooks/event-route-tool-after.claude.mjs +6 -6
  23. package/dist/hooks/event-route-tool-after.codex.execute.mjs +2 -2
  24. package/dist/hooks/event-route-tool-after.codex.mjs +6 -6
  25. package/dist/hooks/event-route-tool-after.cursor.execute.mjs +2 -2
  26. package/dist/hooks/event-route-tool-after.cursor.mjs +6 -6
  27. package/dist/hooks/event-route-tool-before.claude.execute.mjs +2 -2
  28. package/dist/hooks/event-route-tool-before.codex.execute.mjs +2 -2
  29. package/dist/hooks/event-route-tool-before.cursor.execute.mjs +2 -2
  30. package/dist/hooks/hooks-flight.mjs +19 -19
  31. package/dist/install.mjs +1 -1
  32. package/dist/mcp/mcp-hauler-2b8242f9-flight.mjs +372 -291
  33. package/dist/mcp/mcp-hauler-2b8242f9.mjs +148 -71
  34. package/dist/mcp-apps/dashboard.html +7 -7
  35. package/dist/package.json +1 -1
  36. package/dist/plugin.json +1 -1
  37. package/dist/scripts/hauler.mjs +15 -15
  38. package/dist/skills/hauler-dashboard/SKILL.md +2 -2
  39. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 970dbde: New `hauler_dashboard` MCP tool carries the dashboard App
8
+ (`ui://cargo-hauler/dashboard.html`): hosts that render MCP Apps open the
9
+ dashboard beside its result, populated from the same status payload the App
10
+ then polls through `hauler_status`. Its text result is one summary line plus
11
+ where the App and the text form are, so opening the dashboard never pastes the
12
+ status document into the model's context. `hauler_status` no longer advertises
13
+ the App and returns the queue, lanes, and tickets as text for the model, as
14
+ before. `hauler web` opens the App through `hauler_dashboard`. The
15
+ `hauler-dashboard` skill and the status document's dashboard line name the new
16
+ tool.
17
+
3
18
  ## 0.7.4
4
19
 
5
20
  ### Patch Changes
package/README.md CHANGED
@@ -59,10 +59,11 @@ hauler install-shim # optional: cargo from script
59
59
  ```
60
60
 
61
61
  Restart the host (or reload the window) so new sessions load the hooks. The
62
- daemon starts on demand with the first brokered request; `hauler status` shows
63
- what is running, and the `hauler_status` tool opens the dashboard in hosts that
64
- render MCP Apps. Prefer the hosts' own plugin commands, or building from a
65
- checkout? See [Install](#install).
62
+ daemon starts on demand with the first brokered request; `hauler status` and
63
+ the `hauler_status` tool show what is running as text, and the
64
+ `hauler_dashboard` tool opens the dashboard in hosts that render MCP Apps.
65
+ Prefer the hosts' own plugin commands, or building from a checkout? See
66
+ [Install](#install).
66
67
 
67
68
  The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
68
69
  `scripts/hauler.mjs` or any path under `.claude/plugins/cache`,
@@ -87,11 +88,14 @@ The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
87
88
  | `hauler request [--session ID] [--host HOST] [--cwd DIR] [--after TICKET …] -- <cargo …>` | Submit a background request and return its ticket, with where it landed in its lane (`queued behind cc-3281 (~13m)`, `waiting for cc-3281`, or `attached to cc-3281`). `--cwd` overrides the current CLI workspace; `--after` works as for `exec`. |
88
89
  | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.6.0) → pid 742001 (0.6.1)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older daemon serves them directly. Submission commands replace an older daemon only after an idle status check; daemons from 0.7.4 onward hold admission closed while confirming that state, while 0.7.1–0.7.3 receive a client preflight. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.7.1 will be replaced by 0.7.3 when idle`. A truly incompatible daemon is reported with its pid and version instead of having its payload parsed. |
89
90
  | `hauler install-shim [--dir DIR] [--real-cargo PATH] [--force]` | Install the optional PATH shim. |
90
- | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_status`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_status` instead. |
91
+ | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_dashboard`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_dashboard` instead. |
91
92
 
92
93
  The `hauler` MCP server projects the same operations as `hauler_status`,
93
94
  `hauler_log`, `hauler_last`, `hauler_await`, `hauler_result`, `hauler_kill`,
94
- and `hauler_request`, with the same filters as the CLI. `hauler_status` and
95
+ and `hauler_request`, with the same filters as the CLI, plus
96
+ `hauler_dashboard`, which carries the MCP App (below) and answers with one
97
+ summary line so opening the dashboard never pastes the status text into the
98
+ model's context. `hauler_status` and
95
99
  `hauler_log` rows are the same bounded summaries (`outputPreview`, never a
96
100
  tail); `hauler_result`, `hauler_await`, and `hauler_last` carry the whole
97
101
  tail. `hauler_request.cwd` is an optional override: Agent Bundle's authoritative
@@ -102,7 +106,8 @@ workspace.
102
106
  ## Dashboard
103
107
 
104
108
  The dashboard is an MCP App (`ui://cargo-hauler/dashboard.html`) attached to
105
- `hauler_status`. It shows contention and admission, in-flight and queued work
109
+ `hauler_dashboard`; `hauler_status` is the same data as text for the model and
110
+ never opens it. It shows contention and admission, in-flight and queued work
106
111
  — each running row with the last line of its output preview, each ticket's
107
112
  drawer with the whole tail fetched through `hauler_result` — metrics over
108
113
  one-hour, 24-hour, and all-time windows, per-command timings, optional kache
@@ -783,7 +788,7 @@ src/
783
788
  layout.tsx the hauler shell around every rendered route
784
789
  providers/hauler-daemon.ts request-scoped daemon configuration
785
790
  components/ typed components over pure view-models
786
- mcp/hauler/tools/*.tsx hauler_status, _log, _last, _await, _result, _request, _kill
791
+ mcp/hauler/tools/*.tsx hauler_status, _dashboard, _log, _last, _await, _result, _request, _kill
787
792
  mcp/hauler/tools/*.cli.ts each tool's `hauler <command>` projection (flags, positionals)
788
793
  mcp/hauler/apps/dashboard.tsx the MCP App (ui://cargo-hauler/dashboard.html)
789
794
  cli/daemon.ts the one plain CLI command
@@ -898,7 +903,8 @@ the same filter as its `session` field). Results carry
898
903
 
899
904
  | Route | Surface | Document |
900
905
  | --- | --- | --- |
901
- | `tool:hauler/hauler_status` (`hauler status`) | queue, lanes, admission, kache, filters; bounded summary rows (`StatusRow`): `outputPreview` on running rows, never a tail | `StatusDocument`; the tool advertises the dashboard App |
906
+ | `tool:hauler/hauler_status` (`hauler status`) | queue, lanes, admission, kache, filters; bounded summary rows (`StatusRow`): `outputPreview` on running rows, never a tail | `StatusDocument`, text for the model |
907
+ | `tool:hauler/hauler_dashboard` (`hauler web`) | the same `StatusResult`, `limit` only; the tool advertises the dashboard App (`_meta.ui.resourceUri`) so hosts open it beside the result | `DashboardDocument`: one summary line plus where the App and the text form are |
902
908
  | `tool:hauler/hauler_log` (`hauler log`) | recent requests, as summary rows | `LogStream` → `LogDocument` |
903
909
  | `tool:hauler/hauler_last` (`hauler last`) | most recent request, as a detail record with its tail | `LastDocument` |
904
910
  | `tool:hauler/hauler_await` (`hauler await`) | long-poll a ticket (≤ 2 h) | `AwaitStream` → `AwaitDocument` |
@@ -922,8 +928,10 @@ resource URI it describes, so the document cannot drift from the surface.
922
928
  #### Dashboard
923
929
 
924
930
  `src/mcp/hauler/apps/dashboard.tsx` is the MCP App at
925
- `ui://cargo-hauler/dashboard.html`, attached to `hauler_status` on hosts that
926
- render MCP Apps. It shows contention and admission, in-flight and queued
931
+ `ui://cargo-hauler/dashboard.html`, attached to `hauler_dashboard` on hosts
932
+ that render MCP Apps; the opening result is that tool's status payload, and
933
+ `hauler_status` carries no App so its text reaches the model alone. It shows
934
+ contention and admission, in-flight and queued
927
935
  work, metrics windows, optional kache data, lanes, and history, with a live
928
936
  output drawer per ticket. The App polls `hauler_status` every 5 s; its rows
929
937
  are summaries, so a running row's `outputPreview` shows as one line under the
@@ -979,7 +987,7 @@ pnpm run check # the gate
979
987
  To see the dashboard outside an MCP host, run `node artifact/bin/cargo-hauler.mjs
980
988
  web` after a build: the framework's `web` command (configured under `web` in
981
989
  `agent-bundle.config.ts`) launches the artifact's own `hauler` server, calls
982
- `hauler_status` once so the App opens populated, approves `call-tool` so its
990
+ `hauler_dashboard` once so the App opens populated, approves `call-tool` so its
983
991
  panels may poll, and serves `ui://cargo-hauler/dashboard.html` on a loopback
984
992
  origin until Ctrl-C — so the data is the daemon's own. `pnpm run dev` and the
985
993
  Workbench's MCP page preview the same App with live rebuilds. The repository
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.7.4"}]}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler-marketplace","owner":{"name":"cargo-hauler"},"plugins":[{"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","source":"./","version":"0.8.0"}]}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.7.4"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","name":"cargo-hauler","version":"0.8.0"}
@@ -1 +1 @@
1
- {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.7.4"}
1
+ {"author":{"name":"cargo-hauler"},"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","hooks":"./.codex-plugin/hooks.json","interface":{"capabilities":["mcp","hooks","skills"],"category":"Productivity","defaultPrompt":["Help me use cargo-hauler."],"developerName":"cargo-hauler","displayName":"cargo-hauler","longDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","shortDescription":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks."},"keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.0"}
@@ -1 +1 @@
1
- {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.7.4"}
1
+ {"description":"Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.","displayName":"cargo-hauler","hooks":"./.cursor-plugin/hooks.json","keywords":["cargo","rust","agent","mcp","claude-code","codex","cursor","build-orchestration"],"license":"MIT","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","repository":"https://github.com/ScriptedAlchemy/cargo-hauler","skills":"./skills/","version":"0.8.0"}
package/dist/INSTALL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Coalesce, schedule, and stream cargo so concurrent agent sessions share compiles instead of fighting locks.
4
4
 
5
- Version: `0.7.4`
5
+ Version: `0.8.0`
6
6
 
7
7
  Run these commands from this bundle directory. The bundle is self-contained: every command below is
8
8
  a host command or the bundled installer, and nothing requires the `agent-bundle` CLI. Where that CLI is
package/dist/README.md CHANGED
@@ -59,10 +59,11 @@ hauler install-shim # optional: cargo from script
59
59
  ```
60
60
 
61
61
  Restart the host (or reload the window) so new sessions load the hooks. The
62
- daemon starts on demand with the first brokered request; `hauler status` shows
63
- what is running, and the `hauler_status` tool opens the dashboard in hosts that
64
- render MCP Apps. Prefer the hosts' own plugin commands, or building from a
65
- checkout? See [Install](#install).
62
+ daemon starts on demand with the first brokered request; `hauler status` and
63
+ the `hauler_status` tool show what is running as text, and the
64
+ `hauler_dashboard` tool opens the dashboard in hosts that render MCP Apps.
65
+ Prefer the hosts' own plugin commands, or building from a checkout? See
66
+ [Install](#install).
66
67
 
67
68
  The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
68
69
  `scripts/hauler.mjs` or any path under `.claude/plugins/cache`,
@@ -87,11 +88,14 @@ The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
87
88
  | `hauler request [--session ID] [--host HOST] [--cwd DIR] [--after TICKET …] -- <cargo …>` | Submit a background request and return its ticket, with where it landed in its lane (`queued behind cc-3281 (~13m)`, `waiting for cc-3281`, or `attached to cc-3281`). `--cwd` overrides the current CLI workspace; `--after` works as for `exec`. |
88
89
  | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `stop` records its typed `shutdown` outcome in JSON and exits `0` only after a `shutting-down` acknowledgement followed by the original pid's exit, or when the daemon was already absent. Refusal, timeout, protocol error, disconnect before acknowledgement, and an acknowledged daemon still alive after 5 s exit `1`; `running` remains `true` when the original pid is alive and `null` when liveness could not be established. `restart` is the explicit replacement path: it sends the graceful stop, waits up to 5 s for the old pid to exit, then starts a daemon from this install and prints both (`restarted: pid 741314 (0.6.0) → pid 742001 (0.6.1)`). Tickets in flight are not handed over: the old daemon settles them itself as it shuts down — `killed`, error `daemon shutdown` — and callers resubmit. Automatic upgrades are gentler: read-only commands and MCP/dashboard reads never retire a daemon; a protocol-compatible older daemon serves them directly. Submission commands replace an older daemon only after an idle status check; daemons from 0.7.4 onward hold admission closed while confirming that state, while 0.7.1–0.7.3 receive a client preflight. A busy or slow-to-retire daemon keeps serving the submission and emits one line such as `daemon 0.7.1 will be replaced by 0.7.3 when idle`. A truly incompatible daemon is reported with its pid and version instead of having its payload parsed. |
89
90
  | `hauler install-shim [--dir DIR] [--real-cargo PATH] [--force]` | Install the optional PATH shim. |
90
- | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_status`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_status` instead. |
91
+ | `hauler web [--port N] [--no-open]` | Open the dashboard from the checkout, npm package, or installed plugin. Agent Bundle's generated web command serves the built App against the plugin's own `hauler` server, opens it populated by `hauler_dashboard`, and stays in the foreground until Ctrl-C. In an MCP host, call `hauler_dashboard` instead. |
91
92
 
92
93
  The `hauler` MCP server projects the same operations as `hauler_status`,
93
94
  `hauler_log`, `hauler_last`, `hauler_await`, `hauler_result`, `hauler_kill`,
94
- and `hauler_request`, with the same filters as the CLI. `hauler_status` and
95
+ and `hauler_request`, with the same filters as the CLI, plus
96
+ `hauler_dashboard`, which carries the MCP App (below) and answers with one
97
+ summary line so opening the dashboard never pastes the status text into the
98
+ model's context. `hauler_status` and
95
99
  `hauler_log` rows are the same bounded summaries (`outputPreview`, never a
96
100
  tail); `hauler_result`, `hauler_await`, and `hauler_last` carry the whole
97
101
  tail. `hauler_request.cwd` is an optional override: Agent Bundle's authoritative
@@ -102,7 +106,8 @@ workspace.
102
106
  ## Dashboard
103
107
 
104
108
  The dashboard is an MCP App (`ui://cargo-hauler/dashboard.html`) attached to
105
- `hauler_status`. It shows contention and admission, in-flight and queued work
109
+ `hauler_dashboard`; `hauler_status` is the same data as text for the model and
110
+ never opens it. It shows contention and admission, in-flight and queued work
106
111
  — each running row with the last line of its output preview, each ticket's
107
112
  drawer with the whole tail fetched through `hauler_result` — metrics over
108
113
  one-hour, 24-hour, and all-time windows, per-command timings, optional kache
@@ -783,7 +788,7 @@ src/
783
788
  layout.tsx the hauler shell around every rendered route
784
789
  providers/hauler-daemon.ts request-scoped daemon configuration
785
790
  components/ typed components over pure view-models
786
- mcp/hauler/tools/*.tsx hauler_status, _log, _last, _await, _result, _request, _kill
791
+ mcp/hauler/tools/*.tsx hauler_status, _dashboard, _log, _last, _await, _result, _request, _kill
787
792
  mcp/hauler/tools/*.cli.ts each tool's `hauler <command>` projection (flags, positionals)
788
793
  mcp/hauler/apps/dashboard.tsx the MCP App (ui://cargo-hauler/dashboard.html)
789
794
  cli/daemon.ts the one plain CLI command
@@ -898,7 +903,8 @@ the same filter as its `session` field). Results carry
898
903
 
899
904
  | Route | Surface | Document |
900
905
  | --- | --- | --- |
901
- | `tool:hauler/hauler_status` (`hauler status`) | queue, lanes, admission, kache, filters; bounded summary rows (`StatusRow`): `outputPreview` on running rows, never a tail | `StatusDocument`; the tool advertises the dashboard App |
906
+ | `tool:hauler/hauler_status` (`hauler status`) | queue, lanes, admission, kache, filters; bounded summary rows (`StatusRow`): `outputPreview` on running rows, never a tail | `StatusDocument`, text for the model |
907
+ | `tool:hauler/hauler_dashboard` (`hauler web`) | the same `StatusResult`, `limit` only; the tool advertises the dashboard App (`_meta.ui.resourceUri`) so hosts open it beside the result | `DashboardDocument`: one summary line plus where the App and the text form are |
902
908
  | `tool:hauler/hauler_log` (`hauler log`) | recent requests, as summary rows | `LogStream` → `LogDocument` |
903
909
  | `tool:hauler/hauler_last` (`hauler last`) | most recent request, as a detail record with its tail | `LastDocument` |
904
910
  | `tool:hauler/hauler_await` (`hauler await`) | long-poll a ticket (≤ 2 h) | `AwaitStream` → `AwaitDocument` |
@@ -922,8 +928,10 @@ resource URI it describes, so the document cannot drift from the surface.
922
928
  #### Dashboard
923
929
 
924
930
  `src/mcp/hauler/apps/dashboard.tsx` is the MCP App at
925
- `ui://cargo-hauler/dashboard.html`, attached to `hauler_status` on hosts that
926
- render MCP Apps. It shows contention and admission, in-flight and queued
931
+ `ui://cargo-hauler/dashboard.html`, attached to `hauler_dashboard` on hosts
932
+ that render MCP Apps; the opening result is that tool's status payload, and
933
+ `hauler_status` carries no App so its text reaches the model alone. It shows
934
+ contention and admission, in-flight and queued
927
935
  work, metrics windows, optional kache data, lanes, and history, with a live
928
936
  output drawer per ticket. The App polls `hauler_status` every 5 s; its rows
929
937
  are summaries, so a running row's `outputPreview` shows as one line under the
@@ -979,7 +987,7 @@ pnpm run check # the gate
979
987
  To see the dashboard outside an MCP host, run `node artifact/bin/cargo-hauler.mjs
980
988
  web` after a build: the framework's `web` command (configured under `web` in
981
989
  `agent-bundle.config.ts`) launches the artifact's own `hauler` server, calls
982
- `hauler_status` once so the App opens populated, approves `call-tool` so its
990
+ `hauler_dashboard` once so the App opens populated, approves `call-tool` so its
983
991
  panels may poll, and serves `ui://cargo-hauler/dashboard.html` on a loopback
984
992
  origin until Ctrl-C — so the data is the daemon's own. `pnpm run dev` and the
985
993
  Workbench's MCP page preview the same App with live rebuilds. The repository