create-walle 0.10.1 → 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 (681) hide show
  1. package/README.md +7 -1
  2. package/lib/owner-write-safety.js +135 -0
  3. package/lib/public-runtime.js +13 -5
  4. package/lib/release-schema.json +3 -2
  5. package/lib/runtime-closure-policy.json +11 -8
  6. package/package.json +1 -1
  7. package/template/bin/deps-doctor.js +1 -1
  8. package/template/bin/node-bin.sh +11 -0
  9. package/template/coding-task-manager/api-prompts.js +55 -29
  10. package/template/coding-task-manager/bin/claude-hook.js +62 -4
  11. package/template/coding-task-manager/bin/claude-table-parity.js +307 -0
  12. package/template/coding-task-manager/bin/conversation-storage-auto-migration-lib.js +16 -1
  13. package/template/coding-task-manager/bin/conversation-storage-generation-evidence.js +9 -2
  14. package/template/coding-task-manager/bin/conversation-storage-service-entry-lib.js +16 -1
  15. package/template/coding-task-manager/bin/conversation-storage-walle-owner.js +247 -0
  16. package/template/coding-task-manager/bin/ctm-machine-pair.js +160 -0
  17. package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
  18. package/template/coding-task-manager/bin/land.js +2069 -0
  19. package/template/coding-task-manager/bin/lead-wait-census.js +1348 -0
  20. package/template/coding-task-manager/bin/memory-census.js +4 -2
  21. package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
  22. package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
  23. package/template/coding-task-manager/bin/repair-foreign-clone.js +564 -0
  24. package/template/coding-task-manager/bin/repair-resume-echo-titles.js +248 -0
  25. package/template/coding-task-manager/bin/write-lock-bench.js +111 -0
  26. package/template/coding-task-manager/db.js +860 -317
  27. package/template/coding-task-manager/git-utils.js +44 -0
  28. package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
  29. package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
  30. package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
  31. package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
  32. package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
  33. package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
  34. package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
  35. package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
  36. package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
  37. package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
  38. package/template/coding-task-manager/lib/adopted-host-redial.js +47 -7
  39. package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
  40. package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
  41. package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
  42. package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
  43. package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
  44. package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
  45. package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
  46. package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
  47. package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
  48. package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
  49. package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
  50. package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
  51. package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
  52. package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
  53. package/template/coding-task-manager/lib/agent-definitions.js +19 -0
  54. package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
  55. package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
  56. package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
  57. package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
  58. package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
  59. package/template/coding-task-manager/lib/agent-presets.js +99 -1
  60. package/template/coding-task-manager/lib/agent-title-apply.js +88 -0
  61. package/template/coding-task-manager/lib/agent-title-backfill-read.js +92 -0
  62. package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
  63. package/template/coding-task-manager/lib/agent-version-service.js +74 -11
  64. package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
  65. package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
  66. package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
  67. package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
  68. package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
  69. package/template/coding-task-manager/lib/api/fleet.js +118 -0
  70. package/template/coding-task-manager/lib/api/host-stats.js +98 -0
  71. package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
  72. package/template/coding-task-manager/lib/api/ingress.js +43 -12
  73. package/template/coding-task-manager/lib/api/landing.js +403 -0
  74. package/template/coding-task-manager/lib/api/machine-pairing.js +285 -0
  75. package/template/coding-task-manager/lib/api/machine-pool.js +307 -0
  76. package/template/coding-task-manager/lib/api/machines.js +1150 -0
  77. package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
  78. package/template/coding-task-manager/lib/api/misc-ops.js +25 -5
  79. package/template/coding-task-manager/lib/api/providers.js +53 -6
  80. package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
  81. package/template/coding-task-manager/lib/api/resume-from-store.js +25 -0
  82. package/template/coding-task-manager/lib/api/session-attach.js +623 -0
  83. package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
  84. package/template/coding-task-manager/lib/api/sessions.js +237 -59
  85. package/template/coding-task-manager/lib/api/setup-network.js +544 -16
  86. package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
  87. package/template/coding-task-manager/lib/api/setup.js +829 -10
  88. package/template/coding-task-manager/lib/api/transcript-history.js +17 -4
  89. package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
  90. package/template/coding-task-manager/lib/api/worktrees.js +38 -37
  91. package/template/coding-task-manager/lib/approval-drift.js +16 -1
  92. package/template/coding-task-manager/lib/approval-logical-frame.js +5 -1
  93. package/template/coding-task-manager/lib/approval-scope.js +68 -4
  94. package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
  95. package/template/coding-task-manager/lib/auth-context.js +32 -2
  96. package/template/coding-task-manager/lib/auth-rate-limit.js +64 -1
  97. package/template/coding-task-manager/lib/auth-rules.js +474 -62
  98. package/template/coding-task-manager/lib/background-stop.js +369 -0
  99. package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
  100. package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
  101. package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
  102. package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
  103. package/template/coding-task-manager/lib/broadcast-serialize.js +7 -1
  104. package/template/coding-task-manager/lib/browser-session-broker.js +9 -1
  105. package/template/coding-task-manager/lib/browser-use-adapter.js +33 -2
  106. package/template/coding-task-manager/lib/build-info.js +4 -2
  107. package/template/coding-task-manager/lib/claude-markdown-ansi.js +27 -85
  108. package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
  109. package/template/coding-task-manager/lib/claude-session-title.js +6 -30
  110. package/template/coding-task-manager/lib/claude-table-layout.js +322 -0
  111. package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
  112. package/template/coding-task-manager/lib/client-diag-handler.js +69 -2
  113. package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
  114. package/template/coding-task-manager/lib/codex-config-guard.js +33 -3
  115. package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
  116. package/template/coding-task-manager/lib/codex-harness-qualification.js +55 -20
  117. package/template/coding-task-manager/lib/codex-launch-health.js +29 -2
  118. package/template/coding-task-manager/lib/codex-link-preparation.js +9 -8
  119. package/template/coding-task-manager/lib/codex-paths.js +2 -1
  120. package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
  121. package/template/coding-task-manager/lib/coding-agent-models.js +48 -42
  122. package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
  123. package/template/coding-task-manager/lib/coding-session-model-adapters.js +70 -4
  124. package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
  125. package/template/coding-task-manager/lib/coding-session-model-projection.js +5 -0
  126. package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
  127. package/template/coding-task-manager/lib/coding-session-model-runtime.js +24 -6
  128. package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
  129. package/template/coding-task-manager/lib/coding-session-model-state.js +17 -0
  130. package/template/coding-task-manager/lib/coding-session-model-sync-state.js +0 -1
  131. package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
  132. package/template/coding-task-manager/lib/conversation-import/cursor-guard-owner.js +10 -0
  133. package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
  134. package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
  135. package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
  136. package/template/coding-task-manager/lib/conversation-sync.js +355 -0
  137. package/template/coding-task-manager/lib/create/resolve-launch-params.js +104 -13
  138. package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
  139. package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
  140. package/template/coding-task-manager/lib/ctm-boot-lifecycle.js +17 -1
  141. package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
  142. package/template/coding-task-manager/lib/db-domain-tables.js +8 -0
  143. package/template/coding-task-manager/lib/db-domains.js +22 -2
  144. package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
  145. package/template/coding-task-manager/lib/db-owner-op-registry.js +7 -0
  146. package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
  147. package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
  148. package/template/coding-task-manager/lib/db-schema-source-files.js +6 -0
  149. package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
  150. package/template/coding-task-manager/lib/feature-manifest.js +5 -1
  151. package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
  152. package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
  153. package/template/coding-task-manager/lib/fleet-hub.js +762 -0
  154. package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
  155. package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
  156. package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
  157. package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
  158. package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
  159. package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
  160. package/template/coding-task-manager/lib/fleet-update.js +798 -0
  161. package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
  162. package/template/coding-task-manager/lib/fs-watcher.js +61 -44
  163. package/template/coding-task-manager/lib/harness-history-transition.js +52 -11
  164. package/template/coding-task-manager/lib/headless-inflight-ops.js +203 -0
  165. package/template/coding-task-manager/lib/headless-missing-reply.js +42 -0
  166. package/template/coding-task-manager/lib/headless-term-service.js +139 -25
  167. package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
  168. package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
  169. package/template/coding-task-manager/lib/host-control-dial.js +167 -0
  170. package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
  171. package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
  172. package/template/coding-task-manager/lib/host-handoff-orchestrator.js +16 -2
  173. package/template/coding-task-manager/lib/host-handoff.js +50 -15
  174. package/template/coding-task-manager/lib/host-health-ledger.js +164 -12
  175. package/template/coding-task-manager/lib/host-self-truth-watchdog.js +4 -0
  176. package/template/coding-task-manager/lib/host-stats.js +475 -0
  177. package/template/coding-task-manager/lib/host-threadpool-evacuation.js +160 -0
  178. package/template/coding-task-manager/lib/host-threadpool-monitor.js +14 -1
  179. package/template/coding-task-manager/lib/hosted-input-dispatch.js +203 -0
  180. package/template/coding-task-manager/lib/hosted-sync-worker.js +141 -310
  181. package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
  182. package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
  183. package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
  184. package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
  185. package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
  186. package/template/coding-task-manager/lib/hub-bridge.js +398 -0
  187. package/template/coding-task-manager/lib/idle-notify.js +491 -0
  188. package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +12 -0
  189. package/template/coding-task-manager/lib/instance-manifest-runtime.js +3 -0
  190. package/template/coding-task-manager/lib/instance-manifest.js +18 -2
  191. package/template/coding-task-manager/lib/instance-sync-status.js +33 -8
  192. package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
  193. package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
  194. package/template/coding-task-manager/lib/landing/config.js +536 -0
  195. package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
  196. package/template/coding-task-manager/lib/landing/gate.js +360 -0
  197. package/template/coding-task-manager/lib/landing/git.js +344 -0
  198. package/template/coding-task-manager/lib/landing/lease.js +247 -0
  199. package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
  200. package/template/coding-task-manager/lib/landing/proof.js +223 -0
  201. package/template/coding-task-manager/lib/landing/queue.js +998 -0
  202. package/template/coding-task-manager/lib/landing/radar.js +489 -0
  203. package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
  204. package/template/coding-task-manager/lib/landing/state.js +263 -0
  205. package/template/coding-task-manager/lib/landing/stop.js +49 -0
  206. package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
  207. package/template/coding-task-manager/lib/landing/sync.js +456 -0
  208. package/template/coding-task-manager/lib/landing/train.js +885 -0
  209. package/template/coding-task-manager/lib/landing/window.js +57 -0
  210. package/template/coding-task-manager/lib/launch-environment.js +121 -0
  211. package/template/coding-task-manager/lib/launch-model-override.js +193 -8
  212. package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
  213. package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
  214. package/template/coding-task-manager/lib/launch-plan-worker.js +59 -2
  215. package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
  216. package/template/coding-task-manager/lib/lead-model-options.js +160 -3
  217. package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
  218. package/template/coding-task-manager/lib/lead-model-switch-runtime.js +409 -72
  219. package/template/coding-task-manager/lib/lead-model-switch.js +115 -10
  220. package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
  221. package/template/coding-task-manager/lib/lead-model-transition-store.js +85 -9
  222. package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
  223. package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
  224. package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
  225. package/template/coding-task-manager/lib/legacy-draft-cancellation-recovery.js +111 -0
  226. package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
  227. package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
  228. package/template/coding-task-manager/lib/login-tripwire.js +1 -0
  229. package/template/coding-task-manager/lib/machine-pairing.js +238 -0
  230. package/template/coding-task-manager/lib/machine-pool.js +409 -0
  231. package/template/coding-task-manager/lib/machine-registry.js +1494 -0
  232. package/template/coding-task-manager/lib/machine-self.js +66 -0
  233. package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
  234. package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +485 -57
  235. package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
  236. package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
  237. package/template/coding-task-manager/lib/media-journal-control-reader.js +473 -0
  238. package/template/coding-task-manager/lib/media-journal.js +84 -27
  239. package/template/coding-task-manager/lib/media-store-options.js +43 -15
  240. package/template/coding-task-manager/lib/memory-join.js +337 -0
  241. package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
  242. package/template/coding-task-manager/lib/memory-sync.js +565 -0
  243. package/template/coding-task-manager/lib/migrations/v56-host-samples-and-machine-pool.js +76 -0
  244. package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
  245. package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
  246. package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
  247. package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
  248. package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
  249. package/template/coding-task-manager/lib/mirror-feed-sanitize.js +12 -3
  250. package/template/coding-task-manager/lib/model-availability.js +727 -0
  251. package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
  252. package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
  253. package/template/coding-task-manager/lib/model-id-rule.js +19 -0
  254. package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +8 -0
  255. package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
  256. package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +6 -0
  257. package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
  258. package/template/coding-task-manager/lib/model-proxy/handoff.js +494 -0
  259. package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
  260. package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
  261. package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
  262. package/template/coding-task-manager/lib/model-proxy/lead-worker-picks.js +25 -0
  263. package/template/coding-task-manager/lib/model-proxy/native-lead-listener.js +61 -7
  264. package/template/coding-task-manager/lib/model-proxy/proxy-cli.js +200 -0
  265. package/template/coding-task-manager/lib/model-proxy/proxy-instance-record.js +257 -0
  266. package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
  267. package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
  268. package/template/coding-task-manager/lib/model-proxy/stream-accounting.js +205 -0
  269. package/template/coding-task-manager/lib/model-proxy/tokens.js +147 -5
  270. package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +18 -0
  271. package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
  272. package/template/coding-task-manager/lib/native-history-control.js +7 -5
  273. package/template/coding-task-manager/lib/native-lead-settings-client.js +46 -5
  274. package/template/coding-task-manager/lib/native-lead-tls.js +18 -4
  275. package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +776 -75
  276. package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
  277. package/template/coding-task-manager/lib/opencode-cli.js +480 -0
  278. package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
  279. package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
  280. package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
  281. package/template/coding-task-manager/lib/owner-action-manifest-data.json +15 -1
  282. package/template/coding-task-manager/lib/painted-row-recorder.js +9 -1
  283. package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
  284. package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
  285. package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
  286. package/template/coding-task-manager/lib/perf-summary.js +7 -0
  287. package/template/coding-task-manager/lib/perf-tracker.js +63 -2
  288. package/template/coding-task-manager/lib/project-config.js +7 -0
  289. package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
  290. package/template/coding-task-manager/lib/prompt-submission-contract.js +21 -1
  291. package/template/coding-task-manager/lib/provider-login-broker.js +264 -24
  292. package/template/coding-task-manager/lib/provider-login-capture.js +153 -0
  293. package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
  294. package/template/coding-task-manager/lib/queue-draft-status-overlay.js +36 -0
  295. package/template/coding-task-manager/lib/raw-codex-history-window.js +5 -3
  296. package/template/coding-task-manager/lib/read-pool-client.js +94 -4
  297. package/template/coding-task-manager/lib/read-pool-op-registry.js +10 -1
  298. package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
  299. package/template/coding-task-manager/lib/recent-catalog-query.js +41 -0
  300. package/template/coding-task-manager/lib/recent-session-catalog-response.js +76 -10
  301. package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
  302. package/template/coding-task-manager/lib/relay-client.js +57 -3
  303. package/template/coding-task-manager/lib/relink-audit.js +34 -5
  304. package/template/coding-task-manager/lib/remote-command-context.js +12 -0
  305. package/template/coding-task-manager/lib/remote-command-runtime.js +13 -1
  306. package/template/coding-task-manager/lib/remote-machine-catalog.js +1357 -0
  307. package/template/coding-task-manager/lib/remote-machine-create.js +1233 -0
  308. package/template/coding-task-manager/lib/remote-machine-link.js +1426 -0
  309. package/template/coding-task-manager/lib/remote-machine-proxy.js +654 -0
  310. package/template/coding-task-manager/lib/remote-session-forward.js +364 -0
  311. package/template/coding-task-manager/lib/remote-submission-status.js +6 -0
  312. package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
  313. package/template/coding-task-manager/lib/restart-guard.js +18 -6
  314. package/template/coding-task-manager/lib/restart-outcome-truth.js +20 -3
  315. package/template/coding-task-manager/lib/restart-preflight.js +9 -2
  316. package/template/coding-task-manager/lib/restore-backoff-gate.js +10 -2
  317. package/template/coding-task-manager/lib/restore-prepare-retry.js +12 -5
  318. package/template/coding-task-manager/lib/restore-resume-batch.js +22 -1
  319. package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
  320. package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
  321. package/template/coding-task-manager/lib/resume-admission.js +17 -3
  322. package/template/coding-task-manager/lib/resume-blocked-wire.js +62 -1
  323. package/template/coding-task-manager/lib/resume-cwd.js +13 -0
  324. package/template/coding-task-manager/lib/resume-from-store.js +12 -1
  325. package/template/coding-task-manager/lib/resume-origin-facts.js +38 -1
  326. package/template/coding-task-manager/lib/resume-preflight.js +21 -16
  327. package/template/coding-task-manager/lib/review-repo-admission.js +39 -6
  328. package/template/coding-task-manager/lib/review-repo-registry.js +74 -18
  329. package/template/coding-task-manager/lib/root-delivery-runtime.js +74 -17
  330. package/template/coding-task-manager/lib/root-delivery-selection.js +37 -1
  331. package/template/coding-task-manager/lib/root-prompt-admission.js +33 -2
  332. package/template/coding-task-manager/lib/root-prompt-flow.js +168 -34
  333. package/template/coding-task-manager/lib/runtime-contract.js +3 -1
  334. package/template/coding-task-manager/lib/schema-indexes.js +1 -0
  335. package/template/coding-task-manager/lib/scrollback-archive-store.js +7 -4
  336. package/template/coding-task-manager/lib/session-analysis-memory.js +2 -0
  337. package/template/coding-task-manager/lib/session-context-locator.js +742 -0
  338. package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
  339. package/template/coding-task-manager/lib/session-create/codex-native-provider-gate.js +218 -0
  340. package/template/coding-task-manager/lib/session-create/codex-resume-exit-classify.js +52 -0
  341. package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
  342. package/template/coding-task-manager/lib/session-create/delegate-worker.js +179 -20
  343. package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
  344. package/template/coding-task-manager/lib/session-create/identity.js +20 -1
  345. package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
  346. package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
  347. package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
  348. package/template/coding-task-manager/lib/session-create/prepared.js +201 -9
  349. package/template/coding-task-manager/lib/session-create/provider-launch-context.js +77 -0
  350. package/template/coding-task-manager/lib/session-create/provider-process.js +193 -64
  351. package/template/coding-task-manager/lib/session-create/response.js +37 -19
  352. package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
  353. package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
  354. package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
  355. package/template/coding-task-manager/lib/session-create/transcript.js +14 -5
  356. package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
  357. package/template/coding-task-manager/lib/session-create/worker-continuation.js +50 -2
  358. package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
  359. package/template/coding-task-manager/lib/session-create/worker-notices.js +94 -5
  360. package/template/coding-task-manager/lib/session-create/worker-observability.js +101 -9
  361. package/template/coding-task-manager/lib/session-create/worker-stop.js +11 -3
  362. package/template/coding-task-manager/lib/session-create/worker-wait-watcher.js +315 -0
  363. package/template/coding-task-manager/lib/session-empty.js +13 -10
  364. package/template/coding-task-manager/lib/session-geometry-authority-handler.js +10 -1
  365. package/template/coding-task-manager/lib/session-host-manager.js +212 -206
  366. package/template/coding-task-manager/lib/session-jobs.js +20 -10
  367. package/template/coding-task-manager/lib/session-lifecycle.js +28 -4
  368. package/template/coding-task-manager/lib/session-model-action-preconditions.js +15 -2
  369. package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
  370. package/template/coding-task-manager/lib/session-park.js +738 -0
  371. package/template/coding-task-manager/lib/session-path-grant.js +13 -4
  372. package/template/coding-task-manager/lib/session-resource-sampler.js +19 -9
  373. package/template/coding-task-manager/lib/session-standup.js +67 -4
  374. package/template/coding-task-manager/lib/session-status-ledger.js +147 -6
  375. package/template/coding-task-manager/lib/session-status-runtime.js +45 -1
  376. package/template/coding-task-manager/lib/session-title-mirror.js +25 -57
  377. package/template/coding-task-manager/lib/session-transcript-trash.js +8 -1
  378. package/template/coding-task-manager/lib/session-transport.js +17 -0
  379. package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
  380. package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
  381. package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
  382. package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
  383. package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
  384. package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
  385. package/template/coding-task-manager/lib/startup-pointer-write.js +57 -0
  386. package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
  387. package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
  388. package/template/coding-task-manager/lib/state-sync/painted-frame-field.js +11 -0
  389. package/template/coding-task-manager/lib/storage/coding-session-model-store.js +25 -23
  390. package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
  391. package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
  392. package/template/coding-task-manager/lib/submission-ack.js +90 -2
  393. package/template/coding-task-manager/lib/surviving-owner-bootstrap.js +7 -2
  394. package/template/coding-task-manager/lib/surviving-owner-recovery.js +2 -1
  395. package/template/coding-task-manager/lib/systemd-scope.js +115 -0
  396. package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
  397. package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
  398. package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
  399. package/template/coding-task-manager/lib/terminal-draft-http-status.js +25 -0
  400. package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
  401. package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
  402. package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
  403. package/template/coding-task-manager/lib/transcript-archiver.js +229 -229
  404. package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
  405. package/template/coding-task-manager/lib/transcript-frame-cache.js +20 -5
  406. package/template/coding-task-manager/lib/transcript-guard-job.js +55 -4
  407. package/template/coding-task-manager/lib/transcript-link.js +77 -0
  408. package/template/coding-task-manager/lib/transcript-manifest-store.js +8 -4
  409. package/template/coding-task-manager/lib/transcript-source.js +44 -7
  410. package/template/coding-task-manager/lib/transcript-store.js +49 -0
  411. package/template/coding-task-manager/lib/tunnel-lane-governor.js +6 -3
  412. package/template/coding-task-manager/lib/typing-interaction-trace.js +198 -3
  413. package/template/coding-task-manager/lib/typing-worker-stages.js +60 -0
  414. package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
  415. package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
  416. package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
  417. package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
  418. package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
  419. package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
  420. package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
  421. package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
  422. package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
  423. package/template/coding-task-manager/lib/visible-revision-watchdog.js +8 -12
  424. package/template/coding-task-manager/lib/wake-skip-reasons.js +47 -0
  425. package/template/coding-task-manager/lib/walle/turn.js +1 -1
  426. package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
  427. package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
  428. package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
  429. package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
  430. package/template/coding-task-manager/lib/walle-row-history.js +495 -0
  431. package/template/coding-task-manager/lib/walle-supervisor.js +130 -27
  432. package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
  433. package/template/coding-task-manager/lib/worker-failure-classify.js +13 -1
  434. package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
  435. package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
  436. package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
  437. package/template/coding-task-manager/lib/ws/misc.js +1 -1
  438. package/template/coding-task-manager/lib/ws/state-sync.js +125 -6
  439. package/template/coding-task-manager/lib/ws/terminal-attach.js +123 -1
  440. package/template/coding-task-manager/lib/ws-router.js +68 -1
  441. package/template/coding-task-manager/lib/ws-send-admission.js +22 -4
  442. package/template/coding-task-manager/oauth-proxy.js +211 -170
  443. package/template/coding-task-manager/package-lock.json +34 -94
  444. package/template/coding-task-manager/package.json +7 -3
  445. package/template/coding-task-manager/protocol/message-table.json +10 -0
  446. package/template/coding-task-manager/protocol/messages.js +10 -0
  447. package/template/coding-task-manager/protocol/ws-schema.json +20 -0
  448. package/template/coding-task-manager/protocol/ws-schema.md +2 -0
  449. package/template/coding-task-manager/providers/codex-mcp-extract.js +121 -19
  450. package/template/coding-task-manager/providers/codex-mcp.js +14 -5
  451. package/template/coding-task-manager/public/css/app.css +449 -1
  452. package/template/coding-task-manager/public/css/reviews.css +4 -0
  453. package/template/coding-task-manager/public/css/walle-session.css +4 -0
  454. package/template/coding-task-manager/public/index.html +766 -465
  455. package/template/coding-task-manager/public/js/agent-command.js +86 -0
  456. package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
  457. package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
  458. package/template/coding-task-manager/public/js/app/machines-page.js +2572 -0
  459. package/template/coding-task-manager/public/js/app/models-tab.js +658 -73
  460. package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
  461. package/template/coding-task-manager/public/js/app/worktrees-panel.js +191 -7
  462. package/template/coding-task-manager/public/js/background-work.js +203 -28
  463. package/template/coding-task-manager/public/js/coding-session-model-presentation.js +181 -13
  464. package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
  465. package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
  466. package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
  467. package/template/coding-task-manager/public/js/core/session-commands.js +847 -5
  468. package/template/coding-task-manager/public/js/core/session-selectors.js +5 -1
  469. package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
  470. package/template/coding-task-manager/public/js/document-review-links.js +9 -1
  471. package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
  472. package/template/coding-task-manager/public/js/history-app-seam.js +48 -4
  473. package/template/coding-task-manager/public/js/history-painted-rows.js +17 -2
  474. package/template/coding-task-manager/public/js/history-reader-park.js +13 -1
  475. package/template/coding-task-manager/public/js/history-scroller.js +187 -9
  476. package/template/coding-task-manager/public/js/history-transcript-pages.js +5 -5
  477. package/template/coding-task-manager/public/js/machine-pool-shared.js +991 -0
  478. package/template/coding-task-manager/public/js/message-renderer.js +4 -3
  479. package/template/coding-task-manager/public/js/model-picker.js +3 -1
  480. package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
  481. package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
  482. package/template/coding-task-manager/public/js/pasted-content.js +236 -0
  483. package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
  484. package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
  485. package/template/coding-task-manager/public/js/private-state-scope.js +31 -3
  486. package/template/coding-task-manager/public/js/prompt-submission-client.js +173 -8
  487. package/template/coding-task-manager/public/js/prompt-submission-tray.js +281 -0
  488. package/template/coding-task-manager/public/js/prompts.js +11 -10
  489. package/template/coding-task-manager/public/js/protocol.js +10 -0
  490. package/template/coding-task-manager/public/js/queue-panel-submission-reconcile.js +174 -1
  491. package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
  492. package/template/coding-task-manager/public/js/reviews.js +7 -3
  493. package/template/coding-task-manager/public/js/root-draft-lifetime.js +139 -2
  494. package/template/coding-task-manager/public/js/root-queue-builder-lifetime.js +16 -0
  495. package/template/coding-task-manager/public/js/row-join.js +4 -2
  496. package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
  497. package/template/coding-task-manager/public/js/session-search-utils.js +64 -21
  498. package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
  499. package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
  500. package/template/coding-task-manager/public/js/state-sync-client.js +14 -1
  501. package/template/coding-task-manager/public/js/stream-view.js +6 -5
  502. package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
  503. package/template/coding-task-manager/public/js/terminal/runtime-02.js +16 -7
  504. package/template/coding-task-manager/public/js/terminal/runtime-03.js +41 -0
  505. package/template/coding-task-manager/public/js/terminal/runtime-04.js +41 -4
  506. package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
  507. package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
  508. package/template/coding-task-manager/public/js/terminal/runtime-12.js +60 -3
  509. package/template/coding-task-manager/public/js/terminal/runtime-16.js +16 -12
  510. package/template/coding-task-manager/public/js/terminal/runtime-18.js +14 -0
  511. package/template/coding-task-manager/public/js/terminal/runtime-19.js +8 -4
  512. package/template/coding-task-manager/public/js/terminal/runtime-20.js +211 -74
  513. package/template/coding-task-manager/public/js/terminal/runtime-21.js +19 -6
  514. package/template/coding-task-manager/public/js/terminal/runtime-22.js +86 -0
  515. package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
  516. package/template/coding-task-manager/public/js/terminal-history-viewport.js +1 -1
  517. package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
  518. package/template/coding-task-manager/public/js/terminal-wheel.js +62 -5
  519. package/template/coding-task-manager/public/js/walle/chat-conversation.js +15 -7
  520. package/template/coding-task-manager/public/js/walle-session.js +30 -7
  521. package/template/coding-task-manager/public/js/walle.js +6 -0
  522. package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
  523. package/template/coding-task-manager/public/m/app.css +366 -8
  524. package/template/coding-task-manager/public/m/app.js +1006 -74
  525. package/template/coding-task-manager/public/m/index.html +55 -1
  526. package/template/coding-task-manager/public/m/machines.js +2147 -0
  527. package/template/coding-task-manager/public/m/pool-failover.js +391 -0
  528. package/template/coding-task-manager/public/m/private-api.js +31 -1
  529. package/template/coding-task-manager/public/m/private-queue-actions.js +26 -7
  530. package/template/coding-task-manager/public/m/sw.js +5 -0
  531. package/template/coding-task-manager/public/usage.html +1 -0
  532. package/template/coding-task-manager/queue-engine.js +13 -0
  533. package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
  534. package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
  535. package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
  536. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
  537. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
  538. package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
  539. package/template/coding-task-manager/server/approvals.js +5 -6
  540. package/template/coding-task-manager/server/boot.js +136 -17
  541. package/template/coding-task-manager/server.js +2819 -11885
  542. package/template/coding-task-manager/session-integrity.js +71 -13
  543. package/template/coding-task-manager/workers/db-owner-worker.js +72 -9
  544. package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
  545. package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
  546. package/template/coding-task-manager/workers/read-pool-worker.js +93 -12
  547. package/template/coding-task-manager/workers/session-host-pool-process.js +24 -10
  548. package/template/coding-task-manager/workers/session-host-process.js +19 -8
  549. package/template/coding-task-manager/workers/transcript-archive-worker.js +1 -1
  550. package/template/coding-task-manager/workers/watch-worker.js +105 -0
  551. package/template/coding-task-manager/workers/worktree-worker.js +202 -33
  552. package/template/ctm-relay/lib/protocol.js +14 -1
  553. package/template/package-lock.json +2 -2
  554. package/template/package.json +1 -1
  555. package/template/scripts/conversation-storage-v2-migration.js +78 -11
  556. package/template/shared/backup-retention.js +82 -0
  557. package/template/shared/conversation-admission.js +2 -0
  558. package/template/shared/conversation-provenance.js +3 -7
  559. package/template/shared/conversation-storage-v2-contract.js +47 -6
  560. package/template/shared/fixtures/worker-status-payloads.json +392 -0
  561. package/template/shared/git-remote-key.js +83 -0
  562. package/template/shared/host-identity.js +98 -2
  563. package/template/shared/linked-worktree.js +51 -0
  564. package/template/shared/macos-fda-target.js +57 -0
  565. package/template/shared/orphan-parents.js +55 -0
  566. package/template/shared/owner-write-safety.js +135 -0
  567. package/template/shared/public-runtime.js +13 -5
  568. package/template/shared/release-schema.json +3 -2
  569. package/template/shared/report-citations.js +14 -0
  570. package/template/shared/sqlite-write-lock.js +361 -223
  571. package/template/shared/storage/contract.js +38 -3
  572. package/template/wall-e/adapters/imessage.js +12 -0
  573. package/template/wall-e/agent.js +92 -4
  574. package/template/wall-e/api-walle.js +26 -1
  575. package/template/wall-e/bin/brain-purge-legacy-ctm.js +3 -2
  576. package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
  577. package/template/wall-e/bin/walle-mcp-stdio.js +14 -8
  578. package/template/wall-e/brain/brain-join.js +859 -0
  579. package/template/wall-e/brain/brain-sync-membership.js +20 -0
  580. package/template/wall-e/brain/brain-sync-store.js +131 -77
  581. package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
  582. package/template/wall-e/brain/brain-sync-v2.js +578 -0
  583. package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
  584. package/template/wall-e/brain/deterministic-id.js +51 -0
  585. package/template/wall-e/brain/helper-rules-schema.js +129 -0
  586. package/template/wall-e/brain/memories.js +2 -2
  587. package/template/wall-e/brain/migrations.js +91 -28
  588. package/template/wall-e/brain/model-deployment-facts.js +31 -1
  589. package/template/wall-e/brain/model-identity-migration.js +1 -1
  590. package/template/wall-e/brain/owner-call-whitelist.js +39 -7
  591. package/template/wall-e/brain/schema-ensures.js +22 -0
  592. package/template/wall-e/brain/schema.js +45 -85
  593. package/template/wall-e/brain.js +172 -36
  594. package/template/wall-e/chat.js +3 -3
  595. package/template/wall-e/coding/agent-shell-env.js +7 -2
  596. package/template/wall-e/coding/journal-dispatcher.js +51 -0
  597. package/template/wall-e/coding/prompt-bundle.js +66 -21
  598. package/template/wall-e/coding/session-journal.js +28 -40
  599. package/template/wall-e/coding-orchestrator.js +23 -26
  600. package/template/wall-e/config/main-loop-exemptions.json +2 -2
  601. package/template/wall-e/http/admin-api.js +37 -0
  602. package/template/wall-e/http/auth.js +18 -1
  603. package/template/wall-e/http/blog-views-api.js +318 -0
  604. package/template/wall-e/http/gws-api.js +4 -0
  605. package/template/wall-e/http/helper-rules-api.js +327 -0
  606. package/template/wall-e/http/model-admin.js +8 -1
  607. package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
  608. package/template/wall-e/http/model-proxy-providers.js +177 -2
  609. package/template/wall-e/http/model-route-health.js +157 -0
  610. package/template/wall-e/http/sync-api.js +278 -464
  611. package/template/wall-e/http/telemetry-api.js +12 -0
  612. package/template/wall-e/jobs/job-runner.js +28 -1
  613. package/template/wall-e/lib/blog-view-policy.js +88 -0
  614. package/template/wall-e/lib/blog-view-store.js +169 -0
  615. package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
  616. package/template/wall-e/lib/client-config-lock.js +2 -1
  617. package/template/wall-e/lib/coding-journal-writer-child-client.js +67 -18
  618. package/template/wall-e/lib/ctm-data-dir.js +26 -0
  619. package/template/wall-e/lib/derivation-home.js +147 -0
  620. package/template/wall-e/lib/error-kinds.js +10 -1
  621. package/template/wall-e/lib/feature-manifest.js +1 -1
  622. package/template/wall-e/lib/helper-rules/cell-state.js +123 -0
  623. package/template/wall-e/lib/helper-rules/evaluate.js +398 -0
  624. package/template/wall-e/lib/helper-rules/explore-rubric.md +12 -0
  625. package/template/wall-e/lib/helper-rules/grade.js +320 -0
  626. package/template/wall-e/lib/helper-rules/label.js +247 -0
  627. package/template/wall-e/lib/helper-rules/lead-call-hook.js +555 -0
  628. package/template/wall-e/lib/helper-rules/store.js +669 -0
  629. package/template/wall-e/lib/landing-mcp-tools.js +170 -0
  630. package/template/wall-e/lib/mcp-client-config.js +133 -14
  631. package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
  632. package/template/wall-e/lib/mcp-integration.js +63 -19
  633. package/template/wall-e/lib/parent-death.js +7 -1
  634. package/template/wall-e/lib/runtime-worker-pool.js +1 -0
  635. package/template/wall-e/lib/scheduler-worker-jobs.js +12 -4
  636. package/template/wall-e/lib/telemetry-db-schema.js +37 -0
  637. package/template/wall-e/lib/telemetry-process-client.js +76 -1
  638. package/template/wall-e/llm/default-fallback.js +4 -0
  639. package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
  640. package/template/wall-e/llm/delegate-vendor-default.js +12 -5
  641. package/template/wall-e/llm/model-catalog.js +13 -4
  642. package/template/wall-e/llm/model-roles.js +7 -1
  643. package/template/wall-e/llm/native-delegate-selection.js +56 -8
  644. package/template/wall-e/llm/portkey-http.js +150 -0
  645. package/template/wall-e/llm/portkey-sync.js +15 -145
  646. package/template/wall-e/llm/worker-delegate-args.js +72 -7
  647. package/template/wall-e/llm/worker-mcp-routing.js +117 -7
  648. package/template/wall-e/llm/worker-route.js +43 -1
  649. package/template/wall-e/loops/brain-custom-writes.js +64 -0
  650. package/template/wall-e/loops/ingest.js +17 -1
  651. package/template/wall-e/loops/think.js +19 -4
  652. package/template/wall-e/mcp-contract.js +222 -6
  653. package/template/wall-e/mcp-protocol-contract.js +77 -2
  654. package/template/wall-e/mcp-server.js +141 -31
  655. package/template/wall-e/mcp-worker-schemas.js +25 -7
  656. package/template/wall-e/memory/ctm-context-client.js +110 -5
  657. package/template/wall-e/memory/ctm-session-context.js +9 -3
  658. package/template/wall-e/memory/hub-bridge-client.js +388 -0
  659. package/template/wall-e/memory/replica-origin.js +56 -0
  660. package/template/wall-e/memory/session-pool.js +135 -0
  661. package/template/wall-e/runtime/live-capabilities.js +8 -3
  662. package/template/wall-e/server.js +4 -2
  663. package/template/wall-e/shared/release-schema.json +3 -2
  664. package/template/wall-e/shared/sqlite-file-set.js +39 -0
  665. package/template/wall-e/shared/sqlite-write-lock.js +361 -223
  666. package/template/wall-e/shared/storage/contract.js +38 -3
  667. package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
  668. package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +13 -1
  669. package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +11 -6
  670. package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +13 -8
  671. package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
  672. package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
  673. package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
  674. package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
  675. package/template/wall-e/tools/chrome-automation.js +6 -0
  676. package/template/wall-e/tools/local-tools.js +6 -4
  677. package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
  678. package/template/wall-e/workers/brain-owner-worker.js +27 -4
  679. package/template/wall-e/workers/coding-journal-writer-child.js +8 -1
  680. package/template/wall-e/workers/mcp-gateway-process.js +5 -5
  681. package/template/wall-e/workers/telemetry-worker.js +8 -0
