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
@@ -2,19 +2,27 @@
2
2
 
3
3
  // Round-3 WP-5 T3 group 4 (design doc §5 D-1/D-3/D-8, §8 WP-5, §9.5 S-42):
4
4
  // group 3 (lib/api/worktrees.js) deliberately skipped this cluster because
5
- // server.js's legacy chain gates entry to handleSetupNetwork with a single
6
- // big OR condition and then does `if (await handleSetupNetwork(...) !== false)
5
+ // server.js's legacy chain gated entry to handleSetupNetwork with a single
6
+ // big OR condition and then did `if (await handleSetupNetwork(...) !== false)
7
7
  // return;` — a matched-but-declined dispatch that lib/api-router.js couldn't
8
8
  // express (a matched route was always "handled"). lib/api-router.js's
9
- // ROUTE_DECLINED sentinel (added in this same work package) closes that gap:
10
- // this module registers the same ten path specs the legacy OR-gate used to
11
- // gate on, each wrapping a call to handleSetupNetwork and returning
12
- // ROUTE_DECLINED exactly where the legacy `!== false` check would have let
13
- // the (now-deleted) chain entry fall through. handleSetupNetwork itself is
14
- // NOT moved — it stays a top-level `async function` in server.js (unchanged
15
- // body, closes over the same transport/tailscale/golive state as before) and
16
- // is injected via configure(), same as every other name in this file's
17
- // sibling modules.
9
+ // ROUTE_DECLINED sentinel closes that gap: this module registers the same ten
10
+ // path specs the legacy OR-gate used to gate on, each wrapping a call to
11
+ // handleSetupNetwork and returning ROUTE_DECLINED exactly where the legacy
12
+ // `!== false` check would have let the (now-deleted) chain entry fall through.
13
+ //
14
+ // Landing-throughput WP-5 shard S2 (design doc §5 D-10 "move-only", §6 "Shard
15
+ // module seam", §8 WP-5, §9 S-21..S-27): handleSetupNetwork itself now moves
16
+ // out of server.js VERBATIM — it was the last dispatch-only name this file
17
+ // injected. Its body is identical to server.js's declaration except for the
18
+ // `_deps.` prefix on every identifier that used to resolve to a server.js
19
+ // top-level binding (D-10 rule 1), proven by `node bin/move-only-check.js`.
20
+ // Injected deps (40): CONFIG_DIR, CTM_SESSION_STREAM_SLICE, PORT, _applyTransportEnvValues, _cacheGolivePlan, _connectionHealthForPairing, _goliveManifestRefreshLease, _golivePeersSummaryCache, _golivePlan, _golivePlanCache, _invalidateGoliveProbes, _mergeAllowedOriginTransportEnv, _mergeCloudflareTransportEnv, _noteMicrosoftTunnelOrigin, _readSetupJsonBody, _runMicrosoftTunnelRecovery, _scheduleTransportRestart, _tailscaleCertificateSupervisor, _transportEnvValuesFromInput, _transportNetworkStatus, applyCloudflareFallbackSetup, applyMicrosoftDevTunnelSetup, checkMicrosoftDevTunnelLoginStatus, clearMicrosoftDevTunnelTraffic, detectMicrosoftDevTunnelSetup, detectTailscaleSetup, generateTailscaleCert, getMicrosoftDevTunnelProgress, isLocalOrTailnetRequest, loadManagedTunnelState, logoutMicrosoftDevTunnelUser, managedTunnelDesiredRunning, probeMicrosoftDevTunnelPublicAccess, redactGolivePlanSteps, resetMicrosoftDevTunnelPrivateAccess, setMicrosoftDevTunnelKeepAwake, startMicrosoftDevTunnelInstall, startMicrosoftDevTunnelLogin, stopMicrosoftDevTunnel, tailscaleCertificateLifecycle.
21
+ // _golivePlanCache/_golivePeersSummaryCache are the only mutable ones (declared
22
+ // `let` and reassigned later in server.js by _cacheGolivePlan /
23
+ // _refreshGolivePeersSummaryCache), so they are injected as GETTERS — a copied
24
+ // value would freeze at configure() time (D-10 rule 2). Everything else is an
25
+ // immutable `const`/function declaration and is passed by value.
18
26
  //
