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,55 @@
1
+ 'use strict';
2
+
3
+ // WP-12 (coding-task-manager/docs/nightly-linux-host-portability-2026-10-27.html §9.4, S-29): the pids an
4
+ // orphan can be re-parented to. The kernel hands an orphan to its nearest living CHILD SUBREAPER ancestor
5
+ // and only falls back to pid 1 without one (prctl(2) PR_SET_CHILD_SUBREAPER). On Linux the `systemd
6
+ // --user` manager is a subreaper for everything in the user's session -- measured on the DGX Spark: this
7
+ // shell's ancestry ends bash -> claude -> CTM -> systemd 2177, and an orphaned proxy, fake Wall-E and
8
+ // spawn-helper all showed ppid 2177, never 1. So `ppid === 1` misses every orphan there.
9
+ //
10
+ // Another process's subreaper flag cannot be read, but an orphan of one of OUR descendants can only go to
11
+ // pid 1 or to one of our own ancestors (gascity #8058's argument), so the set is pid 1 plus each of this
12
+ // process's ancestors that is a `systemd` (the user manager; KiroCrew #10601, jstack #363 use the same
13
+ // test). On every other platform it is exactly {1}: macOS launchd is pid 1.
14
+
15
+ const fs = require('node:fs');
16
+
17
+ const MAX_ANCESTRY_STEPS = 64;
18
+
19
+ function _statusField(status, field) {
20
+ const m = new RegExp(`^${field}:\\s+(\\d+)`, 'm').exec(status);
21
+ return m ? Number(m[1]) : null;
22
+ }
23
+
24
+ /**
25
+ * @param {{ platform?: string, pid?: number, readFileSync?: Function }} [opts]
26
+ * @returns {Set<number>} always contains 1; on Linux also every `systemd` ancestor of `pid`.
27
+ */
28
+ function orphanParentPids({ platform = process.platform, pid = process.pid, readFileSync = fs.readFileSync } = {}) {
29
+ const parents = new Set([1]);
30
+ if (platform !== 'linux') return parents;
31
+ let current = pid;
32
+ const seen = new Set();
33
+ for (let step = 0; step < MAX_ANCESTRY_STEPS; step += 1) {
34
+ let status;
35
+ try {
36
+ status = String(readFileSync(`/proc/${current}/status`, 'utf8'));
37
+ } catch {
38
+ break; // expected: the ancestor exited mid-walk or /proc is unreadable -- what was found stands
39
+ }
40
+ const ppid = _statusField(status, 'PPid');
41
+ if (!Number.isSafeInteger(ppid) || ppid <= 1 || seen.has(ppid)) break;
42
+ seen.add(ppid);
43
+ let comm = '';
44
+ try {
45
+ comm = String(readFileSync(`/proc/${ppid}/comm`, 'utf8')).trim();
46
+ } catch {
47
+ break; // expected: the parent exited between the two reads
48
+ }
49
+ if (comm === 'systemd') parents.add(ppid);
50
+ current = ppid;
51
+ }
52
+ return parents;
53
+ }
54
+
55
+ module.exports = { orphanParentPids, MAX_ANCESTRY_STEPS };
@@ -9,7 +9,7 @@
9
9
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
10
10
  31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
11
11
  41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
12
- 51, 52, 53, 54, 55, 56
12
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61
13
13
  ]
14
14
  },
15
15
  "walle": {
@@ -25,7 +25,7 @@
25
25
  71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
26
26
  81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
27
27
  97, 98, 99, 100,
28
- 101
28
+ 101, 102, 103, 104, 105
29
29
  ]
30
30
  }
31
31
  }
