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
@@ -60,6 +60,7 @@ const { budgetRefusalResponse } = require('./lib/model-proxy/budget-response');
60
60
  const { applyWorkerFinalization, minimumOutputForRequest } = require('./lib/model-proxy/worker-finalization');
61
61
  const routes = require('./lib/model-proxy/routes');
62
62
  const tokens = require('./lib/model-proxy/tokens');
63
+ const { handleLeadTokenRegistration: _handleLeadTokenRegistration } = require('./lib/model-proxy/lead-token-admin');
63
64
  const leadWorkerPicks = require('./lib/model-proxy/lead-worker-picks');
64
65
  const anthropicFace = require('./lib/model-proxy/anthropic-face');
65
66
  const responsesFace = require('./lib/model-proxy/responses-face');
@@ -69,15 +70,23 @@ const nativeEndpoint = require('./lib/native-lead-endpoint');
69
70
  const nativeForwarder = require('./lib/model-proxy/native-claude-forwarder');
70
71
  const { createNativeLeadListener, wrapHttpServerClose } = require('./lib/model-proxy/native-lead-listener');
71
72
  const { getDataDir } = require('./lib/data-dir');
73
+ // WP-9 §9b L-1 (docs/deepseek-harness-acp-agent-2026-10-28.html D-19): the per-request usage writer for
74
+ // a dsh lead token. ACP carries no token counts, so the proxy appends one contract row per completed
75
+ // request to <dataDir>/dsh-usage/<ctmSessionId>.jsonl.
76
+ const { appendDshUsageRow } = require('./lib/acp/dsh-usage-log');
72
77
  const { validateLeadWorkerTarget, safeRefusalReason } = require('./lib/model-proxy/lead-request-validation');
73
78
  const { buildCodexModelsResponse } = require('./lib/harness-model-profile');
79
+ const { normalizeHistoricalAdditionalTools } = require('./lib/model-proxy/historical-tool-declarations');
74
80
  const legacyRelay = require('./lib/model-proxy/legacy-relay');
75
81
  const streamAccountingMod = require('./lib/model-proxy/stream-accounting');
76
82
  const instanceRecord = require('./lib/model-proxy/proxy-instance-record');
77
83
  const handoff = require('./lib/model-proxy/handoff');
78
84
  const {
79
- unsupportedSafeguards, logReviewDiagnostic,
85
+ unsupportedSafeguards, logReviewDiagnostic, requestClassFromHeaders, serverReviewAsked,
80
86
  } = require('./lib/model-proxy/auto-mode-review');
87
+ const {
88
+ refusalEntry, clientVersion, scopeVerification, warnIfUnverified,
89
+ } = require('./lib/model-proxy/refusal-scope');
81
90
 
82
91
  const PORT = parseInt(process.env.OAUTH_PROXY_PORT || '3459', 10);
83
92
  const HOST = '127.0.0.1';
@@ -451,11 +460,21 @@ async function _handleAdmin(req, res, pathName, ctx) {
451
460
  res.end(JSON.stringify({ error: 'model_required' }));
452
461
  return;
453
462
  }
463
+ // WP-1b (§12a rule 1): an optional `face` names the harness whose wire the probe must dial. The
464
+ // set is closed (`anthropic`, `responses`, or absent = the legacy preference order); anything
465
+ // else is a caller bug, not a probe, so it is answered 400 rather than silently probed on a
466
+ // wire the caller did not ask for.
467
+ const face = body.face;
468
+ if (face !== undefined && face !== null && face !== 'anthropic' && face !== 'responses') {
469
+ res.writeHead(400, { 'Content-Type': 'application/json' });
470
+ res.end(JSON.stringify({ error: 'invalid_face' }));
471
+ return;
472
+ }
454
473
  const requestedTimeout = Number(body.timeoutMs);
455
474
  const timeoutMs = Number.isFinite(requestedTimeout) && requestedTimeout > 0