@@ -0,0 +1,491 @@
1
+ 'use strict';
2
+
3
+ // Landing-throughput WP-6 shard S11 (design doc §5 D-10 "move-only", §6 "Shard module
4
+ // seam"): the idle-notify cluster (checkIdleNotify + its four private helpers) moves out of
5
+ // server.js VERBATIM into this module behind the same configure(deps) seam as
6
+ // lib/api/session-attach.js and lib/terminal-attach-geometry.js (S6), lib/walle-history-serve.js
7
+ // (S8), lib/codex-rollout-history.js (S9) and lib/terminal-input-prepared.js (S10). It registers
8
+ // NO route and NO socket handler: server.js keeps the five pass-through call sites (the
9
+ // _statusBindings probeIdle arrow, the _suppressionReplay factory, the session-create service
10
+ // bindings object, the sessionAttachApi bindings object and the adopted-pty flush) as
11
+ // idleNotify.checkIdleNotify(...), plus this configure() seam.
12
+ // Bodies are identical to server.js declarations except for the `_deps.` prefix on every
13
+ // identifier that used to resolve to a server.js top-level binding (D-10 rule 1), proven by
14
+ // `node bin/move-only-check.js`. No moved body contains an inline `require(...)`, so there is no
15
+ // require rebase here (unlike S1/S3/S6/S8).
16
+ //
17
+ // The module deliberately lives at lib/idle-notify.js and NOT under lib/ws/: checkIdleNotify is
18
+ // the output-quiet idle/waiting detector, not a ws-router handler.
19
+ //
20
+ // Injected deps, per function:
21
+ // _idlePromptDetections: IDLE_PROMPT_PATTERNS, _providerGenerationGateState, _providerIdFromCmd, _providerTurnFinishedDetection, _providerWaitingInputDetection, approvalAgent, recordSessionDiagnostic, terminalChoice
22
+ // _unconfirmedPatternWait: (none)
23
+ // _prioritizeIdlePromptDetections: (none)
24
+ // _runningEvidenceHoldUntil: IDLE_NOTIFY_DELAY_MS, _providerRunningHoldMsForSession, _serverObservedTimeMs, _sessionCapture, idleNotifyState
25
+ // checkIdleNotify: IDLE_NOTIFY_DELAY_MS, STATUS_EVIDENCE, _clearServerWaitingForInput, _composerMayClose, _deriveApprovalBannerLabel, _getHeadlessViewportRead, _isActivePtyChunk, _isStatusOnlyPtyChunk, _markBackgroundAgentsEvidence, _markServerSessionTurnClosed, _markServerSessionTurnEvidence, _markTerminalLifecycleChanged, _providerActivelyGenerating, _providerIdFromCmd, _recheckHeadlessApprovalPrompt, _recordWaitCleared, _selectionCardFpForSession, _statusBindings, _suppressCtmUiRefreshActivity, _suppressionReplay, _wordsMayUnstickWait, autoApprovalBuffers, broadcastToAll, dispatchMobileNotification, idleNotifyState, isSessionAtLivePrompt, mobileNotifications, reconcileSessionWaitState, recordSessionDiagnostic, restoreRuntime, sessionPolicy, statusRuntime, stripAnsi, telemetryReceiver
26
+ //
27
+ // Mutable module state (D-10 rule 2 / S9 lesson 7): _sessionCapture is a server.js `let`
28
+ // reassigned once during boot (in the boot sequence), so it is injected as a GETTER -- never a
29
+ // copy. Every other dep is a by-value reference, and no moved body writes a server.js binding
30
+ // (checked with an acorn walk), so there is no get/set pair here. Calls between the five moved
31
+ // functions stay direct (no _deps.).
32
+
33
+ let _deps = null;
34
+
35
+ function configure(deps = {}) {
36
+ _deps = deps;
37
+ }
38
+
39
+ function _idlePromptDetections(session, lastLines, rawTail) {
40
+ const detections = [];
41
+ const providerId = session?._providerId || _deps._providerIdFromCmd(session?.cmd || '');
42
+ for (const { pattern, test, reason, provider } of _deps.IDLE_PROMPT_PATTERNS) {
43
+ if (provider && provider !== providerId) continue;
44
+ if ((test && test(lastLines)) || (pattern && pattern.test(lastLines))) {
45
+ detections.push({ reason, source: 'pattern' });
46
+ }
47
+ }
48
+ try {
49
+ const choice = _deps.terminalChoice.extractTerminalChoice(rawTail || lastLines);
50
+ if (choice && (choice.kind === 'numbered' || choice.kind === 'form')) {
51
+ detections.push({ reason: 'choice', source: 'terminal-choice', fingerprint: choice.fingerprint });
52
+ }
53
+ } catch (e) {
54
+ _deps.recordSessionDiagnostic(session?.id || '', 'terminal-choice-detection-error', {
55
+ error: e && e.message || String(e),
56
+ });
57
+ }
58
+ const providerDetection = _deps._providerWaitingInputDetection(session, rawTail || lastLines);
59
+ if (providerDetection) detections.push({ ...providerDetection, source: providerDetection.source || 'provider' });
60
+ if (_deps._providerTurnFinishedDetection(session, rawTail || lastLines)) {
61
+ detections.push({ reason: 'finished', source: 'provider-ready-composer' });
62
+ }
63
+ // "Agent is actively generating" gate (provider-aware). Under the Claude V2 rule (the default) generation is the
64
+ // busy status-line shape or live background-agent evidence, NOT the "esc to interrupt" footer (that phrase is
65
+ // ignored: it lingers in scrollback). When the provider reports it is
66
+ // generating, the agent is NOT blocked on the user, so drop EVERY blocker reason —
67
+ // including 'input', which the composer-footer gate below deliberately keeps. This
68
+ // is what stops a long, output-quiet tool turn (the bare `❯` composer is still
69
+ // painted, so the `❯` idle-notify pattern fires) from being mislabeled "Needs You".
70
+ // A genuinely idle composer lacks this footer, so real idle-notify is unaffected.
71
+ // Claude's per-chunk busy channel also gives this gate bounded memory: a single
72
+ // footer-less repaint cannot leak a false input wait between live status paints.
73
+ // The memory arm applies only to the non-blocking input reason; approval and
74
+ // choice remain positive blocking assertions and are never hidden by stale work.
75
+ const generation = _deps._providerGenerationGateState(session, rawTail || lastLines);
76
+ if (generation.activelyGenerating || generation.heldByRecentEvidence) {
77
+ const isBlocker = generation.activelyGenerating
78
+ ? (d) => d.reason === 'input' || d.reason === 'approval' || d.reason === 'choice'
79
+ : (d) => d.reason === 'input';
80
+ const blockers = detections.filter(isBlocker);
81
+ if (blockers.length) {
82
+ _deps.recordSessionDiagnostic(session?.id || '', 'waiting-input-generating-gated', {
83
+ suppressed: blockers.map((d) => `${d.reason}:${d.source}`).join(','),
84
+ });
85
+ return detections.filter((d) => !isBlocker(d));
86
+ }
87
+ }
88
+ // Negative "not at a live prompt" gate. A live approval/choice widget REPLACES
89
+ // the composer, so positive evidence that the agent is idle/generating at its
90
+ // ready prompt is decisive proof it is NOT blocked at a permission prompt or a
91
+ // selection menu. Two independent, provider-spanning signals:
92
+ // (1) `hasComposerStatusFooter` — the agent's own composer/working footer is on
93
+ // screen. This vocabulary is Claude-specific (esc to interrupt, shift+tab to
94
+ // cycle, ? for shortcuts), so on its own it does NOT cover Codex/Cursor.
95
+ // (2) a `finished` detection from the provider's own state detector
96
+ // (`_providerTurnFinishedDetection` → e.g. Claude/Codex
97
+ // `detectTurnFinished`, which
98
+ // returns false when a REAL pending widget like CODEX_PENDING_PROMPT_RE is on
99
+ // screen). This makes the gate provider-aware for free: a Codex/any-provider
100
+ // session that has repainted its ready composer suppresses the bogus banner.
101
+ // Without this, a session merely DISPLAYING approval-shaped prose (a coding agent's
102
+ // numbered to-do list, this very tool discussing approvals) raised a false
103
+ // "Approval needed" banner. Only the blocker reasons are gated: 'input' is the
104
+ // normal ready-composer idle-notify state and 'finished' is itself a positive idle
105
+ // signal, so both pass through.
106
+ const composerFooter = _deps.approvalAgent.hasComposerStatusFooter(rawTail || lastLines);
107
+ const turnFinished = detections.some((d) => d.reason === 'finished');
108
+ if (detections.some((d) => d.reason === 'approval' || d.reason === 'choice') &&
109
+ (composerFooter || turnFinished)) {
110
+ const filtered = detections.filter((d) => d.reason !== 'approval' && d.reason !== 'choice');
111
+ _deps.recordSessionDiagnostic(session?.id || '', 'waiting-input-composer-gated', {
112
+ via: composerFooter ? (turnFinished ? 'composer+finished' : 'composer') : 'finished',
113
+ suppressed: detections
114
+ .filter((d) => d.reason === 'approval' || d.reason === 'choice')
115
+ .map((d) => `${d.reason}:${d.source}`)
116
+ .join(','),
117
+ });
118
+ return filtered;
119
+ }
120
+ return detections;
121
+ }
122
+
123
+ function _unconfirmedPatternWait(source, liveConfirmed) {
124
+ return source === 'pattern' && !liveConfirmed;
125
+ }
126
+
127
+ function _prioritizeIdlePromptDetections(detections) {
128
+ const rank = (d) => {
129
+ if (d?.reason === 'approval') return 0;
130
+ if (d?.reason === 'choice') return 1;
131
+ if (d?.reason === 'input') return 2;
132
+ if (d?.reason === 'finished') return 4;
133
+ return 3;
134
+ };
135
+ return [...detections].sort((a, b) => rank(a) - rank(b));
136
+ }
137
+
138
+ function _runningEvidenceHoldUntil(sessionId, session, now = Date.now()) {
139
+ const holdMs = Math.max(_deps.IDLE_NOTIFY_DELAY_MS, _deps._providerRunningHoldMsForSession(session));
140
+ const candidates = [];
141
+ const st = _deps.idleNotifyState.get(sessionId);
142
+ if (st && st.lastSignificantOutput) candidates.push(st.lastSignificantOutput);
143
+ if (session && session.lastPtyActivity) candidates.push(_deps._serverObservedTimeMs(session.lastPtyActivity, now, session, 'lastPtyActivity', 'idle-notify'));
144
+ if (_deps._sessionCapture && typeof _deps._sessionCapture.getStatus === 'function') {
145
+ for (const id of [sessionId, session?._claudeSessionId].filter(Boolean)) {
146
+ try {
147
+ const projected = _deps._sessionCapture.getStatus(id);
148
+ if (projected && projected.status === 'running' && projected.lastActivity) {
149
+ candidates.push(_deps._serverObservedTimeMs(projected.lastActivity, now, session, 'captureLastActivity', 'idle-notify'));
150
+ }
151
+ } catch {}
152
+ }
153
+ }
154
+ const newest = Math.max(0, ...candidates.filter((ms) => Number.isFinite(ms) && ms > 0));
155
+ if (!newest) return 0;
156
+ return newest + holdMs;
157
+ }
158
+
159
+ function checkIdleNotify(sessionId, session, data, delayMs = _deps.IDLE_NOTIFY_DELAY_MS) {
160
+ if (!_deps.sessionPolicy(session).humanAttention) return; // worker-session-class WP-5: no human attends a headless worker
161
+ const hasAuthoritativeSource = _deps.telemetryReceiver.hasAuthoritativeSource(sessionId);
162
+ let st = _deps.idleNotifyState.get(sessionId);
163
+ if (!st) {
164
+ st = { timer: null, notified: false, reason: '', notifiedAt: 0, lastOutput: Date.now(), buf: '', freshBuf: '', _lastCheck: 0, suppressedFresh: '', suppressReplayTimer: null };
165
+ _deps.idleNotifyState.set(sessionId, st);
166
+ }
167
+
168
+ // Accumulate output — cheap string concat only, no regex per-chunk
169
+ st.buf += data;
170
+ if (st.buf.length > 4096) st.buf = st.buf.slice(-3000);
171
+ st.freshBuf += data; // Track content since last check
172
+
173
+ st.lastOutput = Date.now();
174
+
175
+ // Throttle the expensive work: only process every 500ms instead of per-chunk
176
+ const now = Date.now();
177
+ if (now - st._lastCheck < 500) return;
178
+ st._lastCheck = now;
179
+
180
+ // Only reset notified flag if FRESH output (since last check) has substantial content.
181
+ // Strip comprehensively (CSI, OSC, charset, control). Check for word characters
182
+ // (letters/digits) to distinguish real text from TUI spinner glyphs (✢✳✶✻·⠂).
183
+ const freshChunk = st.freshBuf;
184
+ const freshStripped = _deps.stripAnsi(freshChunk).trim();
185
+ st.freshBuf = ''; // Reset for next interval
186
+ // Tab activation / resize / reflow makes the agent's TUI repaint a full frame,
187
+ // and the deferred-restore replay does the same. That redraw is NOT fresh agent
188
+ // activity, so it must not bump significant-output bookkeeping or (below) reset a
189
+ // waiting session — the exact false Idle/Needs-You → Running flip seen on click.
190
+ // Honor the same UI-refresh / restore suppression the main PTY data handler
191
+ // already applies (genuine work is still caught via the busy-status path).
192
+ const refreshSuppressed = _deps._suppressCtmUiRefreshActivity(session) ||
193
+ _deps.restoreRuntime.restoreActivitySuppressed(session, now);
194
+ const wordsPresent = _deps._isActivePtyChunk(session, freshChunk) &&
195
+ !_deps._isStatusOnlyPtyChunk(session, freshChunk) &&
196
+ /\w/.test(freshStripped) &&
197
+ freshStripped.length > 5;
198
+ const hasWords = !refreshSuppressed && wordsPresent;
199
+ // The window swallowed real content — arm the once-only replay so this text still
200
+ // gets a detection pass when the suppression window closes.
201
+ if (refreshSuppressed && wordsPresent) {
202
+ _deps._suppressionReplay.armPromptReplay(sessionId, session, st, freshChunk);
203
+ }
204
+ if (hasWords) {
205
+ st.lastSignificantOutput = now;
206
+ if (session?._activeTurnOpen && !_deps.statusRuntime.viewerProvoked(session, now)) _deps._markServerSessionTurnEvidence(session, now, 'terminal-output', { ledger: false });
207
+ }
208
+ // Authority inversion: when telemetry/hooks own this session, generic word
209
+ // output may not clear a waiting state into Running — the structured source
210
+ // (codex user_prompt/tool_decision, claude start hook) or the strict
211
+ // busy-status line does that. Without a structured source, words remain the
212
+ // unstick signal.
213
+ if (hasWords && st.notified && !_deps.statusRuntime.viewerProvoked(session, now) && !_deps._statusBindings.keepBlockingWait(session) && _deps._wordsMayUnstickWait(session, now, hasAuthoritativeSource)) { // F-B: viewer-provoked words never clear a wait
214
+ const hasUnsubmittedWaitingInput = !!(session?._waitingForInput &&
215
+ session._lastNonResolvingWaitingInputAt &&
216
+ (!session._lastWaitingResolveInputAt ||
217
+ session._lastNonResolvingWaitingInputAt > session._lastWaitingResolveInputAt));
218
+ if (!hasUnsubmittedWaitingInput) {
219
+ st.notified = false;
220
+ st.reason = '';
221
+ st.notifiedAt = 0;
222
+ if (session) {
223
+ _deps._recordWaitCleared(session, 'terminal-output');
224
+ session._waitingForInput = false;
225
+ session._waitingForInputLiveConfirmed = null;
226
+ session._waitingForInputReason = '';
227
+ session._waitingForInputMessage = '';
228
+ session._waitingForInputAt = 0;
229
+ }
230
+ // Tell clients this session is no longer idle — clears _waitingForInput
231
+ _deps.broadcastToAll({ type: 'session-resumed', id: sessionId });
232
+ // If a provider hook missed the next start transition, real terminal
233
+ // output is enough to unstick the sidebar until the hook catches up.
234
+ if (hasAuthoritativeSource) {
235
+ _deps.broadcastToAll({ type: 'session.status', id: sessionId, working: true, source: 'terminal-output', timestamp: Date.now() });
236
+ }
237
+ _deps.recordSessionDiagnostic(sessionId, 'status-running', { source: 'terminal-output', reason: 'significant-output' });
238
+ }
239
+ }
240
+
241
+ // Only reset the idle timer when significant output arrives.
242
+ // Spinner noise should NOT reset — let the existing countdown continue.
243
+ if (hasWords) {
244
+ if (st.timer) { clearTimeout(st.timer); st.timer = null; }
245
+ }
246
+
247
+ // Set timer if none is running — after IDLE_NOTIFY_DELAY_MS of no significant output,
248
+ // check if we're at a prompt marker.
249
+ function armIdlePromptTimer(delayMs) {
250
+ st.timer = setTimeout(async () => {
251
+ st.timer = null;
252
+ // Waiting-input state must be based on the current terminal viewport, not
253
+ // on the rolling PTY text buffer. The rolling buffer can contain old
254
+ // approval widgets that were already handled, which caused stale
255
+ // "Do you want to proceed?" prompts to reappear as fresh user blockers.
256
+ // No viewport, no evidence: record nothing and say so (the rolling PTY buffer is historical, never judged as the screen).
257
+ const viewportRead = await _deps._getHeadlessViewportRead(sessionId);
258
+ if (!viewportRead.ok) {
259
+ // D-5: one re-arm 1 s later (the trigger of a card that just painted must not be lost to one slow read); a second failure records.
260
+ if (!st.readRetried) { st.readRetried = true; armIdlePromptTimer(1000); return; }
261
+ st.readRetried = false;
262
+ _deps.recordSessionDiagnostic(sessionId, 'viewport-read-failed', { source: 'idle-settle', reason: viewportRead.reason || 'unknown' });
263
+ return;
264
+ }
265
+ st.readRetried = false;
266
+ const waitingSource = viewportRead.text;
267
+ // Background-agent evidence: VIEWPORT only (a raw chunk can carry replayed scrollback).
268
+ if (!_deps._suppressCtmUiRefreshActivity(session) && !_deps.restoreRuntime.restoreActivitySuppressed(session, Date.now())) {
269
+ _deps._markBackgroundAgentsEvidence(session, waitingSource, Date.now());
270
+ }
271
+ const clean = _deps.stripAnsi(waitingSource);
272
+ // Get last non-empty lines
273
+ const lines = clean.split('\n').filter(l => l.trim().length > 0);
274
+ const lastLines = lines.slice(-8).join('\n');
275
+
276
+ // Plan-card convergence (secondary detector + clear-when-gone). The shadow
277
+ // approver is the primary, output-driven detector; this output-quiet pass
278
+ // catches what it missed and, crucially, CLEARS the plan Needs-You/render
279
+ // state once the card leaves the viewport. Judged against the AUTHORITATIVE
280
+ // viewport (`clean`), and short-circuits the generic detection loop so it
281
+ // can't clobber the 'plan' wait reason with a generic 'input'/'finished'.
282
+ if (session && typeof session._planCardOnDetect === 'function') {
283
+ const card = _deps._selectionCardFpForSession(session, clean);
284
+ if (card.fp) {
285
+ // Render convergence for ANY card type (plan / AskUserQuestion / permission).
286
+ session._planCardOnDetect(card.fp, card.reason);
287
+ // Only the plan card's Needs-You is owned by convergence, so only it short-circuits
288
+ // the generic loop. A choice/approval card FALLS THROUGH so the canonical reconcile
289
+ // keeps owning its banner exactly as before (render-only generalization).
290
+ if (card.reason === 'plan') return;
291
+ } else if (session._planCardPending) {
292
+ session._clearPlanDecisionPending('card-gone');
293
+ }
294
+ }
295
+
296
+ const detections = _prioritizeIdlePromptDetections(_idlePromptDetections(session, lastLines, waitingSource));
297
+ // Active-generation clear for a stale non-blocking 'input' wait. The gate in
298
+ // _idlePromptDetections suppresses NEW 'input' detections while the agent is
299
+ // generating, but it cannot clear an 'input' _waitingForInput that an EARLIER
300
+ // output-quiet window already set. The word-output clear path (the hasWords
301
+ // branch above) is the only other clear, and a long status-only turn — a
302
+ // "Wrangling… esc to interrupt" spinner, or a backgrounded sub-agent painting
303
+ // "Waiting for N background agents…" — emits no words, so the stale flag sticks
304
+ // for the whole turn. Because _isServerWaitingForInput then feeds the phase
305
+ // projection a needs_you condition (strength 5) that outranks the running spine
306
+ // (strength 3), the session reads "Needs You" for minutes while it is plainly
307
+ // working. So once we POSITIVELY confirm generation, clear it here. This mirrors
308
+ // reconcileSessionWaitState's _clearWaitCard('actively-generating', …) for the
309
+ // choice/approval cards it owns. Only the non-blocking 'input' reason is cleared;
310
+ // real approval/choice/plan blockers (a live widget REPLACES the footer, so it is
311
+ // never "generating") are owned by reconcile and left untouched.
312
+ if (session && session._waitingForInput &&
313
+ String(session._waitingForInputReason || '') === 'input' &&
314
+ _deps._providerActivelyGenerating(session, waitingSource)) {
315
+ _deps._clearServerWaitingForInput(sessionId, session, st);
316
+ _deps.broadcastToAll({ type: 'session-resumed', id: sessionId });
317
+ _deps.recordSessionDiagnostic(sessionId, 'waiting-cleared-generating', { reason: 'input', source: 'idle-settle' });
318
+ return;
319
+ }
320
+ // Approval/choice cards have ONE owner: the canonical reconcile. Routing the
321
+ // output-quiet trigger through it (instead of the old edge-emit below) keeps
322
+ // the card idempotent and consistent with the warm tick + restart. The warm
323
+ // tick is the safety net for prompts this idle detector misses entirely.
324
+ if (detections.some((d) => d.reason === 'approval' || d.reason === 'choice')) {
325
+ await _deps.reconcileSessionWaitState(sessionId);
326
+ return;
327
+ }
328
+ for (const detection of detections) {
329
+ const { reason, source } = detection;
330
+ if (reason === 'input') {
331
+ const deferUntil = _runningEvidenceHoldUntil(sessionId, session, Date.now());
332
+ if (deferUntil > Date.now()) {
333
+ armIdlePromptTimer(Math.max(250, Math.min(_deps.IDLE_NOTIFY_DELAY_MS, deferUntil - Date.now() + 50)));
334
+ return;
335
+ }
336
+ }
337
+ // Approval prompts are first-class and may be handled by the
338
+ // auto-approver. Generic numbered choice menus are different: they
339
+ // need user input, but are not approvals and must not be suppressed
340
+ // just because the approval detector correctly returns "not approval".
341
+ if (reason === 'approval') {
342
+ const buf = _deps.autoApprovalBuffers.get(sessionId);
343
+ if (buf && !buf.reviewing && !buf._workerPending) {
344
+ buf._workerPending = true;
345
+ const result = await _deps._recheckHeadlessApprovalPrompt(sessionId);
346
+ if (!result.hasApproval) {
347
+ if (_deps.autoApprovalBuffers.get(sessionId) === buf) buf._workerPending = false;
348
+ _deps.recordSessionDiagnostic(sessionId, 'stale-waiting-input-suppressed', {
349
+ source: 'terminal-prompt',
350
+ reason,
351
+ rawDetected: !!result.rawDetected,
352
+ gateReason: result.gateReason || '',
353
+ snippet: lastLines.trim().split('\n').slice(-3).join('\n').slice(0, 200),
354
+ });
355
+ continue;
356
+ }
357
+ // The recheck result is also delivered to the shared approver
358
+ // handler, which owns waiting_input transitions for real approval
359
+ // widgets. Do not duplicate that state change here.
360
+ return;
361
+ }
362
+ continue;
363
+ }
364
+ if (reason === 'finished') {
365
+ // Positive "agent returned to its ready prompt" signal (e.g. Codex's
366
+ // idle composer with no Working… line). Close the active turn so the
367
+ // session settles to Idle rather than riding the long open-turn hold.
368
+ // This is NOT a user blocker — do not set _waitingForInput.
369
+ const busyNow = _deps._providerActivelyGenerating(session, waitingSource); // gated on the LEDGER (R-3/W-4/D-2): composerMayClose
370
+ if (_deps._composerMayClose(session, Date.now(), busyNow)) {
371
+ _deps._markServerSessionTurnClosed(session, Date.now(), source || 'ready-composer', { kind: _deps.STATUS_EVIDENCE.AGENT_READY_COMPOSER });
372
+ _deps._markTerminalLifecycleChanged(session, 'turn-finished');
373
+ _deps.recordSessionDiagnostic(sessionId, 'status-idle', {
374
+ source: source || 'ready-composer',
375
+ snippet: lastLines.trim().split('\n').slice(-3).join('\n').slice(0, 200),
376
+ });
377
+ _deps.broadcastToAll({ type: 'session.status', id: sessionId, working: false, source: 'terminal-idle', timestamp: Date.now() });
378
+ // The turn just settled to its idle prompt — force a clean final
379
+ // render (SIGWINCH repaint + authoritative snapshot to all clients)
380
+ // so the browser never sticks on a stale mid-repaint frame. Provider-
381
+ // agnostic: both Claude and Codex 'finished' detections route here.
382
+ if (typeof session._forceCleanFinalRenderOnIdle === 'function') {
383
+ session._forceCleanFinalRenderOnIdle(sessionId, source || 'ready-composer');
384
+ }
385
+ } else if (_deps._statusBindings.composerRetryMs(session, Date.now(), busyNow) > 0) {
386
+ armIdlePromptTimer(_deps._statusBindings.composerRetryMs(session, Date.now(), busyNow)); // N-2: only the W-4 age rule said no
387
+ }
388
+ continue;
389
+ }
390
+ if (!st.notified) {
391
+ st.notified = true;
392
+ const waitingAt = Date.now();
393
+ const providerId = session?._providerId || _deps._providerIdFromCmd(session?.cmd || '');
394
+ // Compute prompt authority before mutating liveness. An unconfirmed
395
+ // pattern wait is visible to the user, but cannot erase the open-turn
396
+ // and busy evidence that would disprove it on the next heartbeat.
397
+ const liveConfirmed = source === 'terminal-choice'
398
+ || _deps.isSessionAtLivePrompt(providerId, waitingSource).live;
399
+ const unconfirmedPattern = _unconfirmedPatternWait(source, liveConfirmed);
400
+ st.reason = reason;
401
+ st.notifiedAt = waitingAt;
402
+ if (session) {
403
+ // D-14: an idle composer of a lease-only provider is no wait: the ledger reads it as a ready composer below.
404
+ if (!(reason === 'input' && _deps._statusBindings.inputWaitIsIdle(session))) {
405
+ session._waitingForInput = true;
406
+ session._waitingForInputLiveConfirmed = liveConfirmed;
407
+ session._waitingForInputReason = reason;
408
+ session._waitingForInputAt = waitingAt;
409
+ session._lastNonResolvingWaitingInputAt = 0;
410
+ session._lastWaitingResolveInputAt = 0;
411
+ }
412
+ if (!unconfirmedPattern) {
413
+ session._lastBusyStatusAt = 0;
414
+ session._lastBusyStatusSource = reason ? `waiting:${reason}` : 'waiting';
415
+ _deps._markServerSessionTurnClosed(session, waitingAt, `waiting:${reason || 'input'}`);
416
+ } else {
417
+ _deps.recordSessionDiagnostic(sessionId, 'waiting-input-leak-veto', {
418
+ source,
419
+ reason,
420
+ preservedOpenTurn: session._activeTurnOpen === true,
421
+ preservedBusyEvidence: Number(session._lastBusyStatusAt || 0) > 0,
422
+ });
423
+ }
424
+ _deps._markTerminalLifecycleChanged(session, `waiting-for-input:${reason}`);
425
+ }
426
+ // Provider hooks are useful, but a visible prompt is stronger evidence
427
+ // than a stale "working" hook that never received its stop event.
428
+ if (hasAuthoritativeSource) {
429
+ _deps.broadcastToAll({ type: 'session.status', id: sessionId, working: false, source: 'terminal-prompt', timestamp: Date.now() });
430
+ }
431
+ const promptSnippet = lastLines.trim().split('\n').slice(-3).join('\n').slice(0, 200);
432
+ // Banner label = the actual command/prompt, NOT the session title and NOT
433
+ // the menu/box-drawing junk at the bottom of the widget. For approvals we
434
+ // reuse the auto-approver's own parser (escalationCommandParts) to surface
435
+ // the real command (e.g. the Bash command). Falls back to a junk-filtered
436
+ // prompt line, then the title, so the label is never empty or a bare divider.
437
+ // The fixed-size headless grid can clip a tall command box; pass the wider
438
+ // rolling PTY buffer (ANSI-stripped) so the label can recover the command.
439
+ const labelBuffer = _deps.stripAnsi(String(st.buf || '').slice(-8000));
440
+ const derivedPromptLabel = _deps._deriveApprovalBannerLabel(providerId, clean, lines, reason, labelBuffer) || '';
441
+ const promptLabel = derivedPromptLabel || session.title || session.label || '';
442
+ // Stable per-prompt fingerprint so a user-dismissed false banner stays
443
+ // dismissed until the on-screen prompt actually changes (client compares the
444
+ // incoming fingerprint against the one it dismissed).
445
+ const promptFingerprint = detection.fingerprint || ('snip:' + promptLabel);
446
+ // Only a positive, anchored widget confirms a LIVE prompt the Approve/Deny
447
+ // buttons may act on (they inject '1'/Esc keystrokes): a highlighted
448
+ // terminal-choice menu, or the provider state detector's authoritative
449
+ // isSessionAtLivePrompt. A bare global-pattern match over the whole rendered
450
+ // tail is not trustworthy enough to inject a keystroke, so the client shows
451
+ // it Review-only.
452
+ _deps.recordSessionDiagnostic(sessionId, 'status-waiting', {
453
+ source: source || 'terminal-prompt',
454
+ reason,
455
+ liveConfirmed,
456
+ snippet: promptSnippet,
457
+ });
458
+ if (session) session._waitingForInputMessage = derivedPromptLabel;
459
+ _deps.broadcastToAll({
460
+ type: 'waiting-for-input',
461
+ id: sessionId,
462
+ reason,
463
+ label: promptLabel,
464
+ snippet: promptSnippet,
465
+ fingerprint: promptFingerprint,
466
+ liveConfirmed,
467
+ timestamp: waitingAt,
468
+ });
469
+ _deps.dispatchMobileNotification(_deps.mobileNotifications.notifyWaitingInput({
470
+ sessionId,
471
+ source: 'server-waiting-for-input',
472
+ createdAt: waitingAt,
473
+ privatePreview: lastLines.trim().split('\n').slice(-1).join(' ').slice(0, 64),
474
+ }));
475
+ }
476
+ return;
477
+ }
478
+ }, Math.max(0, Number(delayMs) || 0));
479
+ }
480
+
481
+ if (!st.timer) armIdlePromptTimer(delayMs);
482
+ }
483
+
484
+ module.exports = {
485
+ configure,
486
+ _idlePromptDetections,
487
+ _unconfirmedPatternWait,
488
+ _prioritizeIdlePromptDetections,
489
+ _runningEvidenceHoldUntil,
490
+ checkIdleNotify,
491
+ };
@@ -64,6 +64,14 @@ const INSTANCE_ID_COLUMN_MANIFEST = [
64
64
  },
