create-walle 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/README.md +3 -1
  2. package/lib/release-schema.json +2 -2
  3. package/lib/runtime-closure-policy.json +8 -7
  4. package/package.json +1 -1
  5. package/template/coding-task-manager/api-prompts.js +45 -7
  6. package/template/coding-task-manager/bin/claude-hook.js +55 -1
  7. package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
  8. package/template/coding-task-manager/bin/land.js +2069 -0
  9. package/template/coding-task-manager/bin/memory-census.js +4 -2
  10. package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
  11. package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
  12. package/template/coding-task-manager/db.js +156 -32
  13. package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
  14. package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
  15. package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
  16. package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
  17. package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
  18. package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
  19. package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
  20. package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
  21. package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
  22. package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
  23. package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
  24. package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
  25. package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
  26. package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
  27. package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
  28. package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
  29. package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
  30. package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
  31. package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
  32. package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
  33. package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
  34. package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
  35. package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
  36. package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
  37. package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
  38. package/template/coding-task-manager/lib/agent-definitions.js +19 -0
  39. package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
  40. package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
  41. package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
  42. package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
  43. package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
  44. package/template/coding-task-manager/lib/agent-presets.js +84 -1
  45. package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
  46. package/template/coding-task-manager/lib/agent-version-service.js +74 -11
  47. package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
  48. package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
  49. package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
  50. package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
  51. package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
  52. package/template/coding-task-manager/lib/api/fleet.js +118 -0
  53. package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
  54. package/template/coding-task-manager/lib/api/ingress.js +9 -1
  55. package/template/coding-task-manager/lib/api/landing.js +403 -0
  56. package/template/coding-task-manager/lib/api/machines.js +691 -2
  57. package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
  58. package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
  59. package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
  60. package/template/coding-task-manager/lib/api/session-attach.js +623 -0
  61. package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
  62. package/template/coding-task-manager/lib/api/sessions.js +77 -51
  63. package/template/coding-task-manager/lib/api/setup-network.js +544 -16
  64. package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
  65. package/template/coding-task-manager/lib/api/setup.js +829 -10
  66. package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
  67. package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
  68. package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
  69. package/template/coding-task-manager/lib/auth-rules.js +292 -21
  70. package/template/coding-task-manager/lib/background-stop.js +369 -0
  71. package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
  72. package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
  73. package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
  74. package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
  75. package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
  76. package/template/coding-task-manager/lib/build-info.js +4 -2
  77. package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
  78. package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
  79. package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
  80. package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
  81. package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
  82. package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
  83. package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
  84. package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
  85. package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
  86. package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
  87. package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
  88. package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
  89. package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
  90. package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
  91. package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
  92. package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
  93. package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
  94. package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
  95. package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
  96. package/template/coding-task-manager/lib/conversation-sync.js +355 -0
  97. package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
  98. package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
  99. package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
  100. package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
  101. package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
  102. package/template/coding-task-manager/lib/db-domains.js +1 -0
  103. package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
  104. package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
  105. package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
  106. package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
  107. package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
  108. package/template/coding-task-manager/lib/feature-manifest.js +4 -0
  109. package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
  110. package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
  111. package/template/coding-task-manager/lib/fleet-hub.js +762 -0
  112. package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
  113. package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
  114. package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
  115. package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
  116. package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
  117. package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
  118. package/template/coding-task-manager/lib/fleet-update.js +798 -0
  119. package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
  120. package/template/coding-task-manager/lib/fs-watcher.js +58 -42
  121. package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
  122. package/template/coding-task-manager/lib/headless-term-service.js +84 -8
  123. package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
  124. package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
  125. package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
  126. package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
  127. package/template/coding-task-manager/lib/host-handoff.js +16 -19
  128. package/template/coding-task-manager/lib/host-stats.js +150 -3
  129. package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
  130. package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
  131. package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
  132. package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
  133. package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
  134. package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
  135. package/template/coding-task-manager/lib/hub-bridge.js +398 -0
  136. package/template/coding-task-manager/lib/idle-notify.js +491 -0
  137. package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
  138. package/template/coding-task-manager/lib/instance-manifest.js +5 -1
  139. package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
  140. package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
  141. package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
  142. package/template/coding-task-manager/lib/landing/config.js +536 -0
  143. package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
  144. package/template/coding-task-manager/lib/landing/gate.js +360 -0
  145. package/template/coding-task-manager/lib/landing/git.js +344 -0
  146. package/template/coding-task-manager/lib/landing/lease.js +247 -0
  147. package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
  148. package/template/coding-task-manager/lib/landing/proof.js +223 -0
  149. package/template/coding-task-manager/lib/landing/queue.js +998 -0
  150. package/template/coding-task-manager/lib/landing/radar.js +489 -0
  151. package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
  152. package/template/coding-task-manager/lib/landing/state.js +263 -0
  153. package/template/coding-task-manager/lib/landing/stop.js +49 -0
  154. package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
  155. package/template/coding-task-manager/lib/landing/sync.js +456 -0
  156. package/template/coding-task-manager/lib/landing/train.js +885 -0
  157. package/template/coding-task-manager/lib/landing/window.js +57 -0
  158. package/template/coding-task-manager/lib/launch-environment.js +121 -0
  159. package/template/coding-task-manager/lib/launch-model-override.js +36 -10
  160. package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
  161. package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
  162. package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
  163. package/template/coding-task-manager/lib/lead-model-options.js +160 -3
  164. package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
  165. package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
  166. package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
  167. package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
  168. package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
  169. package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
  170. package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
  171. package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
  172. package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
  173. package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
  174. package/template/coding-task-manager/lib/machine-registry.js +750 -5
  175. package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
  176. package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
  177. package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
  178. package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
  179. package/template/coding-task-manager/lib/memory-join.js +337 -0
  180. package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
  181. package/template/coding-task-manager/lib/memory-sync.js +565 -0
  182. package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
  183. package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
  184. package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
  185. package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
  186. package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
  187. package/template/coding-task-manager/lib/model-availability.js +727 -0
  188. package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
  189. package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
  190. package/template/coding-task-manager/lib/model-id-rule.js +19 -0
  191. package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
  192. package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
  193. package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
  194. package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
  195. package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
  196. package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
  197. package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
  198. package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
  199. package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
  200. package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
  201. package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
  202. package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
  203. package/template/coding-task-manager/lib/native-history-control.js +6 -4
  204. package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
  205. package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
  206. package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
  207. package/template/coding-task-manager/lib/opencode-cli.js +480 -0
  208. package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
  209. package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
  210. package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
  211. package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
  212. package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
  213. package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
  214. package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
  215. package/template/coding-task-manager/lib/perf-summary.js +7 -0
  216. package/template/coding-task-manager/lib/perf-tracker.js +63 -2
  217. package/template/coding-task-manager/lib/project-config.js +7 -0
  218. package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
  219. package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
  220. package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
  221. package/template/coding-task-manager/lib/read-pool-client.js +89 -2
  222. package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
  223. package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
  224. package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
  225. package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
  226. package/template/coding-task-manager/lib/relay-client.js +57 -3
  227. package/template/coding-task-manager/lib/relink-audit.js +34 -5
  228. package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
  229. package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
  230. package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
  231. package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
  232. package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
  233. package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
  234. package/template/coding-task-manager/lib/restart-guard.js +18 -6
  235. package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
  236. package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
  237. package/template/coding-task-manager/lib/resume-admission.js +17 -3
  238. package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
  239. package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
  240. package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
  241. package/template/coding-task-manager/lib/runtime-contract.js +3 -1
  242. package/template/coding-task-manager/lib/schema-indexes.js +1 -0
  243. package/template/coding-task-manager/lib/session-context-locator.js +742 -0
  244. package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
  245. package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
  246. package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
  247. package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
  248. package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
  249. package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
  250. package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
  251. package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
  252. package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
  253. package/template/coding-task-manager/lib/session-create/response.js +7 -7
  254. package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
  255. package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
  256. package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
  257. package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
  258. package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
  259. package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
  260. package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
  261. package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
  262. package/template/coding-task-manager/lib/session-empty.js +13 -10
  263. package/template/coding-task-manager/lib/session-host-manager.js +60 -0
  264. package/template/coding-task-manager/lib/session-jobs.js +3 -1
  265. package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
  266. package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
  267. package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
  268. package/template/coding-task-manager/lib/session-park.js +738 -0
  269. package/template/coding-task-manager/lib/session-path-grant.js +13 -4
  270. package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
  271. package/template/coding-task-manager/lib/session-transport.js +17 -0
  272. package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
  273. package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
  274. package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
  275. package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
  276. package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
  277. package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
  278. package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
  279. package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
  280. package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
  281. package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
  282. package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
  283. package/template/coding-task-manager/lib/submission-ack.js +90 -2
  284. package/template/coding-task-manager/lib/systemd-scope.js +115 -0
  285. package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
  286. package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
  287. package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
  288. package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
  289. package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
  290. package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
  291. package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
  292. package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
  293. package/template/coding-task-manager/lib/transcript-source.js +36 -4
  294. package/template/coding-task-manager/lib/transcript-store.js +9 -0
  295. package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
  296. package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
  297. package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
  298. package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
  299. package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
  300. package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
  301. package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
  302. package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
  303. package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
  304. package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
  305. package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
  306. package/template/coding-task-manager/lib/walle/turn.js +1 -1
  307. package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
  308. package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
  309. package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
  310. package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
  311. package/template/coding-task-manager/lib/walle-row-history.js +495 -0
  312. package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
  313. package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
  314. package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
  315. package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
  316. package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
  317. package/template/coding-task-manager/lib/ws/misc.js +1 -1
  318. package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
  319. package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
  320. package/template/coding-task-manager/oauth-proxy.js +112 -115
  321. package/template/coding-task-manager/package-lock.json +10 -94
  322. package/template/coding-task-manager/package.json +4 -3
  323. package/template/coding-task-manager/protocol/message-table.json +10 -0
  324. package/template/coding-task-manager/protocol/messages.js +10 -0
  325. package/template/coding-task-manager/protocol/ws-schema.json +20 -0
  326. package/template/coding-task-manager/protocol/ws-schema.md +2 -0
  327. package/template/coding-task-manager/public/css/app.css +170 -0
  328. package/template/coding-task-manager/public/css/walle-session.css +4 -0
  329. package/template/coding-task-manager/public/index.html +473 -243
  330. package/template/coding-task-manager/public/js/agent-command.js +86 -0
  331. package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
  332. package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
  333. package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
  334. package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
  335. package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
  336. package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
  337. package/template/coding-task-manager/public/js/background-work.js +196 -27
  338. package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
  339. package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
  340. package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
  341. package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
  342. package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
  343. package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
  344. package/template/coding-task-manager/public/js/document-review-links.js +9 -1
  345. package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
  346. package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
  347. package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
  348. package/template/coding-task-manager/public/js/message-renderer.js +4 -3
  349. package/template/coding-task-manager/public/js/model-picker.js +3 -1
  350. package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
  351. package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
  352. package/template/coding-task-manager/public/js/pasted-content.js +236 -0
  353. package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
  354. package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
  355. package/template/coding-task-manager/public/js/prompts.js +11 -10
  356. package/template/coding-task-manager/public/js/protocol.js +10 -0
  357. package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
  358. package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
  359. package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
  360. package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
  361. package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
  362. package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
  363. package/template/coding-task-manager/public/js/stream-view.js +6 -5
  364. package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
  365. package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
  366. package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
  367. package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
  368. package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
  369. package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
  370. package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
  371. package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
  372. package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
  373. package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
  374. package/template/coding-task-manager/public/js/walle.js +6 -0
  375. package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
  376. package/template/coding-task-manager/public/m/app.css +140 -0
  377. package/template/coding-task-manager/public/m/app.js +507 -68
  378. package/template/coding-task-manager/public/m/index.html +17 -0
  379. package/template/coding-task-manager/public/m/machines.js +838 -4
  380. package/template/coding-task-manager/public/m/private-api.js +31 -1
  381. package/template/coding-task-manager/public/usage.html +1 -0
  382. package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
  383. package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
  384. package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
  385. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
  386. package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
  387. package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
  388. package/template/coding-task-manager/server.js +1950 -11679
  389. package/template/coding-task-manager/session-integrity.js +64 -4
  390. package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
  391. package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
  392. package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
  393. package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
  394. package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
  395. package/template/coding-task-manager/workers/session-host-process.js +5 -5
  396. package/template/coding-task-manager/workers/watch-worker.js +105 -0
  397. package/template/coding-task-manager/workers/worktree-worker.js +168 -33
  398. package/template/ctm-relay/lib/protocol.js +14 -1
  399. package/template/package-lock.json +2 -2
  400. package/template/package.json +1 -1
  401. package/template/shared/backup-retention.js +82 -0
  402. package/template/shared/conversation-admission.js +2 -0
  403. package/template/shared/conversation-provenance.js +3 -7
  404. package/template/shared/conversation-storage-v2-contract.js +5 -0
  405. package/template/shared/linked-worktree.js +51 -0
  406. package/template/shared/macos-fda-target.js +57 -0
  407. package/template/shared/orphan-parents.js +55 -0
  408. package/template/shared/release-schema.json +2 -2
  409. package/template/shared/storage/contract.js +3 -0
  410. package/template/wall-e/adapters/imessage.js +12 -0
  411. package/template/wall-e/agent.js +71 -4
  412. package/template/wall-e/api-walle.js +21 -1
  413. package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
  414. package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
  415. package/template/wall-e/brain/brain-join.js +859 -0
  416. package/template/wall-e/brain/brain-sync-membership.js +20 -0
  417. package/template/wall-e/brain/brain-sync-store.js +131 -77
  418. package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
  419. package/template/wall-e/brain/brain-sync-v2.js +578 -0
  420. package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
  421. package/template/wall-e/brain/deterministic-id.js +51 -0
  422. package/template/wall-e/brain/memories.js +2 -2
  423. package/template/wall-e/brain/migrations.js +40 -6
  424. package/template/wall-e/brain/model-identity-migration.js +1 -1
  425. package/template/wall-e/brain/owner-call-whitelist.js +23 -7
  426. package/template/wall-e/brain/schema.js +45 -85
  427. package/template/wall-e/brain.js +171 -35
  428. package/template/wall-e/chat.js +3 -3
  429. package/template/wall-e/coding/agent-shell-env.js +7 -2
  430. package/template/wall-e/coding/prompt-bundle.js +66 -21
  431. package/template/wall-e/config/main-loop-exemptions.json +2 -2
  432. package/template/wall-e/http/admin-api.js +37 -0
  433. package/template/wall-e/http/gws-api.js +4 -0
  434. package/template/wall-e/http/helper-rules-api.js +7 -1
  435. package/template/wall-e/http/model-admin.js +8 -1
  436. package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
  437. package/template/wall-e/http/model-proxy-providers.js +174 -1
  438. package/template/wall-e/http/model-route-health.js +157 -0
  439. package/template/wall-e/http/sync-api.js +278 -464
  440. package/template/wall-e/jobs/job-runner.js +28 -1
  441. package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
  442. package/template/wall-e/lib/ctm-data-dir.js +26 -0
  443. package/template/wall-e/lib/derivation-home.js +147 -0
  444. package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
  445. package/template/wall-e/lib/helper-rules/grade.js +51 -8
  446. package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
  447. package/template/wall-e/lib/helper-rules/store.js +4 -2
  448. package/template/wall-e/lib/landing-mcp-tools.js +170 -0
  449. package/template/wall-e/lib/mcp-client-config.js +133 -14
  450. package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
  451. package/template/wall-e/lib/mcp-integration.js +58 -13
  452. package/template/wall-e/lib/parent-death.js +7 -1
  453. package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
  454. package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
  455. package/template/wall-e/llm/delegate-vendor-default.js +12 -5
  456. package/template/wall-e/llm/model-roles.js +1 -1
  457. package/template/wall-e/llm/native-delegate-selection.js +56 -8
  458. package/template/wall-e/llm/worker-delegate-args.js +72 -7
  459. package/template/wall-e/llm/worker-mcp-routing.js +66 -17
  460. package/template/wall-e/loops/brain-custom-writes.js +19 -0
  461. package/template/wall-e/loops/ingest.js +17 -1
  462. package/template/wall-e/loops/think.js +19 -4
  463. package/template/wall-e/mcp-contract.js +222 -6
  464. package/template/wall-e/mcp-protocol-contract.js +40 -5
  465. package/template/wall-e/mcp-server.js +128 -29
  466. package/template/wall-e/mcp-worker-schemas.js +5 -5
  467. package/template/wall-e/memory/ctm-context-client.js +85 -0
  468. package/template/wall-e/memory/ctm-session-context.js +9 -3
  469. package/template/wall-e/memory/hub-bridge-client.js +388 -0
  470. package/template/wall-e/memory/replica-origin.js +56 -0
  471. package/template/wall-e/memory/session-pool.js +135 -0
  472. package/template/wall-e/runtime/live-capabilities.js +8 -3
  473. package/template/wall-e/server.js +4 -2
  474. package/template/wall-e/shared/release-schema.json +2 -2
  475. package/template/wall-e/shared/sqlite-file-set.js +39 -0
  476. package/template/wall-e/shared/storage/contract.js +3 -0
  477. package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
  478. package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
  479. package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
  480. package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
  481. package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
  482. package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
  483. package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
  484. package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
  485. package/template/wall-e/tools/chrome-automation.js +6 -0
  486. package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
  487. package/template/wall-e/workers/brain-owner-worker.js +18 -4
  488. package/template/wall-e/workers/mcp-gateway-process.js +5 -5
