create-walle 0.10.2 → 0.10.3

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 (488) hide show
  1. package/README.md +3 -1
  2. package/lib/release-schema.json +2 -2
  3. package/lib/runtime-closure-policy.json +8 -7
  4. package/package.json +1 -1
  5. package/template/coding-task-manager/api-prompts.js +45 -7
  6. package/template/coding-task-manager/bin/claude-hook.js +55 -1
  7. package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
  8. package/template/coding-task-manager/bin/land.js +2069 -0
  9. package/template/coding-task-manager/bin/memory-census.js +4 -2
  10. package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
  11. package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
  12. package/template/coding-task-manager/db.js +156 -32
  13. package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
  14. package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
  15. package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
  16. package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
  17. package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
  18. package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
  19. package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
  20. package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
  21. package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
  22. package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
  23. package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
  24. package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
  25. package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
  26. package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
  27. package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
  28. package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
  29. package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
  30. package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
  31. package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
  32. package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
  33. package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
  34. package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
  35. package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
  36. package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
  37. package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
  38. package/template/coding-task-manager/lib/agent-definitions.js +19 -0
  39. package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
  40. package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
  41. package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
  42. package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
  43. package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
  44. package/template/coding-task-manager/lib/agent-presets.js +84 -1
  45. package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
  46. package/template/coding-task-manager/lib/agent-version-service.js +74 -11
  47. package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
  48. package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
  49. package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
  50. package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
  51. package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
  52. package/template/coding-task-manager/lib/api/fleet.js +118 -0
  53. package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
  54. package/template/coding-task-manager/lib/api/ingress.js +9 -1
  55. package/template/coding-task-manager/lib/api/landing.js +403 -0
  56. package/template/coding-task-manager/lib/api/machines.js +691 -2
  57. package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
  58. package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
  59. package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
  60. package/template/coding-task-manager/lib/api/session-attach.js +623 -0
  61. package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
  62. package/template/coding-task-manager/lib/api/sessions.js +77 -51
  63. package/template/coding-task-manager/lib/api/setup-network.js +544 -16
  64. package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
  65. package/template/coding-task-manager/lib/api/setup.js +829 -10
  66. package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
  67. package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
  68. package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
  69. package/template/coding-task-manager/lib/auth-rules.js +292 -21
  70. package/template/coding-task-manager/lib/background-stop.js +369 -0
  71. package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
  72. package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
  73. package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
  74. package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
  75. package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
  76. package/template/coding-task-manager/lib/build-info.js +4 -2
  77. package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
  78. package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
  79. package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
  80. package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
  81. package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
  82. package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
  83. package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
  84. package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
  85. package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
  86. package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
  87. package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
  88. package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
  89. package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
  90. package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
  91. package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
  92. package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
  93. package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
  94. package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
  95. package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
  96. package/template/coding-task-manager/lib/conversation-sync.js +355 -0
  97. package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
  98. package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
  99. package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
  100. package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
  101. package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
  102. package/template/coding-task-manager/lib/db-domains.js +1 -0
  103. package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
  104. package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
  105. package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
  106. package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
  107. package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
  108. package/template/coding-task-manager/lib/feature-manifest.js +4 -0
  109. package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
  110. package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
  111. package/template/coding-task-manager/lib/fleet-hub.js +762 -0
  112. package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
  113. package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
  114. package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
  115. package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
  116. package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
  117. package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
  118. package/template/coding-task-manager/lib/fleet-update.js +798 -0
  119. package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
  120. package/template/coding-task-manager/lib/fs-watcher.js +58 -42
  121. package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
  122. package/template/coding-task-manager/lib/headless-term-service.js +84 -8
  123. package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
  124. package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
  125. package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
  126. package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
  127. package/template/coding-task-manager/lib/host-handoff.js +16 -19
  128. package/template/coding-task-manager/lib/host-stats.js +150 -3
  129. package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
  130. package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
  131. package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
  132. package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
  133. package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
  134. package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
  135. package/template/coding-task-manager/lib/hub-bridge.js +398 -0
  136. package/template/coding-task-manager/lib/idle-notify.js +491 -0
  137. package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
  138. package/template/coding-task-manager/lib/instance-manifest.js +5 -1
  139. package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
  140. package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
  141. package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
  142. package/template/coding-task-manager/lib/landing/config.js +536 -0
  143. package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
  144. package/template/coding-task-manager/lib/landing/gate.js +360 -0
  145. package/template/coding-task-manager/lib/landing/git.js +344 -0
  146. package/template/coding-task-manager/lib/landing/lease.js +247 -0
  147. package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
  148. package/template/coding-task-manager/lib/landing/proof.js +223 -0
  149. package/template/coding-task-manager/lib/landing/queue.js +998 -0
  150. package/template/coding-task-manager/lib/landing/radar.js +489 -0
  151. package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
  152. package/template/coding-task-manager/lib/landing/state.js +263 -0
  153. package/template/coding-task-manager/lib/landing/stop.js +49 -0
  154. package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
  155. package/template/coding-task-manager/lib/landing/sync.js +456 -0
  156. package/template/coding-task-manager/lib/landing/train.js +885 -0
  157. package/template/coding-task-manager/lib/landing/window.js +57 -0
  158. package/template/coding-task-manager/lib/launch-environment.js +121 -0
  159. package/template/coding-task-manager/lib/launch-model-override.js +36 -10
  160. package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
  161. package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
  162. package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
  163. package/template/coding-task-manager/lib/lead-model-options.js +160 -3
  164. package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
  165. package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
  166. package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
  167. package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
  168. package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
  169. package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
  170. package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
  171. package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
  172. package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
  173. package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
  174. package/template/coding-task-manager/lib/machine-registry.js +750 -5
  175. package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
  176. package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
  177. package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
  178. package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
  179. package/template/coding-task-manager/lib/memory-join.js +337 -0
  180. package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
  181. package/template/coding-task-manager/lib/memory-sync.js +565 -0
  182. package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
  183. package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
  184. package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
  185. package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
  186. package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
  187. package/template/coding-task-manager/lib/model-availability.js +727 -0
  188. package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
  189. package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
  190. package/template/coding-task-manager/lib/model-id-rule.js +19 -0
  191. package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
  192. package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
  193. package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
  194. package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
  195. package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
  196. package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
  197. package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
  198. package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
  199. package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
  200. package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
  201. package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
  202. package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
  203. package/template/coding-task-manager/lib/native-history-control.js +6 -4
  204. package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
  205. package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
  206. package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
  207. package/template/coding-task-manager/lib/opencode-cli.js +480 -0
  208. package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
  209. package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
  210. package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
  211. package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
  212. package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
  213. package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
  214. package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
  215. package/template/coding-task-manager/lib/perf-summary.js +7 -0
  216. package/template/coding-task-manager/lib/perf-tracker.js +63 -2
  217. package/template/coding-task-manager/lib/project-config.js +7 -0
  218. package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
  219. package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
  220. package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
  221. package/template/coding-task-manager/lib/read-pool-client.js +89 -2
  222. package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
  223. package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
  224. package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
  225. package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
  226. package/template/coding-task-manager/lib/relay-client.js +57 -3
  227. package/template/coding-task-manager/lib/relink-audit.js +34 -5
  228. package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
  229. package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
  230. package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
  231. package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
  232. package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
  233. package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
  234. package/template/coding-task-manager/lib/restart-guard.js +18 -6
  235. package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
  236. package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
  237. package/template/coding-task-manager/lib/resume-admission.js +17 -3
  238. package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
  239. package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
  240. package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
  241. package/template/coding-task-manager/lib/runtime-contract.js +3 -1
  242. package/template/coding-task-manager/lib/schema-indexes.js +1 -0
  243. package/template/coding-task-manager/lib/session-context-locator.js +742 -0
  244. package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
  245. package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
  246. package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
  247. package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
  248. package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
  249. package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
  250. package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
  251. package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
  252. package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
  253. package/template/coding-task-manager/lib/session-create/response.js +7 -7
  254. package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
  255. package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
  256. package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
  257. package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
  258. package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
  259. package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
  260. package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
  261. package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
  262. package/template/coding-task-manager/lib/session-empty.js +13 -10
  263. package/template/coding-task-manager/lib/session-host-manager.js +60 -0
  264. package/template/coding-task-manager/lib/session-jobs.js +3 -1
  265. package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
  266. package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
  267. package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
  268. package/template/coding-task-manager/lib/session-park.js +738 -0
  269. package/template/coding-task-manager/lib/session-path-grant.js +13 -4
  270. package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
  271. package/template/coding-task-manager/lib/session-transport.js +17 -0
  272. package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
  273. package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
  274. package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
  275. package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
  276. package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
  277. package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
  278. package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
  279. package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
  280. package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
  281. package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
  282. package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
  283. package/template/coding-task-manager/lib/submission-ack.js +90 -2
  284. package/template/coding-task-manager/lib/systemd-scope.js +115 -0
  285. package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
  286. package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
  287. package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
  288. package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
  289. package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
  290. package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
  291. package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
  292. package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
  293. package/template/coding-task-manager/lib/transcript-source.js +36 -4
  294. package/template/coding-task-manager/lib/transcript-store.js +9 -0
  295. package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
  296. package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
  297. package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
  298. package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
  299. package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
  300. package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
  301. package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
  302. package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
  303. package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
  304. package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
  305. package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
  306. package/template/coding-task-manager/lib/walle/turn.js +1 -1
  307. package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
  308. package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
  309. package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
  310. package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
  311. package/template/coding-task-manager/lib/walle-row-history.js +495 -0
  312. package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
  313. package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
  314. package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
  315. package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
  316. package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
  317. package/template/coding-task-manager/lib/ws/misc.js +1 -1
  318. package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
  319. package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
  320. package/template/coding-task-manager/oauth-proxy.js +112 -115
  321. package/template/coding-task-manager/package-lock.json +10 -94
  322. package/template/coding-task-manager/package.json +4 -3
  323. package/template/coding-task-manager/protocol/message-table.json +10 -0
  324. package/template/coding-task-manager/protocol/messages.js +10 -0
  325. package/template/coding-task-manager/protocol/ws-schema.json +20 -0
  326. package/template/coding-task-manager/protocol/ws-schema.md +2 -0
  327. package/template/coding-task-manager/public/css/app.css +170 -0
  328. package/template/coding-task-manager/public/css/walle-session.css +4 -0
  329. package/template/coding-task-manager/public/index.html +473 -243
  330. package/template/coding-task-manager/public/js/agent-command.js +86 -0
  331. package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
  332. package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
  333. package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
  334. package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
  335. package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
  336. package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
  337. package/template/coding-task-manager/public/js/background-work.js +196 -27
  338. package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
  339. package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
  340. package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
  341. package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
  342. package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
  343. package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
  344. package/template/coding-task-manager/public/js/document-review-links.js +9 -1
  345. package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
  346. package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
  347. package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
  348. package/template/coding-task-manager/public/js/message-renderer.js +4 -3
  349. package/template/coding-task-manager/public/js/model-picker.js +3 -1
  350. package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
  351. package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
  352. package/template/coding-task-manager/public/js/pasted-content.js +236 -0
  353. package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
  354. package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
  355. package/template/coding-task-manager/public/js/prompts.js +11 -10
  356. package/template/coding-task-manager/public/js/protocol.js +10 -0
  357. package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
  358. package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
  359. package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
  360. package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
  361. package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
  362. package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
  363. package/template/coding-task-manager/public/js/stream-view.js +6 -5
  364. package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
  365. package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
  366. package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
  367. package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
  368. package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
  369. package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
  370. package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
  371. package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
  372. package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
  373. package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
  374. package/template/coding-task-manager/public/js/walle.js +6 -0
  375. package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
  376. package/template/coding-task-manager/public/m/app.css +140 -0
  377. package/template/coding-task-manager/public/m/app.js +507 -68
  378. package/template/coding-task-manager/public/m/index.html +17 -0
  379. package/template/coding-task-manager/public/m/machines.js +838 -4
  380. package/template/coding-task-manager/public/m/private-api.js +31 -1
  381. package/template/coding-task-manager/public/usage.html +1 -0
  382. package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
  383. package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
  384. package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
  385. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
  386. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
  387. package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
  388. package/template/coding-task-manager/server.js +1950 -11679
  389. package/template/coding-task-manager/session-integrity.js +64 -4
  390. package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
  391. package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
  392. package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
  393. package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
  394. package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
  395. package/template/coding-task-manager/workers/session-host-process.js +5 -5
  396. package/template/coding-task-manager/workers/watch-worker.js +105 -0
  397. package/template/coding-task-manager/workers/worktree-worker.js +168 -33
  398. package/template/ctm-relay/lib/protocol.js +14 -1
  399. package/template/package-lock.json +2 -2
  400. package/template/package.json +1 -1
  401. package/template/shared/backup-retention.js +82 -0
  402. package/template/shared/conversation-admission.js +2 -0
  403. package/template/shared/conversation-provenance.js +3 -7
  404. package/template/shared/conversation-storage-v2-contract.js +5 -0
  405. package/template/shared/linked-worktree.js +51 -0
  406. package/template/shared/macos-fda-target.js +57 -0
  407. package/template/shared/orphan-parents.js +55 -0
  408. package/template/shared/release-schema.json +2 -2
  409. package/template/shared/storage/contract.js +3 -0
  410. package/template/wall-e/adapters/imessage.js +12 -0
  411. package/template/wall-e/agent.js +71 -4
  412. package/template/wall-e/api-walle.js +21 -1
  413. package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
  414. package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
  415. package/template/wall-e/brain/brain-join.js +859 -0
  416. package/template/wall-e/brain/brain-sync-membership.js +20 -0
  417. package/template/wall-e/brain/brain-sync-store.js +131 -77
  418. package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
  419. package/template/wall-e/brain/brain-sync-v2.js +578 -0
  420. package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
  421. package/template/wall-e/brain/deterministic-id.js +51 -0
  422. package/template/wall-e/brain/memories.js +2 -2
  423. package/template/wall-e/brain/migrations.js +40 -6
  424. package/template/wall-e/brain/model-identity-migration.js +1 -1
  425. package/template/wall-e/brain/owner-call-whitelist.js +23 -7
  426. package/template/wall-e/brain/schema.js +45 -85
  427. package/template/wall-e/brain.js +171 -35
  428. package/template/wall-e/chat.js +3 -3
  429. package/template/wall-e/coding/agent-shell-env.js +7 -2
  430. package/template/wall-e/coding/prompt-bundle.js +66 -21
  431. package/template/wall-e/config/main-loop-exemptions.json +2 -2
  432. package/template/wall-e/http/admin-api.js +37 -0
  433. package/template/wall-e/http/gws-api.js +4 -0
  434. package/template/wall-e/http/helper-rules-api.js +7 -1
  435. package/template/wall-e/http/model-admin.js +8 -1
  436. package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
  437. package/template/wall-e/http/model-proxy-providers.js +174 -1
  438. package/template/wall-e/http/model-route-health.js +157 -0
  439. package/template/wall-e/http/sync-api.js +278 -464
  440. package/template/wall-e/jobs/job-runner.js +28 -1
  441. package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
  442. package/template/wall-e/lib/ctm-data-dir.js +26 -0
  443. package/template/wall-e/lib/derivation-home.js +147 -0
  444. package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
  445. package/template/wall-e/lib/helper-rules/grade.js +51 -8
  446. package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
  447. package/template/wall-e/lib/helper-rules/store.js +4 -2
  448. package/template/wall-e/lib/landing-mcp-tools.js +170 -0
  449. package/template/wall-e/lib/mcp-client-config.js +133 -14
  450. package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
  451. package/template/wall-e/lib/mcp-integration.js +58 -13
  452. package/template/wall-e/lib/parent-death.js +7 -1
  453. package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
  454. package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
  455. package/template/wall-e/llm/delegate-vendor-default.js +12 -5
  456. package/template/wall-e/llm/model-roles.js +1 -1
  457. package/template/wall-e/llm/native-delegate-selection.js +56 -8
  458. package/template/wall-e/llm/worker-delegate-args.js +72 -7
  459. package/template/wall-e/llm/worker-mcp-routing.js +66 -17
  460. package/template/wall-e/loops/brain-custom-writes.js +19 -0
  461. package/template/wall-e/loops/ingest.js +17 -1
  462. package/template/wall-e/loops/think.js +19 -4
  463. package/template/wall-e/mcp-contract.js +222 -6
  464. package/template/wall-e/mcp-protocol-contract.js +40 -5
  465. package/template/wall-e/mcp-server.js +128 -29
  466. package/template/wall-e/mcp-worker-schemas.js +5 -5
  467. package/template/wall-e/memory/ctm-context-client.js +85 -0
  468. package/template/wall-e/memory/ctm-session-context.js +9 -3
  469. package/template/wall-e/memory/hub-bridge-client.js +388 -0
  470. package/template/wall-e/memory/replica-origin.js +56 -0
  471. package/template/wall-e/memory/session-pool.js +135 -0
  472. package/template/wall-e/runtime/live-capabilities.js +8 -3
  473. package/template/wall-e/server.js +4 -2
  474. package/template/wall-e/shared/release-schema.json +2 -2
  475. package/template/wall-e/shared/sqlite-file-set.js +39 -0
  476. package/template/wall-e/shared/storage/contract.js +3 -0
  477. package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
  478. package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
  479. package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
  480. package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
  481. package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
  482. package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
  483. package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
  484. package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
  485. package/template/wall-e/tools/chrome-automation.js +6 -0
  486. package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
  487. package/template/wall-e/workers/brain-owner-worker.js +18 -4
  488. package/template/wall-e/workers/mcp-gateway-process.js +5 -5