@@ -783,6 +783,9 @@ const OP_META = {
783
783
  recordResumeLineage: { kind: 'write', equality: 'exact', domain: 'firehose', tables: ['session_resume_lineage'] },
784
784
  // WP-0 change feed: the ACK is a write on the firehose file (db.js:19895).
785
785
  ackConversationChanges: { kind: 'write', equality: 'exact', domain: 'firehose', tables: ['conversation_projection_outbox_v2', 'conversation_projection_deletes_v2'] },
786
+ conversationSyncVector: { kind: 'write', equality: 'exact', domain: 'firehose', tables: ['conversation_item_clock', 'conversation_vv', 'conversation_local_seq'] },
787
+ conversationSyncChanges: { kind: 'write', equality: 'exact', domain: 'firehose', tables: ['conversation_item_clock', 'conversation_vv', 'conversation_local_seq'] },
788
+ conversationSyncApply: { kind: 'write', equality: 'exact', domain: 'firehose', tables: ['conversation_text_items_v2', 'conversation_item_placement_v2', 'conversation_item_clock', 'conversation_vv'] },
786
789
  // --- core (session identity, user content, runtime control state; latency-critical) ---
787
790
  updateRuntimeInputEnvelope: { kind: 'write', equality: 'exact', domain: 'core', tables: ['ctm_runtime_input_envelopes'] },
788
791
  upsertRuntimeRouteSnapshot: { kind: 'write', equality: 'exact', domain: 'core', tables: ['ctm_runtime_route_snapshots'] },
@@ -15,6 +15,7 @@ const DEFAULT_SERVICES = ['iMessage', 'SMS', 'RCS'];
15
15
  const AdapterBase = require('./adapter-base');
16
16
  const { decodeAttributedBodyText } = require('../lib/imessage/typedstream-text');
17
17
  const { editedCurrentText } = require('../lib/imessage/bplist-min');
18
+ const { boolFlag } = require('../lib/env-flags');
18
19
 
19
20
  function normalizeServices(services) {
20
21
  const requested = Array.isArray(services) ? services : [];
@@ -217,6 +218,16 @@ class IMessageAdapter extends AdapterBase {
217
218
  }
218
219
  }
219
220
 
221
+ // D-5/S-21 (shared-memory WP-2, Q-2): this adapter is OFF on a `role:'box'` machine — the box
222
+ // shares the hub's Apple ID (3/3 probed guids matched), so both Macs would ingest the same
223
+ // chat.db and double-extract it. A machine with a DIFFERENT Apple ID opts in with
224
+ // WALLE_IMESSAGE_INGEST=1. Ingest itself is host-local and never duplicates rows (deterministic
225
+ // ids), so a role we cannot read keeps today's behaviour: the adapter stays active.
226
+ function imessageIngestEnabled(placement) {
227
+ if (!placement || placement.role !== 'box') return true;
228
+ return boolFlag('WALLE_IMESSAGE_INGEST', false);
229
+ }
230
+
220
231
  // D-18: service-alert-store's addServiceAlert() is async and needs a kvStore
221
232
  // ({getKv,setKv}) rather than a single call, so this is the "tiny helper"
222
233
  // the WP-1 brief calls for -- shared by agent.js and lib/scheduler-worker-jobs.js
@@ -248,5 +259,6 @@ function buildHealthReporter(kvStore, { addServiceAlert, fdaGuidance } = {}) {
248
259
  module.exports = IMessageAdapter;
249
260
  module.exports.IMessageAdapter = IMessageAdapter;
250
261
  module.exports.buildHealthReporter = buildHealthReporter;
262
+ module.exports.imessageIngestEnabled = imessageIngestEnabled;
251
263
  module.exports.normalizeServices = normalizeServices;
252
264
  module.exports.DEFAULT_SERVICES = DEFAULT_SERVICES;
@@ -103,6 +103,8 @@ const {
103
103
  // interval engine) is gone with it — on-demand skill execution in skill-planner
104
104
  // is untouched.
105
105
  const { runDueJobs, recoverLostRuns } = require('./jobs/job-runner');
106
+ // shared-memory WP-2 (D-5/S-17/S-19): the derivation-home gate for `placement: 'home'` jobs.
107
+ const { runIfHome } = require('./lib/derivation-home');
106
108
  const { getIncidentLog } = require('./lib/incident-log');
107
109
  const { ProcessErrorReporter } = require('./lib/process-error-reporter');
108
110
  const errorSink = require('./lib/error-sink');
@@ -526,8 +528,8 @@ async function main() {
526
528
  // When CTM is unreachable the bridge fails closed to the local rules (no hang).
527
529
  try {
528
530
  const { configure: configurePermissions } = require('./tools/permission-checker');
529
- const ctmPort = process.env.CTM_PORT || require('./lib/ctm-endpoint').ctmPort();
530
- configurePermissions({ ctmUrl: `http://localhost:${ctmPort}`, ctmToken: process.env.CTM_TOKEN });
531
+ const { resolveApiBaseUrl } = require('./memory/ctm-context-client'); // R-7: one resolver; WALLE_CTM_API=0 = bridge off
532
+ configurePermissions({ ctmUrl: resolveApiBaseUrl(process.env) || null, ctmToken: process.env.CTM_TOKEN });
531
533
  } catch (e) { console.warn('[wall-e] permission bridge configure failed:', e.message); }
532
534
 
533
535
  let eventLoopWatchdog = null;
@@ -1279,6 +1281,7 @@ async function main() {
1279
1281
  // preserved.
1280
1282
  scheduler.register({
1281
1283
  name: 'ingest',
1284
+ placement: 'any', // D-5(a): host-local ingest runs where the data lives (the iMessage adapter gates itself, S-21)
1282
1285
  // WP-1b (E-6 follow-up): derived from enabled poll adapters' manifests
1283
1286
  // (adapters/registry.js:ingestNetworkClass) — local-only dev still
1284
1287
  // ingests local sources (imessage) while enabled Slack keeps it external.
@@ -1303,6 +1306,7 @@ async function main() {
1303
1306
  // projection; it is the only way coding-session text reaches the brain (D-11a).
1304
1307
  scheduler.register({
1305
1308
  name: 'conversation-subscriber',
1309
+ placement: 'any', // D-11a: pulls CTM's own conversation feed — host-local
1306
1310
  networkClass: 'local',
1307
1311
  run: () => require('./memory/conversation-subscriber').runConversationSubscriberOnce({ brain }),
1308
1312
  intervalMs: clampInterval(config.intervals?.conversation_subscriber_ms, 30 * 1000),
@@ -1316,8 +1320,9 @@ async function main() {
1316
1320
 
1317
1321
  scheduler.register({
1318
1322
  name: 'memory-consolidation',
1323
+ placement: 'home', // D-5(c)/S-17: derives from replicated walle-coding rows — derivation home only
1319
1324
  networkClass: 'local', // WP-6: decisions are the deterministic defaultDecision (no model call); FTS search + loopback CTM reads only
1320
- run: () => require('./memory/consolidation').runMemoryConsolidation({ brain }),
1325
+ run: () => runIfHome('memory-consolidation', () => require('./memory/consolidation').runMemoryConsolidation({ brain })),
1321
1326
  intervalMs: clampInterval(config.intervals?.memory_consolidation_ms, 60 * 60 * 1000),
1322
1327
  pool: 'maintenance',
1323
1328
  lane: 2,
@@ -1350,6 +1355,7 @@ async function main() {
1350
1355
 
1351
1356
  scheduler.register({
1352
1357
  name: 'think',
1358
+ placement: 'any', // D-5(d): extraction of locally ingested pending memories runs everywhere (think gates only its derived steps, S-18/S-20)
1353
1359
  networkClass: 'llm',
1354
1360
  // WP-7: think's model calls stop 15 s before the job request deadline. A worker run reads that deadline
1355
1361
  // from its runtime execution context; this in-process run (no worker pool) is bounded by the same constant.
@@ -1375,6 +1381,7 @@ async function main() {
1375
1381
 
1376
1382
  scheduler.register({
1377
1383
  name: 'jobs',
1384
+ placement: 'any', // D-5(c)/S-16: the engine gates derived action_kinds itself; builtin jobs run everywhere
1378
1385
  networkClass: 'llm',
1379
1386
  // surface-redesign WP-3 §5: ONE scheduler job over the jobs/job_runs
1380
1387
  // records, replacing the `tasks` and `skills` registrations. runDueJobs
@@ -1406,8 +1413,9 @@ async function main() {
1406
1413
 
1407
1414
  scheduler.register({
1408
1415
  name: 'reflect',
1416
+ placement: 'home', // D-5(c)/S-19: rewrites entities from every node's rows (LWW churn) — derivation home only
1409
1417
  networkClass: 'llm',
1410
- run: () => reflect.runOnce(),
1418
+ run: () => runIfHome('reflect', () => reflect.runOnce()),
1411
1419
  intervalMs: clampInterval(config.intervals?.reflect_ms, 3600000),
1412
1420
  pool: 'llm_background',
1413
1421
  lane: 2,
@@ -1427,6 +1435,7 @@ async function main() {
1427
1435
 
1428
1436
  scheduler.register({
1429
1437
  name: 'backfill',
1438
+ placement: 'any', // host-local backfill over this node's own rows (embeddings are derived per node, id-stable)
1430
1439
  // E-6: calls embeddings.batchComputeEmbeddings, which routes to whatever
1431
1440
  // embedding provider is configured — MAY hit a remote provider, not
1432
1441
  // guaranteed local-Ollama.
@@ -1463,6 +1472,7 @@ async function main() {
1463
1472
  // is idempotent (skips if today's already exists) and createBackup is now non-blocking.
1464
1473
  scheduler.register({
1465
1474
  name: 'daily-backup',
1475
+ placement: 'any', // local sqlite file copy only — every node backs up its own brain file
1466
1476
  networkClass: 'local', // local sqlite file copy only
1467
1477
  run: async () => {
1468
1478
  const r = await brain.ensureDailyBackup();
@@ -1496,6 +1506,7 @@ async function main() {
1496
1506
  let walOverThresholdStreak = 0;
1497
1507
  scheduler.register({
1498
1508
  name: 'wal-checkpoint',
1509
+ placement: 'any', // host-local WAL hygiene for this node's own file
1499
1510
  networkClass: 'local', // local sqlite WAL checkpoint/planner-optimize only
1500
1511
  worker: false,
1501
1512
  workerHeavy: false,
@@ -1599,6 +1610,7 @@ async function main() {
1599
1610
  // short brain-owner op (WP-6: the writer is never held for the whole sweep), age-gated + batched. See the 2026-05-31 audit.
1600
1611
  scheduler.register({
1601
1612
  name: 'brain-retention',
1613
+ placement: 'any', // local table pruning only — each node prunes its own file
1602
1614
  networkClass: 'local', // local table pruning only
1603
1615
  run: async () => await brain.brainRetentionJob(require('./loops/brain-write').brainWrite),
1604
1616
  intervalMs: 24 * 60 * 60 * 1000,
@@ -1616,12 +1628,62 @@ async function main() {
1616
1628
  onError: (err) => console.error('[brain-retention] Error:', err.message),
1617
1629
  });
1618
1630
 
1631
+ // shared-memory WP-0 §6.3: give every pre-existing replicated row a v2 clock, one bounded
1632
+ // owner page (2,000 rows) per tick; a no-op once the kv cursor says done. Never boot work.
1633
+ scheduler.register({
1634
+ name: 'brain-clock-seed',
1635
+ placement: 'any', // WP-0 (S-71): this node's own pre-existing rows need their v2 clock locally
1636
+ networkClass: 'local',
1637
+ worker: false,
1638
+ workerHeavy: false,
1639
+ executionClass: 'constant-time-control',
1640
+ run: async () => {
1641
+ const state = require('./brain/brain-sync-store').clockSeedState(brain.getDb());
1642
+ if (state && state.done) return { skipped: true, reason: 'done' };
1643
+ return require('./loops/brain-write').brainWrite('brainSyncClockSeed', { limit: 2000 });
1644
+ },
1645
+ intervalMs: 5000,
1646
+ pool: 'maintenance',
1647
+ lane: 2,
1648
+ priority: 11,
1649
+ startDelayMs: 60000,
1650
+ onError: (err) => console.error('[brain-clock-seed] Error:', err.message),
1651
+ });
1652
+
1653
+ // shared-memory WP-4 §6.7: drive the join import one bounded page per tick, only while a join
1654
+ // is in flight (verifying/importing). A no-op otherwise — a machine that never joins pays
1655
+ // nothing but the kv read. Same owner-routed seam as brain-clock-seed: the job's handle is
1656
+ // read-only, so the page (four replicated tables + their clock rows, sentinel on) runs on the
1657
+ // owner's write connection. The kv cursor makes a killed import resume without duplicates.
1658
+ scheduler.register({
1659
+ name: 'brain-join-import',
1660
+ placement: 'any', // the imported rows land on THIS member's own brain
1661
+ networkClass: 'local',
1662
+ worker: false,
1663
+ workerHeavy: false,
1664
+ executionClass: 'constant-time-control',
1665
+ run: async () => {
1666
+ const state = require('./brain/brain-join').joinStatus(brain.getDb());
1667
+ if (!state || state.state === 'none' || state.state === 'done' || state.state === 'failed') {
1668
+ return { skipped: true, reason: (state && state.state) || 'none' };
1669
+ }
1670
+ return require('./loops/brain-write').brainWrite('brainSyncV2JoinStep', { limit: 5000 });
1671
+ },
1672
+ intervalMs: 2000,
1673
+ pool: 'maintenance',
1674
+ lane: 2,
1675
+ priority: 11,
1676
+ startDelayMs: 75000,
1677
+ onError: (err) => console.error('[brain-join-import] Error:', err.message),
1678
+ });
1679
+
1619
1680
  // Model facts sync daemon fallback. LiteLLM supplies broad provider context-
1620
1681
  // window/cost FACTS into model_facts ONLY — model-facts-registry-separation-
1621
1682
  // session-owned-window WP-3 replaced the old pricing-sync skill (which
1622
1683
  // wrote straight into model_registry route rows) in place.
1623
1684
  scheduler.register({
1624
1685
  name: 'model-facts-sync',
1686
+ placement: 'any', // D-19: the facts catalog is shared, the write is idempotent per node
1625
1687
  networkClass: 'external', // fetches the LiteLLM facts catalog
1626
1688
  run: async () => {
1627
1689
  const sync = require('./skills/_bundled/model-facts-sync/run');
@@ -1657,6 +1719,7 @@ async function main() {
1657
1719
  // write through the brain owner.
1658
1720
  scheduler.register({
1659
1721
  name: 'connections',
1722
+ placement: 'any', // D-12: probes THIS machine's credential surface and writes its own record
1660
1723
  networkClass: 'external', // Slack auth.test + the gateway /_status
1661
1724
  run: () => runConnectionProbe(),
1662
1725
  intervalMs: 300000, // 5 min (D-12)
@@ -1678,6 +1741,7 @@ async function main() {
1678
1741
  // dry-run so operators can inspect candidate counts before enabling it.
1679
1742
  scheduler.register({
1680
1743
  name: 'telemetry:cleanup',
1744
+ placement: 'any', // local telemetry-DB row deletes/redactions on this node's own store
1681
1745
  networkClass: 'local', // local telemetry-DB row deletes/redactions only, no outbound sends
1682
1746
  run: async () => {
1683
1747
  const { runTelemetryCleanup, isTelemetryCleanupLive } = require('./api-walle');
@@ -1712,6 +1776,7 @@ async function main() {
1712
1776
  // Weekly coding-agent benchmark suite (Phase 5)
1713
1777
  scheduler.register({
1714
1778
  name: 'agent-benchmark',
1779
+ placement: 'any', // opt-in per-machine evaluation (heavyEvalJobsEnabled), writes only its own results
1715
1780
  networkClass: 'llm',
1716
1781
  run: async () => {
1717
1782
  const { runAgentBenchmarkSuite, detectRegressions, resolveModelName } = require('./runtime/evaluation/agent-runner');
@@ -1762,6 +1827,7 @@ async function main() {
1762
1827
  // Weekly full evaluation loop (Phase 8: benchmarks + regressions + mining + promotions + aggregation)
1763
1828
  scheduler.register({
1764
1829
  name: 'weekly-eval-loop',
1830
+ placement: 'any', // opt-in per-machine evaluation loop (Sundays, heavyEvalJobsEnabled)
1765
1831
  networkClass: 'llm',
1766
1832
  run: async () => {
1767
1833
  const { run: runWeeklyEval } = require('./runtime/evaluation/weekly-eval-loop');
@@ -1797,6 +1863,7 @@ async function main() {
1797
1863
  // is no day-of-week gate because the evaluator owns its own timing.
1798
1864
  scheduler.register({
1799
1865
  name: 'helper-rules-probe',
1866
+ placement: 'any', // local sqlite read + one owner-path write on this node's own outcome stream
1800
1867
  networkClass: 'local', // local sqlite read + one owner-path write, no provider call
1801
1868
  run: async () => runRuntimeJob(
1802
1869
  'helper-rules-probe',
@@ -37,7 +37,7 @@ const { handleSkillsApi } = require('./http/skills-api');
37
37
  const { handleSlackApi } = require('./http/slack-api');
38
38
  const { handleSystemApi } = require('./http/system-api');
39
39
  const { handleTelemetryApi } = require('./http/telemetry-api');
40
- const { handleModelProxyProvidersFeed } = require('./http/model-proxy-providers');
40
+ const { handleModelProxyProvidersFeed, handleDelegateDefaultsFeed, handleProviderExport } = require('./http/model-proxy-providers');
41
41
  const {
42
42
  jsonResponse,
43
43
  parseLimit,
@@ -2334,6 +2334,26 @@ function routeWalleApi(req, res, url, routeHandlers = {}) {
2334
2334
  errorStatus: apiReadErrorStatus,
2335
2335
  });
2336
2336
  if (providerFeedHandled !== false) return providerFeedHandled;
2337
+ // WP-1 (docs/remote-box-model-access-2026-10-26.html §6.1): the box's own /delegate defaults, so
2338
+ // the hub can say whether the box can reach the route its pick names. Same loopback guard and the
2339
+ // same dispatch site as the provider feed above.
2340
+ const delegateDefaultsHandled = handleDelegateDefaultsFeed(req, res, url, {
2341
+ isLoopbackRequest: ctmTransportSecurity?.isLoopbackRequest,
2342
+ brainAvailable: !!brain,
2343
+ errorStatus: apiReadErrorStatus,
2344
+ });
2345
+ if (delegateDefaultsHandled !== false) return delegateDefaultsHandled;
2346
+ // WP-5 (docs/remote-box-model-access-2026-10-26.html §5.1 R-5/R-6, §6.4): the hub's CTM reads
2347
+ // ONE route WITH its key here, to copy it onto a paired box on an explicit click. Same loopback
2348
+ // guard and the same dispatch site as the two leaves above — it is the only route that returns a
2349
+ // credential, and loopback is what confines it to this host.
2350
+ const providerExportHandled = handleProviderExport(req, res, url, {
2351
+ readBrain,
2352
+ isLoopbackRequest: ctmTransportSecurity?.isLoopbackRequest,
2353
+ brainAvailable: !!brain,
2354
+ errorStatus: apiReadErrorStatus,
2355
+ });
2356
+ if (providerExportHandled !== false) return providerExportHandled;
2337
2357
  if (url.pathname === '/api/wall-e/background/completion' && req.method === 'POST') {
2338
2358
  if (!brain || !ensureBrainInit()) return jsonResponse(res, { error: 'Brain module not available' }, 503), true;
2339
2359
  return handleBackgroundCompletionApi(req, res, url, { brain });
@@ -1953,7 +1953,7 @@ function printHelp() {
1953
1953
  node wall-e/bin/train-gemma-e4b-tooluse.js validate-dataset --output-dir /tmp/run
1954
1954
  node wall-e/bin/train-gemma-e4b-tooluse.js dry-run-train --output-dir /tmp/run --base-model /path/to/base
1955
1955
  node wall-e/bin/train-gemma-e4b-tooluse.js train --output-dir /tmp/run --base-model /path/to/base --iters 600 --max-seq-length 8192
1956
- node wall-e/bin/train-gemma-e4b-tooluse.js train --backend cuda --remote-host spark@dgx-spark --preset best-practice --output-dir /tmp/run --base-model /path/to/base --remote-base-model ~/models/gemma-4-E4B-it
1956
+ node wall-e/bin/train-gemma-e4b-tooluse.js train --backend cuda --remote-host dgx-spark --preset best-practice --output-dir /tmp/run --base-model /path/to/base --remote-base-model ~/models/gemma-4-E4B-it
1957
1957
  node wall-e/bin/train-gemma-e4b-tooluse.js register-candidate --output-dir /tmp/run --alias gemma-e4b-tooluse-v1
1958
1958
 
1959
1959
  Dataset export options:
@@ -2049,7 +2049,7 @@ Backend / DGX Spark (CUDA) options:
2049
2049
  --backend mlx|cuda mlx = local Metal (default); cuda = PyTorch/PEFT/bitsandbytes
2050
2050
  --load-in-4bit true|false NF4 QLoRA on the CUDA path (default true)
2051
2051
  --remote-host user@host run the CUDA launcher on the Spark over ssh/rsync
2052
- (e.g. spark@dgx-spark); omit to run on a local CUDA box
2052
+ (e.g. dgx-spark, an alias naming the login); omit for a local CUDA box
2053
2053
  --remote-root path remote run root (default ~/walle-training)
2054
2054
  --remote-base-model path remote-side base model path on the Spark
2055
2055
  --remote-python path remote venv python (default ~/.cuda-train-env/bin/python3)
@@ -48,9 +48,9 @@ const TOOL_PROXY_TIMEOUTS_MS = Object.freeze({
48
48
  walle_lookup_context: 60000, walle_context_hint: 60000,
49
49
  walle_postflight_check: 60000, walle_search_sessions: 60000,
50
50
  walle_get_session: 60000, walle_context_pack: 90000,
51
- ask_walle: 240000, walle_worker_wait: 545000,
51
+ ask_walle: 240000, walle_worker_wait: 545000, walle_landing_wait: 545000, // WP-4 §6.4: the landing wait polls up to 540000 ms; its proxy deadline outlasts it.
52
52
  walle_imessage_search: 10000, walle_imessage_read_chat: 10000,
53
- walle_imessage_list_chats: 10000,
53
+ walle_imessage_list_chats: 10000, hub_exec: 125000, // hub bridge §6.4: exec 120000 + the client's 2 s grace (memory/hub-bridge-client.js) + 2 s HTTP grace = 124000; 125000 outlasts it.
54
54
  walle_delegate_implementation: LAUNCH_TOOL_PROXY_TIMEOUT_MS, walle_resume_worker: LAUNCH_TOOL_PROXY_TIMEOUT_MS, // R-3: the daemon's own CTM deadline is 30000 (mcp-server.js, delegate + resume) + 5000
55
55
  });
56
56
 
@@ -170,9 +170,9 @@ function _localControlPlaneEnabled() {
170
170
  async function _localControlResponseOne(message) {
171
171
  // WP-4 §6.4: the caller harness's `explore` cell lives in the daemon (this process owns no
172
172
  // brain): read-only endpoint, existing breaker machinery, 1500 ms bound, fail-open 'on'.
173
- const options = message?.method === 'initialize'
174
- ? { leadGuidance: { explore: await fetchExploreCellState({ agent: leadAgentFromClientInfo(message.params?.clientInfo), requestFn: (path) => _executeDaemonRequest(() => httpJsonGet({ host: process.env.WALLE_HOST || '127.0.0.1', port: _wallePort(), path })) }) } }
175
- : undefined;
173
+ const options = await require('../memory/hub-bridge-client').controlPlaneOptions(message, { // R-1/R-2/WP-2/WP-3: this file is at a frozen ceiling, so the gate, the hub context and the list_changed timer live in hub-bridge-client.js
174
+ writeMessage, leadGuidance: () => fetchExploreCellState({ agent: leadAgentFromClientInfo(message.params?.clientInfo), requestFn: (path) => _executeDaemonRequest(() => httpJsonGet({ host: process.env.WALLE_HOST || '127.0.0.1', port: _wallePort(), path })) }).then((explore) => ({ explore })),
175
+ });
176
176
  let control = handleProtocolMessage(message, options);
177
177
  if (!control.handled) {
178
178
  control = require('../mcp-contract').handleControlMessage(message, options);