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,118 @@
1
+ 'use strict';
2
+
3
+ // WP-0/WP-1 (docs/fleet-auto-update-pooled-machines-2026-10-26.html §6, §8 WP-0/WP-1, §9 S-4/S-6):
4
+ // the fleet route cluster.
5
+ //
6
+ // GET /api/fleet/status (read, peerControl) -> { ok, ...readFleetStatus() }
7
+ // POST /api/fleet/bundle?to=<40-hex sha> (admin, peerControl) -> 202 | 400 | 409 | 413
8
+ //
9
+ // This is the BOX side of the fleet: a hub asks each member "what is your checkout?" and decides
10
+ // eligibility from the answer (channel git + branch main + clean tree, per the lead's 2026-10-26
11
+ // decision — there is no `autoUpdate` setting), then PUSHES the fast-forward bundle it built
12
+ // (`git bundle create - <boxHead>..<target>`) as the raw body of the bundle route (D-3). The box
13
+ // verifies, parks it in `refs/fleet/incoming`, and hands the apply to the detached helper — the hub
14
+ // never runs a command on the box (D-4).
15
+ //
16
+ // Same shape as lib/api/machine-pool.js and lib/api/machines.js: NEW surface, so there is no legacy
17
+ // handleApi branch to delete and tests-integration/api-router-parity.test.js's no-dual-dispatch rule
18
+ // is satisfied by construction. The auth rows live in lib/auth-rules.js (`read` + peerControl on the
19
+ // status GET, `admin` + peerControl on the bundle POST — NOT loopbackOnly, because a hub on another
20
+ // machine reaches them over the peer bearer).
21
+
22
+ const path = require('node:path');
23
+ const { registerApiRoutes } = require('../api-router');
24
+ const fleetUpdate = require('../fleet-update');
25
+ const originFollower = require('../fleet-origin-follower');
26
+ const { createResolverTick } = require('../fleet-resolver-tick');
27
+ const { loadTargetLandingConfig } = require('../landing/config');
28
+
29
+ // The repo root that contains `coding-task-manager/` — `lib/api/` is three levels below it.
30
+ const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
31
+
32
+ let _deps = null;
33
+ // WP-3 (docs/fleet-origin-main-sync-skill-2026-10-31.html §5 R-8, §6.5): the CTM origin follower's
34
+ // handle, so a re-configure (dev reload, tests) stops the previous timer instead of stacking one.
35
+ let _follower = null;
36
+
37
+ function configure({ repoRoot = DEFAULT_REPO_ROOT, dataDir = '', port = null, runningSha = '', sessions = () => [], guardSnapshot = null, sendJsonResponse, resolverEffects = null } = {}) {
38
+ _deps = { repoRoot, dataDir, port, runningSha, sessions, guardSnapshot, sendJsonResponse };
39
+ // R-8: this box pulls origin itself. The follower no-ops on a dev instance, on a repository with no
40
+ // `landing.publish`, and on a checkout that is not on `main` (see lib/fleet-origin-follower.js), so
41
+ // arming it here is safe for every boot. A throw here would take the whole server down over an
42
+ // optional background timer, so it is reported and dropped.
43
+ if (_follower && typeof _follower.stop === 'function') _follower.stop();
44
+ // §13.4 R-R1/R-R7 (WP-8): when server.js hands over the resolver effects, arm the follower's
45
+ // per-tick resolver hooks from the TARGET tree's normalized `landing.publish`. The config is read
46
+ // exactly the way the follower reads it; a repository that cannot be read (or has no publish block)
47
+ // simply gets a follower with no resolver — never a boot failure.
48
+ let resolverTick = null;
49
+ if (resolverEffects) {
50
+ try {
51
+ const config = loadTargetLandingConfig(repoRoot);
52
+ if (config && config.publish) {
53
+ resolverTick = createResolverTick({ repoRoot, publish: config.publish, deps: resolverEffects });
54
+ }
55
+ } catch (error) {
56
+ // REPORT: the resolver half is optional; the follower and the routes below are not.
57
+ console.warn(`[fleet] resolver tick not wired: ${(error && error.message) || error}`);
58
+ }
59
+ }
60
+ try {
61
+ _follower = originFollower.start({ repoRoot, dataDir, port, resolverTick });
62
+ } catch (error) {
63
+ // REPORT: the follower is optional; the fleet routes below are not. Never fail boot for it.
64
+ console.warn(`[fleet] origin follower not started: ${(error && error.message) || error}`);
65
+ }
66
+ }
67
+
68
+ function _send(res, status, payload) {
69
+ if (_deps && typeof _deps.sendJsonResponse === 'function') return _deps.sendJsonResponse(res, status, payload);
70
+ const body = JSON.stringify(payload || {});
71
+ res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) });
72
+ res.end(body);
73
+ }
74
+
75
+ /** The current session list, from the SAME source /api/instance/update-gate feeds the guard. */
76
+ function _sessions() {
77
+ const source = _deps && _deps.sessions;
78
+ if (typeof source !== 'function') return [];
79
+ const value = source();
80
+ return value ? Array.from(value) : [];
81
+ }
82
+
83
+ async function handleFleetStatus(req, res) {
84
+ const status = await fleetUpdate.readFleetStatus({
85
+ repoRoot: (_deps && _deps.repoRoot) || DEFAULT_REPO_ROOT,
86
+ dataDir: (_deps && _deps.dataDir) || '',
87
+ runningSha: (_deps && _deps.runningSha) || '',
88
+ sessions: _sessions(),
89
+ guardSnapshot: (_deps && _deps.guardSnapshot) || null,
90
+ });
91
+ return _send(res, 200, { ok: true, ...status });
92
+ }
93
+
94
+ /** POST /api/fleet/bundle?to=<40-hex sha> — the hub's push leg; the body IS the git bundle (D-3). */
95
+ async function handleFleetBundle(req, res) {
96
+ const url = new URL(req.url, 'http://localhost');
97
+ const result = await fleetUpdate.acceptFleetBundle(req, {
98
+ to: String(url.searchParams.get('to') || ''),
99
+ repoRoot: (_deps && _deps.repoRoot) || DEFAULT_REPO_ROOT,
100
+ dataDir: (_deps && _deps.dataDir) || require('../data-dir').getDataDir(),
101
+ port: (_deps && _deps.port) || null,
102
+ });
103
+ return _send(res, result.status, result.body);
104
+ }
105
+
106
+ function register() {
107
+ registerApiRoutes('fleet', [
108
+ { method: 'GET', path: '/api/fleet/status', handler: (req, res) => handleFleetStatus(req, res) },
109
+ { method: 'POST', path: '/api/fleet/bundle', handler: (req, res) => handleFleetBundle(req, res) },
110
+ ]);
111
+ }
112
+
113
+ module.exports = {
114
+ configure,
115
+ register,
116
+ handleFleetBundle,
117
+ handleFleetStatus,
118
+ };
@@ -0,0 +1,243 @@
1
+ 'use strict';
2
+
3
+ // WP-0/WP-2 (docs/remote-session-hub-bridge-2026-10-30.html §6.2, §8 WP-0/WP-2): the HTTP surface of
4
+ // the hub-bridge lane.
5
+ //
6
+ // BOX side (loopback only, WP-0):
7
+ // GET /api/hub-bridge/status[?session=<ctmSessionId>]
8
+ // -> { role:'box'|'none', hubs:[{hubInstanceId,hubDisplayName,connected}], poolMembers,
9
+ // self:{instanceId,displayName}, session?:{hubInstanceId,hubDisplayName,connected}|null }
10
+ // POST /api/hub-bridge/call body { callerSessionId, op, args, deadlineMs? } -> 200 { ok, result|error }
11
+ //
12
+ // HUB side (user principal only, WP-2 — lib/auth-rules.js rows are `admin` + stepUp 'remote' and
13
+ // deliberately carry NO peerControl, so the box's peer bearer can never mint a grant, R-4):
14
+ // GET /api/hub-bridge/grants -> { grants, pending } (Grant rows carry scope/always)
15
+ // POST /api/hub-bridge/grants body { machineId, callerSessionId, tier, ttlSec?, always? }
16
+ // callerSessionId is a uuid — or '*' for every session of
17
+ // that machine (D-1/D-3); always:true is durable (D-4).
18
+ // DELETE /api/hub-bridge/grants body { machineId, callerSessionId, tier? }
19
+ // POST /api/hub-bridge/pending/:id/deny
20
+ // GET /api/hub-bridge/trust -> the R-11 trust file (incl. its durable `grants`)
21
+ // PUT /api/hub-bridge/trust body { default?, machines? } (never writes `grants`)
22
+ // GET /api/hub-bridge/audit?machineId=&limit= -> { entries } (R-9, digest only)
23
+ //
24
+ // A BRIDGE error on status/call is DATA with HTTP 200 (the design says so explicitly); only a
25
+ // malformed JSON body is a 400. The hub-side admin routes answer 400 for a bad body and 200 otherwise.
26
+ //
27
+ // Same configure()/register() shape as lib/api/machine-pool.js; the handler bodies live in
28
+ // lib/hub-bridge-box.js's singleton (box side) and lib/hub-bridge-access.js's singleton (hub side).
29
+
30
+ const { registerApiRoutes } = require('../api-router');
31
+
32
+ let _deps = null;
33
+
34
+ function configure({ status, call, readJsonRequestBody, sendJsonResponse, access, reconcile } = {}) {
35
+ _deps = { status, call, readJsonRequestBody, sendJsonResponse, access, reconcile };
36
+ }
37
+
38
+ /** The access/trust/grant store (lib/hub-bridge-access.js), injected at boot or lazily required. */
39
+ function _access() {
40
+ if (_deps && _deps.access) return _deps.access;
41
+ return require('../hub-bridge-access');
42
+ }
43
+
44
+ function _send(res, statusCode, payload) {
45
+ if (_deps && typeof _deps.sendJsonResponse === 'function') return _deps.sendJsonResponse(res, statusCode, payload);
46
+ const body = JSON.stringify(payload || {});
47
+ res.writeHead(statusCode, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) });
48
+ res.end(body);
49
+ }
50
+
51
+ function _readJson(req) {
52
+ if (_deps && typeof _deps.readJsonRequestBody === 'function') return _deps.readJsonRequestBody(req);
53
+ return new Promise((resolve, reject) => {
54
+ const chunks = [];
55
+ req.on('data', (chunk) => chunks.push(chunk));
56
+ req.on('end', () => {
57
+ const raw = Buffer.concat(chunks).toString('utf8');
58
+ if (!raw) return resolve({});
59
+ try {
60
+ resolve(JSON.parse(raw));
61
+ } catch {
62
+ reject(new Error('invalid_json'));
63
+ }
64
+ });
65
+ req.on('error', reject);
66
+ });
67
+ }
68
+
69
+ /** Read a JSON body, or null when it is malformed (the caller answers 400). */
70
+ async function _body(req) {
71
+ try {
72
+ const parsed = await _readJson(req);
73
+ return parsed && typeof parsed === 'object' ? parsed : {};
74
+ } catch {
75
+ return null;
76
+ }
77
+ }
78
+
79
+ function _badRequest(res, code, message) {
80
+ return _send(res, 400, { ok: false, error: { code, message } });
81
+ }
82
+
83
+ /** Map a named refusal thrown by lib/hub-bridge-access.js onto an HTTP status. */
84
+ function _accessFailure(res, error) {
85
+ const code = String((error && error.code) || 'hub_bridge_error');
86
+ const status = code === 'trust_value_invalid' || code === 'grant_invalid' ? 400 : 500;
87
+ return _send(res, status, { ok: false, error: { code, message: String((error && error.message) || code) } });
88
+ }
89
+
90
+ /**
91
+ * R-5 (§6.1): the box status. An optional `?session=<ctmSessionId>` asks "is THIS session's creator
92
+ * hub connected" — the box resolves the record and matches it against its live links. A missing/blank
93
+ * query passes nothing through, so the body carries no `session` key at all (a reader tells "no
94
+ * question" from "no record" by its presence). Never a 4xx for a bad id.
95
+ */
96
+ async function handleStatus(req, res, url) {
97
+ const session = String(url?.searchParams?.get('session') || '').trim();
98
+ const status = _deps && typeof _deps.status === 'function'
99
+ ? await _deps.status(session ? { session } : {})
100
+ : { role: 'none', hubs: [] };
101
+ return _send(res, 200, status);
102
+ }
103
+
104
+ async function handleCall(req, res) {
105
+ const body = await _body(req);
106
+ if (body === null) {
107
+ return _send(res, 400, { ok: false, error: { code: 'invalid_json', message: 'request body is not valid JSON' } });
108
+ }
109
+ const result = typeof _deps?.call === 'function'
110
+ ? await _deps.call({
111
+ callerSessionId: body.callerSessionId,
112
+ op: body.op,
113
+ args: body.args,
114
+ // WP-5 (R-12): the target machine rides the body TOP-LEVEL (an instance id or a display name),
115
+ // never inside `op`'s args — the op args are the machine's business, not the router's.
116
+ machine: body.machine,
117
+ deadlineMs: body.deadlineMs,
118
+ })
119
+ : { ok: false, error: { code: 'hub_unreachable', message: 'bridge_not_wired' } };
120
+ return _send(res, 200, result);
121
+ }
122
+
123
+ async function handleListGrants(req, res, url) {
124
+ const access = _access();
125
+ const machineId = String(url?.searchParams?.get('machineId') || '');
126
+ return _send(res, 200, {
127
+ grants: access.listGrants(),
128
+ pending: access.listPending(machineId ? { machineId } : {}),
129
+ });
130
+ }
131
+
132
+ async function handleCreateGrant(req, res) {
133
+ const body = await _body(req);
134
+ if (body === null) return _badRequest(res, 'invalid_json', 'request body is not valid JSON');
135
+ try {
136
+ // D-1/D-4: `always === true` is the durable answer; anything else is the in-memory hour grant.
137
+ // `callerSessionId` may be '*' (every session of the machine). Both are async writes now.
138
+ const grant = await _access().grantGrants({
139
+ machineId: body.machineId,
140
+ callerSessionId: body.callerSessionId,
141
+ tier: body.tier,
142
+ ttlSec: body.ttlSec,
143
+ always: body.always === true,
144
+ });
145
+ return _send(res, 200, { ok: true, grant });
146
+ } catch (error) {
147
+ return _accessFailure(res, error);
148
+ }
149
+ }
150
+
151
+ async function handleRevokeGrant(req, res) {
152
+ const body = await _body(req);
153
+ if (body === null) return _badRequest(res, 'invalid_json', 'request body is not valid JSON');
154
+ // D-4: drops the in-memory TTL rows AND the durable rows; the trust file is rewritten only when a
155
+ // durable row was actually removed.
156
+ const removed = await _access().revokeGrants({
157
+ machineId: body.machineId,
158
+ callerSessionId: body.callerSessionId,
159
+ tier: body.tier,
160
+ });
161
+ return _send(res, 200, { ok: true, removed });
162
+ }
163
+
164
+ async function handleDenyPending(req, res, url, params) {
165
+ const id = String((params && params.id) || '');
166
+ const denied = _access().denyPending(id);
167
+ if (!denied) return _send(res, 404, { ok: false, error: { code: 'pending_not_found', message: `no pending request ${id}` } });
168
+ return _send(res, 200, { ok: true, denied: true });
169
+ }
170
+
171
+ async function handleGetTrust(req, res) {
172
+ return _send(res, 200, _access().readTrust());
173
+ }
174
+
175
+ /**
176
+ * WP-5 (R-12): a successful trust write is the moment the mesh's desired set can change, so the mesh
177
+ * reconciles at once instead of waiting up to 30 s for its tick. Best-effort by construction: the
178
+ * trust file is already written and answered, and a mesh fault must never turn that into a 500.
179
+ */
180
+ function _reconcileMesh() {
181
+ const reconcile = _deps && _deps.reconcile;
182
+ if (typeof reconcile !== 'function') return;
183
+ try {
184
+ const pending = reconcile();
185
+ if (pending && typeof pending.catch === 'function') {
186
+ pending.catch(() => {
187
+ // REPORT (console only): reconcile never rejects by contract; a rejection is a mesh bug, not
188
+ // a trust-write failure, and the trust response has already been sent.
189
+ console.warn('[hub-bridge] mesh reconcile after trust write failed');
190
+ });
191
+ }
192
+ } catch (error) {
193
+ console.warn(`[hub-bridge] mesh reconcile after trust write failed: ${error?.message || error}`);
194
+ }
195
+ }
196
+
197
+ async function handlePutTrust(req, res) {
198
+ const body = await _body(req);
199
+ if (body === null) return _badRequest(res, 'invalid_json', 'request body is not valid JSON');
200
+ try {
201
+ const written = await _access().writeTrust({ default: body.default, machines: body.machines });
202
+ _reconcileMesh();
203
+ return _send(res, 200, written);
204
+ } catch (error) {
205
+ return _accessFailure(res, error);
206
+ }
207
+ }
208
+
209
+ async function handleAudit(req, res, url) {
210
+ const machineId = String(url?.searchParams?.get('machineId') || '');
211
+ const limit = Number(url?.searchParams?.get('limit')) || undefined;
212
+ return _send(res, 200, { entries: await _access().recentAudit({ machineId, limit }) });
213
+ }
214
+
215
+ function register() {
216
+ registerApiRoutes('hub-bridge', [
217
+ { method: 'GET', path: '/api/hub-bridge/status', handler: (req, res, url) => handleStatus(req, res, url) },
218
+ { method: 'POST', path: '/api/hub-bridge/call', handler: (req, res) => handleCall(req, res) },
219
+ // WP-2 (R-4/R-5/R-11/R-9): the hub-side admin surface. All user-principal only (auth-rules rows
220
+ // carry NO peerControl), so a box's peer bearer can neither read nor mint a grant.
221
+ { method: 'GET', path: '/api/hub-bridge/grants', handler: (req, res, url) => handleListGrants(req, res, url) },
222
+ { method: 'POST', path: '/api/hub-bridge/grants', handler: (req, res) => handleCreateGrant(req, res) },
223
+ { method: 'DELETE', path: '/api/hub-bridge/grants', handler: (req, res) => handleRevokeGrant(req, res) },
224
+ { method: 'POST', regex: /^\/api\/hub-bridge\/pending\/(?<id>[^/]+)\/deny$/, handler: (req, res, url, params) => handleDenyPending(req, res, url, params) },
225
+ { method: 'GET', path: '/api/hub-bridge/trust', handler: (req, res) => handleGetTrust(req, res) },
226
+ { method: 'PUT', path: '/api/hub-bridge/trust', handler: (req, res) => handlePutTrust(req, res) },
227
+ { method: 'GET', path: '/api/hub-bridge/audit', handler: (req, res, url) => handleAudit(req, res, url) },
228
+ ]);
229
+ }
230
+
231
+ module.exports = {
232
+ configure,
233
+ register,
234
+ handleStatus,
235
+ handleCall,
236
+ handleListGrants,
237
+ handleCreateGrant,
238
+ handleRevokeGrant,
239
+ handleDenyPending,
240
+ handleGetTrust,
241
+ handlePutTrust,
242
+ handleAudit,
243
+ };
@@ -89,12 +89,19 @@ function workerNoticeBody(route, payload, res, verdict) {
89
89
  const nudge = isStop
90
90
  ? workerNotices.stopNudge(leadId, { backgroundTasks: payload.background_tasks, sessionCrons: payload.session_crons })
91
91
  : null;
92
- if (!drained.notices.length && !nudge) return undefined;
92
+ // R4 (WP-1): the receiver's per-task quiet notices for this Stop, in the order it rendered them.
93
+ const bgNudges = isStop && verdict && Array.isArray(verdict.backgroundNudges) ? verdict.backgroundNudges : [];
94
+ if (!drained.notices.length && !nudge && !bgNudges.length) return undefined;
93
95
  // §7: one session_diagnostics row per nudge, so the RC-1 census can count leads that were held.
94
96
  if (nudge && typeof _deps.recordSessionDiagnostic === 'function') {
95
97
  try { _deps.recordSessionDiagnostic(leadId, 'lead-stop-nudge', { workers: nudge.workers, background_running: false }); }
96
98
  catch (err) { console.error('[worker-notices] lead-stop-nudge diagnostic failed:', err && err.message); }
97
99
  }
100
+ // §7 (WP-1): the same census row for the quiet-background ask, so M1/M2 can count it.
101
+ if (bgNudges.length && typeof _deps.recordSessionDiagnostic === 'function') {
102
+ try { _deps.recordSessionDiagnostic(leadId, 'background-quiet-nudge', { ids: bgNudges.map((n) => n.id), count: bgNudges.length }); }
103
+ catch (err) { console.error('[worker-notices] background-quiet-nudge diagnostic failed:', err && err.message); }
104
+ }
98
105
  if (drained.notices.length) {
99
106
  if (res && typeof res.once === 'function') {
100
107
  res.once('finish', () => drained.commit());
@@ -105,6 +112,7 @@ function workerNoticeBody(route, payload, res, verdict) {
105
112
  const notices = drained.notices.map((n) => ({ receipt_id: n.receipt_id, text: n.text }));
106
113
  // A nudge is not a receipt-backed notice, so it carries no receipt_id.
107
114
  if (nudge) notices.push({ receipt_id: null, text: nudge.text });
115
+ for (const n of bgNudges) notices.push({ receipt_id: null, text: n.text });
108
116
  return { notices };
109
117
  }
110
118