@@ -1027,7 +1027,7 @@ function installAttachmentRuntime(runtime) {
1027
1027
  createdAt: now,
1028
1028
  }));
1029
1029
  } catch (error) { void error; /* notification is best-effort */ }
1030
- runtime.broadcastSessionList(true);
1030
+ runtime.broadcastSessionList(true, { reason: 'plan-decision' });
1031
1031
  }
1032
1032
  }
1033
1033
 
@@ -1061,7 +1061,7 @@ function installAttachmentRuntime(runtime) {
1061
1061
  // Always refresh the sidebar when plan state drops — the input / pty-resumed
1062
1062
  // callers reset the wait reason BEFORE calling here, so hadPlanWait can be
1063
1063
  // false even though the Needs-You chip must clear now.
1064
- runtime.broadcastSessionList(true);
1064
+ runtime.broadcastSessionList(true, { reason: 'plan-decision-cleared' });
1065
1065
  }
1066
1066
 
1067
1067
  function _ensurePlanCardDelivered(reason) {
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ // WP-0a (docs/session-create-accept-then-complete-2026-11-01.html §6.1): the ONE phase clock every
4
+ // create on this machine is measured with, and the ONE `[create]` line built from it.
5
+ //
6
+ // The clock is a chain of deltas, not a set of timestamps: each `mark(key)` stores the elapsed time
7
+ // since the PREVIOUS mark (the first one measures from the clock's creation), so the eleven phases of
8
+ // CREATE_PHASE_KEYS tile the create's wall-clock instead of overlapping. `now()` is injected and
9
+ // defaults to `performance.now` — a monotonic timer, never a wall-clock timestamp — so a phase is
10
+ // unaffected by clock steps, and a host that wants a deterministic clock (tests) simply supplies one.
11
+ //
12
+ // Nothing here reads the message, the socket, the session or the environment: this module is pure,
13
+ // which is what makes "a create's telemetry can never change a create's behaviour" checkable.
14
+
15
+ /**
16
+ * The phase keys, in the ORDER the `[create]` line prints them. A key that was never marked reads
17
+ * -1 (`UNMARKED`) in `fields()` — "not reached on this exit", never a fabricated 0.
18
+ */
19
+ const CREATE_PHASE_KEYS = Object.freeze([
20
+ 'admitMs', // handleCreatePrepared entry -> end of the idempotency block (prepared.js)
21
+ 'reserveMs', // reserveSessionGeneration
22
+ 'mkdirMs', // createCwd mkdir; -1 when no folder was requested
23
+ 'metaMs', // readLaunchMetadata
24
+ 'warmMs', // _launchPlanWarmInputs
25
+ 'planMs', // _launchPlanCoordinator.prepare
26
+ 'rungMs', // _resolveMissingTranscriptRung + re-plan
27
+ 'restoreMs', // block verdict + copyBakToMissingLive
28
+ 'codexMcpMs', // _awaitCodexMcpReadinessForPlan
29
+ 'estimateMs', // _resumeReadyEstimator.estimate
30
+ // The awaited `handleCreate` call in prepared.js, marked the moment it returns (success or null):
31
+ // provider preparation, PTY spawn and the `created` send all happen inside that one call, so it is
32
+ // the last phase and it reaches `created`. A `handleCreate` that THROWS never returns and leaves it
33
+ // -1, like every other phase whose await did not resolve.
34
+ 'providerMs',
35
+ ]);
36
+
37
+ const UNMARKED = -1;
38
+
39
+ /**
40
+ * A monotonic phase clock. Deltas are whole milliseconds (`Math.round`), so a line is stable to read
41
+ * and a sub-millisecond phase is 0 rather than 0.4.
42
+ *
43
+ * @param {{ now?: () => number }} [opts] `now` defaults to `performance.now`.
44
+ * @returns {{ mark: (key: string) => void, fields: () => Record<string, number>, totalMs: () => number }}
45
+ * `mark(key)` stores `round(now() - previousMark)` under `key` (the first mark measures from
46
+ * creation) and throws a `TypeError` for a key outside CREATE_PHASE_KEYS; a key never marked reads
47
+ * -1 in `fields()`; `totalMs()` is the elapsed time since creation.
48
+ */
49
+ function createPhaseClock(opts) {
50
+ const source = opts && typeof opts === 'object' ? opts : {};
51
+ const now = typeof source.now === 'function' ? source.now : () => performance.now();
52
+ const startedAt = now();
53
+ const marks = new Map();
54
+ let previous = startedAt;
55
+ return {
56
+ mark(key) {
57
+ if (!CREATE_PHASE_KEYS.includes(key)) throw new TypeError(`Unknown create phase key: ${String(key)}`);
58
+ const at = now();
59
+ marks.set(key, Math.round(at - previous));
60
+ previous = at;
61
+ },
62
+ fields() {
63
+ const fields = {};
64
+ for (const key of CREATE_PHASE_KEYS) fields[key] = marks.has(key) ? marks.get(key) : UNMARKED;
65
+ return fields;
66
+ },
67
+ totalMs() {
68
+ return Math.round(now() - startedAt);
69
+ },
70
+ };
71
+ }
72
+
73
+ /** A number or -1. Never throws: a written field is the only way a phase value reaches the line. */
74
+ function _number(value) {
75
+ return typeof value === 'number' && Number.isFinite(value) ? value : UNMARKED;
76
+ }
77
+
78
+ /** A scalar as text; anything else (a missing field, an object, a function) reads ''. Never throws. */
79
+ function _text(value) {
80
+ const type = typeof value;
81
+ if (type === 'string') return value;
82
+ if (type === 'number' || type === 'boolean' || type === 'bigint') return String(value);
83
+ return '';
84
+ }
85
+
86
+ /**
87
+ * The ONE `[create]` line: the fixed prefix, then the eleven CREATE_PHASE_KEYS in order, then
88
+ * load1/cores. NEVER throws — a line that cannot be built is still a line, because this is the only
89
+ * record that a create happened at all (a bad argument degrades a field to '' or -1, never the
90
+ * caller's create). Every value is coerced through {@link _text}/{@link _number}, and `clock` is used
91
+ * only through the two methods this module itself defines.
92
+ *
93
+ * @param {{ id?: string, agent?: string, forwardedBy?: string,
94
+ * outcome?: 'created'|'duplicate'|'refused'|'failed', code?: string,
95
+ * clock?: ReturnType<typeof createPhaseClock>, load1?: number, cores?: number }} [r]
96
+ * @returns {string} e.g.
97
+ * "[create] id=f9edf6cf agent=claude forwardedBy=ctm-3456-1a2c9c outcome=created code=- totalMs=16912
98
+ * admitMs=2 reserveMs=41 mkdirMs=-1 metaMs=12 warmMs=0 planMs=11 rungMs=3 restoreMs=0 codexMcpMs=-1
99
+ * estimateMs=4 providerMs=15020 load1=76.9 cores=16"
100
+ */
101
+ function formatCreateLine(r) {
102
+ const source = r && typeof r === 'object' ? r : {};
103
+ const clock = source.clock && typeof source.clock.fields === 'function' ? source.clock : null;
104
+ const fields = clock ? clock.fields() : null;
105
+ const values = fields && typeof fields === 'object' ? fields : {};
106
+ const totalMs = clock && typeof clock.totalMs === 'function' ? clock.totalMs() : UNMARKED;
107
+ let line = '[create]'
108
+ + ` id=${_text(source.id).slice(0, 8)}`
109
+ + ` agent=${_text(source.agent) || '-'}`
110
+ + ` forwardedBy=${_text(source.forwardedBy)}`
111
+ + ` outcome=${_text(source.outcome) || 'failed'}`
112
+ + ` code=${_text(source.code) || '-'}`
113
+ + ` totalMs=${_number(totalMs)}`;
114
+ for (const key of CREATE_PHASE_KEYS) line += ` ${key}=${_number(values[key])}`;
115
+ return `${line} load1=${_number(source.load1)} cores=${_number(source.cores)}`;
116
+ }
117
+
118
+ module.exports = { CREATE_PHASE_KEYS, createPhaseClock, formatCreateLine };
@@ -284,6 +284,13 @@ async function createWorkerSession(opts = {}) {
284
284
  }
285
285
 
286
286
  const { agent, harness, workerProfile } = _normalizeWorkerRequest(opts);
287
+ // WP-14 (design D-21, rev 4): the worker TABLE names a dsh worker's harness `'dsh-acp'`, but every
288
+ // proxy-facing decision below (route servability/execution profile, worker-capability records, the
289
+ // minted token's binding) is keyed by the WIRE FACE the child speaks. A dsh child speaks
290
+ // `/v1/messages`, exactly a routed Claude lead's face, so the proxy side is `'claude-code'`;
291
+ // an `'dsh-acp'` capability/binding could never match it (lib/acp/dsh-route-patch.js DSH_HARNESS is
292
+ // the same literal for the same reason). The worker table and the launch recipe keep `'dsh-acp'`.
293
+ const proxyHarness = agent === 'dsh' ? 'claude-code' : harness;
287
294
  if (opts.effort !== undefined && !EFFORT_VALUES.has(opts.effort)) {
288
295
  throw new DelegateError('effort_invalid', 400, `effort must be one of low|medium|high|xhigh, got "${opts.effort}"`);
289
296
  }
@@ -345,17 +352,17 @@ async function createWorkerSession(opts = {}) {
345
352
  }
346
353
  const settingSources = inheritUserSettings === true ? ['user', 'project', 'local'] : ['project', 'local'];
347
354
  const routeStartedAt = Date.now();
348
- const { alias, model, baseUrl, upstreamApis, workerCapabilities, executionProfile: routeProfile, maxOutputTokensFact, routeConfiguredMaxOutput } = await _resolveRoute({ route: opts.route, model: opts.model, agent, harness });
355
+ const { alias, model, baseUrl, upstreamApis, workerCapabilities, executionProfile: routeProfile, maxOutputTokensFact, routeConfiguredMaxOutput } = await _resolveRoute({ route: opts.route, model: opts.model, agent, harness: proxyHarness });
349
356
  // D-7 (routed-worker-visibility-and-review-workers-2026-10-16.html): a review worker is
350
357
  // budgeted like an implementation worker -- the request policy is proxied for BOTH; only the
351
358
  // profile name on the budget sentence and the (later) launch argv differ.
352
359
  const budgeted = workerProfile === 'implementation' || workerProfile === 'review';
353
- const proxied = workerBudgetSetup.isProxiedRecipe({ requestPolicy: budgeted, route: alias }); let exec; try { exec = resolveExecutionProfile({ request: opts, routeProfile, projectConfig: cfg?.data?.worker, harness, proxied }); } catch (err) { throw new DelegateError('execution_profile_invalid', 400, err.message); }
360
+ const proxied = workerBudgetSetup.isProxiedRecipe({ requestPolicy: budgeted, route: alias }); let exec; try { exec = resolveExecutionProfile({ request: opts, routeProfile, projectConfig: cfg?.data?.worker, harness: proxyHarness, proxied }); } catch (err) { throw new DelegateError('execution_profile_invalid', 400, err.message); }
354
361
  const maxTurns = cliMaxTurns(exec.values, proxied);
355
362
  renderedBrief = renderedBriefWithBudget(renderedBrief, exec.values, { proxied, profile: workerProfile });
356
363
  const requestPolicy = budgeted ? policyFromValues(exec.values) : null;
357
- const selection = workerCapabilitySelection.forLaunch({ workerProfile, callerEffort: opts.effort, capabilities: workerCapabilities, modelId: model, harness });
358
- if (selection.error) throw new DelegateError(selection.error, 400, `route "${alias}" has an unsafe capability record for model "${model}" and harness "${harness}"`);
364
+ const selection = workerCapabilitySelection.forLaunch({ workerProfile, callerEffort: opts.effort, capabilities: workerCapabilities, modelId: model, harness: proxyHarness });
365
+ if (selection.error) throw new DelegateError(selection.error, 400, `route "${alias}" has an unsafe capability record for model "${model}" and harness "${proxyHarness}"`);
359
366
  const effectiveEffort = selection.effort, capabilityRevision = selection.revision, executionProfile = { ...exec, ...(proxied ? { lease: { current: 1, ceiling: require('../model-proxy/request-budget').LEASE_CEILING } } : {}), maxOutputTokensFact, outputCapSource: require('../model-proxy/output-cap').effectiveOutputCap({ capabilityMaxOutput: selection.capability?.max_output_tokens, factMaxOutput: maxOutputTokensFact, routeConfiguredMaxOutput }).source };
360
367
  // Admission gates the LAUNCH, right after the route alias is known and before any
361
368
  // proxy/token work happens for it -- never a retry, never a queue, never a concurrency cap:
@@ -426,7 +433,7 @@ async function createWorkerSession(opts = {}) {
426
433
  }
427
434
 
428
435
  token = await workerBudgetSetup.mintInitialToken(deps.oauthProxySupervisor, {
429
- sessionId: id, alias, model, harness, ttlMs: DEFAULT_TOKEN_TTL_MS, policy: requestPolicy, capabilityRevision, capabilityBasis: selection.basis,
436
+ sessionId: id, alias, model, harness: proxyHarness, ttlMs: DEFAULT_TOKEN_TTL_MS, policy: requestPolicy, capabilityRevision, capabilityBasis: selection.basis,
430
437
  delegationInvocationId,
431
438
  }, (err) => new DelegateError('proxy_unready', 503, `could not mint worker token: ${err.message}`));
432
439
 
@@ -535,6 +542,13 @@ async function createWorkerSession(opts = {}) {
535
542
  createCwd: false,
536
543
  _isRestore: false, agentRole: 'worker',
537
544
  workerRow,
545
+ // WP-14 (§9b W-2/W-3): the SAME create path every other worker uses -- deps.createSession is
546
+ // server.js's handleCreatePrepared -> handleCreate, whose structured-session dispatcher
547
+ // (lib/session-create/structured-session.js -> dsh-session.js) owns a non-PTY create. A dsh
548
+ // worker is routed there by its agentType, and its ACP start params (the brief as the first
549
+ // prompt, the routed pick, the MCP set, the report path) ride the launch spec the dsh branch
550
+ // of resolveWorkerLaunchParams built. No other agent ever carries `agentType`/`acp`.
551
+ ...(agent === 'dsh' && launch.acp ? { agentType: 'dsh', routeAlias: launch.acp.routeAlias || null, model: model || null, acp: launch.acp } : {}),
538
552
  });
