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
@@ -324,6 +324,7 @@
324
324
  return MR.stripImageAttachmentMetadata(text);
325
325
  }
326
326
 
327
+ const _userPromptMarkdown = (t) => (typeof PastedContent !== 'undefined' && PastedContent ? PastedContent.toMarkdown(String(t || '')) : String(t || '')); // D-6 (WP-2): a USER card's paste wrapper → a literal fenced `text` block; typed text around it still renders as markdown, assistant rows never call this
327
328
  function _appendReviewAttachmentsHtml(message) {
328
329
  const html = MR.renderImageAttachmentsHtml(message);
329
330
  return html ? html : '';
@@ -2524,9 +2525,9 @@
2524
2525
  const metaCard = MR.renderMetaCardHtml(m, i);
2525
2526
  if (metaCard) return metaCard;
2526
2527
  const time = m.timestamp ? new Date(m.timestamp).toLocaleString() : '';
2527
- const displayText = _messageTextForDisplay(m.text || '');
2528
+ const displayText = _messageTextForDisplay(m.role === 'user' ? _userPromptMarkdown(m.text || '') : (m.text || ''));
2528
2529
  const attachmentHtml = _appendReviewAttachmentsHtml(Object.assign({}, m, { text: m.text || '' }));
2529
- const textHtml = _formatDisplayTextHtml(m.text || '', attachmentHtml ? '<span class="msg-empty">(image attachment)</span>' : '');
2530
+ const textHtml = _formatDisplayTextHtml(m.role === 'user' ? _userPromptMarkdown(m.text || '') : (m.text || ''), attachmentHtml ? '<span class="msg-empty">(image attachment)</span>' : '');
2530
2531
  const hasRenderedText = !!String(textHtml || '').trim();
2531
2532
  const needsCollapse = displayText.length > 1500 || displayText.split('\n').length > 30;
2532
2533
  const stripped = displayText.replace(/\[Tool: [^\]]+\]/g, '').trim();
@@ -3624,7 +3625,7 @@
3624
3625
  div.className = 'review-msg user';
3625
3626
  if (evt.data?.parentUuid) div.dataset.parentUuid = evt.data.parentUuid;
3626
3627
  div.appendChild(_makeHeader('You', time, text));
3627
- if (!_appendTextWithExpand(div, text, evt.data || evt)) return null;
3628
+ if (!_appendTextWithExpand(div, _userPromptMarkdown(text), evt.data || evt)) return null;
3628
3629
  return div;
3629
3630
  }
3630
3631
 
@@ -580,7 +580,9 @@
580
580
  }
581
581
  }
582
582
  updateRoleValues();
583
- if (activeTab === tab) { renderList(); renderDetail(); position(anchor, popover); }
583
+ // renderActions(): an action whose label depends on the loaded answer (the OpenCode mode verdict)
584
+ // must repaint when the answer lands, not only on open()/switchTab().
585
+ if (activeTab === tab) { renderList(); renderDetail(); position(anchor, popover); renderActions(); }
584
586
  }, function(err) {
585
587
  if (closed || gen !== st.gen) return;
586
588
  st.loading = false;
@@ -39,11 +39,16 @@
39
39
  };
