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
@@ -262,6 +262,22 @@ async function readLeadPosture({ parent, deps } = {}) {
262
262
  };
263
263
  }
264
264
 
265
+ // WP-14 (docs/deepseek-harness-acp-agent-2026-10-28.html §9b W-9). A dsh worker is the ONE worker
266
+ // harness with no argv at all: it is an ACP child (lib/acp/dsh-session-runtime.js) driven over
267
+ // JSON-RPC, so neither Claude Code's `--settings` sandbox block nor Codex's `-c
268
+ // sandbox_workspace_write...` override can express its confinement. The child's own permission mode
269
+ // is the write rule that exists, so this is an EXPLICIT dsh branch rather than the claude-code
270
+ // fallthrough (which would silently hand dsh a Claude-only settings shape nothing consumes):
271
+ // * a review worker is read-only (D-5: it owns no files and produces a report);
272
+ // * every other profile is workspace-write, which is also the runtime's own default
273
+ // (dsh-session-runtime.js DSH_PERMISSION_MODE) — stated here so the worker's rule is decided in
274
+ // the same place a claude/codex worker's is.
275
+ // `cwd` is NOT re-derived: the caller (delegate-worker.js) already validated it inside the lead's
276
+ // scope (checkCallerAuthority + workerCwdInScope) before any launch spec exists.
277
+ function dshWorkerSandbox({ profile = 'implementation' } = {}) {
278
+ return { permissionMode: profile === 'review' ? 'read-only' : 'workspace-write' };
279
+ }
280
+
265
281
  // WP-4's launch-time half (D-29 table): the argv each posture maps to, per harness.
266
282
  // `harness` is 'claude-code' or 'codex-cli'. No posture (null) is today's argv; an
267
283
  // unresolved caller never reaches a launch (D-10 refused it first). read-only throws --