@@ -0,0 +1,563 @@
1
+ 'use strict';
2
+
3
+ // Landing-throughput WP-6 shard S10 (design doc §5 D-10 "move-only", §6 "Shard module
4
+ // seam"): the terminal-input-prepared cluster moves out of server.js VERBATIM into this
5
+ // module behind the same configure(deps) seam as lib/api/session-attach.js and
6
+ // lib/terminal-attach-geometry.js (S6), lib/walle-history-serve.js (S8) and
7
+ // lib/codex-rollout-history.js (S9). It registers NO route and NO socket handler: server.js
8
+ // keeps the two pass-through callers (handleInput, _executeTerminalInputPlan) as
9
+ // terminalInputPrepared._handleInputPrepared(...), plus this configure() seam.
10
+ // Bodies are identical to server.js's declarations except for the `_deps.` prefix on every
11
+ // identifier that used to resolve to a server.js top-level binding (D-10 rule 1), proven by
12
+ // `node bin/move-only-check.js`. No moved body contains an inline `require(...)`, so there
13
+ // is no require rebase here (unlike S1/S3/S6/S8).
14
+ //
15
+ // The module deliberately lives at lib/terminal-input-prepared.js and NOT under lib/ws/:
16
+ // _handleInputPrepared is the keystroke admission/prepare seam, not a ws-router handler.
17
+ //
18
+ // Injected deps, per function:
19
+ // _wakeDeferredOnInput: _lifecycleClientKind, _recordRuntimeInputOutcome,
20
+ // _scheduleDeferredRestoreStart, _sendWsJsonBounded, promptSubmissionContract
21
+ // _runtimeInputMetadataForDeferredMessage: agentSessionKernel
22
+ // _recordAcceptedInteractiveInputForAnalysis: _analysisWorkerCoordinator,
23
+ // _lastUserInteractiveInputAt (get/set pair -- the moved body WRITES it)
24
+ // _handleInputPrepared: CODEX_BULK_INPUT_REDRAW_COALESCE_MS,
25
+ // CODEX_BULK_INPUT_REDRAW_WINDOW_MS, CTM_CLASSIFY_TAIL_BOUND, INPUT_READY_GATE_ENABLED,
26
+ // STATUS_EVIDENCE, _approverState, _clearManualApprovalReview, _clearRestoreInterruption,
27
+ // _clearTerminalInputEchoSuppression, _codexComposerBulkInputData,
28
+ // _emitOwnerMismatchDiagnostic, _impliedView, _inputMayResolveWaiting,
29
+ // _isServerWaitingForInput, _markMeaningfulActivity, _markServerSessionTurnOpen,
30
+ // _markSessionUserPromptInput, _markTerminalNonResolvingInputEcho,
31
+ // _maybeHandoffPrimaryOnInteract, _ownerDecisionInvalidRequest, _ownerRecovery,
32
+ // _prepareRestoreReplaySuppressionForInput, _recordInputAbortKeyDiagnostic,
33
+ // _recordRuntimeInputAcceptedForSession, _recordRuntimeInputOutcome,
34
+ // _recordRuntimeInputResultForSession, _recordStatusEvidence, _resendBlockedByParkQueue,
35
+ // _resumePromptNavigationDigits, _runtimeAdapterForSession,
36
+ // _runtimeAgentSessionIdForSession, _runtimeInputBaseForSession, _sendWsJsonBounded,
37
+ // _serverRawTerminalInputDecision, _sessionOwnerDecision,
38
+ // _standupIsBlockingWaitingReason, _standupWaitingReason, _terminalInputEchoTextFromInput,
39
+ // _terminalProcessGeneration, _updateCodexComposerInputState, _writeInputWithEchoTracking,
40
+ // _writeLifecyclePty, agentSessionKernel, approvalAgent, approvalSelfAdapt,
41
+ // approverDebugRings, autoApprovalBuffers, dbModule, detectAgentType, emitHumanSubmit,
42
+ // enqueueDeferredInput, evaluateResumeGateInput, idleNotifyState, isPureMouseReportInput,
43
+ // promptSubmissionContract, recordSessionDiagnostic, remoteTerminalTarget, restoreRuntime,
44
+ // resumePolicyForAttempt, runtimeInputPhaseCache, sessionInputAuthority, sessions,
45
+ // shouldWakeDeferredOnRawInput, terminalFirstPromptInputMatches,
46
+ // terminalInputAdmissionFacts
47
+ //
48
+ // Mutable module state (D-10 rule 2 / S9 lesson 7): _lastUserInteractiveInputAt is the ONE
49
+ // server.js binding a moved body WRITES (_recordAcceptedInteractiveInputForAnalysis), so it
50
+ // is injected as a getter/setter pair (S3/S9 precedent, lib/api/session-messages.js) -- never
51
+ // a copy. _ownerRecovery is a server.js `let` reassigned once during boot (server.js:7907),
52
+ // so it is injected as a getter too. Every other dep is a by-value reference; calls between
53
+ // the four moved functions stay direct (no _deps.).
54
+ //
55
+ // One syntax-forced deviation from rule 1 (reported): `dbModule` appears twice as an
56
+ // object-literal SHORTHAND property inside _handleInputPrepared
57
+ // (`{ sessionId: msg.id, dbModule }`). `_deps.dbModule` cannot be written in shorthand
58
+ // position, so those two sites keep the bare identifier, resolved by the module-scope alias
59
+ // below (assigned by configure()). Expanding the shorthand to `dbModule: _deps.dbModule`
60
+ // instead would make move-only-check report `DIFF at ...properties[N].shorthand` (the AST
61
+ // comparison includes the shorthand flag) for a change that is not semantic. dbModule is a
62
+ // server.js `const` (never rebound), so the by-value alias is behaviour-identical.
63
+
64
+ let _deps = null;
65
+ let dbModule = null; // bare alias for the two shorthand sites above -- see the header note
66
+
67
+ function configure(deps = {}) {
68
+ _deps = deps;
69
+ dbModule = deps.dbModule;
70
+ }
71
+
72
+ // WP-1 (live-defer-wake-adopted-host-death-2026-10-28.html §5 R-1/R-2): the ONE deferred-wake
73
+ // block -- a raw keystroke on a session whose process died under an open tab (_restoreDeferred,
74
+ // ptyProcess null) schedules the revive and is answered with the existing
75
+ // session_resume_not_ready drop payload, exactly like the non-raw wake site below.
76
+ function _wakeDeferredOnInput(session, ws, msg) {
77
+ _deps._scheduleDeferredRestoreStart(session, { source: 'input', clientKind: _deps._lifecycleClientKind(ws, msg),
78
+ cols: msg.cols || session._ptyCols || 120, rows: msg.rows || session._ptyRows || 30,
79
+ terminalDimsMeasured: msg.terminalDimsMeasured === true,
80
+ });
81
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
82
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session_resume_not_ready'));
83
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'session_resume_not_ready');
84
+ }
85
+
86
+ function _runtimeInputMetadataForDeferredMessage(msg, source = 'composer') {
87
+ const clientMessageId = _deps.agentSessionKernel.normalizeClientMessageId(msg?.clientMessageId);
88
+ return clientMessageId ? {
89
+ clientMessageId,
90
+ source: String(msg?.source || source),
91
+ recordText: String(msg?.recordText !== undefined ? msg.recordText : msg?.data || ''),
92
+ } : {};
93
+ }
94
+
95
+ function _recordAcceptedInteractiveInputForAnalysis(now = Date.now()) {
96
+ _deps._lastUserInteractiveInputAt = now;
97
+ _deps._analysisWorkerCoordinator.recordAcceptedInput();
98
+ }
99
+
100
+ async function _handleInputPrepared(ws, msg, existingInput, options = {}) {
101
+ const recoveryBlock = _deps._ownerRecovery.rejectRequest(ws, msg); if (recoveryBlock) return recoveryBlock;
102
+ const initialTargetRefusal = _deps.remoteTerminalTarget.terminalInputRefusal(options);
103
+ if (initialTargetRefusal) return initialTargetRefusal;
104
+ let session = _deps.sessions.get(msg.id);
105
+ if (session) {
106
+ // D-3: a keystroke for a session this socket is not viewing is a client bug -- implied-view
107
+ // it (see _impliedView) so frames start flowing, but never refuse the keystroke on this
108
+ // account (that is WP-2's admission concern, unchanged here).
109
+ if (ws && options.trustedInternal !== true) _deps._impliedView(ws, msg.id, 'input');
110
+ const rawTerminalInput = options.trustedInternal !== true;
111
+ const ownerDecision = _deps._sessionOwnerDecision(msg.id);
112
+ if (!ownerDecision.ok) {
113
+ if (_deps._ownerDecisionInvalidRequest(ownerDecision)) return;
114
+ _deps._emitOwnerMismatchDiagnostic(ownerDecision);
115
+ }
116
+ // User-input priority: mark the session as human-driven so the auto-approver backs off
117
+ // (its y/Enter/backspace must not interleave with the user's arrow navigation at a prompt).
118
+ _deps.approvalAgent.markUserActive(msg.id); if (rawTerminalInput && options.authenticatedRemote !== true && String(msg.data).includes('\r')) _deps.emitHumanSubmit(msg.id); // WP-5 D-13: an Enter keystroke is a human submit
119
+ if (session._resumeBlocked && !rawTerminalInput) {
120
+ if (ws?.readyState === 1) {
121
+ _deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload({
122
+ id: session.id,
123
+ clientMessageId: _deps.agentSessionKernel.normalizeClientMessageId(msg?.clientMessageId),
124
+ }, 'session_resume_blocked'));
125
+ }
126
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'session_resume_blocked');
127
+ }
128
+ // Every WebSocket `input` message is a raw PTY attempt, including legacy messages that omit
129
+ // inputChannel. Only a server-internal caller can supply this out-of-band option; a message
130
+ // field must never grant a client a semantic-channel bypass.
131
+ const admissionMessage = options.authenticatedRemote === true
132
+ ? {
133
+ ...msg,
134
+ resumeGeneration: Number(session._launchPlanGeneration || 0),
135
+ processGeneration: _deps._terminalProcessGeneration(session),
136
+ }
137
+ : msg;
138
+ const terminalAdmissionFacts = _deps.terminalInputAdmissionFacts(
139
+ session, { ...admissionMessage, inputChannel: rawTerminalInput ? 'terminal' : msg.inputChannel },
140
+ _deps._terminalProcessGeneration,
141
+ );
142
+ const rawDecision = rawTerminalInput
143
+ ? _deps._serverRawTerminalInputDecision(session, ws, options, msg)
144
+ : null;
145
+ const terminalAdmission = rawTerminalInput
146
+ ? (rawDecision.allowed
147
+ ? { outcome: 'allowed', allowed: true, reason: 'route_live', complete: true, advisory: [] }
148
+ : {
149
+ outcome: 'rejected', allowed: false,
150
+ reason: rawDecision.reason.replaceAll('-', '_'),
151
+ complete: true, advisory: [],
152
+ })
153
+ : _deps.sessionInputAuthority.admit(session.id, ws, terminalAdmissionFacts);
154
+ // C-1: a granted-but-stale lease no longer holds the keystroke -- re-seed the owner instead.
155
+ // Item B: only reseed on an actually-admitted keystroke -- a rejected admission carries no
156
+ // baseline-stale advisory of its own worth re-arming a reprojection for.
157
+ if (terminalAdmission.outcome === 'rejected') {
158
+ // WP-1 (R-1): a raw keystroke to a deferred session wakes it instead of being refused
159
+ // pty_unavailable -- the raw refusal below would otherwise return before the wake. Only a
160
+ // genuine pty_unavailable rejection on a writable socket wakes (a read-only secondary
161
+ // viewer's keystroke must never respawn the session).
162
+ if (_deps.shouldWakeDeferredOnRawInput({
163
+ rawTerminalInput,
164
+ rejectionReason: terminalAdmission.reason,
165
+ readOnly: rawDecision?.readOnly === true,
166
+ restoreDeferred: session._restoreDeferred === true,
167
+ parking: !!session._parking,
168
+ })) return _wakeDeferredOnInput(session, ws, msg);
169
+ if (terminalAdmission.complete !== true) {
170
+ _deps.recordSessionDiagnostic(session.id, 'terminal-input-authority-incomplete', {
171
+ reason: terminalAdmission.reason,
172
+ socketGeneration: Number(ws?.socketGeneration || 0),
173
+ });
174
+ }
175
+ _deps.recordSessionDiagnostic(session.id, 'terminal-input-refused', {
176
+ reason: terminalAdmission.reason,
177
+ generation: Number(msg.resumeGeneration || 0),
178
+ processGeneration: Number(msg.processGeneration || 0),
179
+ expectedGeneration: Number(terminalAdmissionFacts.expectedResumeGeneration || 0),
180
+ expectedProcessGeneration: Number(terminalAdmissionFacts.expectedProcessGeneration || 0),
181
+ });
182
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
183
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, `terminal_input_${terminalAdmission.reason}`));
184
+ return _deps._recordRuntimeInputOutcome(
185
+ session, msg, 'refused', `terminal_input_${terminalAdmission.reason}`,
186
+ );
187
+ }
188
+ if (session._parking) {
189
+ if (rawTerminalInput) {
190
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
191
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'terminal_input_pty_unavailable'));
192
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'terminal_input_pty_unavailable');
193
+ }
194
+ _deps._markMeaningfulActivity(session, 'input', Date.now());
195
+ const inputGeneration = session._parkingInputGeneration
196
+ || Math.max(1, Number(session._terminalLifecycleCounter || 0) + 1);
197
+ session._parkingInputGeneration = inputGeneration;
198
+ session._lifecycleInputInFlight = true;
199
+ session._parkingInputQueue = _deps.enqueueDeferredInput(
200
+ session._parkingInputQueue,
201
+ msg.data,
202
+ inputGeneration,
203
+ _runtimeInputMetadataForDeferredMessage(msg),
204
+ );
205
+ if (!session._parkingSignalSent) session._parkingAbortRequested = true;
206
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'parked');
207
+ }
208
+ if (session._restoreDeferred) {
209
+ return _wakeDeferredOnInput(session, ws, msg);
210
+ }
211
+ const resumePolicy = _deps.resumePolicyForAttempt(session._resumeAttemptState);
212
+ const terminalHandoffReady = terminalAdmission.allowed && rawTerminalInput;
213
+ if (_deps.INPUT_READY_GATE_ENABLED
214
+ && !terminalHandoffReady
215
+ && ['prompt-navigation', 'blocked'].includes(resumePolicy.inputChannel)) {
216
+ const terminalFirstInput = resumePolicy.inputChannel === 'prompt-navigation'
217
+ && _deps.terminalFirstPromptInputMatches(
218
+ session._resumeAttemptState,
219
+ session._launchPlanGeneration,
220
+ msg,
221
+ );
222
+ const gateChannel = terminalFirstInput ? 'prompt-terminal' : resumePolicy.inputChannel;
223
+ const channel = resumePolicy.inputChannel === 'prompt-navigation' ? 'prompt-navigation' : 'readiness';
224
+ const gate = _deps.evaluateResumeGateInput(msg.data, {
225
+ channel: gateChannel,
226
+ digits: _deps._resumePromptNavigationDigits(session._resumeAttemptState),
227
+ });
228
+ if (gate.droppedMouse > 0) {
229
+ _deps.recordSessionDiagnostic(session.id, 'input-dropped-mouse', {
230
+ generation: Number(session._launchPlanGeneration || 0),
231
+ reports: gate.droppedMouse,
232
+ chars: String(msg.data || '').length - gate.data.length,
233
+ });
234
+ }
235
+ if (gate.droppedControl > 0) {
236
+ _deps.recordSessionDiagnostic(session.id, 'input-dropped-control', {
237
+ generation: Number(session._launchPlanGeneration || 0),
238
+ sequences: gate.droppedControl,
239
+ });
240
+ }
241
+ if (gate.action === 'drop') {
242
+ const reason = gate.droppedMouse > 0 ? 'resume_mouse_report' : 'resume_control_sequence';
243
+ _deps.recordSessionDiagnostic(session.id, 'resume-input-dropped', {
244
+ chars: String(msg.data || '').length,
245
+ reason,
246
+ generation: Number(session._launchPlanGeneration || 0),
247
+ });
248
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
249
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, reason));
250
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', reason);
251
+ }
252
+ if (gate.data !== String(msg.data || '')) msg = { ...msg, data: gate.data, recordText: gate.data };
253
+ if (gate.action === 'hold') {
254
+ _deps.recordSessionDiagnostic(session.id, 'terminal-input-refused', {
255
+ reason: channel,
256
+ generation: Number(session._launchPlanGeneration || 0),
257
+ phase: String(session._resumeAttemptState?.phase || ''),
258
+ chars: gate.data.length,
259
+ });
260
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
261
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session_resume_not_ready'));
262
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', channel);
263
+ }
264
+ }
265
+ if (!session.ptyProcess) {
266
+ if (session._resumeAttemptState && _deps.INPUT_READY_GATE_ENABLED) {
267
+ const gate = _deps.evaluateResumeGateInput(msg.data, { channel: 'blocked' });
268
+ if (gate.droppedMouse > 0) _deps.recordSessionDiagnostic(session.id, 'input-dropped-mouse', {
269
+ generation: Number(session._launchPlanGeneration || 0),
270
+ reports: gate.droppedMouse,
271
+ chars: String(msg.data || '').length - gate.data.length,
272
+ });
273
+ if (!gate.data) {
274
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
275
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'resume_mouse_report'));
276
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'resume_mouse_report');
277
+ }
278
+ if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
279
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'pty-missing'));
280
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'pty-missing');
281
+ }
282
+ _deps.recordSessionDiagnostic(session.id, 'input-dropped', {
283
+ reason: 'pty-missing',
284
+ chars: String(msg.data || '').length,
285
+ });
286
+ if (ws && ws.readyState === 1) {
287
+ _deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'pty-missing'));
288
+ }
289
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'pty-missing');
290
+ }
291
+ // Width arbitration (Phase 3): typing makes THIS client the active device —
292
+ // hand it the primary role (drive the PTY at its width, get the raw stream) if
293
+ // the current primary has gone idle, so the device you're using renders
294
+ // natively. No-op for single-viewer sessions and HTTP-route callers.
295
+ // Geometry ownership only affects viewport presentation. A failed best-effort handoff must
296
+ // never invalidate a raw byte already admitted on transport/route/PTY authority.
297
+ try { _deps._maybeHandoffPrimaryOnInteract(ws, msg.id); } catch {}
298
+ // Input dedup: macOS IME can cause the browser to send the same keystroke twice
299
+ // (keydown + composition path). Skip identical input within 10ms.
300
+ // Keep single printable characters out of dedup entirely: adjacent repeated
301
+ // letters such as the "ss" in "session" are real input even when browser
302
+ // scheduling compresses them into the same 10ms window.
303
+ const now = Date.now();
304
+ _deps._markMeaningfulActivity(session, 'input', now);
305
+ const inputData = String(msg.data || '');
306
+ let durableInputPhase = '';
307
+ const clientMessageId = _deps.agentSessionKernel.normalizeClientMessageId(msg.clientMessageId);
308
+ if (clientMessageId) {
309
+ const durableInputId = `web:${clientMessageId}`;
310
+ // WP-2 (D-16, S-4): a refused-but-never-queued earlier attempt kept no bytes -- this is a
311
+ // fresh one (unless it is still sitting in the park queue -- see _resendBlockedByParkQueue).
312
+ if (existingInput && existingInput.result === 'refused' && !_deps._resendBlockedByParkQueue(session, clientMessageId)) {
313
+ existingInput = null;
314
+ }
315
+ const existingResult = String(existingInput?.result || '');
316
+ const duplicatePhase = msg.commit === true
317
+ ? existingResult === 'delivered'
318
+ : !!existingInput;
319
+ if (duplicatePhase) {
320
+ const phase = existingResult === 'delivered'
321
+ ? 'delivered'
322
+ : existingResult === 'deferred'
323
+ ? 'held'
324
+ : existingResult === 'rejected' || existingResult === 'refused' || existingResult === 'dedup'
325
+ ? 'refused'
326
+ : 'accepted';
327
+ const ack = _deps.agentSessionKernel.recordCanonicalEvent(_deps.dbModule, msg.id, {
328
+ id: `input:${clientMessageId}:${phase}`, type: `input.${phase}`, role: 'event',
329
+ data: { clientMessageId, fidelity: msg.fidelity || 'pty', duplicate: true },
330
+ }, { adapter: _deps._runtimeAdapterForSession(session), agentSessionId: _deps._runtimeAgentSessionIdForSession(session) });
331
+ if (ack && ws && ws.readyState === 1) _deps._sendWsJsonBounded(ws, {
332
+ ...ack, type: 'stream-event', eventType: ack.type, ctmSessionId: msg.id,
333
+ data: { type: ack.type, ...(ack.data || {}), duplicate: true },
334
+ });
335
+ return { durableInputPhase: phase };
336
+ }
337
+ const runtimeInput = _deps._runtimeInputBaseForSession(msg.id, session, {
338
+ inputId: durableInputId,
339
+ source: 'composer', mode: 'inline', action: 'agent-web-input',
340
+ text: msg.commit === true ? '' : String(msg.recordText !== undefined ? msg.recordText : inputData),
341
+ attachments: Array.isArray(msg.attachments) ? msg.attachments : [],
342
+ metadata: { clientMessageId, fidelity: msg.fidelity || 'pty' },
343
+ appendUserInputEvent: msg.commit !== true,
344
+ });
345
+ const phase = msg.commit === true ? 'delivered' : 'accepted';
346
+ durableInputPhase = phase;
347
+ if (phase === 'accepted') _deps._recordRuntimeInputAcceptedForSession(msg.id, session, runtimeInput);
348
+ else _deps._recordRuntimeInputResultForSession(msg.id, session, runtimeInput, 'delivered', 'pty_commit');
349
+ const ack = _deps.agentSessionKernel.recordCanonicalEvent(_deps.dbModule, msg.id, {
350
+ id: `input:${clientMessageId}:${phase}`,
351
+ type: `input.${phase}`,
352
+ role: 'event',
353
+ data: { clientMessageId, fidelity: msg.fidelity || 'pty' },
354
+ }, { adapter: _deps._runtimeAdapterForSession(session), agentSessionId: _deps._runtimeAgentSessionIdForSession(session) });
355
+ if (ack && ws && ws.readyState === 1) {
356
+ _deps._sendWsJsonBounded(ws, { ...ack, type: 'stream-event', eventType: ack.type, ctmSessionId: msg.id,
357
+ data: { type: ack.type, ...(ack.data || {}) } });
358
+ }
359
+ }
360
+ const singlePrintableInput = inputData.length === 1 && inputData >= ' ' && inputData !== '\x7f';
361
+ if (!singlePrintableInput && !_deps.isPureMouseReportInput(inputData) && msg.data === session._lastInputData && (now - session._lastInputTs) < 10) {
362
+ // S-16 (WP-3): net-zero at the ceiling -- one diagnostic per session per 10s (sibling
363
+ // shape: the pty-missing site above pairs recordSessionDiagnostic with
364
+ // _recordRuntimeInputOutcome too), never per keystroke.
365
+ if (!session._lastInputDedupDiagAt || now - session._lastInputDedupDiagAt >= 10000) {
366
+ session._lastInputDedupDiagAt = now;
367
+ _deps.recordSessionDiagnostic(session.id, 'input-dropped', { reason: 'dedup', chars: inputData.length });
368
+ }
369
+ _deps._recordRuntimeInputOutcome(session, msg, 'dedup');
370
+ return { durableInputPhase };
371
+ }
372
+ const prevInputTs = session._lastInputTs || 0;
373
+ session._lastInputData = msg.data;
374
+ session._lastInputTs = now;
375
+ _recordAcceptedInteractiveInputForAnalysis(now);
376
+ _deps.restoreRuntime.markUserInput(session, now);
377
+ if (_deps.detectAgentType(session.cmd || '') === 'codex' && _deps._codexComposerBulkInputData(inputData)) {
378
+ session._codexComposerBulkInputUntil = now + _deps.CODEX_BULK_INPUT_REDRAW_COALESCE_MS;
379
+ session._codexComposerBulkInputRedrawUntil = now + _deps.CODEX_BULK_INPUT_REDRAW_WINDOW_MS;
380
+ }
381
+ _deps._updateCodexComposerInputState(session, msg.data, now);
382
+ const waitingBeforeInput = _deps._isServerWaitingForInput(msg.id, session);
383
+ const waitingReasonBeforeInput = _deps._standupWaitingReason(msg.id, session);
384
+ const promptDismissResetEligible = waitingBeforeInput && !_deps._standupIsBlockingWaitingReason(waitingReasonBeforeInput);
385
+ const inputEchoText = _deps._terminalInputEchoTextFromInput(inputData).trim();
386
+ const inputSubmitsPrompt = inputData.includes('\r') || inputData.includes('\n');
387
+ if (inputSubmitsPrompt || inputData.includes('\x03') || inputData.includes('\x04')) {
388
+ _deps._clearRestoreInterruption(session, now, inputSubmitsPrompt ? 'terminal-submit' : 'terminal-control');
389
+ }
390
+ if (inputSubmitsPrompt) {
391
+ _deps._markServerSessionTurnOpen(session, now, 'terminal-submit');
392
+ }
393
+ if (promptDismissResetEligible && inputEchoText) {
394
+ session._attentionPendingUserPromptAt = now;
395
+ }
396
+ const submittedPromptAfterDismissal = promptDismissResetEligible && inputSubmitsPrompt && (
397
+ !!inputEchoText ||
398
+ !!(session._attentionPendingUserPromptAt && (now - session._attentionPendingUserPromptAt) < 10 * 60 * 1000)
399
+ );
400
+ const suppression = _deps._prepareRestoreReplaySuppressionForInput(
401
+ session,
402
+ msg.id,
403
+ inputData,
404
+ {
405
+ write: _deps.remoteTerminalTarget.guardTargetWrite(
406
+ options.isTerminalTargetCurrent,
407
+ data => _deps._writeLifecyclePty(session, data, 'restore-suppressed-input'),
408
+ ),
409
+ isTerminalTargetCurrent: options.isTerminalTargetCurrent,
410
+ isTerminalAttemptCurrent: options.isTerminalAttemptCurrent,
411
+ metadata: _runtimeInputMetadataForDeferredMessage(msg),
412
+ },
413
+ );
414
+ const suppressionReady = suppression && typeof suppression.then === 'function'
415
+ ? await suppression
416
+ : suppression;
417
+ const postSuppressionRefusal = _deps.remoteTerminalTarget.terminalInputRefusal(options);
418
+ if (postSuppressionRefusal) return postSuppressionRefusal;
419
+ if (!suppressionReady) {
420
+ if (ws?.readyState === 1) {
421
+ _deps._sendWsJsonBounded(ws,
422
+ _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'restore_replay_suppression'));
423
+ }
424
+ return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'restore_replay_suppression');
425
+ }
426
+ const resolvesWaiting = _deps._inputMayResolveWaiting(msg.data, session);
427
+ // User evidence never changes a verdict (D-2); only a submit with echoed text opens a short
428
+ // probable turn, and an input that answers a wait releases the ledger's wait.
429
+ _deps._recordStatusEvidence(
430
+ session,
431
+ inputSubmitsPrompt
432
+ ? (inputEchoText ? _deps.STATUS_EVIDENCE.USER_SUBMIT : _deps.STATUS_EVIDENCE.USER_INPUT)
433
+ : ((inputData === '\x1b' || inputData.includes('\x03')) ? _deps.STATUS_EVIDENCE.USER_INTERRUPT : _deps.STATUS_EVIDENCE.USER_INPUT),
434
+ Date.now(), // R-11: stamped at record time; `now` predates the suppression await, so a wait raised meanwhile would outlive the keystroke
435
+ 'terminal-input',
436
+ resolvesWaiting ? { resolvesWait: true } : {},
437
+ );
438
+ if (resolvesWaiting) {
439
+ _deps._clearTerminalInputEchoSuppression(session);
440
+ session.lastActivity = now;
441
+ session._waitingForInput = false;
442
+ session._waitingForInputReason = '';
443
+ session._waitingForInputMessage = '';
444
+ session._waitingForInputAt = 0;
445
+ session._waitFieldsFromHook = false; // N-5
446
+ session._lastWaitingResolveInputAt = now;
447
+ session._lastNonResolvingWaitingInputAt = 0;
448
+ if (submittedPromptAfterDismissal) {
449
+ _deps._markSessionUserPromptInput(session, now, 'terminal-submit');
450
+ session._attentionPendingUserPromptAt = 0;
451
+ }
452
+ // The user picked a plan option (digit/Esc/Enter) — stop convergence so a
453
+ // pending re-probe can't re-broadcast the dismissed card.
454
+ if (typeof session._clearPlanDecisionPending === 'function') session._clearPlanDecisionPending('input-resolved');
455
+ } else {
456
+ _deps._markTerminalNonResolvingInputEcho(session, msg.data, now);
457
+ if (_deps._isServerWaitingForInput(msg.id, session)) {
458
+ session._lastNonResolvingWaitingInputAt = now;
459
+ }
460
+ }
461
+ const idleState = _deps.idleNotifyState.get(msg.id);
462
+ if (idleState && resolvesWaiting) {
463
+ idleState.notified = false;
464
+ idleState.reason = '';
465
+ idleState.notifiedAt = 0;
466
+ }
467
+ session._inputFrame = (session._inputFrame || 0) + 1;
468
+ let deferApproveAfterEscalation = false;
469
+ let deferInterruptSelfAdapt = false;
470
+
471
+ // Miss detection: if user manually types "1" or "2" while the approver is in
472
+ // 'watching' state (not reviewing/cooldown), it MIGHT mean the prompt was missed.
473
+ // But "1" and "2" appear all the time inside normal typing ("step 1...", "phase 2"),
474
+ // so we filter out mid-typing bursts. Only log when the keystroke looks SOLO:
475
+ // - more than 800ms since the previous keystroke (clean response, not in a flurry)
476
+ // - last VTerm snapshot is recent and shows no approval prompt
477
+ if ((msg.data === '1' || msg.data === '2') && _deps.autoApprovalBuffers.has(msg.id)) {
478
+ const isSoloKeystroke = (now - prevInputTs) > 800;
479
+ const buf = _deps.autoApprovalBuffers.get(msg.id);
480
+ if (isSoloKeystroke && buf && _deps._approverState(buf) === 'watching') {
481
+ const ring = _deps.approverDebugRings.get(msg.id) || [];
482
+ const lastSnap = ring[ring.length - 1];
483
+ if (lastSnap && !lastSnap.hasApproval && (now - lastSnap.ts) < 5000) {
484
+ console.log(`[shadow-approver:miss] User manually sent "${msg.data}" in session ${msg.id.slice(0, 8)} ` +
485
+ `— approver didn't detect prompt. Last screen: ${JSON.stringify(lastSnap.debugLines)}`);
486
+ }
487
+ // Self-adapt: user manually approved — if we had just escalated this
488
+ // session, record a positive signal so the maintenance loop / history
489
+ // scan can promote a narrow auto-approve rule for this class.
490
+ deferApproveAfterEscalation = true;
491
+ }
492
+ }
493
+
494
+ // Self-adapt: user interrupted (Ctrl-C) right after we auto-approved via a
495
+ // learned rule → retire that over-broad rule.
496
+ if (msg.data === '\x03' && _deps.autoApprovalBuffers.has(msg.id)) {
497
+ deferInterruptSelfAdapt = true;
498
+ }
499
+
500
+ const selfAdaptActions = [];
501
+ if (deferApproveAfterEscalation) {
502
+ selfAdaptActions.push(() => {
503
+ try {
504
+ const learned = _deps.approvalSelfAdapt.learnFromApproveAfterEscalation({ sessionId: msg.id, dbModule });
505
+ if (learned.action === 'rule_created') {
506
+ console.log(`[shadow-approver:self-adapt] learned auto-approve rule from approve-after-escalation in session ${msg.id.slice(0, 8)} (${learned.label || ''}, risk=${learned.riskLevel})`);
507
+ } else if (learned.action === 'signal_recorded') {
508
+ console.log(`[shadow-approver:self-adapt] recorded approve-after-escalation signal for session ${msg.id.slice(0, 8)} (${learned.reason || ''})`);
509
+ }
510
+ } catch (e) { console.error('[shadow-approver:self-adapt] approve-signal error:', e.message); }
511
+ });
512
+ }
513
+ if (deferInterruptSelfAdapt) {
514
+ selfAdaptActions.push(() => {
515
+ try {
516
+ const retired = _deps.approvalSelfAdapt.learnFromInterrupt({ sessionId: msg.id, dbModule });
517
+ if (retired.action === 'disabled') {
518
+ console.log(`[shadow-approver:self-adapt] retired learned rule ${retired.ruleId} after user interrupt in session ${msg.id.slice(0, 8)} (${retired.label || ''})`);
519
+ }
520
+ } catch (e) { console.error('[shadow-approver:self-adapt] interrupt-signal error:', e.message); }
521
+ });
522
+ }
523
+ _deps.runtimeInputPhaseCache.runInputSelfAdaptActions({
524
+ optimized: _deps.CTM_CLASSIFY_TAIL_BOUND,
525
+ actions: selfAdaptActions,
526
+ schedule: setImmediate,
527
+ });
528
+
529
+ // Attribution trail for turn-aborting control bytes (bare ESC / Ctrl-C) —
530
+ // see lib/turn-abort-key-detect.js. Cheap on every keystroke (two string
531
+ // equality checks) and only ever records for those two exact payloads,
532
+ // never for escape-prefixed sequences (arrows, mouse reports, bracketed
533
+ // paste) and never with the input text itself.
534
+ try { _deps._recordInputAbortKeyDiagnostic(session, msg.id, ws, inputData, now); } catch {}
535
+
536
+ // Only an input that passed every activation/resume/geometry gate may release
537
+ // the manual-review hold. Clearing it at function entry made a rejected key
538
+ // look like a provider decision and could strand the still-visible prompt.
539
+ _deps._clearManualApprovalReview(msg.id, 'terminal input accepted');
540
+ _deps.approvalAgent.clearSessionDedup(msg.id);
541
+ _deps._writeInputWithEchoTracking(session, msg.data, 'input', {
542
+ interactionId: msg.interactionId,
543
+ interactionStartedAt: msg.interactionStartedAt,
544
+ serverReceivedAt: Number(msg._typingWsReceivedAt || now),
545
+ clientId: ws?.clientId || '',
546
+ socketGeneration: Number(ws?.socketGeneration || 0),
547
+ agentType: msg.agentType || _deps.detectAgentType(session.cmd || ''),
548
+ });
549
+ return { durableInputPhase };
550
+ }
551
+ if (ws && ws.readyState === 1) {
552
+ _deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session-not-found'));
553
+ }
554
+ console.warn(`[input] dropped missing session id=${String(msg?.id || '').slice(0, 8)}`);
555
+ }
556
+
557
+ module.exports = {
558
+ configure,
559
+ _wakeDeferredOnInput,
560
+ _runtimeInputMetadataForDeferredMessage,
561
+ _recordAcceptedInteractiveInputForAnalysis,
562
+ _handleInputPrepared,
563
+ };