65
65
 
66
66
  // --- provenance: historical, never restamped ---
67
+ {
68
+ table: 'conversation_item_clock', column: 'origin_instance_id', classification: 'provenance',
69
+ note: 'shared-memory WP-5 (migration v61): the machine that authored a conversation item — the replica feed addresses a change by (origin, seq), so it must never be restamped.',
70
+ },
71
+ {
72
+ table: 'conversation_vv', column: 'origin_instance_id', classification: 'provenance',
73
+ note: 'shared-memory WP-5 (migration v61): per-origin version vector key — one row per authoring machine; never restamped.',
74
+ },
67
75
  {
68
76
  table: 'ctm_sessions', column: 'origin_instance_id', classification: 'provenance',
69
77
  note: 'Historical: which instance a session was originally created on. Documented at db.js ~line 1234.',
@@ -120,6 +128,10 @@ const INSTANCE_ID_COLUMN_MANIFEST = [
120
128
  },
121
129
 
122
130
  // --- live-peer: peer-sync owned, deliberately out of scope for local restamping ---
131
+ {
132
+ table: 'machines', column: 'instance_id', classification: 'live-peer',
133
+ note: 'WP-0 remote-machine-hub (docs/remote-machine-hub-sessions-2026-10-22.html D-3): the REMOTE box\'s minted identity, pinned from its GET /api/sync/manifest at registration. It names another machine, never this one — a local re-mint changes nothing about which box the row points at, so restamping it would corrupt the pin.',
134
+ },
123
135
  {
124
136
  table: 'sync_outbox', column: 'source_instance_id', classification: 'live-peer',
125
137
  note: 'Peer sync bookkeeping. Restamping locally could trigger re-delivery storms on the peer side. Deferred per S-14/S-15.',
@@ -68,6 +68,9 @@ function buildServerInstanceManifest(options = {}) {
68
68
  backupStatus,
69
69
  port: options.port,
70
70
  wallePort: options.wallePort,
71
+ // WP-2a D-4: the machine-owned settings cache (lib/machine-self.js) rides through to the pure
72
+ // builder, which reads it and never the DB. `options.machineSelf` is `current()` from server.js.
73
+ machineSelf: options.machineSelf,
71
74
  pid: options.pid,
72
75
  uptimeSeconds: options.uptimeSeconds,
73
76
  walleStatus: options.walleStatus,
@@ -102,9 +102,19 @@ function buildInstanceManifest(options = {}) {
102
102
  EXECUTION_HOST_KINDS,
103
103
  'local'
104
104
  );
105
- const displayName = _limitedString(
105
+ // WP-2a (machine-pool-picker-pairing-dashboard-2026-10-24.html §5 D-4 rev 2, §9 S-25): the
106
+ // machine-owned settings, passed IN through `options.machineSelf` (lib/machine-self.js's cache) so
107
+ // the builder stays pure and never reads the DB. A non-empty displayName overrides the env/default
108
+ // name; favorite/hidden ride the manifest as booleans so every primary reads the same values.
109
+ const machineSelf = options.machineSelf && typeof options.machineSelf === 'object' ? options.machineSelf : null;
110
+ const selfDisplayName = _limitedString(machineSelf && machineSelf.displayName, '');
111
+ // The unset default is the box's hostname (mDNS `.local` dropped), never a relative label: a hub
112
+ // shows this name on every remote session's chip, and a literal "Local CTM" from each box made
113
+ // every pooled machine read as this one.
114
+ const hostLabel = hostname === 'unknown-host' ? 'Local CTM' : hostname.replace(/\.local$/i, '');
115
+ const displayName = selfDisplayName || _limitedString(
106
116
  env.CTM_EXECUTION_HOST_DISPLAY_NAME || env.CTM_INSTANCE_DISPLAY_NAME,
107
- executionHostKind === 'hosted' ? hostname : 'Local CTM'
117
+ executionHostKind === 'hosted' ? hostname : hostLabel
108
118
  );
109
119
  const deploymentMode = _deploymentMode(env, executionHostKind);
110
120
  const serviceManager = _serviceManager(env);
@@ -158,8 +168,14 @@ function buildInstanceManifest(options = {}) {
158
168
  executionHost: {
159
169
  kind: executionHostKind,
160
170
  displayName,
171
+ // D-4 rev 2: machine-owned booleans. `favorite` is the picker star; `hidden` is "hide from
172
+ // picker". NEVER `pinned` — that word already means the identity pin (lib/machine-registry.js).
173
+ favorite: !!(machineSelf && machineSelf.favorite),
174
+ hidden: !!(machineSelf && machineSelf.hidden),
161
175
  hostname,
162
176
  os: _platform(options, env),
177
+ // Machine pool D-2/D-10: os/arch name the box in the picker search and the Machines card.
178
+ arch: _limitedString(options.arch || process.arch || '', ''),
163
179
  hostLabel: _limitedString(env.CTM_SERVER_HOST_LABEL || env.CTM_HOST_LABEL, ''),
164
180
  bindHost: host,
165
181
  publicOrigin: _limitedString(
@@ -52,6 +52,17 @@ function _phaseEnabledBySchema(hybridEnabled, hasOwnership, hasOutbox) {
52
52
  return hybridEnabled && hasOwnership && hasOutbox;
53
53
  }
54
54
 
55
+ // The v2 memory round's last report, wherever the worker keeps it: the peers loop records it
56
+ // under lastResult.machineProbe, the machines-only loop under machines (both are the
57
+ // _sweepMachines result). null when no sweep has reached a machine yet.
58
+ function _brainSyncFromWorker(worker) {
59
+ const probe = worker.lastResult && worker.lastResult.machineProbe;
60
+ if (probe && probe.brainSync && typeof probe.brainSync === 'object') return probe.brainSync;
61
+ const machines = worker.machines;
62
+ if (machines && machines.brainSync && typeof machines.brainSync === 'object') return machines.brainSync;
63
+ return null;
64
+ }
65
+
55
66
  function buildInstanceSyncStatus(options = {}) {
56
67
  const env = options.env || process.env;
57
68
  const manifest = options.manifest || {};
@@ -76,6 +87,8 @@ function buildInstanceSyncStatus(options = {}) {
76
87
  const hasDurableSyncSchema = _phaseEnabledBySchema(hybridEnabled, hasOwnership, hasOutbox);
77
88
  const outboxStats = schema.outbox || {};
78
89
  const worker = schema.worker || {};
90
+ // S-30: supplied by the caller (see the `machines` key in the return below).
91
+ const machinesInput = options.machines && typeof options.machines === 'object' ? options.machines : {};
79
92
 
80
93
  const warnings = [];
81
94
  if (mode !== 'none' && !hybridEnabled) warnings.push('sync_mode_configured_but_hybrid_sync_disabled');
@@ -132,14 +145,26 @@ function buildInstanceSyncStatus(options = {}) {
132
145
  // {peer, lastAttemptAt, lastOkAt, lastDeliveredSeq, lastError}.
133
146
  pull: Array.isArray(worker.lastResult && worker.lastResult.results) ? worker.lastResult.results : [],
134
147
  push: Array.isArray(worker.push) ? worker.push : [],
135
- // WP-5 §6.6: the brain pair (memories/knowledge/entities/people) per peer —
136
- // {peer, lastAttemptAt, lastOkAt, lastSeq, lastError, pull, push}; a failed brain
137
- // leg appears here and never as a failed CTM leg.
138
- // Follow-ups #16/#17: each brain record carries `backfill: {local, peer}` (per-table
139
- // {after, done} history-backfill progress), and brainPrune is the last local outbox prune
140
- // ({ok, throughSeq, pruned, more, error, lastAttemptAt} or null before the first one).
141
- brain: Array.isArray(worker.brain) ? worker.brain : [],
142
- brainPrune: worker.brainPrune && typeof worker.brainPrune === 'object' ? worker.brainPrune : null,
148
+ // WP-3 §6.6 + WP-6 (§11): the v2 memory round (lib/memory-sync.js runBrainMemberRound,
149
+ // driven by the machine-registry sweep) is the ONLY brain transport left — the v1
150
+ // outbox pair and its local prune were retired with migration 104. The round's report
151
+ // ({ok, members:[...]}) rides the sweep result: `lastResult.machineProbe.brainSync` in
152
+ // the peers loop, `machines.brainSync` in the machines-only loop. null before the first
153
+ // tick that reached a machine.
154
+ brainSync: _brainSyncFromWorker(worker),
155
+ },
156
+ // S-30 (WP-0, remote-machine-hub-sessions-2026-10-22.html): the machine registry's rollup —
157
+ // how many boxes this hub knows and where they stand. The CALLER supplies it
158
+ // (options.machines, built by lib/machine-registry.js summarizeMachines) because this builder
159
+ // is pure: it opens no handle and probes nothing. Absent input reads as "no machines known",
160
+ // which is the truth for a hub with no registry rows.
161
+ machines: {
162
+ count: Number(machinesInput.count || 0) || 0,
163
+ reachable: Number(machinesInput.reachable || 0) || 0,
164
+ unknown: Number(machinesInput.unknown || 0) || 0,
165
+ unreachable: Number(machinesInput.unreachable || 0) || 0,
166
+ unhealthy: Number(machinesInput.unhealthy || 0) || 0,
167
+ hubNetworkSuspect: machinesInput.hubNetworkSuspect === true,
143
168
  },
144
169
  exchange: {
145
170
  workspaceBindingsReady: !!workspaceBindings.enabled,
@@ -0,0 +1 @@
1
+ To integrate finished work: commit on your branch, then run land submit and report its job id; never merge or fast-forward <target> yourself. Do not merge <target> into your branch to land it; merge only when land submit or the queue reports a conflict.