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
@@ -4,6 +4,15 @@
4
4
  // the ONE fingerprint definition lives in lib/session-create/identity.js; this module stamps it on a
5
5
  // session it fully owned and compares it on the next same-id create.
6
6
  const { createFingerprint } = require('./identity');
7
+ // WP-0a (docs/session-create-accept-then-complete-2026-11-01.html §6.1 D-8): the phase clock and the
8
+ // one `[create]` line. Every phase of this measured create is marked HERE — the provider prepare, the
9
+ // PTY spawn and the `created` send are inside the awaited `handleCreate` call and are the last phase
10
+ // (`providerMs`), so nothing else has to read the clock; `createFingerprint` reads only its nine
11
+ // named fields.
12
+ const { createPhaseClock, formatCreateLine } = require('./create-phases');
13
+ // The one-hop `X-CTM-Forwarded-By` accessor (never a second header reader) and the box's own load.
14
+ const { forwardedByOf } = require('../remote-machine-create');
15
+ const os = require('node:os');
7
16
 
8
17
  // WP-2b (docs/session-model-authority-and-display-2026-10-15.html §9): the COMPLETE prepared-create
9
18
  // orchestration, moved verbatim out of server.js's `handleCreatePrepared`. It owns one whole
@@ -41,6 +50,22 @@ const { createFingerprint } = require('./identity');
41
50
  // stays the generation runtime's business).
42
51
  const _inflightCreates = new Map();
43
52
 