19
27
  // None of these ten path specs carry a method filter here — the legacy
20
28
  // OR-gate didn't filter by method either (method enforcement happens INSIDE
@@ -25,14 +33,534 @@ const { registerApiRoutes, ROUTE_DECLINED } = require('../api-router');
25
33
 
26
34
  let _deps = null;
27
35
 
28
- function configure({ handleSetupNetwork } = {}) {
29
- _deps = { handleSetupNetwork };
36
+ // deps (40), per D-10 rule 1: CONFIG_DIR, CTM_SESSION_STREAM_SLICE, PORT, _applyTransportEnvValues, _cacheGolivePlan, _connectionHealthForPairing, _goliveManifestRefreshLease, _golivePeersSummaryCache, _golivePlan, _golivePlanCache, _invalidateGoliveProbes, _mergeAllowedOriginTransportEnv, _mergeCloudflareTransportEnv, _noteMicrosoftTunnelOrigin, _readSetupJsonBody, _runMicrosoftTunnelRecovery, _scheduleTransportRestart, _tailscaleCertificateSupervisor, _transportEnvValuesFromInput, _transportNetworkStatus, applyCloudflareFallbackSetup, applyMicrosoftDevTunnelSetup, checkMicrosoftDevTunnelLoginStatus, clearMicrosoftDevTunnelTraffic, detectMicrosoftDevTunnelSetup, detectTailscaleSetup, generateTailscaleCert, getMicrosoftDevTunnelProgress, isLocalOrTailnetRequest, loadManagedTunnelState, logoutMicrosoftDevTunnelUser, managedTunnelDesiredRunning, probeMicrosoftDevTunnelPublicAccess, redactGolivePlanSteps, resetMicrosoftDevTunnelPrivateAccess, setMicrosoftDevTunnelKeepAwake, startMicrosoftDevTunnelInstall, startMicrosoftDevTunnelLogin, stopMicrosoftDevTunnel, tailscaleCertificateLifecycle.
37
+ // The object is stored BY REFERENCE (never destructured) so the two live getters server.js
38
+ // passes — `get _golivePlanCache()` / `get _golivePeersSummaryCache()` (D-10 rule 2: both are
39
+ // `let` in server.js and reassigned by _cacheGolivePlan / _refreshGolivePeersSummaryCache) —
40
+ // are read at each call instead of frozen at configure() time.
41
+ function configure(deps = {}) {
42
+ _deps = deps;
30
43
  }
31
-
32
44
  async function _dispatch(req, res, url) {
33
- const result = await _deps.handleSetupNetwork(req, res, url);
45
+ const result = await handleSetupNetwork(req, res, url);
34
46
  return result === false ? ROUTE_DECLINED : result;
35
47
  }
48
+ async function handleSetupNetwork(req, res, url) {
49
+ if (url.pathname === '/api/setup/network' && req.method === 'GET') {
50
+ res.writeHead(200, { 'Content-Type': 'application/json' });
51
+ res.end(JSON.stringify(await _deps._transportNetworkStatus(req)));
52
+ return true;
53
+ }
54
+ // Cheap, pollable unified health for the three phone-access methods (read-only).
55
+ // D-7: routes through _connectionHealthForPairing — the ONE builder both this endpoint and
56
+ // /api/phone/health consume — so tunnel_egress (the Dev Tunnels bandwidth ledger truth)
57
+ // is attached in a single place for both.
58
+ if (url.pathname === '/api/setup/connection-health' && req.method === 'GET') {
59
+ let payload;
60
+ try {
61
+ payload = await _deps._connectionHealthForPairing();
62
+ } catch (err) {
63
+ payload = { ok: false, error: String((err && err.message) || err) };
64
+ }
65
+ res.writeHead(200, { 'Content-Type': 'application/json' });
66
+ res.end(JSON.stringify(payload));
67
+ return true;
68
+ }
69
+ if (url.pathname === '/api/setup/network/tailscale-certificate' && req.method === 'GET') {
70
+ try {
71
+ const tailscaleSetup = await _deps.detectTailscaleSetup({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
72
+ const certificate = await _deps.tailscaleCertificateLifecycle.inspectTailscaleCertificate({
73
+ configDir: _deps.CONFIG_DIR,
74
+ setup: tailscaleSetup,
75
+ });
76
+ const recovery = await _deps.tailscaleCertificateLifecycle.loadTailscaleCertificateState({ configDir: _deps.CONFIG_DIR });
77
+ res.writeHead(200, { 'Content-Type': 'application/json' });
78
+ res.end(JSON.stringify({ ok: true, tailscale: tailscaleSetup, certificate, recovery }));
79
+ return true;
80
+ } catch (e) {
81
+ res.writeHead(200, { 'Content-Type': 'application/json' });
82
+ res.end(JSON.stringify({ ok: false, error: e.message }));
83
+ return true;
84
+ }
85
+ }
86
+ if (url.pathname === '/api/setup/network/tailscale-certificate/recover' && req.method === 'POST') {
87
+ try {
88
+ const data = await _deps._readSetupJsonBody(req, 2048);
89
+ const result = await _deps._tailscaleCertificateSupervisor.check('manual', { force: data.force === true });
90
+ res.writeHead(result.ok ? 200 : 409, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify(result));
92
+ return true;
93
+ } catch (e) {
94
+ res.writeHead(400, { 'Content-Type': 'application/json' });
95
+ res.end(JSON.stringify({ ok: false, error: e.message }));
96
+ return true;
97
+ }
98
+ }
99
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/start' && req.method === 'POST') {
100
+ try {
101
+ const data = await _deps._readSetupJsonBody(req, 4096);
102
+ const setupResult = await _deps.applyMicrosoftDevTunnelSetup(data, {
103
+ configDir: _deps.CONFIG_DIR,
104
+ port: _deps.PORT,
105
+ });
106
+ if (!setupResult.ok) {
107
+ res.writeHead(400, { 'Content-Type': 'application/json' });
108
+ res.end(JSON.stringify({
109
+ error: setupResult.error || 'Microsoft tunnel setup failed.',
110
+ code: setupResult.error_code || 'microsoft_tunnel_setup_failed',
111
+ microsoft_dev_tunnel: setupResult.setup || null,
112
+ }));
113
+ return true;
114
+ }
115
+
116
+ const envValues = _deps._mergeAllowedOriginTransportEnv(setupResult.origin);
117
+ _deps._applyTransportEnvValues(envValues);
118
+ await _deps._noteMicrosoftTunnelOrigin(setupResult.origin, 'start');
119
+ res.writeHead(200, { 'Content-Type': 'application/json' });
120
+ res.end(JSON.stringify({
121
+ ok: true,
122
+ restart_scheduled: false,
123
+ restart_required: false,
124
+ values: {
125
+ allowed_origins: envValues.CTM_ALLOWED_ORIGINS ? envValues.CTM_ALLOWED_ORIGINS.split(',') : [],
126
+ mobile_url: setupResult.mobile_url,
127
+ origin: setupResult.origin,
128
+ inspect_url: setupResult.inspect_url,
129
+ tunnel_id: setupResult.tunnel_id,
130
+ managed_tunnel: setupResult.managed_tunnel,
131
+ },
132
+ microsoft_dev_tunnel: {
133
+ tunnel_id: setupResult.tunnel_id,
134
+ origin: setupResult.origin,
135
+ mobile_url: setupResult.mobile_url,
136
+ inspect_url: setupResult.inspect_url,
137
+ managed_tunnel: setupResult.managed_tunnel,
138
+ traffic: setupResult.traffic,
139
+ },
140
+ }));
141
+ return true;
142
+ } catch (e) {
143
+ res.writeHead(400, { 'Content-Type': 'application/json' });
144
+ res.end(JSON.stringify({ error: e.message }));
145
+ return true;
146
+ }
147
+ }
148
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/install' && req.method === 'POST') {
149
+ try {
150
+ const result = await _deps.startMicrosoftDevTunnelInstall({
151
+ configDir: _deps.CONFIG_DIR,
152
+ port: _deps.PORT,
153
+ });
154
+ const status = result.ok ? 200 : 400;
155
+ res.writeHead(status, { 'Content-Type': 'application/json' });
156
+ res.end(JSON.stringify({
157
+ ok: !!result.ok,
158
+ already_installed: !!result.already_installed,
159
+ install: result.install || null,
160
+ error: result.error || '',
161
+ code: result.error_code || '',
162
+ microsoft_dev_tunnel: result.setup || null,
163
+ progress: result.progress || _deps.getMicrosoftDevTunnelProgress({ configDir: _deps.CONFIG_DIR, port: _deps.PORT }),
164
+ }));
165
+ return true;
166
+ } catch (e) {
167
+ res.writeHead(400, { 'Content-Type': 'application/json' });
168
+ res.end(JSON.stringify({ error: e.message }));
169
+ return true;
170
+ }
171
+ }
172
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/progress' && req.method === 'GET') {
173
+ res.writeHead(200, { 'Content-Type': 'application/json' });
174
+ res.end(JSON.stringify({
175
+ ok: true,
176
+ progress: _deps.getMicrosoftDevTunnelProgress({ configDir: _deps.CONFIG_DIR, port: _deps.PORT }),
177
+ }));
178
+ return true;
179
+ }
180
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/probe' && req.method === 'GET') {
181
+ try {
182
+ const setup = await _deps.detectMicrosoftDevTunnelSetup({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
183
+ const probe = await _deps.probeMicrosoftDevTunnelPublicAccess(setup, {
184
+ timeoutMs: 6000,
185
+ });
186
+ res.writeHead(200, { 'Content-Type': 'application/json' });
187
+ res.end(JSON.stringify({
188
+ ok: !!probe.checked,
189
+ probe,
190
+ microsoft_dev_tunnel: {
191
+ ...setup,
192
+ public_probe: probe,
193
+ },
194
+ }));
195
+ return true;
196
+ } catch (e) {
197
+ res.writeHead(200, { 'Content-Type': 'application/json' });
198
+ res.end(JSON.stringify({
199
+ ok: false,
200
+ probe: {
201
+ ok: false,
202
+ checked: true,
203
+ diagnosis: 'probe_failed',
204
+ message: e.message || 'Microsoft tunnel URL check failed.',
205
+ },
206
+ }));
207
+ return true;
208
+ }
209
+ }
210
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/recover' && req.method === 'POST') {
211
+ try {
212
+ const result = await _deps._runMicrosoftTunnelRecovery('manual');
213
+ const status = result.ok ? 200 : 400;
214
+ res.writeHead(status, { 'Content-Type': 'application/json' });
215
+ res.end(JSON.stringify(result));
216
+ return true;
217
+ } catch (e) {
218
+ res.writeHead(400, { 'Content-Type': 'application/json' });
219
+ res.end(JSON.stringify({ ok: false, error: e.message }));
220
+ return true;
221
+ }
222
+ }
223
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/reset-private' && req.method === 'POST') {
224
+ try {
225
+ const data = await _deps._readSetupJsonBody(req, 2048);
226
+ const result = await _deps.resetMicrosoftDevTunnelPrivateAccess(data, {
227
+ configDir: _deps.CONFIG_DIR,
228
+ port: _deps.PORT,
229
+ });
230
+ const status = result.ok ? 200 : 400;
231
+ res.writeHead(status, { 'Content-Type': 'application/json' });
232
+ res.end(JSON.stringify({
233
+ ok: !!result.ok,
234
+ access: result.access || null,
235
+ managed_tunnel: result.managed_tunnel || null,
236
+ microsoft_dev_tunnel: result.setup || null,
237
+ error: result.error || '',
238
+ code: result.error_code || '',
239
+ }));
240
+ return true;
241
+ } catch (e) {
242
+ res.writeHead(400, { 'Content-Type': 'application/json' });
243
+ res.end(JSON.stringify({ ok: false, error: e.message }));
244
+ return true;
245
+ }
246
+ }
247
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/keep-awake' && req.method === 'POST') {
248
+ try {
249
+ const data = await _deps._readSetupJsonBody(req, 2048);
250
+ const result = await _deps.setMicrosoftDevTunnelKeepAwake(data.enabled === true, {
251
+ configDir: _deps.CONFIG_DIR,
252
+ port: _deps.PORT,
253
+ });
254
+ const status = result.ok ? 200 : 400;
255
+ res.writeHead(status, { 'Content-Type': 'application/json' });
256
+ res.end(JSON.stringify(result));
257
+ return true;
258
+ } catch (e) {
259
+ res.writeHead(400, { 'Content-Type': 'application/json' });
260
+ res.end(JSON.stringify({ ok: false, error: e.message }));
261
+ return true;
262
+ }
263
+ }
264
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/login' && req.method === 'POST') {
265
+ try {
266
+ const data = await _deps._readSetupJsonBody(req, 2048);
267
+ const result = _deps.startMicrosoftDevTunnelLogin(data, { configDir: _deps.CONFIG_DIR, port: _deps.PORT });
268
+ res.writeHead(200, { 'Content-Type': 'application/json' });
269
+ res.end(JSON.stringify(result));
270
+ return true;
271
+ } catch (e) {
272
+ res.writeHead(400, { 'Content-Type': 'application/json' });
273
+ res.end(JSON.stringify({ error: e.message }));
274
+ return true;
275
+ }
276
+ }
277
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/login/check' && req.method === 'POST') {
278
+ try {
279
+ const result = await _deps.checkMicrosoftDevTunnelLoginStatus({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
280
+ // Sign-in is back: bring the tunnel + access rules back without further
281
+ // clicks (don't block the response on it).
282
+ if (result.signed_in && _deps.managedTunnelDesiredRunning(_deps.loadManagedTunnelState({ configDir: _deps.CONFIG_DIR }) || {})) {
283
+ _deps._runMicrosoftTunnelRecovery('login-restored').catch(() => {});
284
+ }
285
+ const status = result.ok ? 200 : 409;
286
+ res.writeHead(status, { 'Content-Type': 'application/json' });
287
+ res.end(JSON.stringify(result));
288
+ return true;
289
+ } catch (e) {
290
+ res.writeHead(400, { 'Content-Type': 'application/json' });
291
+ res.end(JSON.stringify({ ok: false, error: e.message }));
292
+ return true;
293
+ }
294
+ }
295
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/logout' && req.method === 'POST') {
296
+ try {
297
+ const result = await _deps.logoutMicrosoftDevTunnelUser({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
298
+ const status = result.ok ? 200 : 400;
299
+ res.writeHead(status, { 'Content-Type': 'application/json' });
300
+ res.end(JSON.stringify(result));
301
+ return true;
302
+ } catch (e) {
303
+ res.writeHead(400, { 'Content-Type': 'application/json' });
304
+ res.end(JSON.stringify({ ok: false, error: e.message }));
305
+ return true;
306
+ }
307
+ }
308
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/stop' && req.method === 'POST') {
309
+ const result = await _deps.stopMicrosoftDevTunnel({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
310
+ res.writeHead(200, { 'Content-Type': 'application/json' });
311
+ res.end(JSON.stringify(result));
312
+ return true;
313
+ }
314
+ if (url.pathname === '/api/setup/network/microsoft-dev-tunnel/traffic/clear' && req.method === 'POST') {
315
+ res.writeHead(200, { 'Content-Type': 'application/json' });
316
+ res.end(JSON.stringify({ ok: true, traffic: _deps.clearMicrosoftDevTunnelTraffic() }));
317
+ return true;
318
+ }
319
+ if (url.pathname === '/api/setup/network/tailscale-auto' && req.method === 'POST') {
320
+ try {
321
+ const data = await _deps._readSetupJsonBody(req, 4096);
322
+ const setupInfo = await _deps.detectTailscaleSetup({ configDir: _deps.CONFIG_DIR, port: _deps.PORT });
323
+ if (!setupInfo.available) {
324
+ res.writeHead(400, { 'Content-Type': 'application/json' });
325
+ res.end(JSON.stringify({ error: setupInfo.error || 'Tailscale setup is not available.', code: setupInfo.error_code || 'tailscale_unavailable', tailscale: setupInfo }));
326
+ return true;
327
+ }
328
+
329
+ const shouldGenerateCert = data.generate_cert !== false && data.generateCert !== false;
330
+ if (shouldGenerateCert) {
331
+ const certResult = await _deps.generateTailscaleCert(setupInfo);
332
+ if (!certResult.ok) {
333
+ res.writeHead(400, { 'Content-Type': 'application/json' });
334
+ res.end(JSON.stringify({ error: certResult.error || 'Could not generate Tailscale certificate.', code: certResult.error_code || 'tailscale_cert_failed', tailscale: setupInfo }));
335
+ return true;
336
+ }
337
+ setupInfo.cert_exists = true;
338
+ setupInfo.key_exists = true;
339
+ } else if (!setupInfo.cert_exists || !setupInfo.key_exists) {
340
+ res.writeHead(400, { 'Content-Type': 'application/json' });
341
+ res.end(JSON.stringify({ error: 'Tailscale certificate files do not exist yet.', code: 'tailscale_cert_missing', tailscale: setupInfo }));
342
+ return true;
343
+ }
344
+
345
+ const decision = _deps._transportEnvValuesFromInput({
346
+ host: setupInfo.host,
347
+ tls_cert: setupInfo.cert_path,
348
+ tls_key: setupInfo.key_path,
349
+ allowed_origins: setupInfo.origin,
350
+ cloudflare_access: data.cloudflare_access || data.cloudflareAccess || null,
351
+ });
352
+ if (!decision.ok) {
353
+ res.writeHead(decision.status || 400, { 'Content-Type': 'application/json' });
354
+ res.end(JSON.stringify({ error: decision.error, code: decision.code }));
355
+ return true;
356
+ }
357
+ _deps._applyTransportEnvValues(decision.envValues);
358
+
359
+ const shouldRestart = data.restart !== false;
360
+ res.writeHead(200, { 'Content-Type': 'application/json' });
361
+ res.end(JSON.stringify({
362
+ ok: true,
363
+ restart_scheduled: shouldRestart,
364
+ restart_required: true,
365
+ values: {
366
+ host: setupInfo.host,
367
+ tls_cert: setupInfo.cert_path,
368
+ tls_key: setupInfo.key_path,
369
+ allowed_origins: [setupInfo.origin],
370
+ mobile_url: setupInfo.mobile_url,
371
+ },
372
+ tailscale: setupInfo,
373
+ }));
374
+ if (shouldRestart) _deps._scheduleTransportRestart();
375
+ return true;
376
+ } catch (e) {
377
+ res.writeHead(400, { 'Content-Type': 'application/json' });
378
+ res.end(JSON.stringify({ error: e.message }));
379
+ return true;
380
+ }
381
+ }
382
+ if (url.pathname === '/api/setup/network/cloudflare-auto' && req.method === 'POST') {
383
+ try {
384
+ const data = await _deps._readSetupJsonBody(req, 8192);
385
+ const setupResult = await _deps.applyCloudflareFallbackSetup(data, {
386
+ configDir: _deps.CONFIG_DIR,
387
+ port: _deps.PORT,
388
+ });
389
+ if (!setupResult.ok) {
390
+ res.writeHead(400, { 'Content-Type': 'application/json' });
391
+ res.end(JSON.stringify({
392
+ error: setupResult.error || 'Cloudflare fallback setup failed.',
393
+ code: setupResult.error_code || 'cloudflare_setup_failed',
394
+ cloudflare: setupResult.setup || null,
395
+ cloudflared: setupResult.cloudflared || null,
396
+ }));
397
+ return true;
398
+ }
399
+
400
+ const envValues = _deps._mergeCloudflareTransportEnv(setupResult.env, setupResult.origin);
401
+ _deps._applyTransportEnvValues(envValues);
402
+ const shouldRestart = data.restart === true;
403
+ res.writeHead(200, { 'Content-Type': 'application/json' });
404
+ res.end(JSON.stringify({
405
+ ok: true,
406
+ restart_scheduled: shouldRestart,
407
+ restart_required: shouldRestart,
408
+ values: {
409
+ hostnames: [setupResult.hostname],
410
+ allowed_origins: envValues.CTM_ALLOWED_ORIGINS ? envValues.CTM_ALLOWED_ORIGINS.split(',') : [],
411
+ mobile_url: setupResult.mobile_url,
412
+ config_path: setupResult.config_path,
413
+ config_written: !!setupResult.config_written,
414
+ remote_config: !!setupResult.remote_config,
415
+ token_file_written: !!setupResult.token_file_written,
416
+ run_command: (setupResult.config_written || setupResult.token_file_written || setupResult.managed_tunnel?.running) ? setupResult.commands.run.display : '',
417
+ route_dns_command: setupResult.commands.route_dns.display,
418
+ tunnel_running: !!setupResult.managed_tunnel?.running,
419
+ managed_tunnel: setupResult.managed_tunnel,
420
+ access: setupResult.access,
421
+ provisioned_access: setupResult.provisioned_access,
422
+ provisioned_tunnel: setupResult.provisioned_tunnel,
423
+ cloudflare_context: setupResult.cloudflare_context,
424
+ },
425
+ cloudflare: {
426
+ hostname: setupResult.hostname,
427
+ origin: setupResult.origin,
428
+ mobile_url: setupResult.mobile_url,
429
+ local_service: setupResult.local_service,
430
+ tunnel_name: setupResult.tunnel_name,
431
+ tunnel_id: setupResult.tunnel_id,
432
+ remote_config: !!setupResult.remote_config,
433
+ config_path: setupResult.config_path,
434
+ config_written: !!setupResult.config_written,
435
+ token_file_written: !!setupResult.token_file_written,
436
+ managed_tunnel: setupResult.managed_tunnel,
437
+ commands: setupResult.commands,
438
+ access: setupResult.access,
439
+ provisioned_access: setupResult.provisioned_access,
440
+ provisioned_tunnel: setupResult.provisioned_tunnel,
441
+ cloudflare_context: setupResult.cloudflare_context,
442
+ },
443
+ }));
444
+ if (shouldRestart) _deps._scheduleTransportRestart();
445
+ return true;
446
+ } catch (e) {
447
+ res.writeHead(400, { 'Content-Type': 'application/json' });
448
+ res.end(JSON.stringify({ error: e.message }));
449
+ return true;
450
+ }
451
+ }
452
+ // --- Go-Live Wizard (GW-3) ---------------------------------------------
453
+ if (url.pathname === '/api/setup/golive' && req.method === 'GET') {
454
+ try {
455
+ let plan;
456
+ if (!_deps.CTM_SESSION_STREAM_SLICE) {
457
+ // Rollback lane: preserve the parent request-path verification.
458
+ plan = await _deps._golivePlan.getPlan();
459
+ } else if (_deps._golivePlanCache) {
460
+ _deps._goliveManifestRefreshLease.touch();
461
+ plan = _deps._golivePlanCache;
462
+ } else {
463
+ // The first ever request has no last-known value to serve. Populate it once; later
464
+ // visibility/use resumptions serve this snapshot and refresh asynchronously.
465
+ _deps._goliveManifestRefreshLease.touch({ refresh: false });
466
+ plan = await _deps._golivePlan.getPlan();
467
+ _deps._cacheGolivePlan(plan);
468
+ }
469
+ const auth = req.ctmAuth || {};
470
+ const revealSecrets = _deps.isLocalOrTailnetRequest(req) || !!auth.stepUpFresh;
471
+ res.writeHead(200, { 'Content-Type': 'application/json' });
472
+ res.end(JSON.stringify({
473
+ ok: true,
474
+ steps: _deps.redactGolivePlanSteps(plan.steps, { revealSecrets }),
475
+ active_step: plan.active_step,
476
+ // GW-6: read-only peer go-live visibility, served from a cached,
477
+ // best-effort snapshot (see _refreshGolivePeersSummaryCache) — never
478
+ // fetched live on this request path.
479
+ peers: _deps._golivePeersSummaryCache,
480
+ }));
481
+ } catch (e) {
482
+ res.writeHead(500, { 'Content-Type': 'application/json' });
483
+ res.end(JSON.stringify({ ok: false, error: e.message }));
484
+ }
485
+ return true;
486
+ }
487
+ if (url.pathname === '/api/setup/golive/step' && req.method === 'POST') {
488
+ try {
489
+ // An explicit wizard action: the user is asking for the CURRENT truth, and the step it runs
490
+ // may itself change tunnel state. Never answer this one from the passive probe memo.
491
+ _deps._invalidateGoliveProbes();
492
+ const data = await _deps._readSetupJsonBody(req, 4096);
493
+ const id = String(data.id || '').trim();
494
+ if (!id) {
495
+ res.writeHead(400, { 'Content-Type': 'application/json' });
496
+ res.end(JSON.stringify({ ok: false, error: 'id_required' }));
497
+ return true;
498
+ }
499
+ const step = await _deps._golivePlan.runStep(id, data.input || {});
500
+ res.writeHead(200, { 'Content-Type': 'application/json' });
501
+ res.end(JSON.stringify({ ok: true, step }));
502
+ } catch (e) {
503
+ const status = e && e.code === 'unknown_step' ? 404 : (e && e.code === 'step_already_running' ? 409 : 400);
504
+ res.writeHead(status, { 'Content-Type': 'application/json' });
505
+ res.end(JSON.stringify({ ok: false, error: e.message, code: e && e.code }));
506
+ }
507
+ return true;
508
+ }
509
+ if (url.pathname === '/api/setup/golive/skip' && req.method === 'POST') {
510
+ try {
511
+ const data = await _deps._readSetupJsonBody(req, 4096);
512
+ const id = String(data.id || '').trim();
513
+ if (!id) {
514
+ res.writeHead(400, { 'Content-Type': 'application/json' });
515
+ res.end(JSON.stringify({ ok: false, error: 'id_required' }));
516
+ return true;
517
+ }
518
+ const plan = await _deps._golivePlan.skipStep(id, data.reason || '');
519
+ _deps._cacheGolivePlan(plan);
520
+ res.writeHead(200, { 'Content-Type': 'application/json' });
521
+ res.end(JSON.stringify({ ok: true, steps: plan.steps, active_step: plan.active_step }));
522
+ } catch (e) {
523
+ const status = e && e.code === 'unknown_step' ? 404 : 400;
524
+ res.writeHead(status, { 'Content-Type': 'application/json' });
525
+ res.end(JSON.stringify({ ok: false, error: e.message, code: e && e.code }));
526
+ }
527
+ return true;
528
+ }
529
+ if (url.pathname === '/api/setup/golive/reset' && req.method === 'POST') {
530
+ try {
531
+ _deps._invalidateGoliveProbes();
532
+ const plan = await _deps._golivePlan.reset();
533
+ _deps._cacheGolivePlan(plan);
534
+ res.writeHead(200, { 'Content-Type': 'application/json' });
535
+ res.end(JSON.stringify({ ok: true, steps: plan.steps, active_step: plan.active_step }));
536
+ } catch (e) {
537
+ res.writeHead(400, { 'Content-Type': 'application/json' });
538
+ res.end(JSON.stringify({ ok: false, error: e.message }));
539
+ }
540
+ return true;
541
+ }
542
+
543
+ if (req.method !== 'POST') return false;
544
+ try {
545
+ const data = await _deps._readSetupJsonBody(req);
546
+ const decision = _deps._transportEnvValuesFromInput(data);
547
+ if (!decision.ok) {
548
+ res.writeHead(decision.status || 400, { 'Content-Type': 'application/json' });
549
+ res.end(JSON.stringify({ error: decision.error, code: decision.code }));
550
+ return true;
551
+ }
552
+ _deps._applyTransportEnvValues(decision.envValues);
553
+
554
+ const shouldRestart = data.restart !== false;
555
+ res.writeHead(200, { 'Content-Type': 'application/json' });
556
+ res.end(JSON.stringify({ ok: true, restart_scheduled: shouldRestart, restart_required: true }));
557
+ if (shouldRestart) _deps._scheduleTransportRestart();
558
+ } catch (e) {
559
+ res.writeHead(400, { 'Content-Type': 'application/json' });
560
+ res.end(JSON.stringify({ error: e.message }));
561
+ }
562
+ return true;
563
+ }
36
564
 
37
565
  function register() {
38
566
  registerApiRoutes('setup-network', [
@@ -49,4 +577,4 @@ function register() {
49
577
  ]);
50
578
  }
51
579
 
52
- module.exports = { configure, register };
580
+ module.exports = { configure, register, handleSetupNetwork };