456
475
  ? Math.min(requestedTimeout, generationProbe.MAX_TIMEOUT_MS)
457
476
  : generationProbe.DEFAULT_TIMEOUT_MS;
458
- const result = await generationProbe.probeGeneration(route, { model: body.model, timeoutMs });
477
+ const result = await generationProbe.probeGeneration(route, { model: body.model, timeoutMs, face: face == null ? undefined : face });
459
478
  res.writeHead(200, { 'Content-Type': 'application/json' });
460
479
  res.end(JSON.stringify(result));
461
480
  return;
@@ -489,6 +508,9 @@ async function _handleAdmin(req, res, pathName, ctx) {
489
508
  nativeTransport: body.nativeTransport,
490
509
  nativeCertFingerprint: body.nativeCertFingerprint,
491
510
  nativeSettingsRef: body.nativeSettingsRef,
511
+ // WP-9 §9b L-2: the OPTIONAL per-request usage mark. It is not secret and not an identity
512
+ // credential of its own — it only tells this proxy to append usage rows for the token's session.
513
+ usageLog: body.usageLog,
492
514
  };
493
515
  return _handleLeadTokenRegistration(res, registration, ctx);
494
516
  }
@@ -559,111 +581,6 @@ async function _handleAdmin(req, res, pathName, ctx) {
559
581
  res.end(JSON.stringify({ error: 'not_found' }));
560
582
  }
561
583
 
