cargo-hauler 0.6.12 → 0.6.13

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 (71) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +24 -32
  3. package/artifact/.claude-plugin/marketplace.json +1 -1
  4. package/artifact/.claude-plugin/plugin.json +1 -1
  5. package/artifact/.codex-plugin/plugin.json +1 -1
  6. package/artifact/.cursor-plugin/plugin.json +1 -1
  7. package/artifact/INSTALL.md +1 -1
  8. package/artifact/agent-bundle.compile-evidence.json +1 -1
  9. package/artifact/agent-bundle.manifest.json +1 -1
  10. package/artifact/bin/cargo-hauler-flight.mjs +827 -280
  11. package/artifact/bin/cargo-hauler.mjs +645 -232
  12. package/artifact/hooks/event-route-session-start.claude.mjs +2 -2
  13. package/artifact/hooks/event-route-session-start.codex.mjs +2 -2
  14. package/artifact/hooks/event-route-session-start.cursor.mjs +2 -2
  15. package/artifact/hooks/event-route-stop.claude.mjs +2 -2
  16. package/artifact/hooks/event-route-stop.codex.mjs +2 -2
  17. package/artifact/hooks/event-route-stop.cursor.mjs +2 -2
  18. package/artifact/hooks/event-route-tool-after.claude.execute.mjs +2 -2
  19. package/artifact/hooks/event-route-tool-after.claude.mjs +3 -3
  20. package/artifact/hooks/event-route-tool-after.codex.execute.mjs +2 -2
  21. package/artifact/hooks/event-route-tool-after.codex.mjs +3 -3
  22. package/artifact/hooks/event-route-tool-after.cursor.execute.mjs +2 -2
  23. package/artifact/hooks/event-route-tool-after.cursor.mjs +3 -3
  24. package/artifact/hooks/event-route-tool-before.claude.execute.mjs +2 -2
  25. package/artifact/hooks/event-route-tool-before.codex.execute.mjs +2 -2
  26. package/artifact/hooks/event-route-tool-before.cursor.execute.mjs +2 -2
  27. package/artifact/hooks/hooks-flight.mjs +16 -21
  28. package/artifact/install.mjs +1 -1
  29. package/artifact/mcp/mcp-hauler-2b8242f9-flight.mjs +797 -84
  30. package/artifact/mcp/mcp-hauler-2b8242f9.mjs +35 -29
  31. package/artifact/mcp-apps/dashboard.html +1 -1
  32. package/artifact/plugin.json +1 -1
  33. package/artifact/scripts/hauler.mjs +9 -9
  34. package/artifact/skills/hauler-dashboard/SKILL.md +1 -1
  35. package/dist/.claude-plugin/marketplace.json +1 -1
  36. package/dist/.claude-plugin/plugin.json +1 -1
  37. package/dist/.codex-plugin/plugin.json +1 -1
  38. package/dist/.cursor-plugin/plugin.json +1 -1
  39. package/dist/INSTALL.md +1 -1
  40. package/dist/README.md +24 -32
  41. package/dist/agent-bundle.compile-evidence.json +1 -1
  42. package/dist/agent-bundle.manifest.json +1 -1
  43. package/dist/agent-bundle.package-compile-evidence.json +1 -1
  44. package/dist/bin/cargo-hauler-flight.mjs +827 -280
  45. package/dist/bin/cargo-hauler.mjs +645 -232
  46. package/dist/bin/hauler.js +9 -9
  47. package/dist/hooks/event-route-session-start.claude.mjs +2 -2
  48. package/dist/hooks/event-route-session-start.codex.mjs +2 -2
  49. package/dist/hooks/event-route-session-start.cursor.mjs +2 -2
  50. package/dist/hooks/event-route-stop.claude.mjs +2 -2
  51. package/dist/hooks/event-route-stop.codex.mjs +2 -2
  52. package/dist/hooks/event-route-stop.cursor.mjs +2 -2
  53. package/dist/hooks/event-route-tool-after.claude.execute.mjs +2 -2
  54. package/dist/hooks/event-route-tool-after.claude.mjs +3 -3
  55. package/dist/hooks/event-route-tool-after.codex.execute.mjs +2 -2
  56. package/dist/hooks/event-route-tool-after.codex.mjs +3 -3
  57. package/dist/hooks/event-route-tool-after.cursor.execute.mjs +2 -2
  58. package/dist/hooks/event-route-tool-after.cursor.mjs +3 -3
  59. package/dist/hooks/event-route-tool-before.claude.execute.mjs +2 -2
  60. package/dist/hooks/event-route-tool-before.codex.execute.mjs +2 -2
  61. package/dist/hooks/event-route-tool-before.cursor.execute.mjs +2 -2
  62. package/dist/hooks/hooks-flight.mjs +16 -21
  63. package/dist/install.mjs +1 -1
  64. package/dist/mcp/mcp-hauler-2b8242f9-flight.mjs +797 -84
  65. package/dist/mcp/mcp-hauler-2b8242f9.mjs +35 -29
  66. package/dist/mcp-apps/dashboard.html +1 -1
  67. package/dist/package.json +1 -1
  68. package/dist/plugin.json +1 -1
  69. package/dist/scripts/hauler.mjs +9 -9
  70. package/dist/skills/hauler-dashboard/SKILL.md +1 -1
  71. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.13
