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,456 @@
1
+ 'use strict';
2
+ // WP-1 (docs/fleet-origin-main-sync-skill-2026-10-31.html §5 R-1..R-5/R-7/R-9, §6.1-§6.3, §8 WP-1,
3
+ // §9 S-3/S-4/S-6/S-7): `land sync` — the ONE command that pulls origin, trains + gates when the box
4
+ // has diverged, pushes, and (WP-2) schedules the idle restart.
5
+ //
6
+ // The state machine is exactly §6.3, with the local branch `landing/origin-main` as the train's
7
+ // source (§5 R-1) so the queue needs no new source kind:
8
+ //
9
+ // fetch(remote, branch) -> O (no-prompt env, below)
10
+ // O == main -> in_sync
11
+ // O is an ancestor of main -> push main -> pushed
12
+ // main is an ancestor of O -> CAS main := O, schedule restart -> pulled
13
+ // diverged -> update-ref landing/origin-main O
14
+ // enqueue an ordinary queue job kind:"sync" (the existing train
15
+ // merges it into main, regenerates/refreshes, gates and
16
+ // CAS-moves main), then push the landed sha -> published
17
+ //
18
+ // A rejected push is a CAS miss, not a failure (§5 R-4): non-fast-forward / fetch-first re-enters the
19
+ // machine at step 1, bounded by `publish.maxRetrains` extra trains; anything else is `publish_failed`
20
+ // with git's stderr verbatim and is never retried.
21
+ //
22
+ // HARD RULES (§5 R-3, §6.3, house rule "NO TEST/DEV RUN MAY START A GITHUB/CLAUDE LOGIN"): every git
23
+ // child that talks to the remote runs the scrubbed landing env PLUS GIT_TERMINAL_PROMPT=0,
24
+ // GCM_INTERACTIVE=never and GIT_SSH_COMMAND="ssh -o BatchMode=yes"; nothing here ever passes
25
+ // --force, --force-with-lease, --no-verify or a rebase.
26
+ //
27
+ // The push for a `kind:"sync"` job is performed by the RUNNER (`finishSyncJob`), not by the CLI: the
28
+ // job that lands is the job that publishes, so the CLI's `land sync` and the R-9 auto-publish after an
29
+ // ordinary landing share one code path (`syncOnce` + `finishSyncJob`).
30
+
31
+ const path = require('path');
32
+ const fsp = require('fs/promises');
33
+ const { landingError, childEnv, runGitRaw } = require('./git');
34
+ const { readJsonSafe, writeJsonAtomic } = require('./state');
35
+
36
+ const CONTRACT = 1;
37
+ const SYNC_STATE_FILE = 'sync-state.json';
38
+ // §6.3: the local branch origin/main is materialised as, so the train consumes a plain local branch.
39
+ const ORIGIN_BRANCH = 'landing/origin-main';
40
+ // §6.1 defaults. The publish block is only ever present when the repository asked for it.
41
+ const DEFAULT_REMOTE = 'origin';
42
+ const DEFAULT_BRANCH = 'main';
43
+ const DEFAULT_MAX_RETRAINS = 3;
44
+
45
+ // §6.3: the no-prompt env. Layered on top of the landing scrub by `childEnv`, so the GIT_* incident
46
+ // list stays scrubbed and these three can never be forgotten at a call site.
47
+ const NO_PROMPT_ENV = Object.freeze({
48
+ GIT_TERMINAL_PROMPT: '0',
49
+ GCM_INTERACTIVE: 'never',
50
+ GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',
51
+ });
52
+
53
+ function noPromptEnv(extra) {
54
+ return childEnv({ ...NO_PROMPT_ENV, ...(extra || {}) });
55
+ }
56
+
57
+ // The one injected git runner: `(args, extraEnv) -> { status, stdout, stderr }`. Every remote child
58
+ // goes through it, which is what makes the state machine testable without a network.
59
+ function gitRunner(cwd) {
60
+ return (args, extraEnv) => runGitRaw(cwd, args, { env: noPromptEnv(extraEnv) });
61
+ }
62
+
63
+ function remoteRef(remote, branch) {
64
+ return `refs/remotes/${remote}/${branch}`;
65
+ }
66
+
67
+ function originBranchRef() {
68
+ return `refs/heads/${ORIGIN_BRANCH}`;
69
+ }
70
+
71
+ function targetRef(target) {
72
+ return `refs/heads/${target}`;
73
+ }
74
+
75
+ // --- sync state (§6.2 `land status` origin.lastSync, §6.3 atomic writes) -------------------------
76
+
77
+ function syncStatePath(common) {
78
+ return path.join(common, 'landing', SYNC_STATE_FILE);
79
+ }
80
+
81
+ function readSyncState(common) {
82
+ const data = readJsonSafe(syncStatePath(common));
83
+ return data && typeof data === 'object' ? data : null;
84
+ }
85
+
86
+ // Atomic tmp+rename like every other landing state file (state.writeJsonAtomic stamps `contract: 1`).
87
+ function writeSyncState(common, patch) {
88
+ const before = readSyncState(common) || {};
89
+ const next = { ...before, ...patch };
90
+ writeJsonAtomic(syncStatePath(common), next);
91
+ return next;
92
+ }
93
+
94
+ // §6.2: `lastSync` is the verdict a reader shows on the Machines card — the verdict, when it was
95
+ // reached, and the attempt count when the push had to re-train.
96
+ function recordSyncVerdict(common, verdict, extra = {}) {
97
+ const at = new Date().toISOString();
98
+ return writeSyncState(common, { lastSync: { verdict, at, ...extra } });
99
+ }
100
+
101
+ // --- git primitives over the injected runner ------------------------------------------------------
102
+
103
+ function revParseVia(runGit, rev) {
104
+ const res = runGit(['rev-parse', '--verify', '--quiet', rev]);
105
+ return res.status === 0 ? (res.stdout.trim() || null) : null;
106
+ }
107
+
108
+ function isAncestorVia(runGit, ancestor, descendant) {
109
+ const res = runGit(['merge-base', '--is-ancestor', ancestor, descendant]);
110
+ if (res.status === 0) return true;
111
+ if (res.status === 1) return false;
112
+ throw landingError('git_failed', `git merge-base --is-ancestor ${ancestor} ${descendant} exited ${res.status}: ${String(res.stderr || '').trim()}`, {
113
+ ancestor, descendant,
114
+ });
115
+ }
116
+
117
+ // `git fetch <remote> <branch>`: no `--tags`, no `+` refspec — a failed fetch writes nothing locally.
118
+ function fetchOrigin(runGit, { remote, branch }) {
119
+ const res = runGit(['fetch', '--prune', remote, branch]);
120
+ return { ok: res.status === 0, status: res.status, stderr: String(res.stderr || '').trim() };
121
+ }
122
+
123
+ // §5 R-3/R-4: a plain fast-forward push of exactly `sha`. Porcelain is used so the flag column says
124
+ // WHY a ref was rejected. Every wording that means "the ref moved under us" is a CAS MISS — the same
125
+ // condition as a non-fast-forward, and the trigger for one more train:
126
+ // `! [rejected] ... (non-fast-forward)` / `(fetch first)` / `(stale info)` — the smart-transport
127
+ // wordings, and `cannot lock ref ... is at X but expected Y`, which is what a filesystem/`file://`
128
+ // remote reports for the very same race.
129
+ const CAS_MISS = /non-fast-forward|fetch first|stale info|\[rejected\]|cannot lock ref/i;
130
+
131
+ function classifyPush(res) {
132
+ if (res.status === 0) {
133
+ // `=` is porcelain's "up to date" flag: nothing was transferred, origin already held the sha.
134
+ const text = String(res.stdout || '');
135
+ if (/^\s*=\s/m.test(text) && !/^\s*[+*!]\s/m.test(text)) return 'up_to_date';
136
+ return 'ok';
137
+ }
138
+ const text = `${res.stdout || ''}\n${res.stderr || ''}`;
139
+ if (CAS_MISS.test(text)) return 'rejected';
140
+ return 'failed';
141
+ }
142
+
143
+ function pushMain(runGit, { remote, branch, sha }) {
144
+ const res = runGit(['push', '--porcelain', remote, `${sha}:refs/heads/${branch}`]);
145
+ let outcome = classifyPush(res);
146
+ // git words a lost race differently across versions and transports (2.54 local: "cannot lock ref",
147
+ // 2.50 local: only "failed to push some refs"; smart HTTP/ssh: "[rejected] (fetch first)"), so the
148
+ // wording is a hint, never the decision. The decision is the fact: re-fetch, and if `sha` is no
149
+ // longer a fast-forward of the remote tip, origin moved under us — a CAS miss (§5 R-4). If it still
150
+ // IS a fast-forward, the push failed for another reason (auth, network, a hook) and stays failed.
151
+ if (outcome === 'failed') {
152
+ const refetched = fetchOrigin(runGit, { remote, branch });
153
+ const tip = refetched.ok ? revParseVia(runGit, remoteRef(remote, branch)) : null;
154
+ if (tip && tip !== sha && !isAncestorVia(runGit, tip, sha)) outcome = 'rejected';
155
+ }
156
+ return {
157
+ outcome,
158
+ status: res.status,
159
+ stdout: String(res.stdout || '').trim(),
160
+ stderr: String(res.stderr || '').trim(),
161
+ };
162
+ }
163
+
164
+ // §5 R-1/§6.3: origin/main is materialised as the local branch the train consumes. Only ever called
165
+ // on the diverged path — the two ancestor cases are decided before this.
166
+ function materializeOrigin(runGit, { remote, branch }) {
167
+ const tip = revParseVia(runGit, remoteRef(remote, branch));
168
+ if (!tip) {
169
+ throw landingError('origin_ref_missing', `cannot resolve ${remoteRef(remote, branch)} after fetching ${remote}/${branch}`, { remote, branch });
170
+ }
171
+ const res = runGit(['update-ref', originBranchRef(), tip]);
172
+ if (res.status !== 0) {
173
+ throw landingError('git_failed', `git update-ref ${originBranchRef()} ${tip} exited ${res.status}: ${String(res.stderr || '').trim()}`, { tip });
174
+ }
175
+ return tip;
176
+ }
177
+
178
+ // §5 R-2/R-5: a pull is a pure fast-forward of main and nothing else, through the SAME ref-move path
179
+ // the runner uses for a landing (`train.landTrain`: `git merge --ff-only` when the target is checked
180
+ // out, a CAS `update-ref` otherwise). LAND_ALLOW_MANUAL=1 is the ref guard's sanctioned fast-forward
181
+ // path (§7 E-1 rule (b)) — it still refuses a rewind, so this can never move main backwards.
182
+ function defaultMoveTarget(cwd, { target, to, from }) {
183
+ const train = require('./train');
184
+ const result = train.landTrain(cwd, target, to, from, { env: { LAND_ALLOW_MANUAL: '1' } });
185
+ return { sha: result.sha, via: result.via };
186
+ }
187
+
188
+ // --- WP-2 hook -----------------------------------------------------------------------------------
189
+
190
+ // §5 R-7 / §8 WP-2b: every move of main whose new tip differs from the running build schedules
191
+ // `bin/fleet-apply.js --local <to>` to wait for the restart guard's idle verdict, restart without
192
+ // force and confirm readyz. The SCHEDULER (and every refusal guard) lives in lib/fleet-update.js,
193
+ // which is the only place that knows how a box launches its own helper; this module only knows WHEN
194
+ // a move happened.
195
+ //
196
+ // `syncedRepoRoot` is the MAIN worktree of the repository the sync ran in (the git common dir's
197
+ // parent, resolved). fleet-update refuses to act unless it is the very repository that ships that
198
+ // fleet-apply.js, so a sync in a scratch/test repository can never restart a real CTM.
199
+ async function scheduleRestartAfterMove({ from, to, syncedRepoRoot = null }) {
200
+ if (!to || to === from) return { spawned: false, reason: 'no_move' };
201
+ const fleetUpdate = require('../fleet-update');
202
+ return fleetUpdate.scheduleLocalApply({ to, syncedRepoRoot });
203
+ }
204
+
205
+ // The main worktree of the repository whose common dir this is: `<top>/.git` for the main checkout,
206
+ // and the main checkout's `.git` for every linked worktree. Unreadable ⇒ `null`, which fleet-update
207
+ // reads as "not the repository I ship in" (never a spawn).
208
+ async function syncedRepoRootOf(common) {
209
+ if (!common) return null;
210
+ try {
211
+ return path.dirname(await fsp.realpath(common));
212
+ } catch (error) {
213
+ /* expected: an unreadable common dir means "cannot prove this is my own repository" — the
214
+ scheduler then refuses (reason `foreign_repo`) instead of spawning against a guess */
215
+ return null;
216
+ }
217
+ }
218
+
219
+ // §8 WP-2b: the restart is best-effort by contract — `land sync` already did the work that matters
220
+ // (main moved, or origin caught up), so a scheduler that throws is reported in the verdict, never
221
+ // turned into a failed sync.
222
+ async function scheduleRestartForTip({ from, to, common }) {
223
+ try {
224
+ return (await scheduleRestartAfterMove({ from, to, syncedRepoRoot: await syncedRepoRootOf(common) })) || null;
225
+ } catch (error) {
226
+ return { spawned: false, reason: `scheduler_error: ${error.message}` };
227
+ }
228
+ }
229
+
230
+ // --- the state machine (§6.3) --------------------------------------------------------------------
231
+
232
+ function publishOf(config) {
233
+ const publish = config && config.publish;
234
+ if (!publish) return null;
235
+ return {
236
+ remote: publish.remote || DEFAULT_REMOTE,
237
+ branch: publish.branch || DEFAULT_BRANCH,
238
+ maxRetrains: Number.isInteger(publish.maxRetrains) ? publish.maxRetrains : DEFAULT_MAX_RETRAINS,
239
+ };
240
+ }
241
+
242
+ function result(verdict, extra = {}) {
243
+ return { contract: CONTRACT, verdict, ...extra };
244
+ }
245
+
246
+ // Exit codes (§6.2): 0 ok · 1 typed refusal/failure. `in_sync`, `pulled`, `pushed` and `published`
247
+ // are the ok verdicts; everything else is a refusal the caller must read.
248
+ function exitCodeForVerdict(verdict) {
249
+ return verdict === 'in_sync' || verdict === 'pulled' || verdict === 'pushed' || verdict === 'published' ? 0 : 1;
250
+ }
251
+
252
+ // The full §6.3 machine.
253
+ //
254
+ // deps:
255
+ // cwd, common repository paths (common = the git common dir)
256
+ // config the VALIDATED landing config (`config.publish` present)
257
+ // pullOnly §6.2 `land sync --pull-only`: never merges and never pushes
258
+ // runGit(args, env) injected git runner (default: no-prompt git in `cwd`)
259
+ // moveTarget({to, from}) the CAS/ff ref move (default: train.landTrain with LAND_ALLOW_MANUAL)
260
+ // runTrain({tip, attempt}) enqueue the `kind:"sync"` train job; resolves to
261
+ // { jobId, state, reason, sync, waited } — `waited: false` means the
262
+ // caller only enqueued (the runner itself, which cannot block on its
263
+ // own queue).
264
+ async function syncOnce(deps) {
265
+ const publish = publishOf(deps.config);
266
+ if (!publish) {
267
+ throw landingError('sync_not_configured', `no landing.publish block in ${(deps.config && deps.config.configDir) || deps.cwd}/.ctm.json; land sync is off for this repository`, {
268
+ configDir: (deps.config && deps.config.configDir) || deps.cwd,
269
+ });
270
+ }
271
+ const runGit = deps.runGit || gitRunner(deps.cwd);
272
+ const moveTarget = deps.moveTarget || ((args) => defaultMoveTarget(deps.cwd, args));
273
+ const target = deps.config.target;
274
+ const { remote, branch, maxRetrains } = publish;
275
+ const pullOnly = Boolean(deps.pullOnly);
276
+ let retrains = 0;
277
+ const attempts = [];
278
+
279
+ for (;;) {
280
+ const fetched = fetchOrigin(runGit, { remote, branch });
281
+ writeSyncState(deps.common, { fetchedAt: new Date().toISOString() });
282
+ if (!fetched.ok) {
283
+ return result('publish_failed', {
284
+ remote, branch, attempts: retrains + 1,
285
+ error: { code: 'fetch_failed', message: fetched.stderr || `git fetch ${remote} ${branch} exited ${fetched.status}` },
286
+ stderr: fetched.stderr,
287
+ });
288
+ }
289
+ const originTip = revParseVia(runGit, remoteRef(remote, branch));
290
+ if (!originTip) {
291
+ return result('publish_failed', {
292
+ remote, branch, attempts: retrains + 1,
293
+ error: { code: 'origin_ref_missing', message: `cannot resolve ${remoteRef(remote, branch)} after fetching ${remote}/${branch}` },
294
+ });
295
+ }
296
+ const mainTip = revParseVia(runGit, targetRef(target));
297
+ if (!mainTip) {
298
+ return result('publish_failed', {
299
+ remote, branch, attempts: retrains + 1,
300
+ error: { code: 'target_missing', message: `${targetRef(target)} does not exist` },
301
+ });
302
+ }
303
+
304
+ // 2. already level with origin.
305
+ if (originTip === mainTip) return result('in_sync', { remote, branch, tip: mainTip, attempts: retrains + 1 });
306
+
307
+ // 4. local-only commits: publish them (a fast-forward push; nothing to pull and nothing to gate).
308
+ if (isAncestorVia(runGit, originTip, mainTip)) {
309
+ if (pullOnly) return result('ahead', { remote, branch, hint: 'land sync', attempts: retrains + 1 });
310
+ const push = pushMain(runGit, { remote, branch, sha: mainTip });
311
+ if (push.outcome === 'ok') return result('pushed', { remote, branch, tip: mainTip, attempts: retrains + 1 });
312
+ if (push.outcome === 'rejected') {
313
+ retrains += 1;
314
+ if (retrains > maxRetrains) return result('publish_contended', { remote, branch, attempts: retrains, stderr: push.stderr });
315
+ continue; // §5 R-4: origin moved between our fetch and our push — fetch again and redo step 1
316
+ }
317
+ return result('publish_failed', {
318
+ remote, branch, attempts: retrains + 1, stderr: push.stderr,
319
+ error: { code: 'push_failed', message: push.stderr || `git push ${remote} exited ${push.status}` },
320
+ });
321
+ }
322
+
323
+ // 3. behind-only: the origin tip is a commit some box's train gated, so it is a fast-forward —
324
+ // no train, no gate (§5 R-5 / D-4).
325
+ if (isAncestorVia(runGit, mainTip, originTip)) {
326
+ let moved;
327
+ try {
328
+ moved = moveTarget({ target, to: originTip, from: mainTip });
329
+ } catch (error) {
330
+ return result('publish_failed', {
331
+ remote, branch, attempts: retrains + 1, error: { code: error.code || 'git_failed', message: error.message },
332
+ });
333
+ }
334
+ // §8 WP-2b: main moved — this box converges onto the sha it just pulled.
335
+ const restart = await scheduleRestartForTip({ from: mainTip, to: moved.sha || originTip, common: deps.common });
336
+ return result('pulled', { remote, branch, tip: moved.sha || originTip, from: mainTip, restart, attempts: retrains + 1 });
337
+ }
338
+
339
+ // 5. diverged: only a true divergence builds a train.
340
+ if (pullOnly) return result('diverged', { remote, branch, hint: 'land sync', attempts: retrains + 1 });
341
+
342
+ let tip;
343
+ try {
344
+ tip = materializeOrigin(runGit, { remote, branch });
345
+ } catch (error) {
346
+ return result('publish_failed', {
347
+ remote, branch, attempts: retrains + 1, error: { code: error.code || 'git_failed', message: error.message },
348
+ });
349
+ }
350
+ let attempt = retrains + 1;
351
+ // The train job lands and then publishes itself (`finishSyncJob` writes `job.sync.verdict`). A
352
+ // rejected push makes that job write `retraining` + a `retryJobId`, which the CLI follows here —
353
+ // one train per attempt, bounded by `publish.maxRetrains` extra trains on the runner side.
354
+ let trained = await deps.runTrain({ tip, attempt });
355
+ for (;;) {
356
+ attempts.push({ attempt, jobId: trained.jobId, state: trained.state, verdict: trained.sync ? trained.sync.verdict : null });
357
+ if (trained.waited === false) {
358
+ // The runner enqueued its own train and cannot block on it: the push happens when that job
359
+ // lands (§5 R-9). One job per attempt, never a second one from here.
360
+ return result('publishing', { remote, branch, jobId: trained.jobId, attempts: attempt, attemptsDetail: attempts });
361
+ }
362
+ if (trained.state !== 'landed') {
363
+ const verdict = trained.state === 'blocked' || trained.reason === 'conflict' ? 'conflict' : 'gate_failed';
364
+ return result(verdict, { remote, branch, jobId: trained.jobId, reason: trained.reason, attempts: attempt, attemptsDetail: attempts });
365
+ }
366
+ const verdict = trained.sync ? trained.sync.verdict : null;
367
+ const stderr = (trained.sync && trained.sync.stderr) || '';
368
+ if (verdict === 'published' || verdict === 'pushed') {
369
+ // §8 WP-2b: the train that published also moved main — the runner recorded the restart
370
+ // outcome on the job (`finishSyncJob`), and the verdict carries it to the caller.
371
+ return result('published', {
372
+ remote, branch, jobId: trained.jobId, tip: (trained.sync && trained.sync.tip) || null,
373
+ restart: (trained.sync && trained.sync.restart) || null, attempts: attempt, attemptsDetail: attempts,
374
+ });
375
+ }
376
+ if (verdict === 'in_sync' || verdict === 'up_to_date') {
377
+ return result('in_sync', { remote, branch, jobId: trained.jobId, attempts: attempt, attemptsDetail: attempts });
378
+ }
379
+ if (verdict === 'publish_contended') {
380
+ return result('publish_contended', { remote, branch, jobId: trained.jobId, attempts: attempt, stderr, attemptsDetail: attempts });
381
+ }
382
+ if (verdict === 'publish_failed') {
383
+ return result('publish_failed', {
384
+ remote, branch, jobId: trained.jobId, attempts: attempt, stderr,
385
+ error: { code: 'push_failed', message: stderr || 'push failed' },
386
+ attemptsDetail: attempts,
387
+ });
388
+ }
389
+ if (verdict === 'retraining' && trained.sync.retryJobId) {
390
+ attempt += 1;
391
+ trained = await deps.followRetry(trained.sync.retryJobId);
392
+ continue;
393
+ }
394
+ // A landed sync job always carries a verdict; anything else means the runner died between the
395
+ // landing and the push — reported as a failure, never as a silent success.
396
+ return result('publish_failed', {
397
+ remote, branch, jobId: trained.jobId, attempts: attempt,
398
+ error: { code: 'sync_verdict_missing', message: 'the sync job landed but recorded no push verdict' },
399
+ });
400
+ }
401
+ }
402
+ }
403
+
404
+ // §6.2: `origin: { ahead, behind, fetchedAt, lastSync }` for `land status`. Read-only, and a
405
+ // repository without the publish block (or without the tracking ref) reports nulls rather than
406
+ // failing the status verb.
407
+ function originStatus({ runGit, target, config, common }) {
408
+ const publish = publishOf(config);
409
+ const state = readSyncState(common) || {};
410
+ const base = { ahead: null, behind: null, fetchedAt: state.fetchedAt || null, lastSync: state.lastSync || null };
411
+ if (!publish) return base;
412
+ const ref = remoteRef(publish.remote, publish.branch);
413
+ const mainTip = revParseVia(runGit, targetRef(target));
414
+ const originTip = revParseVia(runGit, ref);
415
+ if (!mainTip || !originTip) return { ...base, ahead: null, behind: null };
416
+ const res = runGit(['rev-list', '--left-right', '--count', `${mainTip}...${originTip}`]);
417
+ if (res.status !== 0) return base;
418
+ const [ahead, behind] = String(res.stdout).trim().split(/\s+/).map((value) => Number(value));
419
+ return {
420
+ ...base,
421
+ ahead: Number.isFinite(ahead) ? ahead : null,
422
+ behind: Number.isFinite(behind) ? behind : null,
423
+ };
424
+ }
425
+
426
+ module.exports = {
427
+ CONTRACT,
428
+ SYNC_STATE_FILE,
429
+ ORIGIN_BRANCH,
430
+ NO_PROMPT_ENV,
431
+ DEFAULT_REMOTE,
432
+ DEFAULT_BRANCH,
433
+ DEFAULT_MAX_RETRAINS,
434
+ noPromptEnv,
435
+ gitRunner,
436
+ remoteRef,
437
+ originBranchRef,
438
+ targetRef,
439
+ syncStatePath,
440
+ readSyncState,
441
+ writeSyncState,
442
+ recordSyncVerdict,
443
+ revParseVia,
444
+ isAncestorVia,
445
+ fetchOrigin,
446
+ classifyPush,
447
+ pushMain,
448
+ materializeOrigin,
449
+ defaultMoveTarget,
450
+ scheduleRestartAfterMove,
451
+ scheduleRestartForTip,
452
+ publishOf,
453
+ exitCodeForVerdict,
454
+ syncOnce,
455
+ originStatus,
456
+ };