@@ -336,11 +352,12 @@ function workerClaudeSettingsArgs({ settingSources, cleanupPeriodDays, sandbox }
336
352
  //
337
353
  // D-10 (caller-door doc): an unresolved caller is REFUSED -- 403 caller_unresolved with
338
354
  // reason no_caller (empty/blank input id) | unknown (resolution returns no parent id) |
339
- // lead_not_live (resolution is 'owner', or a 'live' id whose getSession returns null) |
340
- // row_unreadable (D-14: getSession or getWorkerSession threw). The 403 carries next_step
341
- // (worker-failure-classify NEXT_STEPS). Then the unchanged order: worker_nesting_refused
342
- // 403 -> worker_cwd_outside_lead 400 -> worker_exceeds_lead_sandbox 403. Only a LIVE lead
343
- // passes; there is no allowed anonymous delegate (closes F-2 and F-5).
355
+ // lead_not_live (the resolved id -- 'owner' or 'live' -- is not in the live map, so its cwd
356
+ // and posture cannot be read) | row_unreadable (D-14: getSession or getWorkerSession threw).
357
+ // The 403 carries next_step (worker-failure-classify NEXT_STEPS). Then the unchanged order:
358
+ // worker_nesting_refused 403 -> worker_cwd_outside_lead 400 -> worker_exceeds_lead_sandbox
359
+ // 403. Only a LIVE lead passes, whatever the lookup path that named it (D-6); there is no
360
+ // allowed anonymous delegate (closes F-2 and F-5).
344
361
  //
345
362
  // "Is a worker" = getSession(parentId) is a session with agentRole === 'worker' (lib/
346
363
  // session-class.js isWorkerSession) OR getWorkerSession(parentId) returns a row -- the row
@@ -372,10 +389,12 @@ async function checkCallerAuthority(deps, opts = {}, helpers = {}) {
372
389
  const parentId = resolved.parent_ctm_session_id;
373
390
  if (!parentId) throw _callerUnresolved('unknown');
374
391
 
375
- // D-10 reason 3: the resolution is not a LIVE lead ('owner' names a Codex thread whose
376
- // CTM session is not in the live map -- its cwd and posture cannot be read, closes F-5),
377
- // or the 'live' id's session row itself is gone.
378
- if (resolved.parent_resolution !== 'live') throw _callerUnresolved('lead_not_live');
392
+ // D-10 reason 3: the resolved lead is not in the live map. An 'owner' resolution (a Codex
393
+ // thread id whose owning CTM session is not live) is refused HERE, and so is a 'live' id
394
+ // whose session row has gone -- in both cases the cwd and posture cannot be read (closes
395
+ // F-5). D-6: the resolution LABEL is not the gate -- a live owner is a valid caller, since
396
+ // the bearer is one shared runtime token, so presenting an owner's thread id grants exactly
397
+ // what presenting that owner's own CTM id already grants.
379
398
  let parentSession = null;
380
399
  try {
381
400
  parentSession = typeof deps.getSession === 'function' ? deps.getSession(parentId) : null;
@@ -418,7 +437,16 @@ async function checkCallerAuthority(deps, opts = {}, helpers = {}) {
418
437
  throw _authorityError('worker_exceeds_lead_sandbox', 403, READ_ONLY_LEAD_MESSAGE, { lead_posture: leadPosture });
419
438
  }
420
439
 
421
- return { parent_ctm_session_id: parentId, parent_resolution: 'live', leadPosture };
440
+ // D-6: the authorised resolution label is carried through, not flattened to 'live' -- a
441
+ // caller named by its Codex thread id records the owner CTM session it resolved to
442
+ // ('owner'), which is what the worker row/launch record then shows. Only the two
443
+ // resolvable labels can reach here (an empty parent id was refused as 'unknown'), and a
444
+ // resolver returning anything else is recorded as the authorised 'live' it now is.
445
+ return {
446
+ parent_ctm_session_id: parentId,
447
+ parent_resolution: resolved.parent_resolution === 'owner' ? 'owner' : 'live',
448
+ leadPosture,
449
+ };
422
450
  }
423
451
 
424
452
  module.exports = {
@@ -434,5 +462,6 @@ module.exports = {
434
462
  workerClaudeSettingsArgs,
435
463
  readLeadPosture,
436
464
  workerSandboxArgs,
465
+ dshWorkerSandbox,
437
466
  checkCallerAuthority,
438
467
  };
@@ -339,7 +339,7 @@ function stampRestoredWorkerMarkers(session, row) {
339
339
  session._parentAgentSessionId = workerRow.parent_ctm_session_id || '';
340
340
  session._workerAlias = workerRow.route_alias || '';
341
341
  session._workerAgent = workerRow.agent || '';
342
- session._workerHarness = recipe.harness || (workerRow.agent === 'codex' ? 'codex-cli' : 'claude-code');
342
+ session._workerHarness = recipe.harness || (workerRow.agent === 'codex' ? 'codex-cli' : workerRow.agent === 'dsh' ? 'dsh-acp' : 'claude-code');
343
343
  session._workerProfile = recipe.workerProfile || 'legacy';
344
344
  session._workerTerminalAt = String(workerRow.terminal_at || '');
345
345
  if (workerRow.model) session.model_selected = workerRow.model;
@@ -671,7 +671,7 @@ function createWorkerObservability({ getDeps, readWorkerRuntime, getBaseStatus }
671
671
  generation,
672
672
  model: boundedText(workerRow?.model || recipe.model || session?.model_selected || ''),
673
673
  route: boundedText(workerRow?.route_alias || recipe.route || session?._workerAlias || ''),
674
- harness: boundedText(recipe.harness || session?._workerHarness || (workerRow?.agent === 'codex' ? 'codex-cli' : 'claude-code'), 32),
674
+ harness: boundedText(recipe.harness || session?._workerHarness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'dsh' ? 'dsh-acp' : 'claude-code'), 32),
675
675
  worker_profile: boundedText(recipe.workerProfile || session?._workerProfile || 'legacy', 32),
676
676
  evidence: safeEvidence,
677
677
  };
@@ -13,6 +13,13 @@ function agentSessionUserMsgCount(agent) {
13
13
  return maxUserMsgCount(agent.userMsgCount, agent.user_msg_count, agent.message_count);
14
14
  }
15
15
 
16
+ function hasTranscriptBytes(value) {
17
+ // D-6: a session NAME (title/rename_name/displayTitle) is not conversation content, but
18
+ // real transcript bytes on disk are. 2048 matches lib/recent-session-visibility.js:11 and
19
+ // lib/session-empty-file-selection.js:19.
20
+ return Number(value) > 2048;
21
+ }
22
+
16
23
  function agentSessionHasConversationSignal(agent) {
17
24
  if (!agent) return false;
18
25
  return !!(
@@ -23,11 +30,9 @@ function agentSessionHasConversationSignal(agent) {
23
30
  hasText(agent.last_user_content) ||
24
31
  hasText(agent.firstAssistantText) ||
25
32
  hasText(agent.first_assistant_text) ||
26
- hasText(agent.renameName) ||
27
- hasText(agent.rename_name) ||
28
- hasText(agent.displayTitle) ||
29
33
  hasText(agent.aiTitle) ||
30
- hasText(agent.title)
34
+ hasTranscriptBytes(agent.fileSize) ||
35
+ hasTranscriptBytes(agent.file_size)
31
36
  );
32
37
  }
33
38
 
@@ -53,16 +58,14 @@ function recentSessionHasConversationSignal(session, dbRow) {
53
58
  hasText(session?.last_user_content) ||
54
59
  hasText(session?.firstAssistantText) ||
55
60
  hasText(session?.first_assistant_text) ||
56
- hasText(session?.renameName) ||
57
- hasText(session?.rename_name) ||
58
- hasText(session?.displayTitle) ||
59
61
  hasText(session?.aiTitle) ||
60
- hasText(session?.title) ||
62
+ hasTranscriptBytes(session?.fileSize) ||
63
+ hasTranscriptBytes(session?.file_size) ||
61
64
  hasText(dbRow?.first_message) ||
62
65
  hasText(dbRow?.last_user_content) ||
63
66
  hasText(dbRow?.first_assistant_text) ||
64
- hasText(dbRow?.rename_name) ||
65
- hasText(dbRow?.title) ||
67
+ hasTranscriptBytes(dbRow?.file_size) ||
68
+ hasTranscriptBytes(dbRow?.fileSize) ||
66
69
  agents.some(agentSessionHasConversationSignal)
67
70
  );
68
71
  }
@@ -28,6 +28,10 @@ const { sanitizeSessionOps, createOverdueEdgeTrigger } = require('./headless-inf
28
28
  const { dialHostState, shutdownHostSession } = require('./host-adopt-dial');
29
29
  const handoffOrchestrator = require('./host-handoff-orchestrator');
30
30
  const { applyModelHostReceipt, applyStartedModelHostReceipt } = require('./model-host-receipt');
31
+ // WP-1 (S-5): the host-carried launch-environment record is validated at the manager boundary with the
32
+ // same `{}`-or-`{launchEnvironment}` shape the other host-carried fields use.
33
+ const { moveToOwnScope, scopeMoveEnabled } = require('./systemd-scope');
34
+ const { launchEnvironmentMetadata } = require('./launch-environment');
31
35
 
32
36
  // WP-1 (pty-survival design doc, deliverable 1): a host process must survive the
33
37
  // manager's own death (crash, restart) -- fork() alone still ties the child's
@@ -121,6 +125,24 @@ function _stampMainArrival(message) {
121
125
  //
122
126
  // State carries headlessReady so adoption can rebuild a missing mirror without waiting for snapshots.
123
127
  const ADOPT_DIAL_TIMEOUT_MS = 3000;
128
+ // WP-1 (session-host-cgroup-survival design doc, D-1..D-6): on a systemd service host, move a freshly forked
129
+ // survivor (dedicated host or pool) into its own transient scope. Returns null when the move is not applicable
130
+ // (launchd, dev shell, flag off) so callers keep today's synchronous behaviour. The returned promise never
131
+ // rejects; `onSettled(result)` runs first (before any gated frame), and a failed move is REPORTED once.
132
+ function _startScopeMove(child, label, hostId, logger, onSettled) {
133
+ if (!scopeMoveEnabled()) return null;
134
+ return moveToOwnScope(child.pid, { label }).then((result) => {
135
+ if (!result.moved) {
136
+ (logger?.warn ? logger.warn.bind(logger) : console.warn)(`[host-scope] move failed host=${hostId} pid=${child.pid} reason=${result.reason}`);
137
+ }
138
+ try { onSettled(result); } catch (err) {
139
+ // REPORT: a bookkeeping failure must not strand the gated frames.
140
+ (logger?.warn ? logger.warn.bind(logger) : console.warn)(`[host-scope] bookkeeping failed host=${hostId}: ${err && err.message}`);
141
+ }
142
+ return result;
143
+ });
144
+ }
145
+
124
146
  class HostedPtyAdapter {
125
147
  constructor(options = {}) {
126
148
  if (!options.sessionId) throw new Error('HostedPtyAdapter requires sessionId');
@@ -129,6 +151,9 @@ class HostedPtyAdapter {
129
151
  this.args = Array.isArray(options.args) ? options.args : [];
130
152
  this.cwd = options.cwd;
131
153
  this.env = options.env;
154
+ // WP-1 (S-5): the per-spawn launch-environment record this host is told to carry (undefined when the
155
+ // spawn sent none -- an older CTM, or a legacy adapter).
156
+ this.launchEnvironment = launchEnvironmentMetadata(options.launchEnvironment).launchEnvironment;
132
157
  this.cols = Number(options.cols || 120) || 120;
133
158
  this.rows = Number(options.rows || 30) || 30;
134
159
  this.initialHeadlessData = typeof options.initialHeadlessData === 'string' ? options.initialHeadlessData : '';
@@ -171,6 +196,7 @@ class HostedPtyAdapter {
171
196
  args: this.args,
172
197
  cwd: this.cwd,
173
198
  env: this.env,
199
+ launchEnvironment: this.launchEnvironment,
174
200
  cols: this.cols,
175
201
  rows: this.rows,
176
202
  initialHeadlessData: this.initialHeadlessData,
@@ -245,6 +271,16 @@ class HostedPtyAdapter {
245
271
  this._child = child;
246
272
  this.hostPid = child.pid || 0;
247
273
  this.pid = this.hostPid;
274
+ // WP-1 (S-1): own scope; frames are held until it settles (D-6: cgroup membership is inherited at fork).
275
+ this.scopeUnit = null;
276
+ this.scopeReason = null;
277
+ this._scopePending = false;
278
+ this._scopeMove = _startScopeMove(child, `host-${this._hostId}`, this._hostId, this._logger, (r) => {
279
+ this._scopePending = false;
280
+ this.scopeUnit = r.unit;
281
+ this.scopeReason = r.reason;
282
+ });
283
+ this._scopePending = !!this._scopeMove;
248
284
 
249
285
  child.stdout?.on('data', (buf) => {
250
286
  const text = String(buf || '').trimEnd();
@@ -331,6 +367,7 @@ class HostedPtyAdapter {
331
367
  args: this.args,
332
368
  cwd: this.cwd,
333
369
  env: this.env,
370
+ launchEnvironment: this.launchEnvironment,
334
371
  cols: this.cols,
335
372
  rows: this.rows,
336
373
  initialHeadlessData: this.initialHeadlessData,
@@ -341,6 +378,11 @@ class HostedPtyAdapter {
341
378
  }
342
379
 
343
380
  _post(message) {
381
+ // WP-1 D-6: hold every frame (order preserved: then-callbacks run in registration order) until the scope move settled.
382
+ if (!this._pooled && this._scopePending) {
383
+ this._scopeMove.then(() => { this._post(message); });
384
+ return true;
385
+ }
344
386
  if (this._pooled) {
345
387
  // A1: only a truly ABSENT manager refuses here; a present manager keeps its COPY + forwarded scope.
346
388
  if (this._manager === undefined || this._manager === null) { notePostRefusal(message); return false; }
@@ -606,6 +648,11 @@ class SessionHostManager extends EventEmitter {
606
648
  this.poolPath = options.poolPath || path.resolve(__dirname, '..', 'workers', 'session-host-pool-process.js');
607
649
  this.usePool = options.usePool === true;
608
650
  this.logger = options.logger || console; this.isRecoveryProtectedHost = options.isRecoveryProtectedHost;
651
+ // WP-3a (live-defer-wake-adopted-host-death R-6): how the manager stops a host
652
+ // process it has just declared dead. Injected exactly like
653
+ // isRecoveryProtectedHost above -- this lib never learns how to kill a host
654
+ // (server.js owns that), it just asks. Null when the caller supplies none.
655
+ this.retireDeadHost = typeof options.retireDeadHost === 'function' ? options.retireDeadHost : null;
609
656
  this._adoptDialTimeoutMs = Number(options.adoptDialTimeoutMs) > 0 ? Number(options.adoptDialTimeoutMs) : ADOPT_DIAL_TIMEOUT_MS; // test seam (B-4)
610
657
  // WP-0 (pty-survival design doc): registry/socket wiring is entirely
611
658
  // conditional on the caller supplying a dataDir -- this lib never reads
@@ -1623,6 +1670,14 @@ class SessionHostManager extends EventEmitter {
1623
1670
  this._poolChild = child;
1624
1671
  this._poolClosed = false;
1625
1672
  this._poolHostId = `pool-${child.pid}`;
1673
+ // WP-1 (S-2): own scope; no frame reaches the pool until it settles (D-6).
1674
+ this._poolScopeUnit = null;
1675
+ this._poolScopeReason = null;
1676
+ this._poolScopePending = false;
1677
+ this._poolScopeMove = _startScopeMove(child, `pool-${child.pid}`, this._poolHostId, this.logger, (r) => {
1678
+ if (this._poolChild === child) { this._poolScopePending = false; this._poolScopeUnit = r.unit; this._poolScopeReason = r.reason; }
1679
+ });
1680
+ this._poolScopePending = !!this._poolScopeMove;
1626
1681
  this._poolSocketPath = socketPath;
1627
1682
  // WP-1 (deliverable 2): pool-wide control flip, same shape as the dedicated
1628
1683
  // host's per-adapter dial in _startDedicated.
@@ -1750,6 +1805,11 @@ class SessionHostManager extends EventEmitter {
1750
1805
 
1751
1806
  _postToPool(message) {
1752
1807
  const child = this._ensurePool();
1808
+ // WP-1 D-6: hold frames for a pool whose scope move is still in flight (registration order preserved).
1809
+ if (child && this._poolScopePending && this._poolScopeMove) {
1810
+ this._poolScopeMove.then(() => { this._postToPool(message); });
1811
+ return true;
1812
+ }
1753
1813
  // A1: an absent/closed pool posts nothing -- recorded as a refusal, joined CONSERVATIVELY below.
1754
1814
  if (!child || this._poolClosed) { notePostRefusal(message); return false; }
1755
1815
  // WP-1 (deliverable 2): once the pool's control flip has succeeded, ALL
@@ -916,7 +916,9 @@ function registerSessionJobs(scheduler, deps) {
916
916
  const scans = [];
917
917
  const statPaths = new Set();
918
918
  for (const [id, session] of sessions) {
919
- if (!String(session.cmd || '').toLowerCase().includes('claude')) continue;
919
+ // S-6 (D-5): gate on the ONE detector, not a substring — a non-Claude tab under a
920
+ // `claude`-containing path (e.g. an opencode binary under a claude-tools dir) no longer enters.
921
+ if (detectAgentType(session.cmd) !== 'claude') continue;
920
922
  if (!session._claudeSessionId || !session._claudeProjectDir) continue;
921
923
  if (session.type === 'walle') continue;
922
924
  const currentJsonl = path.join(session._claudeProjectDir, `${session._claudeSessionId}.jsonl`);
@@ -124,7 +124,6 @@ function lifecycleConfigFromEnv(env = process.env) {
124
124
  resourceSampleMs: envInt(env, 'CTM_RESOURCE_SAMPLE_MS', 60_000),
125
125
  parkPreSignalGraceMs: envInt(env, 'CTM_PARK_PRE_SIGNAL_GRACE_MS', 50),
126
126
  parkTermGraceMs: envInt(env, 'CTM_PARK_TERM_GRACE_MS', 8_000),
127
- draftTtlMs: envInt(env, 'CTM_PARK_DRAFT_TTL_MS', 24 * 60 * 60_000),
128
127
  prewarm: envBool(env, 'CTM_PREWARM', false),
129
128
  prewarmTtlMs: envInt(env, 'CTM_PREWARM_TTL_MS', 60_000, 1_000),
130
129
  prewarmTopK: envInt(env, 'CTM_PREWARM_TOP_K', 1, 1),
@@ -230,9 +229,12 @@ function evaluatePark(session, host, config) {
230
229
  if (session?.hasPendingInput) protections.push('input');
231
230
  if (Number(session?.queueDepth) > 0) protections.push('queue');
232
231
  if (Number(session?.queueDepth) < 0) protections.push('queue-unknown');
233
- const lastDraftAt = Number(session?.lastDraftAt) || 0;
234
- const draftTtlMs = Math.max(0, Number(config?.draftTtlMs) || 0);
235
- if (session?.hasDraft || (lastDraftAt > 0 && draftTtlMs > 0 && lastDraftAt > now - draftTtlMs)) protections.push('draft');
232
+ // WP-1 (park-draft-truth-from-screen §5 D-1/D-4): `composerDraft` is the verdict the caller read
233
+ // from the agent's own composer row (lib/park-composer-draft.js) — 'text' protects, 'unknown' gets
234
+ // its own protection so only a user-requested park (evaluateManualPark) treats it as no draft.
235
+ // Browser presence and the old keystroke stamp are no longer inputs here (D-5 deleted them).
236
+ if (session?.composerDraft === 'text') protections.push('draft');
237
+ if (session?.composerDraft === 'unknown') protections.push('composer-unknown');
236
238
  if (session?.pinned) protections.push('pinned');
237
239
  if (session?.isActiveTab) protections.push('active-tab');
238
240
  if (session?.isMru) {
@@ -276,6 +278,9 @@ function evaluateManualPark(session, host, config) {
276
278
  isMru: false,
277
279
  recentNonStatusActivityAt: 0,
278
280
  lastActivatedAt: 0,
281
+ // D-4: the user who asked is present, so an unreadable composer is not evidence of a draft --
282
+ // same reason the manual view already drops active-tab and MRU.
283
+ composerDraft: session?.composerDraft === 'text' ? 'text' : 'empty',
279
284
  };
280
285
  return evaluatePark(view, host, {
281
286
  ...config,
@@ -328,6 +333,7 @@ const PARK_PROTECTION_PRIORITY = [
328
333
  'queue',
329
334
  'queue-unknown',
330
335
  'draft',
336
+ 'composer-unknown',
331
337
  'active-tab',
332
338
  'visibility-grace',
333
339
  'pinned',
@@ -25,6 +25,8 @@ const {
25
25
  validateSessionModelIntentRequest,
26
26
  DTO_BYTE_LIMIT,
27
27
  } = require('./session-model-intent-contract');
28
+ // WP-8 (§9b M-10): the owner agent-type list is the ONE declaration in lib/coding-session-model-owner.js.
29
+ const { OWNER_AGENT_TYPES } = require('./coding-session-model-owner');
28
30
 
29
31
  // The EXACT public request body: the four retained target/precondition fields plus the THREE
30
32
  // preconditions (client id, owner, revision). `scope` is NOT a precondition: a missing/invalid scope
@@ -34,7 +36,8 @@ const ACTION_KEYS = Object.freeze([
34
36
  ]);
35
37
  const PRECONDITION_KEYS = Object.freeze(['client_request_id', 'expected_owner', 'expected_intent_revision']);
36
38
  const OWNER_KEYS = Object.freeze(['ctmSessionId', 'agentType', 'providerSessionId', 'processGeneration']);
37
- const AGENT_TYPES = Object.freeze(['claude', 'codex', 'gemini', 'opencode']);
39
+ // Derived from the ONE owner declaration (never a private copy of the four-agent literal).
40
+ const AGENT_TYPES = OWNER_AGENT_TYPES;
38
41
  const SCOPES = Object.freeze(['session', 'session+default']);
39
42
  const CLIENT_REQUEST_ID_MAX = 128;
40
43
  // The ACTUAL accepted approval reference grammar (lib/session-model-intent-contract.js
@@ -145,10 +148,11 @@ function historyPreparationMessage(reason, suppliedMessage = '', { postPark = fa
145
148
  compaction_hash_mismatch: 'The source and target history compaction settings disagree, so the move cannot be verified safely. The current session is still running unchanged.',
146
149
  native_transition_policy_unknown: 'The Codex permission policy for the source or the target could not be read. The current session is still running unchanged.',
147
150
  native_transition_policy_mismatch: 'The Codex permission policy on the target differs from the source, so the history cannot be moved safely. The current session is still running unchanged.',
148
- native_fork_adapter_unqualified: 'This Codex installation or adapter is not qualified to carry this history over. The current session is still running unchanged.',
151
+ native_fork_adapter_unqualified: 'The Codex adapter or version metadata this history move needs is unavailable, so it cannot be carried over. The current session is still running unchanged.',
149
152
  native_policy_override_unqualified: 'This source session uses a Codex policy override that cannot yet be reproduced safely for history transfer. The current session is still running unchanged.',
150
153
  native_token_usage_record_invalid: 'The Codex usage record for this session could not be verified, so the history size cannot be trusted. The current session is still running unchanged.',
151
154
  history_media_not_portable: 'This history contains an image, and the target model cannot receive images. The current session is still running unchanged.',
155
+ history_configuration_not_portable: 'This history contains Codex configuration records that the target model cannot carry over. The current session is still running unchanged.',
152
156
  // WP-2 (docs/codex-lead-routed-switch-history-handoff-2026-10-21.html §5 D-5/D-6, §6.5): the
153
157
  // encrypted-compaction path. The source model writes a plaintext handoff before the switch, and
154
158
  // each way that handoff can fail says which one it was.
@@ -18,9 +18,13 @@
18
18
 
19
19
  const { createHash } = require('node:crypto');
20
20
  const { CLAUDE_ALIASES } = require('./claude-model-selection-vocabulary');
21
+ // D-2 (docs/lead-model-id-rule-at-tilde-prefix-2026-10-28.html §5): there is exactly ONE model-id
22
+ // rule, and it lives in lib/model-id-rule.js. A second copy here already diverged once.
23
+ const { isValidOverrideModel } = require('./model-id-rule');
24
+ // WP-8 (§9b M-10): the owner agent-type list is the ONE declaration in lib/coding-session-model-owner.js.
25
+ const { OWNER_AGENT_TYPES } = require('./coding-session-model-owner');
21
26
 
22
27
  const DTO_BYTE_LIMIT = 4 * 1024;
23
- const MODEL_ID_MAX = 200;
24
28
  const OWNER_TEXT_MAX_BYTES = 256;
25
29
  const EVIDENCE_MAX_BYTES = 256;
26
30
  const TRANSITION_ID_MAX = 128;
@@ -28,16 +32,17 @@ const CLIENT_REQUEST_ID_MAX = 128;
28
32
  const ROUTE_ID_MAX_BYTES = 256;
29
33
  const TRANSITION_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
30
34
 
31
- // The existing journal request grammar for a model id, including the `[1m]` decoration.
32
- const MODEL_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:/@+\-\[\]]*$/;
33
35
  // The existing journal effort grammar.
34
36
  const EFFORT_RE = /^[a-z]{2,12}$/;
35
37
  // The existing journal bounded ASCII reference grammar (transition ids, client request ids).
36
38
  const BOUNDED_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
37
39
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
38
40
 
39
- const AGENT_TYPES = Object.freeze(['claude', 'codex', 'gemini', 'opencode']);
40
- const HARNESS_AGENT_TYPES = Object.freeze({ 'claude-code': 'claude', 'codex-cli': 'codex' });
41
+ // WP-8 (§9b M-10): derived from the ONE owner declaration in lib/coding-session-model-owner.js.
42
+ const AGENT_TYPES = OWNER_AGENT_TYPES;
43
+ // The harness name a worker profile declares for each agent (lib/create/worker-role-profile.js).
44
+ // WP-8: a dsh worker dispatches over ACP as 'dsh-acp'.
45
+ const HARNESS_AGENT_TYPES = Object.freeze({ 'claude-code': 'claude', 'codex-cli': 'codex', 'dsh-acp': 'dsh' });
41
46
  const SELECTION_KINDS = Object.freeze(['concrete', 'alias', 'policy', 'default']);
42
47
  const EFFORT_ACTIONS = Object.freeze(['none', 'set', 'delete']);
43
48
  const OPERATIONS = Object.freeze(['set-selection', 'effort-only']);
@@ -118,9 +123,7 @@ function requireOwnerText(value, label) {
118
123
  }
119
124
 
120
125
  function requireModelId(value, label) {
121
- if (typeof value !== 'string' || value.length < 1 || value.length > MODEL_ID_MAX || !MODEL_ID_RE.test(value)) {
122
- throw invalid(`${label} is not a bounded model id`);
123
- }
126
+ if (!isValidOverrideModel(value)) throw invalid(`${label} is not a bounded model id`);
124
127
  return value;
125
128
  }
126
129