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
@@ -34,6 +34,10 @@ const { ensureApprovalDecisionColumns } = require('./lib/approval-decision-colum
34
34
  // workers/read-pool-worker.js's 'wallePermissionReconcileRead' case.
35
35
  const { queryNonTerminalPtyRuntimeApprovals, queryForwardingWallePermissionResolutions } = require('./lib/walle-permission-reconcile-query');
36
36
  const fs = require('fs');
37
+ // D-5 (docs/temp-file-leaks-disk-full-2026-10-25.html §5): one SQLite destination is a file SET —
38
+ // the base plus its -journal/-wal/-shm sidecars. Every backup and live-copy writer reclaims the
39
+ // whole set when it throws, so no orphan sidecar (or base) survives a failed write.
40
+ const { removeSqliteFileSet } = require('./lib/sqlite-file-set');
37
41
  const crypto = require('crypto');
38
42
  const os = require('os');
39
43
  const zlib = require('zlib');
@@ -43,6 +47,10 @@ const { reapGhostRows, agentRowGhostVerdict } = require('./lib/session-identity-
43
47
  const conversationSourceRegistry = require('./lib/conversation-source-registry');
44
48
  const conversationCommitKernel = require('./lib/conversation-commit-kernel');
45
49
  const conversationStoreV2 = require('./lib/conversation-store-v2');
50
+ // join-sync-followups-2 WP-4: the clock's identity seam (it cannot import instance-identity-access; see its header).
51
+ require('./lib/conversation-item-clock').setConversationInstanceIdResolver(() => {
52
+ try { return getCurrentHostedInstanceIdStrict(); } catch { /* expected: identity not readable yet (pre-initDb / bare fixture) — the clock keeps origin '' rather than mislabelling */ return ''; }
53
+ });
46
54
  const walleHistoryCutoverV2 = require('./lib/walle-history-cutover-v2');
47
55
  const { createReviewReposStore } = require('./lib/storage/review-repos-store');
48
56
  const { insertResumeLineage } = require('./lib/storage/resume-lineage-store');
@@ -172,6 +180,8 @@ const {
172
180
  } = require('../shared/db-migration-runner');
173
181
  // WP-3a (§6.15): pure release schema authority — data + pure functions, no app/native dependency.
174
182
  const { assertMigrationRegistry } = require('../shared/release-contract');
183
+ // Backup retention policy shared with Wall-E (design: docs/backup-retention-days-setting-2026-10-31.html).
184
+ const backupRetention = require('../shared/backup-retention');
175
185
 
176
186
  let dbErrorSink = createErrorSink({ name: 'db' });
177
187
  function setErrorSink(sink) {
@@ -300,13 +310,17 @@ function _pathIsWithin(candidate, parent) {
300
310
  }
301
311
 
302
312
  function _assertDevDbPathIsNotPrimary(dbPath) {
303
- if (!process.env.DEV_CTM_PORT || require('./lib/env-flags').boolFlag('CTM_ALLOW_PRIMARY_DB', false)) return;
313
+ if (require('./lib/env-flags').boolFlag('CTM_ALLOW_PRIMARY_DB', false)) return;
314
+ // 2026-10-31: unmerged branch code (a linked git worktree) must never open -- and so never migrate --
315
+ // the primary DB; see shared/linked-worktree.js. A primary or npm install is never a linked worktree.
316
+ const linkedWorktree = require('../shared/linked-worktree').isLinkedWorktreeCheckout(__dirname);
317
+ if (!process.env.DEV_CTM_PORT && !linkedWorktree) return;
304
318
  const defaultPrimaryDir = require('./lib/data-dir').getDefaultDataDir();
305
319
  const configuredPrimaryDir = process.env.CTM_PRIMARY_DATA_DIR || process.env.CTM_PRODUCTION_DATA_DIR;
306
320
  const primaryDirs = [defaultPrimaryDir, configuredPrimaryDir].filter(Boolean);
307
321
  if (!primaryDirs.some((primaryDir) => _pathIsWithin(dbPath, primaryDir))) return;
308
322
 
309
- const error = new Error(`CTM_PRIMARY_DB_REFUSED_IN_DEV: refusing ${path.resolve(dbPath)} while DEV_CTM_PORT is set`);
323
+ const error = new Error(`CTM_PRIMARY_DB_REFUSED_IN_DEV: refusing ${path.resolve(dbPath)} while ${linkedWorktree ? 'running from a linked git worktree (unmerged branch code); set CTM_DATA_DIR to a scratch dir' : 'DEV_CTM_PORT is set'}`);
310
324
  error.code = 'CTM_PRIMARY_DB_REFUSED_IN_DEV';
311
325
  throw error;
312
326
  }
@@ -316,6 +330,8 @@ function _assertDevDbPathIsNotPrimary(dbPath) {
316
330
  // keep all backup call sites reading this module-level value instead of capturing it.
317
331
  const DEFAULT_BACKUP_DIR = _normalizeUserPath(process.env.CTM_BACKUP_DIR || path.join(DATA_DIR, 'backups'));
318
332
  let BACKUP_DIR = DEFAULT_BACKUP_DIR;
333
+ // Retention is a module value read at prune time (design §5 R-8); the default is 3.
334
+ let BACKUP_RETENTION_DAYS = backupRetention.DEFAULT_BACKUP_RETENTION_DAYS;
319
335
  const IMAGE_HASH_CHUNK_BYTES = Math.max(
320
336
  16 * 1024,
321
337
  Number(process.env.CTM_IMAGE_HASH_CHUNK_BYTES || 512 * 1024) || 512 * 1024
@@ -551,6 +567,22 @@ function _applyPersistedBackupDirSetting() {
551
567
  }
552
568
  }
553
569
 
570
+ // Backup retention (design §5 R-5/R-8): a plain module value; the setter validates but never
571
+ // persists, so writing the setting is the caller's job (api/backup-retention.js PUT).
572
+ function getBackupRetentionDays() { return BACKUP_RETENTION_DAYS; }
573
+ function setBackupRetentionDays(days) {
574
+ BACKUP_RETENTION_DAYS = backupRetention.normalizeRetentionDays(days);
575
+ return BACKUP_RETENTION_DAYS;
576
+ }
577
+ function _applyPersistedBackupRetentionSetting() {
578
+ try {
579
+ if (!db || !_tableExists('settings')) return;
580
+ setBackupRetentionDays(getSetting(backupRetention.BACKUP_RETENTION_SETTING_KEY, null));
581
+ } catch (e) {
582
+ console.error('[db] Backup retention setting ignored:', e.message);
583
+ }
584
+ }
585
+
554
586
  // Cache for resolveGitRoot — avoids repeated git calls for the same path
555
587
  const _gitRootCache = new Map();
556
588
 
@@ -743,6 +775,7 @@ function _baseResidentDb() {
743
775
  return _baseFileHandle;
744
776
  }
745
777
  function _isDomainFlippedInSettings(domain) {
778
+ if (domain !== 'core' && domain !== 'telemetry') return false; // only EXTRACTABLE_DOMAINS (lib/domain-split-migration.js) flip; never read settings for firehose in a request zone
746
779
  if (_domainFlipStickyCache.get(domain)) return true;
747
780
  try {
748
781
  const row = _baseResidentDb().prepare('SELECT value FROM settings WHERE key = ?').get(`domain_routing_flip:${domain}`);
@@ -4951,6 +4984,7 @@ function initDb(dbPath) {
4951
4984
  _resetHostedPrimarySchemaMemo();
4952
4985
  _ensureHostedPrimarySchema(db);
4953
4986
  _applyPersistedBackupDirSetting();
4987
+ _applyPersistedBackupRetentionSetting();
4954
4988
  cleanupScrollbackChunkSeqIntegrity();
4955
4989
  return db;
4956
4990
  } catch (err) {
@@ -7569,6 +7603,31 @@ function _defaultMigrationSteps() {
7569
7603
  53: () => _migrateToV53Impl({ getDb: () => dbFor('session_model_intent'), setSchemaVersion }),
7570
7604
  // v54 (WP-0) the per-session lead model pin — an explicit model choice replayed on resume; v55 (WP-2, multi-machine) stamps blank agent_sessions.origin_instance_id rows with this database's identity (one idempotent UPDATE, sharing this line because db.js is at its size ceiling); v56 (WP-1, machine pool) is host_samples + machine_self + machine_pairing_offers + machines.urls_json, all domain 'core'.
7571
7605
  54: () => _migrateToV54Impl({ getDb: () => dbFor('session_lead_model'), setSchemaVersion }), 55: () => require('./lib/migrations/v55-agent-origin-backfill').migrateToV55({ getDb: () => dbFor('agent_sessions'), getIdentityDb: () => dbFor('instance_identity'), setSchemaVersion }), 56: () => require('./lib/migrations/v56-host-samples-and-machine-pool').migrateToV56({ getDb: () => dbFor('machines'), setSchemaVersion }),
7606
+ // v57 (opencode-lead-and-delegate-model-selection-2026-10-28.html §6.4, §8 WP-4, S-17/S-18):
7607
+ // both delegate-preference tables admit agent='opencode'. SQLite cannot ALTER a CHECK, so the
7608
+ // migration REBUILDS them from their own stored DDL (one transaction, every row and column);
7609
+ // v48 is untouched. Idempotent by inspection of sqlite_master, so a re-run is a no-op.
7610
+ 57: () => require('./lib/migrations/v57-delegate-pref-mirror-opencode').migrateToV57({ getDb: () => dbFor('delegate_pref_mirror'), setSchemaVersion }),
7611
+ // v58 (WP-1, codex-native-subagent-pick-enforcement-2026-10-28.html §6): the launch row gains
7612
+ // the native-sub-agents deny fact (nullable TEXT, no default), so the UI states what a launch
7613
+ // DID instead of re-deriving the rule. One ALTER on the v48 launch table; core domain, like v48/v50.
7614
+ 58: () => require('./lib/migrations/v58-subagent-launch-native-subagents').migrateToV58({ getDb: () => dbFor('session_subagent_pick_launch'), setSchemaVersion }),
7615
+ // v59 (WP-8, ctm-deepseek-harness-acp-agent-design §9b): coding_session_model_state admits the
7616
+ // DeepSeek Harness agent 'dsh'. SQLite cannot ALTER a CHECK, so v59 REBUILDS the table from its
7617
+ // own stored DDL in one transaction; v42 is untouched and a re-run is a no-op.
7618
+ 59: () => require('./lib/migrations/v59-coding-session-model-state-dsh').migrateToV59({ getDb: () => dbFor('coding_session_model_state'), setSchemaVersion }),
7619
+ // v60 (WP-10 step C, ctm-deepseek-harness-acp-agent-design §9b): the delegate pref mirror admits
7620
+ // agent 'dsh', the CTM half of the brain's migration 103 widening of `default:dsh'. SQLite cannot
7621
+ // ALTER a CHECK, so v60 REBUILDS the table from its own stored DDL in one transaction; v48 is
7622
+ // untouched and a re-run is a no-op. session_subagent_pick_launch is deliberately NOT widened:
7623
+ // no writer can reach it with 'dsh' (see the module header).
7624
+ 60: () => require('./lib/migrations/v60-delegate-pref-mirror-dsh').migrateToV60({ getDb: () => dbFor('delegate_pref_mirror'), setSchemaVersion }),
7625
+ // v61 (WP-5, shared-memory-every-machine-2026-10-31.html §5 D-3, §6.8): the conversation-item
7626
+ // change clock — three additive tables + one index, declared by the migration instead of the
7627
+ // store's own DDL (the store is a ratcheted lazy store; lib/migrations/** is sanctioned). The
7628
+ // clock is stamped in the same transaction as conversation_text_items_v2, a 'firehose' table, so
7629
+ // this migration hands the same handle/file as the text table.
7630
+ 61: () => require('./lib/migrations/v61-conversation-item-clock').migrateToV61({ getDb: () => dbFor('conversation_text_items_v2'), setSchemaVersion }),
7572
7631
  }, { reservedVersions: [18] });
7573
7632
  }
7574
7633
  let _migrationSteps = _defaultMigrationSteps();
@@ -12969,6 +13028,17 @@ function _discardPartialBackupSet(names) {
12969
13028
  }
12970
13029
  }
12971
13030
 
13031
+ // D-5: a writer that throws reclaims the destination's whole file set (base + sidecars, via
13032
+ // lib/sqlite-file-set.js) — including the .db.gz companion when the function writes one.
13033
+ // Best-effort by construction: the caller rethrows the ORIGINAL error, so a reclaim failure
13034
+ // must never replace it.
13035
+ function _reclaimBackupDestinationSet(...paths) {
13036
+ for (const target of paths) {
13037
+ if (!target) continue;
13038
+ try { removeSqliteFileSet(target); } catch { /* expected: the reclaim is best-effort and must never mask the original writer error, which the caller rethrows */ }
13039
+ }
13040
+ }
13041
+
12972
13042
  function _finalizeBackup(tmpPath, gzPath, now, tag, basePath) {
12973
13043
  const ts = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
12974
13044
  const check = _quickCheckFile(tmpPath);
@@ -13010,8 +13080,13 @@ async function createBackup(label) {
13010
13080
  const { now, tmpPath, gzPath, tag } = _backupPaths(label);
13011
13081
  fs.rmSync(tmpPath, { force: true });
13012
13082
  fs.rmSync(gzPath, { force: true });
13013
- await db.backup(tmpPath);
13014
- return _finalizeBackupAsync(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
13083
+ try {
13084
+ await db.backup(tmpPath);
13085
+ return await _finalizeBackupAsync(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
13086
+ } catch (err) {
13087
+ _reclaimBackupDestinationSet(tmpPath, gzPath);
13088
+ throw err;
13089
+ }
13015
13090
  }
13016
13091
 
13017
13092
  // Live-snapshot entry point for the dedicated backup worker. It intentionally does not call
@@ -13023,6 +13098,7 @@ async function createBackupFromPath(sourcePath, label, options = {}) {
13023
13098
  if (!requestedSource) throw new Error('Backup source database path required');
13024
13099
  const resolvedSource = path.resolve(requestedSource);
13025
13100
  if (options.backupDir) setBackupDir(options.backupDir, { persist: false });
13101
+ if (options.retentionDays != null) setBackupRetentionDays(options.retentionDays);
13026
13102
 
13027
13103
  const { now, tmpPath, gzPath, tag } = _backupPaths(label);
13028
13104
  fs.rmSync(tmpPath, { force: true });
@@ -13036,12 +13112,15 @@ async function createBackupFromPath(sourcePath, label, options = {}) {
13036
13112
  });
13037
13113
  try {
13038
13114
  source.prepare('VACUUM INTO ?').run(tmpPath);
13115
+ // The worker is handed the BASE path, so its siblings resolve from the same directory —
13116
+ // this is the path the daily backup actually takes (setBackupRunner -> online-backup-worker).
13117
+ return await _finalizeBackupAsync(tmpPath, gzPath, now, tag, resolvedSource);
13118
+ } catch (err) {
13119
+ _reclaimBackupDestinationSet(tmpPath, gzPath);
13120
+ throw err;
13039
13121
  } finally {
13040
13122
  try { source.close(); } catch {}
13041
13123
  }
13042
- // The worker is handed the BASE path, so its siblings resolve from the same directory —
13043
- // this is the path the daily backup actually takes (setBackupRunner -> online-backup-worker).
13044
- return _finalizeBackupAsync(tmpPath, gzPath, now, tag, resolvedSource);
13045
13124
  }
13046
13125
 
13047
13126
  async function copyLiveDatabaseTo(destPath) {
@@ -13059,22 +13138,16 @@ async function copyLiveDatabaseTo(destPath) {
13059
13138
  }
13060
13139
  const tmpPath = path.join(destDir, `.${path.basename(resolved)}.${process.pid}.${Date.now()}.tmp`);
13061
13140
  fs.mkdirSync(destDir, { recursive: true });
13062
- for (const p of [tmpPath, `${tmpPath}-wal`, `${tmpPath}-shm`]) {
13063
- try { fs.rmSync(p, { force: true }); } catch {}
13064
- }
13141
+ _reclaimBackupDestinationSet(tmpPath);
13065
13142
  try {
13066
13143
  await db.backup(tmpPath);
13067
13144
  const check = _quickCheckFile(tmpPath);
13068
13145
  if (!check.ok) throw new Error(`Live database copy quick_check failed: ${check.error}`);
13069
- for (const p of [resolved, `${resolved}-wal`, `${resolved}-shm`]) {
13070
- try { fs.rmSync(p, { force: true }); } catch {}
13071
- }
13146
+ _reclaimBackupDestinationSet(resolved);
13072
13147
  fs.renameSync(tmpPath, resolved);
13073
13148
  return { path: resolved, size: fs.statSync(resolved).size };
13074
13149
  } catch (err) {
13075
- for (const p of [tmpPath, `${tmpPath}-wal`, `${tmpPath}-shm`]) {
13076
- try { fs.rmSync(p, { force: true }); } catch {}
13077
- }
13150
+ _reclaimBackupDestinationSet(tmpPath);
13078
13151
  throw err;
13079
13152
  }
13080
13153
  }
@@ -13084,8 +13157,13 @@ function createBackupSync(label) {
13084
13157
  const { now, tmpPath, gzPath, tag } = _backupPaths(label);
13085
13158
  fs.rmSync(tmpPath, { force: true });
13086
13159
  fs.rmSync(gzPath, { force: true });
13087
- db.exec(`VACUUM INTO ${_quoteSqlString(tmpPath)}`);
13088
- return _finalizeBackup(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
13160
+ try {
13161
+ db.exec(`VACUUM INTO ${_quoteSqlString(tmpPath)}`);
13162
+ return _finalizeBackup(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
13163
+ } catch (err) {
13164
+ _reclaimBackupDestinationSet(tmpPath, gzPath);
13165
+ throw err;
13166
+ }
13089
13167
  }
13090
13168
 
13091
13169
  function listBackups() {
@@ -13412,16 +13490,9 @@ async function restoreAndVerifyPromptPurgeBackupAbsent(baseline = {}, closure =
13412
13490
  }
13413
13491
  }
13414
13492
 
13415
- function cleanOldBackups(maxAge = 7) {
13416
- // Keep backups for maxAge days, but always keep at least 5
13417
- const backups = listBackups();
13418
- if (backups.length <= 5) return;
13419
-
13420
- const cutoff = Date.now() - (maxAge * 24 * 60 * 60 * 1000);
13421
- const toDelete = backups.slice(5).filter(b => new Date(b.createdAt).getTime() < cutoff);
13422
- for (const b of toDelete) {
13423
- deleteBackup(b.name);
13424
- }
13493
+ // Design §5 R-1: keep every backup from the N most recent UTC days that have one (shared policy).
13494
+ function cleanOldBackups(retentionDays = BACKUP_RETENTION_DAYS) {
13495
+ for (const b of backupRetention.selectExpiredBackups(listBackups(), retentionDays)) deleteBackup(b.name);
13425
13496
  }
13426
13497
 
13427
13498
  // Optional hook (registered by server.js via setBackupRunner) that dispatches a backup to a
@@ -16052,11 +16123,36 @@ function listStartupTasks(opts = {}) {
16052
16123
  // listStartupTasks() above drops exited rows — so "does this hub's ledger know the id, and who owns
16053
16124
  // it" is answered here. Deliberately throw-through: the catalog's per-clause guard counts the fault
16054
16125
  // and fails OPEN, which a silent empty answer here would hide.
16126
+ //
16127
+ // D-5 (docs/remote-session-rename-forward-and-empty-rows-2026-10-30.html §5 D-5, §6, §9 S-7): a NAME
16128
+ // is not ownership. The pre-WP-1 hub rename/star of a box-owned id wrote a TITLE-ONLY stub into this
16129
+ // table — provider/project_path/cwd/origin_instance_id/current_owner_instance_id all '' and no
16130
+ // agent_sessions row — and this read then reported it as an owned ledger row, so clause (d) fenced the
16131
+ // box's REAL row out and the session vanished from the hub. Such a stub is not ownership: it answers
16132
+ // `{ exists: false, currentOwner: '', titleOnlyStub: true }` and the box row is kept. Every other row
16133
+ // answers exactly what it always did. Nothing is deleted (R-143).
16055
16134
  function getCtmSessionOwnerRow(ctmSessionId) {
16056
16135
  const id = String(ctmSessionId || '').trim();
16057
16136
  if (!id) return { exists: false, currentOwner: '' };
16058
- const row = getDomainDb('core').prepare('SELECT current_owner_instance_id FROM ctm_sessions WHERE id = ?').get(id);
16137
+ // current_owner_instance_id is selected unconditionally: a schema without it already threw here
16138
+ // (throw-through, per the comment above). The four D-5 columns and agent_sessions may be absent on
16139
+ // an older schema — a missing one is selected as NULL and `evaluable` then refuses to call the row
16140
+ // a stub, so a shape this read cannot fully evaluate never newly fences a box row out.
16141
+ const d5 = ['provider', 'project_path', 'cwd', 'origin_instance_id'];
16142
+ const missing = d5.filter((c) => !_tableHasColumn('ctm_sessions', c));
16143
+ const hasAgent = _tableExists('agent_sessions') && _tableHasColumn('agent_sessions', 'ctm_session_id');
16144
+ const row = getDomainDb('core').prepare(`
16145
+ SELECT current_owner_instance_id, ${d5.map((c) => (missing.includes(c) ? `NULL AS ${c}` : c)).join(', ')},
16146
+ ${hasAgent ? 'EXISTS(SELECT 1 FROM agent_sessions a WHERE a.ctm_session_id = ctm_sessions.id)' : '0'} AS has_agent
16147
+ FROM ctm_sessions WHERE id = ?
16148
+ `).get(id);
16059
16149
  if (!row) return { exists: false, currentOwner: '' };
16150
+ const blank = (v) => String(v == null ? '' : v).trim() === '';
16151
+ const evaluable = !missing.length;
16152
+ if (evaluable && !Number(row.has_agent) && blank(row.provider) && blank(row.project_path)
16153
+ && blank(row.cwd) && blank(row.origin_instance_id) && blank(row.current_owner_instance_id)) {
16154
+ return { exists: false, currentOwner: '', titleOnlyStub: true };
16155
+ }
16060
16156
  return { exists: true, currentOwner: String(row.current_owner_instance_id || '').trim() };
16061
16157
  }
16062
16158
 
@@ -19983,7 +20079,29 @@ const _WORKER_SESSION_PATCHABLE_COLUMNS = new Set([
19983
20079
  'failure_json', 'consumed_at', 'acknowledged_at', 'hidden_at', 'hide_at', 'launch_json', 'runtime_json', 'generation',
19984
20080
  ]);
19985
20081
 
19986
- function updateWorkerSession(ctmSessionId, patch = {}) {
20082
+ // C7-B1 (worker-terminal-retry-generation-fence-2026-10-27.html §3.1): the optional third
20083
+ // argument is an INTERNAL storage fence, not a patch field and not a general predicate engine.
20084
+ // `options === undefined` (or omitted) is the unchanged legacy two-argument call; a PROVIDED
20085
+ // options object must carry EXACTLY the own key expectedGeneration, a positive safe integer, and
20086
+ // is validated BEFORE any DB access -- a present-but-malformed guard is a programming error, never
20087
+ // a silent unfenced write. A valid guard appends one bound predicate (never an interpolated
20088
+ // value) so a stale generation matches zero rows and the existing boolean result already reports
20089
+ // the refusal. Generation stays a SETtable column: the guard never writes it.
20090
+ function updateWorkerSession(ctmSessionId, patch = {}, options) {
20091
+ let expectedGeneration;
20092
+ if (options !== undefined) {
20093
+ if (!options || typeof options !== 'object' || Array.isArray(options)) {
20094
+ throw new TypeError('updateWorkerSession: options must be an object carrying exactly { expectedGeneration }');
20095
+ }
20096
+ const guardKeys = Reflect.ownKeys(options);
20097
+ if (guardKeys.length !== 1 || guardKeys[0] !== 'expectedGeneration') {
20098
+ throw new TypeError('updateWorkerSession: options must carry exactly one own key, expectedGeneration');
20099
+ }
20100
+ expectedGeneration = options.expectedGeneration;
20101
+ if (!Number.isSafeInteger(expectedGeneration) || expectedGeneration <= 0) {
20102
+ throw new TypeError('updateWorkerSession: expectedGeneration must be a positive safe integer');
20103
+ }
20104
+ }
19987
20105
  const id = String(ctmSessionId || '').trim();
19988
20106
  if (!id) return false;
19989
20107
  const columns = Object.keys(patch || {}).filter((k) => _WORKER_SESSION_PATCHABLE_COLUMNS.has(k));
@@ -19991,8 +20109,10 @@ function updateWorkerSession(ctmSessionId, patch = {}) {
19991
20109
  const setClause = columns.map((c) => `${c} = @${c}`).join(', ');
19992
20110
  const params = { id };
19993
20111
  for (const c of columns) params[c] = patch[c];
20112
+ const generationPredicate = options === undefined ? '' : ' AND generation = @expectedGeneration';
20113
+ if (options !== undefined) params.expectedGeneration = expectedGeneration;
19994
20114
  const result = dbFor('worker_sessions').prepare(
19995
- `UPDATE worker_sessions SET ${setClause} WHERE ctm_session_id = @id`
20115
+ `UPDATE worker_sessions SET ${setClause} WHERE ctm_session_id = @id${generationPredicate}`
19996
20116
  ).run(params);
19997
20117
  return result.changes > 0;
19998
20118
  }
@@ -20515,6 +20635,10 @@ const DB_OWNER_MUTATION_ACTIONS = Object.freeze({
20515
20635
  ackConversationChanges: (payload) => conversationChangeFeed.ackConversationChanges(
20516
20636
  dbFor('conversation_projection_outbox_v2'), payload,
20517
20637
  ),
20638
+ // join-sync-followups-2 WP-3: /api/sync/conversation/v2/* run here, never in the request zone.
20639
+ conversationSyncVector: (opts) => require('./lib/conversation-sync').ownerVector(dbFor('conversation_text_items_v2'), opts),
20640
+ conversationSyncChanges: (opts) => require('./lib/conversation-sync').ownerChanges(dbFor('conversation_text_items_v2'), opts),
20641
+ conversationSyncApply: (opts) => require('./lib/conversation-sync').ownerApply(dbFor('conversation_text_items_v2'), opts),
20518
20642
  });
20519
20643
 
20520
20644
  function runDbOwnerMutationAction(action, args = []) {
@@ -20547,7 +20671,7 @@ module.exports = {
20547
20671
  _getMigrationLadderInfo,
20548
20672
  // Canonical filename for bin/migrate.js; avoids a second DEFAULT_DB_PATH basename.
20549
20673
  CTM_DB_FILENAME: path.basename(DEFAULT_DB_PATH),
20550
- initDb, connectDb, getDb, closeDb, getDbPath: () => currentDbPath, getBackupDir: () => BACKUP_DIR, getBackupDirInfo, getHostedBackupStatus, setBackupDir, moveBackupsToDir, flushWal, resolveGitRoot,
20674
+ initDb, connectDb, getDb, closeDb, getDbPath: () => currentDbPath, getBackupDir: () => BACKUP_DIR, getBackupDirInfo, getHostedBackupStatus, setBackupDir, moveBackupsToDir, flushWal, resolveGitRoot, getBackupRetentionDays, setBackupRetentionDays, cleanOldBackups,
20551
20675
  getDomainDb,
20552
20676
  getBaseDbPath,
20553
20677
  setBaseDbPath,