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
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ // WP-0 (docs/shared-memory-every-machine-2026-10-31.html §5 D-4, §6.2): source-derived
4
+ // identity. Two machines that ingest the SAME source item must mint the SAME row id —
5
+ // dedupe on (source, source_id) is a unique index (brain.js:917-924), so with random
6
+ // uuids the second machine's copy is silently dropped on apply while every knowledge row
7
+ // naming the first machine's id points at nothing (measured: one iMessage under two ids,
8
+ // design §1.3/§2 I-3). A memory therefore derives its id from (source, source_id) and a
9
+ // newly created entity from (lower(canonical_name), entity_type).
10
+ //
11
+ // RFC 9562 §5.5 UUIDv5 over node:crypto's sha1 — no `uuid` package is installed in this
12
+ // repo and this is the whole of what is needed from one.
13
+ //
14
+ // The two namespace constants are FIXED FOREVER. Changing one forks the identity space of
15
+ // every replica: a machine still running the old constant keeps minting ids the others can
16
+ // never dedupe against, which is exactly the divergence this file exists to end.
17
+ // tests/deterministic-id.test.js pins the literals.
18
+
19
+ const crypto = require('node:crypto');
20
+
21
+ const MEMORY_NS = '6f1c2b7e-3d4a-5e8f-9a0b-1c2d3e4f5a6b';
22
+ const ENTITY_NS = '9b8a7c6d-5e4f-5a3b-8c2d-1e0f9a8b7c6d';
23
+
24
+ // namespace: a UUID string (its 16 bytes are the hash prefix). name: any value — it is
25
+ // UTF-8 encoded, so callers can pass a NUL-joined composite without escaping.
26
+ function uuidv5(namespace, name) {
27
+ const ns = Buffer.from(String(namespace).replace(/-/g, ''), 'hex');
28
+ const hash = crypto.createHash('sha1')
29
+ .update(ns)
30
+ .update(Buffer.from(String(name), 'utf8'))
31
+ .digest();
32
+ // Set the version nibble (5) and the RFC 4122 variant (10xx), then format 8-4-4-4-12.
33
+ hash[6] = (hash[6] & 0x0f) | 0x50;
34
+ hash[8] = (hash[8] & 0x3f) | 0x80;
35
+ const h = hash.subarray(0, 16).toString('hex');
36
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20, 32)}`;
37
+ }
38
+
39
+ // The NUL separator makes the composite unambiguous: ("a", "b\0c") and ("a\0b", "c") hash
40
+ // differently, so two different (source, source_id) pairs can never collide by concatenation.
41
+ function deterministicMemoryId(source, sourceId) {
42
+ return uuidv5(MEMORY_NS, `${source}\u0000${sourceId}`);
43
+ }
44
+
45
+ // The name is lower-cased and the type is optional so that the two producers that spell the
46
+ // same entity differently ("Ada Example"/"ada example", missing entity_type) converge on one row.
47
+ function deterministicEntityId(canonicalName, entityType) {
48
+ return uuidv5(ENTITY_NS, `${String(canonicalName).toLowerCase()}\u0000${entityType || ''}`);
49
+ }
50
+
51
+ module.exports = { uuidv5, deterministicMemoryId, deterministicEntityId, MEMORY_NS, ENTITY_NS };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const { randomUUID: uuidv4 } = require('node:crypto');
3
+ const { randomUUID: uuidv4 } = require('node:crypto'); const { deterministicMemoryId } = require('./deterministic-id');
4
4
  const conversationProjectionV2 = require('../memory/conversation-projection-v2');
5
5
  const { EXTRACTABLE_PREDICATE, EXTRACTABLE_PARAMS } = require('./knowledge-categories');
6
6
 
@@ -64,7 +64,7 @@ function insertMemory(mem) {
64
64
  const _effectiveRaw = mem.content_raw || mem.content;
65
65
  const _rawToStore = _effectiveRaw === cleanContent ? null : _effectiveRaw;
66
66
 
67
- const id = uuidv4();
67
+ const id = mem.source_id ? deterministicMemoryId(mem.source, mem.source_id) : uuidv4(); // shared-memory D-4: same item, same id on every machine
68
68
  const ingestedAt = String(mem.ingested_at || new Date().toISOString());
69
69
  const triggerHint = _memoryRecallHint(mem.metadata);
70
70
  // surface-redesign WP-0: occurred_at_ms is the sortable form of `timestamp` (which
@@ -2517,14 +2517,13 @@ const MIGRATIONS = {
2517
2517
  97: (d) => {
2518
2518
  d.exec(DROP_RETIRED_TABLES_SQL);
2519
2519
  },
2520
- // Migration 98 (multi-machine WP-5): brain_outbox + brain_sync_hwm +
2521
- // brain_sync_applied + brain_row_clock and the eight capture triggers — see
2520
+ // Migration 98 (multi-machine WP-5): brain_row_clock and the capture triggers — see
2522
2521
  // brain/schema.js's ensureBrainSyncSchema for the why (R-10 LWW clock, R-11
2523
2522
  // host-local tables excluded, the brain_sync_applying sentinel) and why the DDL
2524
2523
  // text lives in schema.js: createTables() (the runner baseline) executes the same
2525
2524
  // string, the ladder never runs on a fresh DB, and reaching back here from
2526
2525
  // schema.js would make the two modules a require cycle (round3 walle-scc-size).
2527
- // Additive and idempotent.
2526
+ // Additive and idempotent. Since WP-6 (105) this body creates brain_row_clock alone.
2528
2527
  98: (d) => { require('./schema').ensureBrainSyncSchema(d); },
2529
2528
  // Migration 99 (surface-redesign follow-up FU-6, D-26 tail): retire the last
2530
2529
  // remnant of the deleted task engine. `task_events` is the event child of
@@ -2552,8 +2551,44 @@ const MIGRATIONS = {
2552
2551
  // same text, same reason (tests-integration/migration-baseline-parity.test.js). Additive and
2553
2552
  // idempotent: the ALTERs are `PRAGMA table_info`-guarded, the index is `IF NOT EXISTS`.
2554
2553
  101: (d) => { require('./helper-rules-schema').ensureHelperRulesSchemaV2(d); },
2554
+ // Migration 102 (opencode-lead-and-delegate-model-selection-2026-10-28.html §6.4, §8 WP-4, S-13):
2555
+ // delegate_model_prefs.scope_key admits `default:opencode`, the per-agent default rung of an
2556
+ // OpenCode lead's delegate ladder. SQLite cannot ALTER a CHECK, so an EXISTING table is REBUILT
2557
+ // (see the helper below): every column and every row, one transaction. model-identity-migration.js
2558
+ // carries the widened CHECK for a fresh brain (the createTaskLedgerTables baseline); this is the
2559
+ // forward step a database created before it needs. Idempotent by inspection of the SCHEMA, never
2560
+ // by the version counter, so both a re-run and ensureSchema's invariant rewind are no-ops.
2561
+ 102: (d) => { widenDelegateModelPrefsScope(d, 102, ['claude', 'codex'], 'opencode'); },
2562
+ // Migration 103 (deepseek-harness-acp-agent-2026-10-28.html WP-10, D-24): same rebuild, admits `default:dsh`.
2563
+ 103: (d) => { widenDelegateModelPrefsScope(d, 103, ['claude', 'codex', 'opencode'], 'dsh'); },
2564
+ 104: (d) => { require('./schema').ensureBrainSyncSchemaV2(d); }, // shared-memory WP-0 §6.1: v2 clock (origin_seq/deleted, 12 triggers, host-local vv tables); idempotent by inspection
2565
+ 105: (d) => { require('./schema').ensureBrainSyncSchemaV3(d); }, // shared-memory WP-6b: drop the v1 outbox tables + the outbox INSERT from the 8 ai/au triggers (idempotent by inspection)
2555
2566
  };
2556
2567
 
2568
+ // Migrations 102/103's body: rebuild from the table's OWN stored DDL with only the scope_key CHECK
2569
+ // widened, so nothing can drift. Absent or already-widened table -> 0 and no DDL; an unknown DDL throws.
2570
+ function widenDelegateModelPrefsScope(d, version, narrow, agent) {
2571
+ const row = d.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'delegate_model_prefs'").get();
2572
+ if (!row || typeof row.sql !== 'string') return 0;
2573
+ // Probe the WIDENED literal ('default:<agent>'): a test for `'<agent>'` never matches (a colon precedes it).
2574
+ if (row.sql.includes(`'default:${agent}'`)) return 0;
2575
+ const keys = narrow.map((name) => `'default:${name}'`);
2576
+ const widened = row.sql.replace(
2577
+ new RegExp(`scope_key\\s+IN\\s*\\(\\s*${keys.join('\\s*,\\s*')}\\s*\\)`),
2578
+ `scope_key IN (${[...keys, `'default:${agent}'`].join(',')})`,
2579
+ );
2580
+ if (widened === row.sql) throw new Error(`migration ${version}: delegate_model_prefs.scope_key has no ${narrow.join('/')} CHECK to widen`);
2581
+ const staging = `delegate_model_prefs__v${version - 1}`;
2582
+ // The canonical 12-step SQLite rebuild: rename, recreate, copy every row and column, drop.
2583
+ d.transaction(() => {
2584
+ d.exec(`ALTER TABLE delegate_model_prefs RENAME TO ${staging}`);
2585
+ d.exec(widened);
2586
+ d.exec(`INSERT INTO delegate_model_prefs SELECT * FROM ${staging}`);
2587
+ d.exec(`DROP TABLE ${staging}`);
2588
+ })();
2589
+ return 1;
2590
+ }
2591
+
2557
2592
  // --- Migration 91 (surface-redesign WP-3) ---------------------------------
2558
2593
  // The Jobs record: ONE table pair replacing the two legacy engines. Column
2559
2594
  // notes from the design doc (§6.1), kept here rather than as SQL comments so
@@ -2947,9 +2982,8 @@ assertMigrationRegistry('walle', MIGRATIONS);
2947
2982
  }
2948
2983
 
2949
2984
  // The WP-5 capture DDL is exported by brain/schema.js as BRAIN_SYNC_DDL /
2950
- // ensureBrainSyncSchema; the ladder reaches it lazily in migration 89 above so
2951
- // this module never requires schema.js at load time (schema.js -> migrations.js
2952
- // would otherwise be the only require cycle in the wall-e graph).
2985
+ // ensureBrainSyncSchema (98) / V2 (104) / V3 (105); the ladder reaches them lazily above so
2986
+ // this module never requires schema.js at load time (that would be the only require cycle in wall-e).
2953
2987
 
2954
2988
  module.exports = createMigrationsModule;
2955
2989
  // Statics on the factory, for callers that hold the module rather than a built
@@ -74,7 +74,7 @@ function ensureModelIdentitySchema(d) {
74
74
  PRIMARY KEY (identity_id, harness)
75
75
  );
76
76
  CREATE TABLE IF NOT EXISTS delegate_model_prefs (
77
- scope_key TEXT PRIMARY KEY CHECK (scope_key IN ('default:claude','default:codex') OR scope_key LIKE 'session:_%'),
77
+ scope_key TEXT PRIMARY KEY CHECK (scope_key IN ('default:claude','default:codex','default:opencode','default:dsh') OR scope_key LIKE 'session:_%'),
78
78
  lane TEXT NOT NULL CHECK (lane IN ('native','routed','inherit')),
79
79
  model TEXT NOT NULL DEFAULT '',
80
80
  identity_id TEXT NOT NULL DEFAULT '',
@@ -29,13 +29,28 @@ const BRAIN_CALL_WHITELIST = new Set([
29
29
  // entry, not a bare brain.js export — see that map below and
30
30
  // wall-e/loops/brain-custom-writes.js for what it does and why.
31
31
  'commitThinkExtraction',
32
- // multi-machine WP-5: the brain sync pair (wall-e/http/sync-api.js) — the outbox
33
- // page read and the one-transaction batch apply both run on the OWNER's connection
34
- // (the apply creates a connection-scoped TEMP sentinel the capture triggers test).
35
- 'brainSyncOutbox',
36
- 'brainSyncApplyEntries',
37
- // follow-up #17: outbox retention (POST /api/walle/sync/prune) — a bounded delete, same owner.
38
- 'brainSyncPrune',
32
+ // WP-0 §6.3: the v2 clock seed walk (wall-e/brain/brain-sync-store.js seedClockPage) — one
33
+ // bounded page per call, on the owner's connection, driven by the brain-clock-seed job. Same
34
+ // CUSTOM_BRAIN_CALLS pattern as the other v2 sync ops — see loops/brain-custom-writes.js.
35
+ // (WP-6/migration 104 retired the v1 trio brainSyncOutbox/brainSyncApplyEntries/brainSyncPrune.)
36
+ 'brainSyncClockSeed',
37
+ // WP-1 §6.4: the v2 change feed (wall-e/brain/brain-sync-v2.js, served by the
38
+ // /api/walle/sync/v2/* routes). The apply is the one that must run on the OWNER's connection —
39
+ // it opens an IMMEDIATE transaction with the connection-scoped TEMP sentinel the capture
40
+ // triggers test; the rest are reads and one small hub-bookkeeping write.
41
+ 'brainSyncV2Vector',
42
+ 'brainSyncV2Changes',
43
+ 'brainSyncV2Apply',
44
+ 'brainSyncV2MemberVector',
45
+ 'brainSyncV2PruneTombstones',
46
+ 'brainSyncV2Digest',
47
+ // WP-4 §6.7: the join trio + the import job's step. The snapshot runs where the backup API
48
+ // runs (the owner's connection); the import records and then imports only the four replicated
49
+ // tables on the owner, with the sentinel on; the step is what the brain-join-import job drives.
50
+ 'brainSyncV2JoinSnapshot',
51
+ 'brainSyncV2JoinImport',
52
+ 'brainSyncV2JoinStatus',
53
+ 'brainSyncV2JoinStep',
39
54
  // WP-2b: same CUSTOM_BRAIN_CALLS pattern for loops/backfill.js — three
40
55
  // per-row transaction batches, see brain-custom-writes.js.
41
56
  'backfillClassifyBatch',
@@ -151,6 +166,7 @@ const BRAIN_CALL_WHITELIST = new Set([
151
166
  'setKv',
152
167
  'setCurrentLocation',
153
168
  'setBackupDir',
169
+ 'setBackupRetentionDays',
154
170
  'setDefaultProviderSelection',
155
171
  'setModelDefault',
156
172
  'setTaskModelDefault',
@@ -1173,13 +1173,15 @@ function createTables() {
1173
1173
  ensureConnectionTables(db); // WP-5a: same constraint — every exec must precede ensureMemorySourceUniqueIndexOnly()
1174
1174
  ensureSlackCursorTables(db); // WP-6a: same constraint — every exec must precede ensureMemorySourceUniqueIndexOnly()
1175
1175
  ensureChatThreadTables(db); // WP-7a: same constraint — every exec must precede ensureMemorySourceUniqueIndexOnly()
1176
- // WP-5 (multi-machine brain sync): brain_outbox/brain_sync_hwm/brain_sync_applied/
1177
- // brain_row_clock + the eight capture triggers. Migration 89 owns the same DDL
1178
- // for existing databases, but the ladder never runs on a fresh install
1179
- // (baseline()+stamp) — and createTables() also runs unconditionally on every
1180
- // non-fresh boot — so the baseline has to carry it too (T-2 AC-2a parity). It is
1176
+ // WP-5 (multi-machine brain sync): brain_row_clock + the 12 capture triggers, now at v2
1177
+ // (origin_seq/deleted, the four AFTER DELETE triggers — WP-0) and with the v1 outbox
1178
+ // transport retired (migration 105, WP-6). Migration 98 owns the clock DDL, 104 the v2
1179
+ // upgrade and 105 the v1 teardown for existing databases, but the ladder never runs on a
1180
+ // fresh install (baseline()+stamp) — and createTables() also runs unconditionally on every
1181
+ // non-fresh boot — so the baseline has to carry all three too (T-2 AC-2a parity). It is
1181
1182
  // part of this function's OWN DDL, so it runs before the delegated helpers.
1182
- ensureBrainSyncSchema(db);
1183
+ ensureBrainSyncSchemaV2(db);
1184
+ ensureBrainSyncSchemaV3(db);
1183
1185
  ensureMemorySourceUniqueIndexOnly(db);
1184
1186
  createTaskLedgerTables(db);
1185
1187
  }
@@ -1379,12 +1381,10 @@ createSchemaModule.ensureTurnLedgerSchema = ensureTurnLedgerSchema;
1379
1381
  module.exports = createSchemaModule;
1380
1382
 
1381
1383
  // Migration 89 (multi-machine WP-5, design doc §6.6 / R-10 / R-11): the brain
1382
- // outbox. The four replicated tables (memories / knowledge / entities / people)
1383
- // gain an AFTER INSERT / AFTER UPDATE trigger each, capturing the row into
1384
- // brain_outbox in the writer's own transaction; the apply path (the
1385
- // /api/walle/sync/apply route) creates a connection-scoped TEMP TABLE
1386
- // `brain_sync_applying` for the duration of a batch and every trigger skips while
1387
- // it exists, so an applied row never re-enqueues.
1384
+ // outbox. WP-6 (migration 105) retired the outbox transport — the three v1 tables
1385
+ // (brain_outbox / brain_sync_hwm / brain_sync_applied) and the ai/au outbox INSERT
1386
+ // are gone — but this module still owns the one object both paths need: the LWW clock,
1387
+ // and the text below is what createTables() and migration 98 execute.
1388
1388
  //
1389
1389
  // The DDL text lives in schema.js (a sanctioned DDL file) because createTables()
1390
1390
  // executes it on the fresh path; a brain/ module would mean schema.js ->
@@ -1392,62 +1392,29 @@ module.exports = createSchemaModule;
1392
1392
  //
1393
1393
  // LWW clock: only `entities` has an `updated_at` column, so instead of adding an
1394
1394
  // `updated_at` to memories/knowledge/people (which every existing writer and the
1395
- // PG shadow would then have to stamp) the triggers also maintain
1395
+ // PG shadow would then have to stamp) the capture triggers maintain
1396
1396
  // `brain_row_clock(table_name, row_id, updated_at, origin_instance_id)` — one
1397
1397
  // clock row per replicated row, the WP-5 brief's option (b); '' = this host.
1398
+ // The eight v1 capture triggers and the `brain_sync_applying` sentinel they tested lived
1399
+ // here too; the capture triggers are now the 12 v2 ones (brain/brain-sync-v2-schema.js),
1400
+ // which also own the sentinel's test.
1398
1401
  //
1399
1402
  // Host-local tables (loop_checkpoints, channel_outbound_locks, kv_store, owner,
1400
1403
  // activity_log, runtime_events, *_fts, memory_index, embeddings) get NO trigger:
1401
1404
  // R-11 is enforced by construction, not by a filter.
1402
- // Built once per process: the same string is executed by migration 89 (existing
1405
+ // Built once per process: the same string is executed by migration 98 (existing
1403
1406
  // databases, via the ladder) AND by createTables() (the runner baseline — fresh
1404
1407
  // installs run ZERO migration bodies, and every non-fresh boot re-runs
1405
- // createTables(), so this is what makes the capture schema exist on both paths;
1406
- // see tests-integration/migration-baseline-parity.test.js T-2 AC-2a).
1408
+ // createTables(), so this is what makes the clock exist on both paths;
1409
+ // see tests-integration/migration-baseline-parity.test.js T-2 AC-2a). v2's
1410
+ // applyBrainSyncSchemaV2 indexes brain_row_clock, so it must be created first.
1411
+ //
1412
+ // WP-6 (migration 105) is why this string no longer creates brain_outbox /
1413
+ // brain_sync_hwm / brain_sync_applied and no longer installs the eight v1 capture
1414
+ // triggers: a fresh brain must never carry either. brain_row_clock's CREATE TABLE text
1415
+ // is deliberately unchanged, so fresh and migrated sqlite_master stay byte-equal.
1407
1416
  function buildBrainSyncDdl() {
1408
- // SQLite refuses `temp.sqlite_master` inside a trigger ("cannot reference
1409
- // objects in database temp") and a bare sqlite_temp_master resolves to
1410
- // main.sqlite_temp_master; pragma_table_list does list temp tables.
1411
- const skipWhen = "NOT EXISTS (SELECT 1 FROM pragma_table_list WHERE name = 'brain_sync_applying')";
1412
- // The triggers reference NO column but `new.id`: the payload is built at READ time from the
1413
- // live row (wall-e/http/sync-api.js listBrainOutbox via brain/brain-sync-store.js), so the
1414
- // outbox never holds a second copy of a memory's bytes (the prompt purge sanitizer stays
1415
- // exact) and a column added or dropped by a later migration never breaks a trigger
1416
- // (`ALTER TABLE ... DROP COLUMN` fails while any trigger names the column). The UPDATE
1417
- // triggers watch only columns present in the earliest baseline of each table — never one a
1418
- // migration added (memories.consolidated_at / trigger_hint / embed_failed_count,
1419
- // knowledge.metadata_json) — and never the read-stamp columns (access_count,
1420
- // last_accessed), so a recall is not a replication event.
1421
- const watchColumns = {
1422
- memories: ['content', 'content_raw', 'subject', 'metadata', 'importance', 'archived_at'],
1423
- knowledge: ['category', 'subject', 'predicate', 'object', 'confidence', 'source_memory_ids', 'status', 'superseded_by', 'valid_from', 'valid_to', 'last_confirmed', 'times_confirmed'],
1424
- entities: ['canonical_name', 'entity_type', 'aliases', 'properties', 'updated_at'],
1425
- people: ['name', 'aliases', 'identities', 'relationship', 'trust_level', 'trust_reason', 'interaction_freq', 'last_interaction', 'notes'],
1426
- };
1427
- let sql = `
1428
- CREATE TABLE IF NOT EXISTS brain_outbox (
1429
- seq INTEGER PRIMARY KEY AUTOINCREMENT,
1430
- operation_id TEXT NOT NULL UNIQUE,
1431
- table_name TEXT NOT NULL CHECK (table_name IN ('memories', 'knowledge', 'entities', 'people')),
1432
- row_id TEXT NOT NULL,
1433
- op TEXT NOT NULL CHECK (op IN ('upsert', 'delete')),
1434
- updated_at TEXT NOT NULL,
1435
- origin_instance_id TEXT NOT NULL DEFAULT '',
1436
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
1437
- delivered_at TEXT NOT NULL DEFAULT ''
1438
- );
1439
- CREATE INDEX IF NOT EXISTS idx_brain_outbox_seq ON brain_outbox(seq);
1440
- CREATE TABLE IF NOT EXISTS brain_sync_hwm (
1441
- source_instance_id TEXT PRIMARY KEY,
1442
- last_seq INTEGER NOT NULL DEFAULT 0,
1443
- updated_at TEXT NOT NULL
1444
- );
1445
- CREATE TABLE IF NOT EXISTS brain_sync_applied (
1446
- source_instance_id TEXT NOT NULL,
1447
- operation_id TEXT NOT NULL,
1448
- applied_at TEXT NOT NULL,
1449
- PRIMARY KEY (source_instance_id, operation_id)
1450
- );
1417
+ return `
1451
1418
  CREATE TABLE IF NOT EXISTS brain_row_clock (
1452
1419
  table_name TEXT NOT NULL,
1453
1420
  row_id TEXT NOT NULL,
@@ -1456,41 +1423,32 @@ function buildBrainSyncDdl() {
1456
1423
  PRIMARY KEY (table_name, row_id)
1457
1424
  );
1458
1425
  `;