4
+
5
+ ### Patch Changes
6
+
7
+ - 16bbf46: Use Agent Bundle route references and workspace context for hauler requests, and stop probing daemon health from the global layout (#147).
8
+
3
9
  ## 0.6.12
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -84,17 +84,20 @@ The CLI is `hauler` on PATH from `npm i -g cargo-hauler`. Never run
84
84
  | `hauler await <ticket> [--max-wait-ms N]` | Long-poll until the ticket finishes or the wait expires (default 30 s, ceiling 2 h per call — the daemon's await ceiling; call again to keep waiting). A host with its own per-call deadline still bounds one call: Codex stops a tool call at `tool_timeout_sec` (60 s unless raised). |
85
85
  | `hauler result <ticket> [--full]` | A stored ticket in full: the settled 16 KiB output tail, or the whole live in-memory tail while it runs (not the status preview). The document names the full on-disk output log (`Full output: <path> (size)`) and `--json` carries it as `request.outputPath`; `--full` prints that whole log instead of the tail (the last ~768 KiB when it does not fit, with the path for the rest). |
86
86
  | `hauler kill <ticket>` | Stop a ticket: drop it from the queue or SIGTERM (then SIGKILL) its cargo process group, freeing the lane. Riders return to their lane or fail with it. |
87
- | `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`). `--after` works as for `exec`. |
87
+ | `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
88
  | `hauler daemon <run\|start\|stop\|status\|restart>` | Manage the daemon lifecycle. `restart` is the manual replacement: 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)`); a daemon that has not exited by then is reported, not killed, and nothing is started (exit `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 (only rows a daemon that died without shutting down never marked are stamped `orphaned by daemon restart` by the next daemon's first ledger pass). After upgrading the package, every client entry — reads (`status`, `daemon status`, `log`, `last`, `await`, `result`, the dashboard and MCP tools), writes, and hooks — checks the daemon version before requesting a versioned payload and replaces a daemon from the previous install automatically. When the old daemon has not exited within the grace, the command fails with `` cargo-hauler daemon pid N (X.Y.Z) is still running 5s after the shutdown request; not restarted — retry once it has exited, or stop it with `hauler daemon stop` `` instead of parsing its payload or starting a second daemon. |
89
89
  | `hauler install-shim [--dir DIR] [--real-cargo PATH] [--force]` | Install the optional PATH shim. |
90
- | `hauler dashboard [--target claude\|codex\|cursor\|portable] [--port N] [--no-open]` | Open the dashboard in a plain browser tab: serve the MCP App standalone against the plugin's own `hauler` server on `127.0.0.1` (`spawnServeApp` from `agent-bundle/serve-app-command`, which runs `agent-bundle serve-app` as a child process and prints its URL), call `hauler_status` once so it opens populated, and stay in the foreground until Ctrl-C. A checkout command: it needs the built `artifact/` beside the CLI and `agent-bundle` under `node_modules` (`pnpm install && pnpm build`); the npm package ships no runtime dependencies and an installed host pack has no artifact, so both report what is missing. In an MCP host, call `hauler_status` instead. |
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
91
 
92
92
  The `hauler` MCP server projects the same operations as `hauler_status`,
93
93
  `hauler_log`, `hauler_last`, `hauler_await`, `hauler_result`, `hauler_kill`,
94
94
  and `hauler_request`, with the same filters as the CLI. `hauler_status` and
95
95
  `hauler_log` rows are the same bounded summaries (`outputPreview`, never a
96
96
  tail); `hauler_result`, `hauler_await`, and `hauler_last` carry the whole
97
- tail.
97
+ tail. `hauler_request.cwd` is an optional override: Agent Bundle's authoritative
98
+ workspace supplies it when available, and callers must provide it when the host
99
+ supplied none. The MCP server process directory is not treated as the caller's
100
+ workspace.
98
101
 
99
102
  ## Dashboard
100
103
 
@@ -701,7 +704,7 @@ argv parser, or string-concatenated Markdown; the `src/` tree is the app.
701
704
  ```text
702
705
  src/
703
706
  layout.tsx the hauler shell around every rendered route
704
- providers/hauler-daemon.ts request-scoped daemon connection + health probe
707
+ providers/hauler-daemon.ts request-scoped daemon configuration
705
708
  components/ typed components over pure view-models
706
709
  mcp/hauler/tools/*.tsx hauler_status, _log, _last, _await, _result, _request, _kill
707
710
  mcp/hauler/tools/*.cli.ts each tool's `hauler <command>` projection (flags, positionals)
@@ -719,12 +722,6 @@ src/
719
722
  Every rendered route — MCP tool, CLI command, rendered script — composes
720
723
  through one layout, the way a page framework's `layout.tsx` wraps every page:
721
724
 
722
- - **Header:** `<DaemonBadge>` prints what the request-start probe proved and
723
- which state directory it is: `cargo-hauler · daemon running (pid 4021) ·
724
- 2/5 permits +1 riding, 1 queued · 2 lanes busy · up since 3h ago · state dir
725
- /fast/cache/cargo-hauler`, or `daemon stopped · no socket; it starts on
726
- demand…`, or `daemon unresponsive · did not accept a connection within
727
- 750ms (machine saturated)…`.
728
725
  - **Body:** the route's own document, unchanged. The route keeps its
729
726
  `<Agent.Result value>`; the runtime merges it into the shell so
730
727
  `structuredContent` and `--json` are exactly what the route declared.
@@ -733,7 +730,9 @@ through one layout, the way a page framework's `layout.tsx` wraps every page:
733
730
  read synchronously with `useAgent()`, and stays silent when the host cannot
734
731
  place the request rather than guessing.
735
732
  - **`_meta.hauler`** on every MCP result: `route`, `surface`, `server`,
736
- `version`, `daemon: { state, pid? }`, `lineage: { conversation, root, depth } | null`.
733
+ `version`, and `lineage: { conversation, root, depth } | null`. Daemon state
734
+ comes from each operation's result, so the shell does not pay or report a
735
+ separate request-start health probe.
737
736
 
738
737
  Event routes are host protocol responses and are never wrapped.
739
738
 
@@ -748,7 +747,7 @@ Flight worker, or Effect — and runs before the rendered route
748
747
  (`src/hooks/tokens.ts`; `session-ping.ts` for the one bounded completion ping
749
748
  after a tool ran): `continue` for the shell calls that name neither cargo nor
750
749
  hauler, `execute` for the rest. Both routes declare `providers: []`, so
751
- neither pays the daemon provider's probe; the rendered route calls
750
+ neither mounts the daemon-config provider; the rendered route calls
752
751
  `before-shell.ts` (the rewrite, the `cargo clean` guard) or `after-shell.ts`
753
752
  (telemetry, finished-ticket context) and returns `allow`, `continue` +
754
753
  `updatedInput`, `deny` with a reason, or `additionalContext` through the
@@ -756,21 +755,11 @@ framework's host projection.
756
755
 
757
756
  #### The daemon provider (`src/providers/hauler-daemon.ts`)
758
757
 
759
- One request-context provider mounts `providers.haulerDaemon` for every tool,
760
- command, event, and script: the resolved `config` (state dir, socket, ledger)
761
- and a `health` value from one bounded `status` probe:
762
-
763
- | `health.state` | meaning |
764
- | --- | --- |
765
- | `running` | `pid`, `startedAtMs`, `latencyMs`, `running` (permit holders), `riding` (attached), `queued`, `busyLanes`, `maxConcurrent`, and `version` (the daemon's release version) |
766
- | `stopped` | `socket-missing` (starts on demand) or `connection-refused` (stale socket) |
767
- | `unresponsive` | `accept-timeout` (never accepted), `answer-timeout` (accepted, no `status-result`), or `connection-closed` within the probe budget (750 ms for the accept and for the answer); ledger reads still work |
768
- | `unreachable` | `open-failed` with the errno (`EACCES`, `EMFILE`, …): the socket is present but could not be opened, which is not evidence the daemon is down |
769
- | `unprobed` | `event-surface`: hooks run on every shell command and skip the probe by design |
770
-
771
- The provider fails closed on nothing it can observe and fabricates nothing.
772
- Routes read it through `requestDaemon(context)` / `requestDaemonConfig(context)`;
773
- tests inject a fixture through the harness `context.providers` seam.
758
+ One request-context provider mounts `providers.haulerDaemon` for rendered tools,
759
+ commands, and scripts. It resolves only cheap `config` data (state directory,
760
+ socket, and ledger paths); active health and status I/O belongs to the operation
761
+ that needs it. Routes read the config through `requestDaemonConfig(context)`,
762
+ and tests inject a fixture through the harness `context.providers` seam.
774
763
 
775
764
  #### Components (`src/components/`)
776
765
 
@@ -790,7 +779,7 @@ assertion share one derivation.
790
779
  | `<BuildDiagnostics>` | an index of cargo `error[E…]`/`warning:` blocks (level / code / message / location) followed by every captured block verbatim |
791
780
  | `<DashboardLink>` | where the MCP App lives and how to open it elsewhere |
792
781
  | `<TicketGuidance>` | what to do next, one component per ticket status |
793
- | `<DaemonBadge>`, `<LineageFooter>` | the shell header and footer |
782
+ | `<LineageFooter>` | the shell footer |
794
783
  | `<EmptyState>`, `<UnavailableState>`, `<ErrorState>` | the three non-happy shapes every document may take |
795
784
 
796
785
  `documents.tsx` composes them into one document per hauler result
@@ -815,10 +804,13 @@ valueless `Agent.Result` container around one `Suspense` boundary:
815
804
 
816
805
  #### Attribution and lineage
817
806
 
818
- `hauler_request` attributes tickets from the request context: an explicit
819
- `host`/`session` wins; otherwise the negotiated host and native session are
820
- used; and when the transport publishes no session id (bare stdio MCP), the
821
- conversation from `request.lineage` becomes the session of record. That is
807
+ `hauler_request` resolves `cwd` from an explicit input first, then from Agent
808
+ Bundle's authoritative workspace; a caller must provide it when neither exists.
809
+ The MCP server's derived process directory is not a caller workspace.
810
+ It attributes tickets from the same request context: an explicit
811
+ `host`/`session` wins; otherwise the negotiated host and native session are used;
812
+ and when the transport publishes no session id (bare stdio MCP), the conversation
813
+ from `request.lineage` becomes the session of record. That is
822
814
  what makes parallel agents' builds attributable in the ledger, the dashboard,
823
815
  and `hauler status --session <conversation>` (the `hauler_status` tool takes
824
816
  the same filter as its `session` field). Results carry
@@ -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.","name":"cargo-hauler","source":"./","version":"0.6.12"}]}
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.","name":"cargo-hauler","source":"./","version":"0.6.13"}]}
@@ -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.6.12"}
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.6.13"}
@@ -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."},"mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","skills":"./skills/","version":"0.6.12"}
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."},"mcpServers":"./.codex-plugin/mcp.json","name":"cargo-hauler","skills":"./skills/","version":"0.6.13"}
@@ -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","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","skills":"./skills/","version":"0.6.12"}
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","mcpServers":"./.cursor-plugin/mcp.json","name":"cargo-hauler","skills":"./skills/","version":"0.6.13"}
@@ -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.6.12`
5
+ Version: `0.6.13`
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