562
- // ── WP-1 §6.4/§6.5: the TLS-ready acknowledgment of an mtls-v1 registration ─────────────────────
563
- //
564
- // A legacy (or routed-primary) registration is unchanged: it is synchronous, creates no listener and
565
- // never loads the CA. An `mtls-v1` registration is the one thing that starts this transport, and it is
566
- // acknowledged ONLY once BOTH of these are true:
567
- //
568
- // 1. the strict HTTPS listener is bound and ready, and
569
- // 2. the pending registration has committed against the live registry.
570
- //
571
- // The order matters, and so does the ticket. Between "the registration is well formed" and "the
572
- // listener is ready" the caller is awaiting, which is exactly when a `DELETE /_admin/tokens` can land:
573
- // a plain revalidation would still see the token as absent (it was never live) and commit a grant the
574
- // caller already gave up on. The registry-owned ticket fences that operation, so commit refuses with a
575
- // bounded code and no token is created. A failed bind cancels the ticket and leaves no grant either.
576
- //
577
- // Review item 3 adds the OTHER half of that window: the caller can also simply GO AWAY. The supervisor's
578
- // admin fetch has a 2s budget, and the child's TLS bind can outlive it — so an interrupted registration
579
- // must not leave a live owner behind that the parent never learned about. The response is therefore
580
- // watched from BEFORE the await (a `res.close` listener installed up front, not after the fact), the
581
- // ticket is cancelled the moment the response can no longer be written, and the commit is guarded by a
582
- // re-check on both sides of the await. Nothing is ever written to a closed response.
583
- function _responseIsGone(res) {
584
- if (!res) return true;
585
- if (res.writableEnded) return true; // we already answered
586
- if (res.destroyed) return true; // the socket went away
587
- return false;
588
- }
589
-
590
- async function _handleLeadTokenRegistration(res, registration, ctx) {
591
- const sendJson = (status, payload) => {
592
- // Never write on a response whose client is gone: a torn-down socket has no reader, and writing
593
- // would surface as an unhandled error rather than as the honest "this registration was abandoned".
594
- if (_responseIsGone(res)) return;
595
- res.writeHead(status, { 'Content-Type': 'application/json' });
596
- res.end(JSON.stringify(payload));
597
- };
598
- if (registration.nativeTransport !== tokens.NATIVE_TRANSPORT_MTLS) {
599
- // Existing synchronous contract, byte-for-byte: no listener, no CA, no await.
600
- try {
601
- const result = tokens.registerLeadToken(registration);
602
- sendJson(200, { token: result.token });
603
- } catch (err) {
604
- sendJson(400, { error: err.message });
605
- }
606
- return;
607
- }
608
- let ticket;
609
- try {
610
- // Validated, conflict-checked read-only against the live registry, and captured BEFORE the first
611
- // await: the caller's own object cannot change what commits, a malformed OR already-conflicting
612
- // registration never reaches the listener (no CA load, no bind), and the ticket exists before any
613
- // await can be interrupted.
614
- ticket = tokens.beginLeadTokenRegistration(registration);
615
- } catch (err) {
616
- sendJson(400, { error: err.message });
617
- return;
618
- }
619
- let settled = false;
620
- const cancelOwnTicket = () => {
621
- if (settled) return;
622
- settled = true;
623
- ticket.cancel();
624
- };
625
- // Installed BEFORE the await, so a disconnect that happens while the listener is still binding is
626
- // observed rather than discovered later as an orphaned owner.
627
- const onClientGone = () => {
628
- if (!res.writableEnded) cancelOwnTicket();
629
- };
630
- res.on('close', onClientGone);
631
- try {
632
- // Entry check: a caller that vanished before we even started has already given up on this attempt.
633
- if (_responseIsGone(res)) return;
634
- // This server's OWN controller, never another live server's.
635
- if (!ctx.nativeListener) {
636
- cancelOwnTicket();
637
- sendJson(503, { error: 'native_lead_listener_unavailable' });
638
- return;
639
- }
640
- await ctx.nativeListener.ensureReady();
641
- // Re-check after the await: the interruption window is exactly the one the ticket exists for.
642
- if (_responseIsGone(res)) return;
643
- // The commit is synchronous and happens while the response is still writable, so the ticket is
644
- // retired from the cancellation path here: from this point the grant is real and the only remaining
645
- // hazard is a LOST acknowledgment, which the caller (the supervisor) owns via its pending-revoke
646
- // obligation — the child cannot distinguish "the parent read it" from "the parent timed out".
647
- settled = true;
648
- const committed = ticket.commit();
649
- if (!committed.ok) {
650
- // A revoke/reset/cancel landed while the listener was starting, or the live revalidation found a
651
- // concurrent owner: no grant, and the caller is told why by bounded code only.
652
- sendJson(409, { error: committed.code });
653
- return;
654
- }
655
- sendJson(200, { token: committed.token });
656
- } catch (err) {
657
- cancelOwnTicket();
658
- sendJson(503, { error: (err && err.code) || 'native_lead_listener_unavailable' });
659
- } finally {
660
- // The response is no longer ours to reason about, so the listener and any unsettled ticket are
661
- // released here. An already-committed ticket is untouched (cancel() only moves a PENDING ticket).
662
- res.removeListener('close', onClientGone);
663
- cancelOwnTicket();
664
- }
665
- }
666
-
667
584
  // ── D-2 client faces: /r/<alias>/v1/... ────────────────────────────────
668
585
  function _selectFaceModule(pathSuffix) {
669
586
  // /v1/models is answered by the Responses face only (Codex's pre-turn probe,
@@ -1011,6 +928,23 @@ async function _handleRouted(req, res, pathName, trusted = null, ctx = null) {
1011
928
  rawBody,
1012
929
  telemetry,
1013
930
  }, context);