539
553
  } catch (err) {
540
554
  await _revokeQuietly(token);
@@ -601,7 +615,7 @@ async function createWorkerSession(opts = {}) {
601
615
  bash_calls: 0,
602
616
  });
603
617
  if (typeof deps.broadcastSessionList === 'function') {
604
- try { deps.broadcastSessionList(true); } catch { /* expected: a stale socket/list update cannot invalidate a launched worker */ }
618
+ try { deps.broadcastSessionList(true, { reason: 'worker-launched' }); } catch { /* expected: a stale socket/list update cannot invalidate a launched worker */ }
605
619
  }
606
620
 
607
621
  // Fix round 6: the identity write above is DEFERRED off the create's critical path
@@ -704,6 +718,19 @@ const _computeExitFailure = computeExitFailure;
704
718
  const workerAdmissionExit = createWorkerAdmissionExit({ admission, computeExitFailure, getSupervisor: () => _deps && _deps.oauthProxySupervisor });
705
719
  const { releaseAdmissionOnExit, resetIgnoredConfigWarningsForTest: _resetIgnoredConfigWarningsForTest } = workerAdmissionExit;
706
720
 
721
+ // WP-14 (docs/deepseek-harness-acp-agent-2026-10-28.html §9b W-3, D-21): a dsh worker is not a PTY
722
+ // worker, so `session._workerTurnCounter` (the WorkerStreamObserver) never exists for it and
723
+ // `observer.finalText` is always empty. Its brief turn travels over ACP instead, and its report is
724
+ // the LAST assistant text of that turn: lib/acp/dsh-session-runtime.js accumulates it per
725
+ // `agent_message_chunk` and lib/session-create/dsh-session.js publishes it on the live session as a
726
+ // non-enumerable `_dshFinalText` accessor. The exit path (retireNow below) stamps the same text into
727
+ // runtime_json.finalText, so a status read AFTER the session is gone still reports it.
728
+ function _dshFinalTextFor(session) {
729
+ if (!session) return '';
730
+ const value = session._dshFinalText;
731
+ return typeof value === 'string' ? value : '';
732
+ }
733
+
707
734
  function _probeWorkerFiles(session, reportPath, lastMessagePath, now) {
708
735
  return probeCachedFileState(session, now, () => {
709
736
  const reportPresent = fs.existsSync(reportPath);
@@ -753,7 +780,7 @@ function getWorkerStatus(ctmSessionId, { now = Date.now } = {}) {
753
780
  let failure = null;
754
781
  let reportSource = null;
755
782
  let reportText = '';
756
- const successfulFinalText = boundedWorkerText(observer?.finalText || runtime?.finalText || '');
783
+ const successfulFinalText = boundedWorkerText(observer?.finalText || runtime?.finalText || _dshFinalTextFor(session) || '');
757
784
  if ((failure = workerBudgetSetup.failureForGeneration(runtime, workerRow?.generation || 1))) status = 'failed';
758
785
  else if (reportPresent) {
759
786
  status = 'report_ready';
@@ -861,7 +888,7 @@ function getWorkerStatus(ctmSessionId, { now = Date.now } = {}) {
861
888
  write_tool_calls: observer && Number.isInteger(observer.writerActions) ? observer.writerActions : 0,
862
889
  read_tool_calls: observer ? (Number.isInteger(observer.readToolCalls) ? observer.readToolCalls : 0) : null,
863
890
  bash_calls: observer ? (Number.isInteger(observer.bashCalls) ? observer.bashCalls : 0) : null,
864
- harness: launchRecipe.harness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'claude' ? 'claude-code' : null),
891
+ harness: launchRecipe.harness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'dsh' ? 'dsh-acp' : workerRow?.agent === 'claude' ? 'claude-code' : null),
865
892
  worker_profile: launchRecipe.workerProfile || 'legacy',
866
893
  original_brief_sha256: launchRecipe.originalBriefSha256 || null,
867
894
  rendered_brief_sha256: launchRecipe.renderedBriefSha256 || null,
@@ -1056,7 +1083,7 @@ async function _hideWorker(ctmSessionId, { now = Date.now } = {}) {
1056
1083
  }
1057
1084
  _hideFailures.delete(ctmSessionId);
1058
1085
  console.log(workerHideLogLine(ctmSessionId, deps.dbModule, retireReason, hiddenAtIso));
1059
- if (typeof deps.broadcastSessionList === 'function') deps.broadcastSessionList(true);
1086
+ if (typeof deps.broadcastSessionList === 'function') deps.broadcastSessionList(true, { reason: 'worker-hidden' });
1060
1087
  }
1061
1088
 
1062
1089
  // Lifecycle WP-5 (§5 D-10, §9 S-13): stamps consumed_at exactly once -- called by
@@ -1129,13 +1156,30 @@ function _invalidateWorkerFailureCache(deps, ctmSessionId) {
1129
1156
  session._workerFailure = null;
1130
1157
  }
1131
1158
 
1132
- function markWorkerTerminal(ctmSessionId, { terminalStatus, failure = null, runtime = null, now = Date.now, retry = 0, firstAttemptMs = null } = {}) {
1159
+ function markWorkerTerminal(ctmSessionId, options = {}) {
1160
+ // C7-B1 (worker-terminal-retry-generation-fence-2026-10-27.html §3.2): the options object is
1161
+ // destructured from a named binding (not inline) so the OWN presence of expectedGeneration can
1162
+ // tell "this retry chain carried the generation it began in" apart from "not provided"; a
1163
+ // present-but-invalid target is refused rather than silently treated as unfenced. Every other
1164
+ // option keeps its exact default, and the legacy `|| 1` row interpretation is unchanged.
1165
+ const { terminalStatus, failure = null, runtime = null, now = Date.now, retry = 0, firstAttemptMs = null } = options;
1166
+ const hasExpectedGeneration = Object.prototype.hasOwnProperty.call(options, 'expectedGeneration');
1133
1167
  const deps = _requireDeps();
1134
1168
  let row;
1135
1169
  try { row = deps.dbModule.getWorkerSession(ctmSessionId); } catch { row = null; /* expected: an unreadable row is treated as no worker row, so nothing is stamped or scheduled -- a later exit-path call or the boot reload retries */ }
1136
1170
  // WP-1: a row that no longer exists, or that another path already hid (hidden_at stamped =
1137
1171
  // the worker is retired and its row is out of every listing), ends the retry chain here.
1138
1172
  if (!row || row.hidden_at) return;
1173
+ // C7-B1 (§3.2): the generation this stamp BEGAN in -- captured once on the first entry and
1174
+ // carried verbatim through every retry, never resampled and never taken from runtime.generation
1175
+ // (absent on a boot retirement, possibly stale telemetry). A resume legitimately reopens the
1176
+ // empty-terminal window for its successor generation (worker-continuation.js); this operation
1177
+ // must not spend that window, so a row that has moved on is left with no mutation and no
1178
+ // terminal side effect at all.
1179
+ const observedGeneration = Number(row.generation || 1);
1180
+ const targetGeneration = hasExpectedGeneration ? options.expectedGeneration : observedGeneration;
1181
+ if (!Number.isSafeInteger(targetGeneration) || targetGeneration <= 0) return;
1182
+ if (observedGeneration !== targetGeneration) return;
1139
1183
  const nowMs = typeof now === 'function' ? now() : Number(now);
1140
1184
  const nowIso = new Date(nowMs).toISOString();
1141
1185
  const patch = {};
@@ -1167,8 +1211,12 @@ function markWorkerTerminal(ctmSessionId, { terminalStatus, failure = null, runt
1167
1211
  });
1168
1212
  }
1169
1213
  if (Object.keys(patch).length) {
1214
+ let accepted;
1170
1215
  try {
1171
- deps.dbModule.updateWorkerSession(ctmSessionId, patch);
1216
+ // C7-B1 (§3.2): the write goes through the existing helper with the generation fence
1217
+ // bound out-of-band (never inside the patch), so a row that advanced since the read above
1218
+ // matches zero rows instead of being stamped by a stale operation.
1219
+ accepted = deps.dbModule.updateWorkerSession(ctmSessionId, patch, { expectedGeneration: targetGeneration });
1172
1220
  } catch (err) {
1173
1221
  // WP-7 live finding: a busy write lock fails FAST and the old early return also dropped the wait wake + terminal sentinel -- disposition is now REPORT + retry of the whole stamp.
1174
1222
  // WP-1: that retry has NO attempt ceiling -- a transient lock error is not the stamp's
@@ -1181,10 +1229,17 @@ function markWorkerTerminal(ctmSessionId, { terminalStatus, failure = null, runt
1181
1229
  if (['SQLITE_WRITE_LOCK_BUSY', 'SQLITE_BUSY', 'SQLITE_LOCKED'].includes(err && err.code)) {
1182
1230
  const firstAtMs = firstAttemptMs ?? nowMs;
1183
1231
  if (retry === 5) console.warn(`[delegate-worker] terminal stamp still busy after 6 attempts (${String((err && err.code) || 'write_failed').slice(0, 48)}); retrying every ${TERMINAL_STAMP_RETRY_CAP_MS} ms`);
1184
- return void workerLedger.trackTerminalWork(new Promise((resolve) => setTimeout(() => { try { markWorkerTerminal(ctmSessionId, { terminalStatus, failure, runtime, now, retry: retry + 1, firstAttemptMs: firstAtMs }); } finally { resolve(); } }, Math.min(100 * (retry + 1), TERMINAL_STAMP_RETRY_CAP_MS)).unref?.()));
1232
+ // The retry carries the SAME captured generation, so the fence is re-applied against
1233
+ // whatever the row says when it fires rather than re-derived from a newer row.
1234
+ return void workerLedger.trackTerminalWork(new Promise((resolve) => setTimeout(() => { try { markWorkerTerminal(ctmSessionId, { terminalStatus, failure, runtime, now, retry: retry + 1, firstAttemptMs: firstAtMs, expectedGeneration: targetGeneration }); } finally { resolve(); } }, Math.min(100 * (retry + 1), TERMINAL_STAMP_RETRY_CAP_MS)).unref?.()));
1185
1235
  }
1186
1236
  console.warn(`[delegate-worker] terminal stamp failed (${String((err && err.code) || "write_failed").slice(0, 48)})`); return;
1187
1237
  }
1238
+ // C7-B1 (§3.2): a refused write is not a hint -- a definite false exits here, BEFORE the
1239
+ // local row merge, the failure-cache invalidation, the terminal publication/ledger, the
1240
+ // sentinel/journal and the retention arm. Legacy producers that return undefined keep their
1241
+ // existing behavior; the production helper always returns a boolean.
1242
+ if (accepted === false) return;
1188
1243
  row = { ...row, ...patch };
1189
1244
  if (retry > 0) console.log(`[delegate-worker] terminal stamp landed for ${ctmSessionId} after ${retry + 1} attempts in ${nowMs - (firstAttemptMs ?? nowMs)} ms`);
1190
1245
  _invalidateWorkerFailureCache(deps, ctmSessionId);
@@ -1228,13 +1283,20 @@ const _TERMINAL_STATUSES = new Set(['report_ready', 'exited', 'failed']);
1228
1283
 
1229
1284
  // Callers don't await: a PROXIED worker is first stamped with the proxy's journaled stop record (one async read),
1230
1285
  // so that deferred stamp is tracked by the terminal settle (its sentinel/journal writes start only after the read).
1286
+ // C7-B2-P1 (docs/worker-deferred-stop-record-generation-2026-10-27.html §5 D2, §6): the helper's captured
1287
+ // numeric generation is forwarded verbatim into the deferred retirement, so the callback retires the
1288
+ // generation the exit began in rather than whatever the row says once the awaited read resolves. The
1289
+ // proxyless/unreadable-row path calls run() with no argument and keeps its synchronous legacy behavior.
1231
1290
  function retireWorkerOnExit(session, { now = Date.now } = {}) {
1232
1291
  if (!session || session.agentRole !== 'worker' || !session.id) return undefined;
1233
- const result = workerBudgetSetup.retireAfterStopRecord(() => _requireDeps().dbModule, session.id, _readWorkerLaunchRecipe, () => retireNow(session, now));
1292
+ const result = workerBudgetSetup.retireAfterStopRecord(() => _requireDeps().dbModule, session.id, _readWorkerLaunchRecipe, (expectedGeneration) => retireNow(session, now, expectedGeneration));
1234
1293
  return result && typeof result.then === 'function' ? workerLedger.trackTerminalWork(result) : result;
1235
1294
  }
1236
1295
 
1237
- function retireNow(session, now) {
1296
+ // C7-B2-P1 (§5 D2, §6): `expectedGeneration` is an INTERNAL continuation argument -- the numeric
1297
+ // generation captured before the deferred stop-record read. undefined means the legacy proxyless /
1298
+ // unreadable-row path, which keeps its exact behavior.
1299
+ function retireNow(session, now, expectedGeneration) {
1238
1300
  let result;
1239
1301
  try {
1240
1302
  result = getWorkerStatus(session.id, { now });
@@ -1242,6 +1304,9 @@ function retireNow(session, now) {
1242
1304
  /* expected: a status derivation that throws at exit (deps not configured, db closing during shutdown) cannot name a terminal status, so the row is left un-stamped and retention degrades to "never auto-hidden" rather than stamping a guess */
1243
1305
  return;
1244
1306
  }
1307
+ // A provided target differing from current-row status exits before terminal side effects.
1308
+ // Omission retains the legacy proxyless/unreadable-row path.
1309
+ if (expectedGeneration !== undefined && result.generation !== expectedGeneration) return;
1245
1310
  if (!_TERMINAL_STATUSES.has(result.status)) return;
1246
1311
  // F1: invalidate unconditionally here too -- markWorkerTerminal only invalidates on the
1247
1312
  // branch that actually writes failure_json (row.terminal_at was empty); a racing/duplicate
@@ -1257,10 +1322,15 @@ function retireNow(session, now) {
1257
1322
  contextTokens: observer ? observer.contextTokens : null,
1258
1323
  peakContextTokens: observer ? observer.peakContextTokens : null,
1259
1324
  compactions: observer ? observer.compactions : [],
1260
- finalText: observer ? observer.finalText : '', cliReportedCostUsd: observer ? observer.cliReportedCostUsd : null,
1325
+ finalText: observer ? observer.finalText : _dshFinalTextFor(session), cliReportedCostUsd: observer ? observer.cliReportedCostUsd : null,
1261
1326
  providerThreadId: observer ? observer.providerThreadId : '',
1262
1327
  };
1263
- markWorkerTerminal(session.id, { terminalStatus: result.status, failure: result.failure, runtime, now });
1328
+ // The target is spread in ONLY when this call actually carries one: B1 rejects a present-but-invalid
1329
+ // guard (a present `undefined` key is invalid), so the legacy path must omit the key, not pass undefined.
1330
+ markWorkerTerminal(session.id, {
1331
+ terminalStatus: result.status, failure: result.failure, runtime, now,
1332
+ ...(expectedGeneration === undefined ? {} : { expectedGeneration }),
1333
+ });
1264
1334
  }
1265
1335
 
1266
1336
  // WP-2 (worker-terminal-stamp-durable-2026-10-26 D-2/D-3): one idempotent read repair for a