53
+ /** WP-0a (§6.1): the hop that FORWARDED this create, or '' for a local browser create. */
54
+ function _forwardedBy(ws) {
55
+ return String(forwardedByOf({ ws }) || '');
56
+ }
57
+
58
+ /**
59
+ * WP-0a (§6.1): write the one `[create]` line to the console the host injected (server.js passes the
60
+ * process console). A host that hands over a partial console still prints through the real one, and a
61
+ * console without `log` is skipped rather than thrown from the create's `finally` — telemetry may
62
+ * never turn a completed create into a rejection.
63
+ */
64
+ function _logCreateLine(console_, line) {
65
+ const sink = console_ && typeof console_.log === 'function' ? console_ : globalThis.console;
66
+ if (sink && typeof sink.log === 'function') sink.log(line);
67
+ }
68
+
44
69
  function createPreparedSessionCreate(host) {
45
70
  const {
46
71
  // Admission / identity
@@ -81,55 +106,127 @@ function createPreparedSessionCreate(host) {
81
106
  // WP-4 (§5 D-13): admission, then the in-flight claim, then the unchanged orchestration. The
82
107
  // claim's `finally` wraps the WHOLE body, so every exit of the orchestration releases it -- and no
83
108
  // line of the orchestration itself had to move to make that true.
109
+ //
110
+ // WP-0a (§6.1 D-8): that same `finally` (now wrapping the ADMISSION too, so a duplicate re-answer,
111
+ // an in-flight refusal and an unrecognized-profile refusal are covered as well) writes exactly ONE
112
+ // `[create]` line per create, from the clock this handler owns — every phase, `providerMs` (the
113
+ // awaited `handleCreate`) included, is marked inside this module. The line is the only new output:
114
+ // no frame, timer, code path or return value changed.
84
115
  async function handleCreatePrepared(ws, msg) {
85
- if (host._ownerRecovery.rejectRequest(ws, msg)) return null; const id = msg?.id || crypto.randomUUID();
86
- const preparedMsg = { ...(msg || {}), id };
87
- // WP-1 (§6.1 S-3): reject an unrecognized mcp_profile rather than silently defaulting -- pure input validation, deliberately AHEAD of the durable generation reservation (a typo'd profile must never depend on, or consume, store availability).
88
- const _rawMcpProfile = preparedMsg.mcp_profile ?? preparedMsg.mcpProfile;
89
- if (_rawMcpProfile !== undefined && _rawMcpProfile !== null && String(_rawMcpProfile).trim() !== '' && !_sessionMcpProfileSetting(preparedMsg)) {
90
- if (ws?.readyState === 1) _wsSend(ws, JSON.stringify({ type: 'error', code: 'mcp_profile_invalid', message: `Unknown mcp_profile: ${JSON.stringify(_rawMcpProfile)}` }));
91
- return null;
92
- }
93
- // WP-4 (§5 D-12/D-13): a client-supplied id is the Idempotency-Key, and both duplicate answers
94
- // are decided HERE, before any generation reservation, plan, markSpawning or markLive:
95
- // - the id names a LIVE session spawned by an identical create => re-answer ONE `created`
96
- // frame (same builder a fresh create uses) and return it; nothing is attached or rolled back;
97
- // - an identical create is still in flight => one typed `create_in_progress` refusal.
98
- // A DIFFERENT fingerprint is NOT a duplicate (D-14): it walks today's path (attach, or the
99
- // generation runtime's model-switch relaunch) and leaves the other fingerprint's entry alone.
100
- let _claimedInflight = false;
101
- const fingerprint = msg?.id ? createFingerprint(preparedMsg) : '';
102
- if (fingerprint) {
103
- const live = getSession(id);
104
- if (ws && live?.ptyProcess && live._createFingerprint === fingerprint) {
105
- sendNativeSessionCreated(ws, live);
106
- return live;
107
- }
108
- const inFlight = _inflightCreates.get(id);
109
- if (inFlight && inFlight.fingerprint === fingerprint) {
110
- sendPreparedError(ws, {
111
- type: 'error',
112
- code: 'create_in_progress',
113
- id,
114
- message: 'A create for this session is already in progress',
115
- });
116
+ // `report` is this create's own running outcome: the phase clock, the exit word, the last typed
117
+ // code and the agent word. It is mutated by the orchestration below and read only by the `finally`.
118
+ const report = {
119
+ clock: createPhaseClock(),
120
+ outcome: 'failed', // 'created' | 'duplicate' | 'refused' | 'failed'; the last is the safe default
121
+ code: '-',
122
+ // The launch's agent, filled in by the orchestration the moment it resolves it (the same
123
+ // detectAgentType call it already made); a refusal before that keeps the client's own word.
124
+ agent: typeof msg?.agentType === 'string' && msg.agentType ? msg.agentType : '-',
125
+ // The last typed code this create reported (a refusal's own code, or sendPreparedError's
126
+ // payload.code). Kept here so the `finally` can name the exit whatever produced it.
127
+ noteCode(value) {
128
+ if (value !== undefined && value !== null && value !== '') this.code = String(value);
129
+ },
130
+ };
131
+ let id = '';
132
+ let claimedInflight = false;
133
+ try {
134
+ if (host._ownerRecovery.rejectRequest(ws, msg)) return null;
135
+ id = msg?.id || crypto.randomUUID();
136
+ const preparedMsg = { ...(msg || {}), id, _createPhaseClock: report.clock };
137
+ // WP-1 (§6.1 S-3): reject an unrecognized mcp_profile rather than silently defaulting -- pure input validation, deliberately AHEAD of the durable generation reservation (a typo'd profile must never depend on, or consume, store availability).
138
+ const _rawMcpProfile = preparedMsg.mcp_profile ?? preparedMsg.mcpProfile;
139
+ if (_rawMcpProfile !== undefined && _rawMcpProfile !== null && String(_rawMcpProfile).trim() !== '' && !_sessionMcpProfileSetting(preparedMsg)) {
140
+ if (ws?.readyState === 1) _wsSend(ws, JSON.stringify({ type: 'error', code: 'mcp_profile_invalid', message: `Unknown mcp_profile: ${JSON.stringify(_rawMcpProfile)}` }));
141
+ report.outcome = 'refused';
142
+ report.noteCode('mcp_profile_invalid');
116
143
  return null;
117
144
  }
118
- if (!inFlight) { _inflightCreates.set(id, { fingerprint }); _claimedInflight = true; }
119
- }
120
- try {
121
- return await _prepareCreateAdmitted(ws, msg, preparedMsg, id, fingerprint);
145
+ // WP-4 (§5 D-12/D-13): a client-supplied id is the Idempotency-Key, and both duplicate answers
146
+ // are decided HERE, before any generation reservation, plan, markSpawning or markLive:
147
+ // - the id names a LIVE session spawned by an identical create => re-answer ONE `created`
148
+ // frame (same builder a fresh create uses) and return it; nothing is attached or rolled back;
149
+ // - an identical create is still in flight => one typed `create_in_progress` refusal.
150
+ // A DIFFERENT fingerprint is NOT a duplicate (D-14): it walks today's path (attach, or the
151
+ // generation runtime's model-switch relaunch) and leaves the other fingerprint's entry alone.
152
+ const fingerprint = msg?.id ? createFingerprint(preparedMsg) : '';
153
+ if (fingerprint) {
154
+ const live = getSession(id);
155
+ if (ws && live?.ptyProcess && live._createFingerprint === fingerprint) {
156
+ sendNativeSessionCreated(ws, live);
157
+ report.outcome = 'duplicate';
158
+ return live;
159
+ }
160
+ const inFlight = _inflightCreates.get(id);
161
+ if (inFlight && inFlight.fingerprint === fingerprint) {
162
+ sendPreparedError(ws, {
163
+ type: 'error',
164
+ code: 'create_in_progress',
165
+ id,
166
+ message: 'A create for this session is already in progress',
167
+ });
168
+ report.outcome = 'duplicate';
169
+ report.noteCode('create_in_progress');
170
+ return null;
171
+ }
172
+ if (!inFlight) { _inflightCreates.set(id, { fingerprint }); claimedInflight = true; }
173
+ }
174
+ // WP-0a (§6.1): admission (owner recovery, input validation, both idempotency answers) ends here.
175
+ report.clock.mark('admitMs');
176
+ // WP-2 (§6.2 D-2): the box says `create-accepted` ONCE, the instant admission is over and
177
+ // BEFORE the first slow phase. Every awaited phase from here on (the generation reservation,
178
+ // launch planning, the scrollback/rung/preflight work, the codex-MCP readiness await, the PTY
179
+ // spawn and the `created` send) is a wait the hub's phase-A timer would otherwise burn as a
180
+ // timeout on a loaded box, so the acceptance is the last thing said before the first of them.
181
+ // The three exits ABOVE return before this line and therefore never accept: the live duplicate
182
+ // (D-12) and the in-flight duplicate (D-13) already answer for themselves, and an unrecognized
183
+ // mcp_profile (WP-1) is a refusal. Same injected `_wsSend` and the same `readyState === 1` gate
184
+ // the mcp_profile refusal above uses; the create's own flow is otherwise untouched.
185
+ if (ws && ws.readyState === 1) {
186
+ try {
187
+ _wsSend(ws, JSON.stringify({
188
+ type: 'create-accepted',
189
+ id,
190
+ load1: Math.round(os.loadavg()[0] * 10) / 10,
191
+ cores: os.cpus().length,
192
+ at: Date.now(),
193
+ }));
194
+ } catch { /* expected: create-accepted is advisory — a socket that cannot take it is the hub's own close/timeout path, and the create proceeds */ }
195
+ }
196
+ const created = await _prepareCreateAdmitted(ws, msg, preparedMsg, id, fingerprint, report);
197
+ report.outcome = created ? 'created' : 'failed';
198
+ return created;
122
199
  } finally {
123
- if (_claimedInflight) _inflightCreates.delete(id);
200
+ if (claimedInflight) _inflightCreates.delete(id);
201
+ _logCreateLine(console, formatCreateLine({
202
+ id,
203
+ agent: report.agent,
204
+ forwardedBy: _forwardedBy(ws),
205
+ outcome: report.outcome,
206
+ code: report.code,
207
+ clock: report.clock,
208
+ load1: Math.round(os.loadavg()[0] * 10) / 10,
209
+ cores: os.cpus().length,
210
+ }));
124
211
  }
125
212
  }
126
213
 
127
214
  // The orchestration itself: byte-for-byte the body that used to be handleCreatePrepared's, from
128
215
  // the generation reservation on, plus the one D-11 fingerprint stamp on the owned success path.
129
216
  // Split out ONLY so the D-13 claim above can wrap every exit.
130
- async function _prepareCreateAdmitted(ws, msg, preparedMsg, id, fingerprint) {
217
+ async function _prepareCreateAdmitted(ws, msg, preparedMsg, id, fingerprint, report) {
218
+ // WP-0a (§6.1 S-7): one `clock.mark(key)` after each awaited phase of this orchestration. The
219
+ // clock is the one carried on the prepared message, so provider-process.js and response.js mark
220
+ // the SAME clock across the whole create (see lib/session-create/create-phases.js).
221
+ const clock = report.clock;
131
222
  const reserved = _codingSessionGenerationRuntime.revalidateReservation(await _codingSessionGenerationRuntime.reserveSessionGeneration(id));
132
- if (!reserved.ok) { recordSessionDiagnostic(id, 'launch-generation-refused', { code: reserved.code, message: reserved.message }); if (ws?.readyState === 1) _wsSend(ws, JSON.stringify({ type: 'error', code: reserved.code, message: `Launch refused: ${reserved.message}` })); return null; }
223
+ clock.mark('reserveMs');
224
+ if (!reserved.ok) {
225
+ recordSessionDiagnostic(id, 'launch-generation-refused', { code: reserved.code, message: reserved.message });
226
+ report.noteCode(reserved.code);
227
+ if (ws?.readyState === 1) _wsSend(ws, JSON.stringify({ type: 'error', code: reserved.code, message: `Launch refused: ${reserved.message}` }));
228
+ return null;
229
+ }
133
230
  const generation = reserved.generation;
134
231
  // WP-15e: an explicit (non-restore) create for a blocked id is the user's resume-from-store launch; drop the block.
135
232
  if (msg?.id && !preparedMsg._isRestore && isSessionResumeBlocked(id)) { clearSessionResumeBlocked(id); const blocked = getSession(id); if (blocked) blocked._resumeBlocked = false; }
@@ -138,12 +235,14 @@ function createPreparedSessionCreate(host) {
138
235
  if (!path.isAbsolute(requestedCwd)) requestedCwd = path.join(serverConfig.HOME || '', requestedCwd);
139
236
  try {
140
237
  await fs.promises.mkdir(requestedCwd, { recursive: true });
238
+ clock.mark('mkdirMs');
141
239
  preparedMsg.cwd = requestedCwd;
142
240
  preparedMsg.createCwd = false;
143
241
  if (ws?.readyState === 1) {
144
242
  _wsSend(ws, JSON.stringify({ type: 'toast', message: `Created folder ${requestedCwd}`, level: 'success' }));
145
243
  }
146
244
  } catch (error) {
245
+ report.noteCode('launch_cwd_create_failed');
147
246
  if (ws?.readyState === 1) {
148
247
  _wsSend(ws, JSON.stringify({ type: 'error', code: 'launch_cwd_create_failed', message: `Could not create folder: ${error.message}` }));
149
248
  }
@@ -151,6 +250,9 @@ function createPreparedSessionCreate(host) {
151
250
  }
152
251
  }
153
252
  const initialAgentType = detectAgentType(preparedMsg.cmd || preparedMsg.shell || serverConfig.SHELL || '/bin/zsh');
253
+ // WP-0a (§6.1): the agent word for the `[create]` line, taken from the launch's own detection
254
+ // (never a second call site), so the line can never disagree with the plan that was built.
255
+ report.agent = initialAgentType || report.agent;
154
256
  const initialResume = extractResumeTarget(initialAgentType, Array.isArray(preparedMsg.args) ? preparedMsg.args : []);
155
257
  const launchCwd = String(preparedMsg.cwd || serverConfig.HOME || '').replace(/^~/, serverConfig.HOME);
156
258
  // WI-6 item 5: only ever computed when the caller hasn't already supplied one — reused
@@ -172,6 +274,7 @@ function createPreparedSessionCreate(host) {
172
274
  // declared 'interactive' class (no downgrade needed here, unlike the deferred
173
275
  // auto-resume path in _startDeferredRestoreSessionNow).
174
276
  }, { timeoutMs: 10_000 });
277
+ clock.mark('metaMs');
175
278
  _cacheSessionOwnershipProjection(id, launchMetadata?.resolved || launchMetadata || null);
176
279
  const mcpProfileSetting = _sessionMcpProfileSetting(preparedMsg); // WP-6/WP-1: '' = no setting (unrecognized already rejected above)
177
280
  const warmPlanInputs = await _launchPlanWarmInputs({
@@ -180,6 +283,7 @@ function createPreparedSessionCreate(host) {
180
283
  launchMetadata,
181
284
  mcpProfile: mcpProfileSetting,
182
285
  });
286
+ clock.mark('warmMs');
183
287
  const prepared = await _launchPlanCoordinator.prepare(id, generation, {
184
288
  cmd: preparedMsg.cmd || preparedMsg.shell || serverConfig.SHELL || '/bin/zsh',
185
289
  args: Array.isArray(preparedMsg.args) ? preparedMsg.args : [],
@@ -201,6 +305,7 @@ function createPreparedSessionCreate(host) {
201
305
  lane: 'interactive', // always a real launch, never launch-plan-pool maintenance
202
306
  transcriptTrashRoot: SESSION_TRANSCRIPT_TRASH_ROOT, // WP-2 R8: findTrashedTranscript() seam
203
307
  }, previousPlan ? { replacesPlan: previousPlan } : undefined);
308
+ clock.mark('planMs');
204
309
  if (prepared?.plan) _noteLaunchPlanReadinessGeneration(prepared.plan);
205
310
  return prepared;
206
311
  };
@@ -223,14 +328,17 @@ function createPreparedSessionCreate(host) {
223
328
  result = await launchPlanPromise;
224
329
  }
225
330
  } catch (error) {
331
+ report.noteCode(error?.code || 'launch_plan_failed');
226
332
  sendPreparedError(ws, { type: 'error', code: error?.code || 'launch_plan_failed', message: 'Could not prepare this session launch.' });
227
333
  return null;
228
334
  }
229
335
  if (result.status === 'stale') return null;
230
336
  const rungHook = await _resolveMissingTranscriptRung(id, result.plan, initialAgentType);
337
+ clock.mark('rungMs');
231
338
  if (rungHook.restored) {
232
339
  // The archived copy is back on disk: prepare the launch again and continue natively.
233
340
  try { result = await runLaunchPlan(result.plan); } catch (error) {
341
+ report.noteCode(error?.code || 'launch_plan_failed');
234
342
  sendPreparedError(ws, { type: 'error', code: error?.code || 'launch_plan_failed', message: 'Could not prepare this session launch.' });
235
343
  return null;
236
344
  }
@@ -239,6 +347,7 @@ function createPreparedSessionCreate(host) {
239
347
  const resumePreflight = rungHook.restored ? result.plan.resume?.preflight : (rungHook.preflight || result.plan.resume?.preflight);
240
348
  if (result.plan.blockReason) {
241
349
  const code = String(result.plan.blockReason.code || 'launch_blocked');
350
+ report.noteCode(code);
242
351
  _launchPlanCoordinator.markBlocked(id, generation, code, result.plan);
243
352
  const notifiedAsResumeFailure = resumePreflight?.ok === false
244
353
  ? _notifyPreparedResumePreflightFailure(id, ws, result.plan.agentType || initialAgentType, resumePreflight)
@@ -259,13 +368,16 @@ function createPreparedSessionCreate(host) {
259
368
  try { await transcriptSource.copyBakToMissingLive(resumePreflight.transcriptPath); }
260
369
  catch (error) {
261
370
  _launchPlanCoordinator.markFailed(id, generation, 'launch_transcript_restore_failed', result.plan);
371
+ report.noteCode('launch_transcript_restore_failed');
262
372
  if (ws?.readyState === 1) {
263
373
  _wsSend(ws, JSON.stringify({ type: 'error', code: 'launch_transcript_restore_failed', message: 'Could not restore the local transcript backup.' }));
264
374
  }
265
375
  return null;
266
376
  }
267
377
  }
378
+ clock.mark('restoreMs');
268
379
  await _awaitCodexMcpReadinessForPlan(id, result.plan, { source: 'create', announce: null });
380
+ clock.mark('codexMcpMs');
269
381
  // The resume-ready estimate is carried on the CREATE MESSAGE (`_resumeReadyEstimate`), exactly
270
382
  // like `_restoreSeedSnapshot` below -- never written onto `result.plan`. The plan is
271
383
  // deep-frozen by lib/launch-plan-pool.js's deepFreezePlan(), so `result.plan.X = ...` throws a
@@ -281,6 +393,9 @@ function createPreparedSessionCreate(host) {
281
393
  agentType: result.plan.agentType,
282
394
  fileSizeBytes,
283
395
  });
396
+ // WP-0a (§6.1): marked only when an estimate really ran — a fresh create has no resume and
397
+ // reads -1, which is exactly "this phase does not exist for this exit".
398
+ clock.mark('estimateMs');
284
399
  }
285
400
  preparedMsg._resumeReadyEstimate = resumeReadyEstimate;
286
401
  if (needsRestoreSeedSnapshot) preparedMsg._restoreSeedSnapshot = restoreSeedSnapshot;
@@ -294,12 +409,20 @@ function createPreparedSessionCreate(host) {
294
409
  _preparedLaunchPlan: result.plan,
295
410
  _ptyStartupAttempt: startupAttempt,
296
411
  });
412
+ // WP-0a (§6.1): the last phase, marked the moment the awaited call RETURNS — provider
413
+ // preparation, PTY spawn and the `created` send all live inside it, and both outcomes reach
414
+ // here: a session object or null. A call that throws never returns, so it stays -1, like every
415
+ // other phase whose await did not resolve (the rollback below logs its own code either way).
416
+ clock.mark('providerMs');
297
417
  } catch (error) {
298
418
  createError = error;
299
419
  }
300
420
  const created = getSession(id);
301
421
  const fullyOwned = !!created && (
302
422
  created.type === 'walle'
423
+ // An ACP (dsh) session has no PTY to commit: its create path registers the row only after the
424
+ // ACP handshake succeeded, and refuses with its own error frame otherwise.
425
+ || created.transport === 'acp'
303
426
  || ptyStartupCommitComplete(created, startupAttempt)
304
427
  );
305
428
  if (createError || !fullyOwned) {
@@ -310,6 +433,7 @@ function createPreparedSessionCreate(host) {
310
433
  const code = createError
311
434
  ? String(createError.code || 'session_setup_failed')
312
435
  : 'session_setup_incomplete';
436
+ report.noteCode(code);
313
437
  _launchPlanCoordinator.markFailed(id, generation, code, result.plan);
314
438
  recordSessionDiagnostic(id, 'session-create-rollback', {
315
439
  code,