931
+ // WP-0 (docs/auto-mode-native-lead-subagent-latch-2026-10-30.html §8): the native-lead lane had no
932
+ // observation line at all, so a lead could keep asking for the server-side review with nothing to
933
+ // see. ONE request-side line per generation POST, built only from the client's own headers and the
934
+ // body it already parsed -- never a second parse, a prompt, a token or a model. Results/completion
935
+ // stay 'unobserved': this line is the request, not a claim about the response. It must never throw,
936
+ // so a null body and a 0 status (an aborted dial) are both fine -- the builder bounds them.
937
+ if (endpoint === 'generation' && req.method === 'POST') {
938
+ logReviewDiagnostic({
939
+ pathKind: 'native-lead',
940
+ transport: 'native',
941
+ status: telemetry.status,
942
+ results: 'unobserved',
943
+ completion: 'unobserved',
944
+ requestClass: requestClassFromHeaders(req.headers),
945
+ review: serverReviewAsked(parsedBody, req.headers) ? 'requested' : 'not_requested',
946
+ });
947
+ }
1014
948
  _logProxyRequest(alias, (parsedBody && parsedBody.model) || '-', telemetry);
1015
949
  return;
1016
950
  }
@@ -1159,29 +1093,59 @@ async function _handleRouted(req, res, pathName, trusted = null, ctx = null) {
1159
1093
  faceModule.writeJson(res, 403, faceModule.errorEnvelope(bindingCheck.code, bindingCheck.code));
1160
1094
  return;
1161
1095
  }
1162
- // D-2: the client's own top-level `safeguards` request can only be answered by a
1163
- // server-side review. When CTM itself is translating this POST /v1/messages to a chat
1164
- // wire, say so with the documented 400 instead of dropping the field and paying for a
1165
- // generation the client did not ask for. Native (passthrough), count_tokens, Responses
1166
- // and unknown paths keep their previous behaviour; no provider call or budget
1167
- // reservation happens on this path.
1096
+ const trustedRoutedCodexLead = endpoint === 'generation' && !workerSwap.swapped
1097
+ && requestHarness === 'codex-cli'
1098
+ && leadBinding?.purpose === 'routed-primary' && leadBinding.harness === 'codex-cli'
1099
+ && faceModule === responsesFace;
1100
+ if (trustedRoutedCodexLead) {
1101
+ const normalized = normalizeHistoricalAdditionalTools(parsedBody, { trustedRoutedCodexLead: true });
1102
+ if (!normalized.ok) {
1103
+ detachOwnListeners();
1104
+ invalidLeadRequest(normalized.reason);
1105
+ return;
1106
+ }
1107
+ if (normalized.removedCount > 0) {
1108
+ parsedBody = normalized.body;
1109
+ rawBody = Buffer.from(JSON.stringify(parsedBody));
1110
+ }
1111
+ }
1112
+ // D-2: the client's own top-level `safeguards` (or dangerous-tool-use beta) request can
1113
+ // only be answered by a server-side review. When CTM itself is translating this
1114
+ // POST /v1/messages to a chat wire, say so with the documented 400 instead of dropping
1115
+ // the field and paying for a generation the client did not ask for. The wording is the
1116
+ // registry's conversation-scoped refusal (refusal-scope.js §6): a 400 NAMING the review
1117
+ // tokens would make the client latch server review off for its whole session (§1.2), so
1118
+ // this message names none of them. Native (passthrough), count_tokens, Responses and
1119
+ // unknown paths keep their previous behaviour; no provider call or budget reservation
1120
+ // happens on this path.
1168
1121
  if (faceModule === anthropicFace && req.method === 'POST' && pathSuffix === '/v1/messages') {
1169
1122
  const selection = routes.selectUpstream(route, 'anthropic', parsedBody && parsedBody.model);
1170
- const negotiation = unsupportedSafeguards(parsedBody, selection && selection.mode);
1123
+ const negotiation = unsupportedSafeguards(parsedBody, selection && selection.mode, req.headers);
1171
1124
  if (negotiation) {
1125
+ const entry = refusalEntry('claude-code', 'server-review');
1126
+ const version = clientVersion(entry, req.headers);
1127
+ const scope = scopeVerification(entry, version);
1128
+ warnIfUnverified(entry, version);
1172
1129
  detachOwnListeners();
1173
1130
  telemetry.status = negotiation.status;
1174
1131
  faceModule.writeJson(res, negotiation.status, negotiation.body, telemetry);
1175
1132
  _logProxyRequest(routeAlias, (parsedBody && parsedBody.model) || '-', telemetry);
1176
1133
  // WP-1 AC-1a: the translated cycle answers the review request with CTM's own fixed
1177
1134
  // 400 -- a complete response that carries no review result because this transport
1178
- // cannot. One diagnostic, no provider call, no fabricated verdict.
1135
+ // cannot. One diagnostic, no provider call, no fabricated verdict. `refusal=conversation`
1136
+ // is the measured scope of this wording, and `scope=` records whether the installed
1137
+ // client version is the one the entry was measured on.
1138
+ // WP-0 §8: the same line also names which kind of client request this was, from the
1139
+ // caller's own headers only (never a body value).
1179
1140
  logReviewDiagnostic({
1180
1141
  pathKind: 'routed',
1181
1142
  transport: 'translated',
1182
1143
  status: negotiation.status,
1183
1144
  results: 'unsupported',
1184
1145
  completion: 'complete',
1146
+ requestClass: requestClassFromHeaders(req.headers),
1147
+ refusal: 'conversation',
1148
+ scope,
1185
1149
  });
1186
1150
  return;
1187
1151
  }
@@ -1307,6 +1271,39 @@ async function _handleRouted(req, res, pathName, trusted = null, ctx = null) {
1307
1271
  downstreamResponseId: telemetry.downstreamResponseId,
1308
1272
  });