40
40
  const safeErrorText = (error) => {
41
41
  const status = Number(error?.status);
42
- const code = String(error?.code || '');
42
+ // WP-1b (§6/§8): the hub's forwarder answers a body code too, so the body is consulted when the
43
+ // error object itself carries none (the phone's api() names the parsed JSON `payload`/`body`).
44
+ const code = String(error?.code || error?.body?.code || '');
43
45
  // D-6 (§6e): the worker copy names the worker, never "child". Raw server text is never shown.
44
46
  const worker = state.source === 'worker';
45
47
  if (status === 409 || code === 'cursor_expired') return 'This transcript snapshot expired. Refresh to start a new snapshot.';
46
48
  if (status === 404 || code === 'child_not_found') return worker ? 'No transcript is recorded for this worker.' : 'This child transcript is no longer available.';
49
+ // WP-1b (AC-1d): a box-owned lead whose box is unreachable names the machine rather than the
50
+ // generic 503 copy — the box, not this hub, owns the transcript.
51
+ if (code === 'machine_unreachable') return `${error?.body?.machineName || 'The machine that owns this session'} is unreachable. Retry when ready.`;
47
52
  if (status === 503 || code === 'review_unavailable') return worker ? "This worker's transcript is currently unavailable. Retry when ready." : 'This child transcript is currently unavailable. Retry when ready.';
48
53
  if (code === 'source_missing') return 'This child transcript is no longer available.';
49
54
  if (code === 'private_scope_changed' || code.startsWith('owner_')) return 'Private access changed. Close this viewer and verify access before trying again.';
@@ -504,7 +509,15 @@
504
509
  if (legacyToken) headers.set('Authorization', `Bearer ${legacyToken}`);
505
510
  const path = worker ? workerEndpoint(leadId, cursor) : endpointFor(leadId, key, cursor);
506
511
  const response = await window.fetch(path, { method: 'GET', headers, signal });
507
- if (!response.ok) throw Object.assign(new Error('native transcript request failed'), { status: response.status, code: response.status === 409 ? 'cursor_expired' : 'native_review_http_error' });
512
+ if (!response.ok) {
513
+ // WP-1b (§8): keep the refusal body (a JSON content type is the only case that can carry
514
+ // one; anything else — an HTML error page, an empty 503 — degrades to a null body).
515
+ let body = null;
516
+ if (String(response.headers?.get?.('content-type') || '').toLowerCase().includes('json')) {
517
+ try { body = await response.json(); } catch { body = null; }
518
+ }
519
+ throw Object.assign(new Error('native transcript request failed'), { status: response.status, code: response.status === 409 ? 'cursor_expired' : (body?.code || 'native_review_http_error'), body });
520
+ }
508
521
  const page = await response.json();
509
522
  if (signal.aborted || !isCapturedAccessCurrent()) {
510
523
  throw Object.assign(new Error('access changed'), { code: 'private_scope_changed' });
@@ -0,0 +1,346 @@
1
+ 'use strict';
2
+
3
+ // S-43 (docs/deepseek-harness-acp-agent-2026-10-28.html §9): the New Session agent grid, extracted
4
+ // VERBATIM out of index.html's inline script — that file is at its file-size ceiling
5
+ // (lint/file-size.config.json) and WP-7 needs the offset. It carries the WP-7 additions:
6
+ //
7
+ // * the DeepSeek Harness card (agent id `dsh`, between `gemini:` and `shell:`), whose icon is the
8
+ // same brand mark the sidebar/tab rows use (providerIconSvg('dsh') → the DeepSeek whale);
9
+ // * OQ-4: a Model select shown only while the dsh card is chosen, listing the routes that serve
10
+ // `anthropic-messages` from the catalog the model pickers already load
11
+ // (the paged coding-catalog feed — its `providers[]` rows carry `upstream_apis`), defaulting to
12
+ // "Auto (DeepSeek on Portkey)" (no `routeAlias`, the server picks the OQ-4 default) and
13
+ // offering dsh's own key as the explicit opt-out;
14
+ // * D-15 (WP-13b): the card is disabled ONLY when the picked machine's own registry row says the
15
+ // box does not have the harness (`agentPresence.dsh === false`). Unknown (null / missing) leaves
16
+ // the card enabled — the box answers for itself, and the server refuses a forwarded dsh create
17
+ // with `machine_agent_not_installed` on an explicit "no";
18
+ // * WP-10 (C-6/D-16): the MCP server selector is ENABLED for dsh like every other agent — the
19
+ // session's profile is forwarded on `session/new`/`session/resume`.
20
+ //
21
+ // The card table and the availability helper are the index.html originals, unchanged except for the
22
+ // new dsh row; `providerIconSvg`, `_selectAgentCard` and `state` stay in the inline script and are
23
+ // reached through the global object (the repo's hoist-safe client-globals contract).
24
+ //
25
+ //@provides: NewSessionAgentGrid
26
+ //@needs: providerIconSvg, _selectAgentCard, _nsOnMcpProfileChange
27
+
28
+ (function (root) {
29
+ var DSH_AGENT = 'dsh';
30
+ var DSH_CARD_ID = 'dsh:';
31
+ var DEFAULT_OPTION_LABEL = 'Auto (DeepSeek on Portkey)';
32
+ var OWN_KEY_LABEL = "DeepSeek (dsh's own key)";
33
+ var ANTHROPIC_MESSAGES = 'anthropic-messages';
34
+
35
+ // Agent card definitions. The `agent` key drives providerIconSvg() so the
36
+ // card icon renders the SAME brand mark that appears in the session-list
37
+ // sidebar and tab header — agent identity is one visual vocabulary across
38
+ // the whole UI. Single-letter fallbacks ('$', '>') stay for `shell` and
39
+ // `custom`, which aren't LLM-branded surfaces.
40
+ var AGENT_DEFS = [
41
+ { id: 'claude:', name: 'Claude Code', sub: 'Anthropic', color: '#D97757', agent: 'claude', detect: 'claude' },
42
+ { id: 'codex:', name: 'Codex', sub: 'OpenAI', color: '#22c55e', agent: 'codex', detect: 'codex' },
43
+ { id: 'opencode:', name: 'OpenCode', sub: 'GLM 5.2', color: '#e0af68', agent: 'opencode', detect: 'opencode' },
44
+ { id: 'walle:', name: 'Wall-E', sub: 'Smart routing', color: '#f59e0b', agent: 'walle', detect: null },
45
+ { id: 'cursor:', name: 'Cursor', sub: 'Anysphere', color: '#111827', accent: '#7aa2f7', agent: 'cursor', detect: 'cursor-agent' },
46
+ { id: 'gemini:', name: 'Gemini CLI', sub: 'Google', color: '#3b82f6', agent: 'gemini', detect: 'gemini' },
47
+ // WP-7 (AC-7a): DeepSeek Harness sits between Gemini CLI and Shell. It is a conv-only ACP agent
48
+ // (no CLI surface), so it is never PATH-detected; WP-13b/D-15 gates it per MACHINE instead (a
49
+ // box whose own registry row says `agentPresence.dsh === false` greys the card out).
50
+ { id: 'dsh:', name: 'DeepSeek Harness', sub: 'DeepSeek', color: '#4D6BFE', agent: 'dsh', detect: null },
51
+ { id: 'shell:', name: 'Shell', sub: 'Terminal', color: '#6b7280', icon: '$', detect: null },
52
+ ];
53
+
54
+ var _agents = undefined; // last /api/models/available-agents payload (undefined = not loaded yet)
55
+ var _dshRoutesState = 'idle';
56
+ var _wrapped = false;
57
+
58
+ function _doc() {
59
+ return root && root.document ? root.document : null;
60
+ }
61
+
62
+ function _el(id) {
63
+ var doc = _doc();
64
+ return doc ? doc.getElementById(id) : null;
65
+ }
66
+
67
+ // D-15: a box is selected in the machine grid ('' = This Mac).
68
+ function _remoteMachineSelected() {
69
+ var hidden = _el('ns-machine');
70
+ return !!(hidden && String(hidden.value || '').trim());
71
+ }
72
+
73
+ // WP-13b: the picked machine's registry row. The new-session machine picker (js/core/session-commands.js)
74
+ // already fetches GET /api/machines and keeps the rows in its module state, so the card reads THAT
75
+ // cache — no second fetch, and the two views can never disagree about a box. The binding is a
76
+ // top-level `const` in a classic script, so it is reached by its bare name under a guarded typeof
77
+ // (a `const` is never a window property), and only from CALL time — never at module-eval time.
78
+ function _machineRows() {
79
+ try {
80
+ var picker = (typeof _nsMachineState !== 'undefined') ? _nsMachineState : null;
81
+ return picker && Array.isArray(picker.machines) ? picker.machines : [];
82
+ } catch (_) {
83
+ return []; // expected: the picker module is not on this page — no rows, no per-machine verdict
84
+ }
85
+ }
86
+
87
+ function _selectedMachineRow() {
88
+ var hidden = _el('ns-machine');
89
+ var id = hidden ? String(hidden.value || '').trim() : '';
90
+ if (!id) return null;
91
+ var rows = _machineRows();
92
+ for (var i = 0; i < rows.length; i += 1) {
93
+ if (rows[i] && String(rows[i].instanceId || '') === id) return rows[i];
94
+ }
95
+ return null;
96
+ }
97
+
98
+ function _selectedMachineName() {
99
+ var row = _selectedMachineRow();
100
+ if (!row) return 'this machine';
101
+ return String(row.displayName || row.url || row.instanceId || 'this machine');
102
+ }
103
+
104
+ // D-15 (WP-13b): dsh is disabled on a remote machine ONLY when that machine's own row says it does
105
+ // not have the harness. Unknown (null / no row / a hub that never read the box) keeps the card
106
+ // enabled and selectable: the box is then asked for itself, and its refusal is the authority (P3
107
+ // "Unknown != Dead" — the hub must never invent a "no").
108
+ function _dshMissingOnMachine(def) {
109
+ if (!def || def.agent !== DSH_AGENT) return false;
110
+ var row = _selectedMachineRow();
111
+ return !!(row && row.agentPresence && row.agentPresence.dsh === false);
112
+ }
113
+
114
+ function _selectedAgentId() {
115
+ var hidden = _el('ns-agent');
116
+ var value = (hidden && hidden.value) || 'claude:';
117
+ return String(value).replace(/:$/, '');
118
+ }
119
+
120
+ function agentAvailability(agents, detectKey) {
121
+ if (!detectKey) return { known: true, available: true, path: null };
122
+ if (!agents) return { known: false, available: true, path: null };
123
+ var detail = agents.agents && agents.agents[detectKey] ? agents.agents[detectKey] : agents[detectKey];
124
+ if (detail && typeof detail === 'object') {
125
+ return { known: true, available: detail.available !== false, path: detail.path || detail.realpath || null };
126
+ }
127
+ if (typeof detail === 'boolean') return { known: true, available: detail, path: null };
128
+ return { known: false, available: true, path: null };
129
+ }
130
+
131
+ function renderAgentCards(agents) {
132
+ var grid = _el('ns-agent-grid');
133
+ if (!grid) return;
134
+ var doc = _doc();
135
+ var hidden = _el('ns-agent');
136
+ var selected = (hidden && hidden.value) || 'claude:';
137
+ var remote = _remoteMachineSelected();
138
+ grid.innerHTML = '';
139
+ AGENT_DEFS.forEach(function(def) {
140
+ var availability = agentAvailability(agents, def.detect);
141
+ var available = availability.available;
142
+ // D-15 (WP-13b): per-machine, not per-remote. Only an explicit "the box does not have it"
143
+ // greys the dsh card out; a local card (no machine picked) is never touched by this rule.
144
+ var remoteBlocked = remote && _dshMissingOnMachine(def);
145
+ var card = doc.createElement('div');
146
+ card.className = 'ns-agent-card' + (available ? '' : ' not-detected') + (remoteBlocked ? ' not-available' : '');
147
+ card.style.setProperty('--ns-card-accent', def.accent || def.color);
148
+ card.dataset.value = def.id;
149
+ if (remoteBlocked) {
150
+ card.title = 'DeepSeek Harness is not installed on ' + _selectedMachineName();
151
+ card.setAttribute('aria-disabled', 'true');
152
+ card.onclick = function() { /* D-15: the hub refuses a forwarded dsh create with machine_agent_not_installed */ };
153
+ grid.appendChild(card);
154
+ card.innerHTML =
155
+ '<div class="ns-card-icon" style="background:' + def.color + ';color:#fff;">'
156
+ + root.providerIconSvg(def.agent, 22) + '</div>'
157
+ + '<div class="ns-card-name">' + def.name + '</div>'
158
+ + '<div class="ns-card-sub">not installed on this machine</div>';
159
+ return;
160
+ }
161
+ if (availability.path) card.title = def.name + ': ' + availability.path;
162
+ else if (availability.known && available === false) card.title = def.name + ' CLI not detected on PATH. You can still select it; launch will show the real terminal error if the command is unavailable.';
163
+ // Render a real brand icon when the agent maps to one (claude/codex/
164
+ // gemini/opencode/walle/dsh); otherwise the textual fallback ($, >) stays.
165
+ // Inline color forces the brand tint regardless of theme — these
166
+ // tiles always show on the dark agent-picker background, never on
167
+ // an active highlight, so we don't need the dark-on-light invert
168
+ // that the session-list .active rule applies via currentColor.
169
+ var iconHtml = def.agent
170
+ ? '<div class="ns-card-icon" style="background:' + def.color + ';color:#fff;">'
171
+ + root.providerIconSvg(def.agent, 22) + '</div>'
172
+ : '<div class="ns-card-icon" style="background:' + def.color + '">' + def.icon + '</div>';
173
+ card.innerHTML =
174
+ iconHtml +
175
+ '<div class="ns-card-name">' + def.name + '</div>' +
176
+ '<div class="ns-card-sub">' + def.sub + (available === false ? ' (not found)' : '') + '</div>';
177
+ card.onclick = function() { _select(def.id); };
178
+ grid.appendChild(card);
179
+ });
180
+ // A machine switch can retire the card that was selected; fall back to the default agent rather
181
+ // than leaving a disabled card selected. Keyed on the SAME per-machine rule as the card above.
182
+ if (remote && AGENT_DEFS.some(function(def) { return def.id === selected && _dshMissingOnMachine(def); })) {
183
+ selected = 'claude:';
184
+ if (hidden) hidden.value = selected;
185
+ }
186
+ _select(selected);
187
+ }
188
+
189
+ function _select(value) {
190
+ if (typeof root._selectAgentCard === 'function') root._selectAgentCard(value);
191
+ else _syncDshRows(value);
192
+ }
193
+
194
+ function _optionsHtml() {
195
+ var html = '<option value="">' + DEFAULT_OPTION_LABEL + '</option>';
196
+ (_dshRoutes().routes || []).forEach(function(route) {
197
+ var label = (route.portkey ? 'Portkey · ' : '') + route.name + (route.model ? ' — ' + route.model : '');
198
+ html += '<option value="' + _attr(JSON.stringify({ routeAlias: route.routeAlias, model: route.model || '' })) + '">'
199
+ + _esc(label) + '</option>';
200
+ });
201
+ html += '<option value="' + _attr(JSON.stringify({ routeAlias: 'dsh-own-key' })) + '">' + _esc(OWN_KEY_LABEL) + '</option>';
202
+ return html;
203
+ }
204
+
205
+ function _esc(text) {
206
+ return String(text == null ? '' : text)
207
+ .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
208
+ }
209
+
210
+ // The JSON payload lives in an HTML attribute-style value, so the quotes are entity-encoded above;
211
+ // the DOM decodes them back before `dshRoutePick` reads the value.
212
+ function _attr(text) {
213
+ return _esc(text);
214
+ }
215
+
216
+ function _dshRoutes() {
217
+ return _dshRoutesState && typeof _dshRoutesState === 'object' ? _dshRoutesState : { routes: [] };
218
+ }
219
+
220
+ // OQ-4: only routes whose upstream serves `anthropic-messages` can carry dsh. The catalog's
221
+ // providers[] rows carry `upstream_apis` (the same field lib/session-create/proxy-route-readiness.js
222
+ // reads server-side), and items[].routes[] pairs a provider with the wire model ids it serves.
223
+ function _buildRoutes(payload) {
224
+ var providers = (payload && Array.isArray(payload.providers)) ? payload.providers : [];
225
+ var items = (payload && Array.isArray(payload.items)) ? payload.items : [];
226
+ var byRoute = {};
227
+ items.forEach(function(item) {
228
+ (Array.isArray(item && item.routes) ? item.routes : []).forEach(function(route) {
229
+ if (!route || !route.provider_id) return;
230
+ var key = String(route.provider_id);
231
+ if (!byRoute[key]) byRoute[key] = [];
232
+ if (route.model_id) byRoute[key].push(String(route.model_id));
233
+ });
234
+ });
235
+ return providers.filter(function(p) {
236
+ if (!p || !p.id) return false;
237
+ if (p.routable === false) return false;
238
+ var apis = Array.isArray(p.upstream_apis) ? p.upstream_apis : null;
239
+ return !!apis && apis.indexOf(ANTHROPIC_MESSAGES) >= 0;
240
+ }).map(function(p) {
241
+ var models = byRoute[String(p.id)] || [];
242
+ var deepseek = models.filter(function(id) { return /deepseek/i.test(id); })[0];
243
+ return {
244
+ routeAlias: String(p.id),
245
+ name: String(p.name || p.display_name || p.id),
246
+ model: deepseek || models[0] || '',
247
+ portkey: /portkey/i.test(String(p.id)) || String(p.connection_kind || '') === 'portkey',
248
+ };
249
+ });
250
+ }
251
+
252
+ function _ensureDshModelRow() {
253
+ var row = _el('ns-dsh-model-row');
254
+ if (row) return row;
255
+ var hidden = _el('ns-agent');
256
+ var doc = _doc();
257
+ if (!hidden || !hidden.parentNode || !doc) return null;
258
+ row = doc.createElement('div');
259
+ row.id = 'ns-dsh-model-row';
260
+ row.style.cssText = 'margin-top:8px;display:none;';
261
+ row.innerHTML = '<label for="ns-dsh-model" style="font-size:13px;">Model</label>'
262
+ + '<select id="ns-dsh-model" style="font-size:13px;width:100%;">' + _optionsHtml() + '</select>'
263
+ + '<span id="ns-dsh-model-hint" style="font-size:11px;color:var(--fg-dim,#565f89);display:block;margin-top:4px;">'
264
+ + 'Routed through CTM\'s model proxy. The default route is chosen server-side (D-11).</span>';
265
+ hidden.parentNode.insertBefore(row, hidden.nextSibling);
266
+ return row;
267
+ }
268
+
269
+ function _loadDshRoutes() {
270
+ if (_dshRoutesState === 'loading' || (_dshRoutesState && typeof _dshRoutesState === 'object')) return;
271
+ _dshRoutesState = 'loading';
272
+ // G-3: the paged catalog must be read through the SHARED loader (fetchAllModelPages in
273
+ // public/js/app/models-paged-client.js) — never with a bare fetch of a paged route.
274
+ if (typeof root.fetchAllModelPages !== 'function') {
275
+ _dshRoutesState = { routes: [] };
276
+ return;
277
+ }
278
+ root.fetchAllModelPages('/api/models/coding-catalog', { restartOnInvalidToken: true }).then(function(payload) {
279
+ var routes = _buildRoutes(payload);
280
+ _dshRoutesState = { routes: routes };
281
+ // Re-render the option list now that the route feed has landed, preserving the pick.
282
+ var select = _el('ns-dsh-model');
283
+ if (select) {
284
+ var previous = select.value;
285
+ select.innerHTML = _optionsHtml();
286
+ select.value = previous;
287
+ }
288
+ }).catch(function() {
289
+ // A catalog-less server keeps the Auto + own-key options — never a dead select.
290
+ _dshRoutesState = { routes: [] };
291
+ });
292
+ }
293
+
294
+ function _syncDshRows(value) {
295
+ var agentId = String(value || '').replace(/:$/, '');
296
+ var row = _ensureDshModelRow();
297
+ if (row) row.style.display = agentId === DSH_AGENT ? '' : 'none';
298
+ // WP-10 step A: dsh now forwards the session's MCP servers (session/new carries the same profile
299
+ // a Claude session gets), so the MCP selector is a normal, enabled control for it — the D-16
300
+ // disabled state and its tooltip are gone.
301
+ if (agentId === DSH_AGENT) _loadDshRoutes();
302
+ }
303
+
304
+ // The create payload's `{routeAlias, model}` (null when the default "Auto" option is chosen).
305
+ function dshRoutePick() {
306
+ var select = _el('ns-dsh-model');
307
+ var raw = select ? String(select.value || '') : '';
308
+ if (!raw) return null;
309
+ try {
310
+ var parsed = JSON.parse(raw);
311
+ if (parsed && parsed.routeAlias) return parsed;
312
+ } catch (_) { /* expected: a non-JSON value is not a route pick */ }
313
+ return null;
314
+ }
315
+
316
+ // Called once per modal open, in place of the inline block it was extracted from.
317
+ function open() {
318
+ if (!_wrapped && typeof root._selectAgentCard === 'function') {
319
+ var original = root._selectAgentCard;
320
+ var wrapped = function(value) { original(value); _syncDshRows(value); };
321
+ wrapped.__nsGridSyncsDsh = true;
322
+ root._selectAgentCard = wrapped;
323
+ _wrapped = true;
324
+ }
325
+ renderAgentCards(_agents);
326
+ var token = (root.state && root.state.token) || '';
327
+ return fetch('/api/models/available-agents?token=' + encodeURIComponent(token))
328
+ .then(function(r) { return r.json(); })
329
+ .then(function(agents) { _agents = agents; renderAgentCards(agents); })
330
+ .catch(function() { _agents = null; renderAgentCards(null); });
331
+ }
332
+
333
+ // A machine switch re-renders the grid (the dsh card's D-15 state depends on it).
334
+ function refresh() {
335
+ renderAgentCards(_agents);
336
+ return true;
337
+ }
338
+
339
+ root.NewSessionAgentGrid = {
340
+ render: renderAgentCards,
341
+ refresh: refresh,
342
+ open: open,
343
+ dshRoutePick: dshRoutePick,
344
+ _agentDefs: AGENT_DEFS,
345
+ };
346
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -0,0 +1,236 @@
1
+ /**
2
+ * PastedContent — the single recogniser of Claude Code's paste wrapper.
3
+ *
4
+ * Design: docs/hub-viewed-box-conv-freshness-and-paste-render-2026-10-31.html
5
+ * §5 D-5 (one strict producer rule, no other file contains the literal
6
+ * `<pasted_content` outside tests and docs), D-6 (`toMarkdown`, user cards),
7
+ * D-7 (`unwrap`, terminal renderer + usage preview); §8 WP-1.
8
+ *
9
+ * Rule provenance: Claude Code's own wrapper, ported from martinus/wostuast
10
+ * PR #145 and verified on 97/97 real wrappers (§1d) — every real opener is a
11
+ * line that is exactly `<pasted_content id="hhhh">` with `hhhh` 4 lowercase
12
+ * hex, matched by a closer line with the same id. The 7 non-matching
13
+ * occurrences are lookalikes inside pasted code and stay typed text.
14
+ *
15
+ * Wrapper shape (all on line boundaries):
16
+ * [≤2 '\n'] <pasted_content id="hhhh"> '\n' <body> '\n' </pasted_content id="hhhh"> [≤2 '\n']
17
+ * The opener's trailing '\n', the closer's leading '\n', and up to 2 further
18
+ * '\n' on each side belong to the wrapper. The body is the text strictly
19
+ * between the opener's trailing '\n' and the closer's leading '\n' — blank
20
+ * lines and lookalike tags inside it are body text, verbatim.
21
+ *
22
+ * UMD: `module.exports = api` under Node, `window.PastedContent = api` in the
23
+ * browser (same wrapper shape as public/js/walle-message-contract.js:1-5).
24
+ */
25
+ (function(root, factory) {
26
+ var api = factory();
27
+ if (typeof module === 'object' && module.exports) module.exports = api;
28
+ if (root) root.PastedContent = api;
29
+ })(typeof window !== 'undefined' ? window : globalThis, function() {
30
+ 'use strict';
31
+
32
+ // A line that is EXACTLY the opener/closer tag, bounded by start-of-text or '\n' on the left
33
+ // and '\n' or end-of-text on the right. Not `/m` ^/$: JS multiline anchors also match next to
34
+ // '\r' (and U+2028/2029), which would accept a CRLF lookalike and leak '\r' into the body.
35
+ // Ids are exactly 4 lowercase hex chars.
36
+ var OPEN_LINE_RE = /(?<![^\n])<pasted_content id="([0-9a-f]{4})">(?![^\n])/g;
37
+ var CLOSE_LINE_RE = /(?<![^\n])<\/pasted_content id="([0-9a-f]{4})">(?![^\n])/g;
38
+
39
+ /** Consecutive '\n' immediately before `pos`, capped at 2. */
40
+ function newlinesBefore(s, pos) {
41
+ var k = 0;
42
+ while (k < 2 && pos - 1 - k >= 0 && s.charCodeAt(pos - 1 - k) === 10) k++;
43
+ return k;
44
+ }
45
+
46
+ /** Consecutive '\n' immediately after `pos`, capped at 2. */
47
+ function newlinesAfter(s, pos) {
48
+ var k = 0;
49
+ while (k < 2 && pos + k < s.length && s.charCodeAt(pos + k) === 10) k++;
50
+ return k;
51
+ }
52
+
53
+ /** Longest run of consecutive backticks anywhere in `str`. */
54
+ function longestBacktickRun(str) {
55
+ var best = 0;
56
+ var cur = 0;
57
+ for (var i = 0; i < str.length; i++) {
58
+ if (str.charCodeAt(i) === 96) {
59
+ cur++;
60
+ if (cur > best) best = cur;
61
+ } else {
62
+ cur = 0;
63
+ }
64
+ }
65
+ return best;
66
+ }
67
+
68
+ /** A fence long enough to contain any backtick run in `body`. */
69
+ function fenceFor(body) {
70
+ return '`'.repeat(Math.max(3, longestBacktickRun(body) + 1));
71
+ }
72
+
73
+ /**
74
+ * Split `text` into typed and paste segments.
75
+ *
76
+ * Linear: pass 1 collects closer line starts per id into ascending arrays;
77
+ * pass 2 walks the openers in order, using a per-id cursor into its closer
78
+ * array (advanced forward only, never rescanned) and skipping any opener
79
+ * that starts before the current scan cursor (so an opener inside a body is
80
+ * body text, not a new wrapper). No lazy `[\s\S]*?` body regex.
81
+ *
82
+ * @param {string} text raw user prompt text (null/undefined → '')
83
+ * @returns {Array<{kind:'typed'|'paste', text:string, id?:string}>}
84
+ * Empty typed segments are omitted; no input → []. Concatenating the
85
+ * segment texts plus the removed wrapper characters reproduces the input.
86
+ */
87
+ function segments(text) {
88
+ var s = text === null || text === undefined ? '' : String(text);
89
+ if (s === '') return [];
90
+
91
+ // Pass 1: closer line starts, per id, in ascending order.
92
+ var closers = Object.create(null);
93
+ var m;
94
+ CLOSE_LINE_RE.lastIndex = 0;
95
+ while ((m = CLOSE_LINE_RE.exec(s)) !== null) {
96
+ var cid = m[1];
97
+ if (!closers[cid]) closers[cid] = [];
98
+ closers[cid].push({ start: m.index, end: m.index + m[0].length });
99
+ }
100
+
101
+ // Pass 2: openers left to right; pair with the first later same-id closer.
102
+ var pairs = [];
103
+ var ptr = Object.create(null);
104
+ var cursor = 0; // scan resumes after each matched closer
105
+ OPEN_LINE_RE.lastIndex = 0;
106
+ while ((m = OPEN_LINE_RE.exec(s)) !== null) {
107
+ var oStart = m.index;
108
+ var oEnd = oStart + m[0].length;
109
+ if (oStart < cursor) continue; // inside a body already claimed
110
+ var id = m[1];
111
+ var list = closers[id];
112
+ if (!list) continue;
113
+ var i = ptr[id] || 0;
114
+ while (i < list.length && list[i].start <= oEnd) i++;
115
+ ptr[id] = i;
116
+ if (i >= list.length) continue;
117
+ var closer = list[i];
118
+ ptr[id] = i + 1;
119
+ cursor = closer.end;
120
+ pairs.push({
121
+ id: id,
122
+ openStart: oStart,
123
+ openEnd: oEnd,
124
+ closeStart: closer.start,
125
+ closeEnd: closer.end,
126
+ });
127
+ }
128
+
129
+ if (pairs.length === 0) return [{ kind: 'typed', text: s }];
130
+
131
+ // Removed wrapper spans: the tags, their owning '\n', and ≤2 further '\n'
132
+ // per side. Paste bodies are the text strictly between those.
133
+ var events = [];
134
+ for (var p = 0; p < pairs.length; p++) {
135
+ var pair = pairs[p];
136
+ var before = newlinesBefore(s, pair.openStart);
137
+ var after = newlinesAfter(s, pair.closeEnd);
138
+ events.push({ kind: 'removed', start: pair.openStart, end: pair.openEnd + 1 });
139
+ events.push({ kind: 'removed', start: pair.closeStart - 1, end: pair.closeEnd });
140
+ if (before > 0) events.push({ kind: 'removed', start: pair.openStart - before, end: pair.openStart });
141
+ if (after > 0) events.push({ kind: 'removed', start: pair.closeEnd, end: pair.closeEnd + after });
142
+ events.push({
143
+ kind: 'paste',
144
+ id: pair.id,
145
+ start: pair.openEnd + 1,
146
+ end: pair.closeStart - 1,
147
+ });
148
+ }
149
+ events.sort(function(a, b) {
150
+ if (a.start !== b.start) return a.start - b.start;
151
+ return a.kind === b.kind ? a.end - b.end : (a.kind === 'removed' ? -1 : 1);
152
+ });
153
+
154
+ var out = [];
155
+ var pos = 0;
156
+ for (var e = 0; e < events.length; e++) {
157
+ var ev = events[e];
158
+ if (ev.start < pos) {
159
+ // Overlap: two wrappers sharing owned newlines, or an empty body whose opener and closer
160
+ // removals touch. A removal still extends the consumed range; an empty paste emits nothing.
161
+ if (ev.kind === 'removed' && ev.end > pos) pos = ev.end;
162
+ continue;
163
+ }
164
+ if (ev.start > pos) out.push({ kind: 'typed', text: s.slice(pos, ev.start) });
165
+ if (ev.kind === 'paste') {
166
+ out.push({ kind: 'paste', text: s.slice(ev.start, ev.end), id: ev.id });
167
+ }
168
+ pos = ev.end;
169
+ }
170
+ if (pos < s.length) out.push({ kind: 'typed', text: s.slice(pos) });
171
+
172
+ var kept = [];
173
+ for (var k = 0; k < out.length; k++) {
174
+ if (out[k].kind === 'typed' && out[k].text === '') continue;
175
+ kept.push(out[k]);
176
+ }
177
+ return kept;
178
+ }
179
+
180
+ /**
181
+ * Body text only: the segments' texts joined with '\n\n'. D-7 (terminal
182
+ * renderer, usage preview). No wrapper → the input string unchanged.
183
+ */
184
+ function unwrap(text) {
185
+ var s = text === null || text === undefined ? '' : String(text);
186
+ var segs = segments(s);
187
+ if (segs.length <= 1 && (segs.length === 0 || segs[0].kind === 'typed')) return s;
188
+ return segs.map(function(seg) { return seg.text; }).join('\n\n');
189
+ }
190
+
191
+ /**
192
+ * Markdown for a USER card. D-6. Each paste becomes
193
+ * fence + 'text\n' + body + '\n' + fence
194
+ * with fence = '`'.repeat(max(3, longestBacktickRun(body) + 1)); typed
195
+ * segments pass through unchanged; segments join with '\n\n'. No wrapper →
196
+ * the input string unchanged.
197
+ */
198
+ function toMarkdown(text) {
199
+ var s = text === null || text === undefined ? '' : String(text);
200
+ var segs = segments(s);
201
+ if (segs.length <= 1 && (segs.length === 0 || segs[0].kind === 'typed')) return s;
202
+ return segs.map(function(seg) {
203
+ if (seg.kind === 'typed') return seg.text;
204
+ var fence = fenceFor(seg.text);
205
+ return fence + 'text\n' + seg.text + '\n' + fence;
206
+ }).join('\n\n');
207
+ }
208
+
209
+ /**
210
+ * Label text for a PREVIEW, which is a truncated prefix of the prompt: unwrap every complete
211
+ * wrapper, then drop one leading opener line whose closer was cut off by the truncation (after
212
+ * unwrap, a leading opener can only remain because its closer is missing).
213
+ */
214
+ function previewText(text) {
215
+ var s = unwrap(text);
216
+ var m = /^\s*<pasted_content id="[0-9a-f]{4}">(?:\n|$)/.exec(s);
217
+ return m ? s.slice(m[0].length) : s;
218
+ }
219
+
220
+ /** True when `text` contains at least one recognised wrapper pair. */
221
+ function hasWrapper(text) {
222
+ var segs = segments(text);
223
+ for (var i = 0; i < segs.length; i++) {
224
+ if (segs[i].kind === 'paste') return true;
225
+ }
226
+ return false;
227
+ }
228
+
229
+ return Object.freeze({
230
+ segments: segments,
231
+ unwrap: unwrap,
232
+ toMarkdown: toMarkdown,
233
+ hasWrapper: hasWrapper,
234
+ previewText: previewText,
235
+ });
236
+ });