1459
- // origin_instance_id '' in the clock and the outbox means "this host": a trigger cannot know
1460
- // the instance id cheaply, so the reader (and the LWW compare) substitutes the local id.
1461
- for (const table of Object.keys(watchColumns)) {
1462
- const watch = watchColumns[table].map((column) => `"${column}"`).join(', ');
1463
- const body = `
1464
- INSERT INTO brain_row_clock (table_name, row_id, updated_at, origin_instance_id)
1465
- VALUES ('${table}', new.id, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'), '')
1466
- ON CONFLICT(table_name, row_id) DO UPDATE SET
1467
- updated_at = excluded.updated_at,
1468
- origin_instance_id = '';
1469
- INSERT INTO brain_outbox (operation_id, table_name, row_id, op, updated_at)
1470
- VALUES (lower(hex(randomblob(16))), '${table}', new.id, 'upsert',
1471
- (SELECT updated_at FROM brain_row_clock WHERE table_name = '${table}' AND row_id = new.id));`;
1472
- sql += `
1473
- CREATE TRIGGER IF NOT EXISTS brain_outbox_${table}_ai AFTER INSERT ON ${table}
1474
- WHEN ${skipWhen}
1475
- BEGIN${body}
1476
- END;
1477
- CREATE TRIGGER IF NOT EXISTS brain_outbox_${table}_au AFTER UPDATE OF ${watch} ON ${table}
1478
- WHEN ${skipWhen}
1479
- BEGIN${body}
1480
- END;
1481
- `;
1482
- }
1483
- return sql;
1484
1426
  }