1309
1273
  }
1274
+ // WP-9 §9b L-1 (docs/deepseek-harness-acp-agent-2026-10-28.html D-19): a dsh session's spend. Its
1275
+ // ACP wire carries no per-request token counts, so this is the only place CTM can see them — one
1276
+ // contract row per completed request, counts only (never a token, key, header, prompt or response
1277
+ // byte). Deliberately INDEPENDENT of the budget block above: a lead token never has a
1278
+ // budgetAdmission.requestId, and this writer must not depend on one. Never awaited on the response
1279
+ // path — the reply has already been written by the time this runs.
1280
+ if (leadBinding && leadBinding.usageLog === 'dsh' && leadBinding.ctmSessionId
1281
+ && telemetry.usage && telemetry.status >= 200 && telemetry.status < 300) {
1282
+ void appendDshUsageRow({
1283
+ // This server's OWN captured data directory, never a module global (see the context note above).
1284
+ dataDir: context.dataDir,
1285
+ ctmSessionId: leadBinding.ctmSessionId,
1286
+ row: {
1287
+ ts: new Date().toISOString(),
1288
+ requestId: telemetry.downstreamRequestId || telemetry.requestId,
1289
+ model: (parsedBody && parsedBody.model) || '',
1290
+ input_tokens: telemetry.usage.input_tokens,
1291
+ output_tokens: telemetry.usage.output_tokens,
1292
+ cache_read_input_tokens: telemetry.usage.cache_read_input_tokens,
1293
+ cache_creation_input_tokens: telemetry.usage.cache_creation_input_tokens,
1294
+ },
1295
+ }).then((result) => {
1296
+ // REPORT: the writer never throws and never writes a partial line; a refusal is surfaced on the
1297
+ // proxy's existing diagnostic channel, with a bounded reason and no caller value.
1298
+ if (result && result.ok === false) {
1299
+ console.log(`[model-proxy] dsh_usage_write_failed reason=${result.reason}`);
1300
+ }
1301
+ }).catch((err) => {
1302
+ // The writer returns a result object rather than throwing, so this is belt-and-braces for a
1303
+ // future edit; it must never become an unhandled rejection on the response path.
1304
+ console.log(`[model-proxy] dsh_usage_write_failed reason=exception detail=${String(err && err.message || err).slice(0, 200)}`);
1305
+ });
1306
+ }
1310
1307
  _logProxyRequest(routeAlias, (parsedBody && parsedBody.model) || '-', telemetry);
1311
1308
  }
1312
1309
  }