1485
1427
 
1486
1428
  const BRAIN_SYNC_DDL = buildBrainSyncDdl();
1487
1429
 
1488
- // Migration 89's body, and the reason the DDL above is a plain string with two
1430
+ // Migration 98's body, and the reason the DDL above is a plain string with two
1489
1431
  // callers rather than an exec-in-place: the ladder never runs on a fresh DB.
1490
1432
  function ensureBrainSyncSchema(d) {
1491
1433
  d.exec(BRAIN_SYNC_DDL);
1492
1434
  }
1493
1435
 
1436
+ // Migration 104's body (WP-0, shared-memory-every-machine-2026-10-31.html §6.1): the v1
1437
+ // brain_row_clock, then the v2 clock from brain/brain-sync-v2-schema.js. Idempotent by
1438
+ // inspection; createTables() runs it every boot on both paths.
1439
+ function ensureBrainSyncSchemaV2(d) {
1440
+ d.exec(BRAIN_SYNC_DDL);
1441
+ require('./brain-sync-v2-schema').applyBrainSyncSchemaV2(d);
1442
+ }
1443
+
1444
+ // Migration 105's body (WP-6, shared-memory-every-machine-2026-10-31.html §11): retire the
1445
+ // v1 outbox transport — the three v1 tables and the outbox INSERT the ai/au capture bodies
1446
+ // appended. createTables() runs it every boot, so a fresh brain never carries them; an
1447
+ // existing v104 brain drops them here. v2 behaviour is untouched.
1448
+ function ensureBrainSyncSchemaV3(d) {
1449
+ require('./brain-sync-v2-schema').applyBrainSyncSchemaV3(d);
1450
+ }
1451
+
1494
1452
  // WP-5 §6.6: the connection-scoped sentinel that silences the eight capture
1495
1453
  // triggers for the duration of one apply batch. TEMP, so no other connection can
1496
1454
  // see it and it vanishes with the connection (an apply can never suppress capture
@@ -1509,5 +1467,7 @@ function dropBrainSyncSentinel(d) {
1509
1467
 
1510
1468
  createSchemaModule.BRAIN_SYNC_DDL = BRAIN_SYNC_DDL;
1511
1469
  createSchemaModule.ensureBrainSyncSchema = ensureBrainSyncSchema;
1470
+ createSchemaModule.ensureBrainSyncSchemaV2 = ensureBrainSyncSchemaV2;
1471
+ createSchemaModule.ensureBrainSyncSchemaV3 = ensureBrainSyncSchemaV3;
1512
1472
  createSchemaModule.createBrainSyncSentinel = createBrainSyncSentinel;
1513
1473
  createSchemaModule.dropBrainSyncSentinel = dropBrainSyncSentinel;