@zergai/ztc 0.4.0-beta.1 → 0.5.0-beta.1

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 (718) hide show
  1. package/README.md +398 -45
  2. package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
  3. package/THIRD_PARTY_NOTICES.md +273 -12
  4. package/bin/zmux-darwin-arm64 +0 -0
  5. package/bin/ztc-audio-darwin-arm64 +0 -0
  6. package/bin/ztc-capture-darwin-arm64 +0 -0
  7. package/bin/ztc-computer-darwin-arm64 +0 -0
  8. package/bin/ztc-llm-darwin-arm64 +0 -0
  9. package/bin/ztc-tts-darwin-arm64 +0 -0
  10. package/bin/ztc-tui-darwin-arm64 +0 -0
  11. package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
  12. package/bin/zterm-darwin-arm64 +0 -0
  13. package/dist/App.js +1206 -209
  14. package/dist/agent/agent.d.ts +74 -8
  15. package/dist/agent/agent.js +1073 -184
  16. package/dist/agent/backends/account_rotation.d.ts +4 -0
  17. package/dist/agent/backends/account_rotation.js +8 -2
  18. package/dist/agent/backends/anthropic.d.ts +13 -0
  19. package/dist/agent/backends/anthropic.js +169 -28
  20. package/dist/agent/backends/claude_cli.js +18 -8
  21. package/dist/agent/backends/codex_app_server.d.ts +1 -0
  22. package/dist/agent/backends/codex_app_server.js +55 -3
  23. package/dist/agent/backends/codex_auth.d.ts +1 -0
  24. package/dist/agent/backends/codex_auth.js +67 -13
  25. package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
  26. package/dist/agent/backends/codex_buffered_recovery.js +293 -0
  27. package/dist/agent/backends/gemini.js +3 -1
  28. package/dist/agent/backends/http_error.d.ts +26 -0
  29. package/dist/agent/backends/http_error.js +221 -0
  30. package/dist/agent/backends/index.d.ts +9 -2
  31. package/dist/agent/backends/index.js +22 -2
  32. package/dist/agent/backends/openai.d.ts +0 -6
  33. package/dist/agent/backends/openai.js +5 -2
  34. package/dist/agent/backends/openai_compatible.d.ts +5 -4
  35. package/dist/agent/backends/openai_compatible.js +26 -19
  36. package/dist/agent/backends/openai_responses.d.ts +8 -3
  37. package/dist/agent/backends/openai_responses.js +77 -33
  38. package/dist/agent/backends/provider_ids.d.ts +1 -0
  39. package/dist/agent/backends/provider_ids.js +4 -0
  40. package/dist/agent/backends/request_metrics.js +12 -2
  41. package/dist/agent/backends/types.d.ts +109 -6
  42. package/dist/agent/backends/types.js +5 -1
  43. package/dist/agent/backends/zrouter_stream.d.ts +6 -1
  44. package/dist/agent/backends/zrouter_stream.js +160 -42
  45. package/dist/agent/background_registry.d.ts +2 -0
  46. package/dist/agent/background_registry.js +1 -0
  47. package/dist/agent/claim_observation.d.ts +6 -0
  48. package/dist/agent/claim_observation.js +54 -0
  49. package/dist/agent/commands/accounts.js +46 -177
  50. package/dist/agent/commands/attention.d.ts +2 -0
  51. package/dist/agent/commands/attention.js +67 -0
  52. package/dist/agent/commands/auth.js +18 -2
  53. package/dist/agent/commands/board.d.ts +2 -0
  54. package/dist/agent/commands/board.js +169 -0
  55. package/dist/agent/commands/clipboard.js +50 -1
  56. package/dist/agent/commands/compact.js +21 -13
  57. package/dist/agent/commands/config.js +4 -1
  58. package/dist/agent/commands/context.js +6 -1
  59. package/dist/agent/commands/desktop.d.ts +2 -0
  60. package/dist/agent/commands/desktop.js +29 -0
  61. package/dist/agent/commands/effort.js +14 -6
  62. package/dist/agent/commands/environment.d.ts +3 -0
  63. package/dist/agent/commands/environment.js +109 -0
  64. package/dist/agent/commands/evidence.d.ts +2 -0
  65. package/dist/agent/commands/evidence.js +9 -0
  66. package/dist/agent/commands/fork.js +4 -3
  67. package/dist/agent/commands/goal.d.ts +33 -1
  68. package/dist/agent/commands/goal.js +174 -14
  69. package/dist/agent/commands/goal_exit.d.ts +36 -0
  70. package/dist/agent/commands/goal_exit.js +120 -0
  71. package/dist/agent/commands/help.js +3 -1
  72. package/dist/agent/commands/history.js +3 -1
  73. package/dist/agent/commands/inbox.d.ts +2 -0
  74. package/dist/agent/commands/inbox.js +148 -0
  75. package/dist/agent/commands/index.js +16 -1
  76. package/dist/agent/commands/input_mode.js +8 -6
  77. package/dist/agent/commands/job.d.ts +2 -0
  78. package/dist/agent/commands/job.js +93 -0
  79. package/dist/agent/commands/keybindings.js +4 -1
  80. package/dist/agent/commands/label.d.ts +2 -0
  81. package/dist/agent/commands/label.js +77 -0
  82. package/dist/agent/commands/layout.d.ts +2 -0
  83. package/dist/agent/commands/layout.js +20 -0
  84. package/dist/agent/commands/mirror.js +16 -1
  85. package/dist/agent/commands/model.js +12 -2
  86. package/dist/agent/commands/permissions.d.ts +3 -1
  87. package/dist/agent/commands/permissions.js +79 -89
  88. package/dist/agent/commands/plan.js +5 -15
  89. package/dist/agent/commands/profile.js +21 -2
  90. package/dist/agent/commands/provider_selection.js +20 -1
  91. package/dist/agent/commands/rename.js +1 -1
  92. package/dist/agent/commands/resources.d.ts +2 -0
  93. package/dist/agent/commands/resources.js +67 -0
  94. package/dist/agent/commands/rewind.d.ts +3 -0
  95. package/dist/agent/commands/rewind.js +16 -0
  96. package/dist/agent/commands/runbooks.d.ts +2 -0
  97. package/dist/agent/commands/runbooks.js +73 -0
  98. package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
  99. package/dist/agent/commands/runbooks_lazy.js +8 -0
  100. package/dist/agent/commands/sessions.d.ts +1 -1
  101. package/dist/agent/commands/sessions.js +33 -5
  102. package/dist/agent/commands/settings.js +185 -39
  103. package/dist/agent/commands/setup.d.ts +2 -0
  104. package/dist/agent/commands/setup.js +78 -0
  105. package/dist/agent/commands/share.d.ts +2 -0
  106. package/dist/agent/commands/share.js +64 -0
  107. package/dist/agent/commands/status.js +14 -2
  108. package/dist/agent/commands/types.d.ts +99 -6
  109. package/dist/agent/commands/update.js +8 -0
  110. package/dist/agent/commands/usage.d.ts +2 -0
  111. package/dist/agent/commands/usage.js +8 -0
  112. package/dist/agent/factory.d.ts +11 -0
  113. package/dist/agent/factory.js +113 -88
  114. package/dist/agent/loop_policy.d.ts +6 -3
  115. package/dist/agent/loop_policy.js +12 -3
  116. package/dist/agent/measurement_guidance.d.ts +2 -0
  117. package/dist/agent/measurement_guidance.js +5 -0
  118. package/dist/agent/request_encoder.d.ts +8 -1
  119. package/dist/agent/request_encoder.js +95 -23
  120. package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
  121. package/dist/agent/runtime/benchmark_comparison.js +94 -0
  122. package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
  123. package/dist/agent/runtime/benchmark_contract.js +90 -0
  124. package/dist/agent/runtime/checked_commands.d.ts +32 -0
  125. package/dist/agent/runtime/checked_commands.js +119 -0
  126. package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
  127. package/dist/agent/runtime/command_execution_policy.js +91 -0
  128. package/dist/agent/runtime/command_jobs.d.ts +36 -18
  129. package/dist/agent/runtime/command_jobs.js +151 -13
  130. package/dist/agent/runtime/command_panes.d.ts +59 -0
  131. package/dist/agent/runtime/command_panes.js +398 -0
  132. package/dist/agent/runtime/command_wait.d.ts +19 -0
  133. package/dist/agent/runtime/command_wait.js +167 -0
  134. package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
  135. package/dist/agent/runtime/cpu_benchmark.js +126 -0
  136. package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
  137. package/dist/agent/runtime/delegated_evidence.js +80 -0
  138. package/dist/agent/runtime/evidence.d.ts +127 -0
  139. package/dist/agent/runtime/evidence.js +468 -0
  140. package/dist/agent/runtime/execution_context.d.ts +7 -0
  141. package/dist/agent/runtime/execution_context.js +39 -3
  142. package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
  143. package/dist/agent/runtime/json_verifier_recipe.js +66 -0
  144. package/dist/agent/runtime/measurements.d.ts +110 -0
  145. package/dist/agent/runtime/measurements.js +317 -0
  146. package/dist/agent/runtime/policy.d.ts +4 -0
  147. package/dist/agent/runtime/policy.js +31 -20
  148. package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
  149. package/dist/agent/runtime/provider_native_evidence.js +86 -0
  150. package/dist/agent/runtime/recovery.d.ts +2 -0
  151. package/dist/agent/runtime/recovery.js +45 -2
  152. package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
  153. package/dist/agent/runtime/remote_broker_transport.js +84 -0
  154. package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
  155. package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
  156. package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
  157. package/dist/agent/runtime/remote_journal_replay.js +233 -0
  158. package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
  159. package/dist/agent/runtime/remote_mutation_journal.js +208 -0
  160. package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
  161. package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
  162. package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
  163. package/dist/agent/runtime/remote_resource_errors.js +9 -0
  164. package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
  165. package/dist/agent/runtime/remote_resource_script.js +1009 -0
  166. package/dist/agent/runtime/remote_resources.d.ts +29 -0
  167. package/dist/agent/runtime/remote_resources.js +160 -0
  168. package/dist/agent/runtime/source_verification.d.ts +12 -0
  169. package/dist/agent/runtime/source_verification.js +210 -0
  170. package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
  171. package/dist/agent/runtime/source_verification_contract.js +203 -0
  172. package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
  173. package/dist/agent/runtime/tool_checkpoints.js +26 -0
  174. package/dist/agent/runtime/tool_effects.d.ts +5 -0
  175. package/dist/agent/runtime/tool_progress.d.ts +12 -0
  176. package/dist/agent/runtime/tool_progress.js +76 -0
  177. package/dist/agent/runtime/tool_runtime.d.ts +16 -1
  178. package/dist/agent/runtime/tool_runtime.js +204 -10
  179. package/dist/agent/runtime/tracing.d.ts +1 -1
  180. package/dist/agent/runtime/verifier_capture.d.ts +9 -0
  181. package/dist/agent/runtime/verifier_capture.js +100 -0
  182. package/dist/agent/runtime/verifier_contract.d.ts +24 -0
  183. package/dist/agent/runtime/verifier_contract.js +41 -0
  184. package/dist/agent/subagent.d.ts +20 -10
  185. package/dist/agent/subagent.js +266 -29
  186. package/dist/agent/tool_response_directory.d.ts +24 -0
  187. package/dist/agent/tool_response_directory.js +61 -0
  188. package/dist/agent/tool_response_source.d.ts +8 -0
  189. package/dist/agent/tool_response_source.js +49 -0
  190. package/dist/agent/tool_response_store.d.ts +75 -4
  191. package/dist/agent/tool_response_store.js +583 -64
  192. package/dist/agent/tools/ask_user.d.ts +3 -1
  193. package/dist/agent/tools/ask_user.js +30 -11
  194. package/dist/agent/tools/background.js +1 -0
  195. package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
  196. package/dist/agent/tools/benchmark_cpu.js +102 -0
  197. package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
  198. package/dist/agent/tools/compare_benchmarks.js +53 -0
  199. package/dist/agent/tools/deferred.js +1 -0
  200. package/dist/agent/tools/delegate.js +18 -2
  201. package/dist/agent/tools/helper_requirements.d.ts +7 -0
  202. package/dist/agent/tools/helper_requirements.js +19 -0
  203. package/dist/agent/tools/index.d.ts +1 -0
  204. package/dist/agent/tools/index.js +3 -0
  205. package/dist/agent/tools/measurement_report.d.ts +22 -0
  206. package/dist/agent/tools/measurement_report.js +190 -0
  207. package/dist/agent/tools/pane.d.ts +0 -7
  208. package/dist/agent/tools/pane.js +5 -4
  209. package/dist/agent/tools/project_context.d.ts +3 -0
  210. package/dist/agent/tools/project_context.js +45 -0
  211. package/dist/agent/tools/recall_tool_response.d.ts +3 -5
  212. package/dist/agent/tools/recall_tool_response.js +19 -29
  213. package/dist/agent/tools/registry.d.ts +1 -0
  214. package/dist/agent/tools/registry.js +23 -0
  215. package/dist/agent/tools/related_sessions.d.ts +2 -0
  216. package/dist/agent/tools/related_sessions.js +156 -0
  217. package/dist/agent/tools/routine.js +13 -3
  218. package/dist/agent/tools/session_evidence.d.ts +3 -0
  219. package/dist/agent/tools/session_evidence.js +72 -0
  220. package/dist/agent/tools/shell.d.ts +4 -3
  221. package/dist/agent/tools/shell.js +174 -47
  222. package/dist/agent/tools/tool_search.js +3 -2
  223. package/dist/agent/tools/types.d.ts +28 -0
  224. package/dist/agent/tools/verify_artifact.d.ts +2 -0
  225. package/dist/agent/tools/verify_artifact.js +60 -0
  226. package/dist/agent/tools/workflow.js +1 -0
  227. package/dist/app/activity.d.ts +6 -1
  228. package/dist/app/activity.js +81 -12
  229. package/dist/app/agent_runner.d.ts +6 -1
  230. package/dist/app/agent_runner.js +34 -19
  231. package/dist/app/command_context.js +106 -10
  232. package/dist/app/controller.d.ts +15 -4
  233. package/dist/app/controller.js +29 -3
  234. package/dist/app/escape_stop.d.ts +11 -0
  235. package/dist/app/escape_stop.js +15 -0
  236. package/dist/app/liveness.d.ts +6 -4
  237. package/dist/app/liveness.js +13 -3
  238. package/dist/app/model_catalog_cache.d.ts +5 -0
  239. package/dist/app/model_catalog_cache.js +138 -0
  240. package/dist/app/ordered_transcript.js +43 -4
  241. package/dist/app/prompt_turn.d.ts +14 -0
  242. package/dist/app/prompt_turn.js +53 -0
  243. package/dist/app/recap.d.ts +3 -0
  244. package/dist/app/recap.js +9 -3
  245. package/dist/app/restart.d.ts +3 -2
  246. package/dist/app/restart.js +22 -7
  247. package/dist/app/rewind.d.ts +3 -3
  248. package/dist/app/rewind.js +3 -3
  249. package/dist/app/selection_completion.d.ts +17 -2
  250. package/dist/app/selection_completion.js +84 -9
  251. package/dist/app/session_manager.d.ts +38 -6
  252. package/dist/app/session_manager.js +263 -60
  253. package/dist/app/session_messages.d.ts +3 -0
  254. package/dist/app/session_messages.js +60 -0
  255. package/dist/app/task_scope_router.d.ts +20 -0
  256. package/dist/app/task_scope_router.js +173 -0
  257. package/dist/app/transcript_window.d.ts +2 -0
  258. package/dist/app/transcript_window.js +4 -0
  259. package/dist/app/workspace_admission_details.d.ts +3 -0
  260. package/dist/app/workspace_admission_details.js +26 -0
  261. package/dist/app/workspace_layout_controller.d.ts +11 -0
  262. package/dist/app/workspace_layout_controller.js +88 -0
  263. package/dist/app/workspace_monitor.d.ts +1 -0
  264. package/dist/app/workspace_monitor.js +216 -0
  265. package/dist/app/workspace_presets.d.ts +29 -0
  266. package/dist/app/workspace_presets.js +192 -0
  267. package/dist/attention/queue.d.ts +37 -0
  268. package/dist/attention/queue.js +183 -0
  269. package/dist/bench/rf_shared.d.ts +2 -0
  270. package/dist/board/binding.d.ts +42 -0
  271. package/dist/board/binding.js +38 -0
  272. package/dist/board/client.d.ts +42 -0
  273. package/dist/board/client.js +60 -0
  274. package/dist/cli.js +1 -1
  275. package/dist/cli_args.js +19 -17
  276. package/dist/cli_main.js +110 -13
  277. package/dist/cli_ratatui.d.ts +183 -16
  278. package/dist/cli_ratatui.js +3989 -1255
  279. package/dist/components/ActivityLine.d.ts +3 -2
  280. package/dist/components/ActivityLine.js +2 -2
  281. package/dist/components/InputArea.d.ts +19 -1
  282. package/dist/components/InputArea.js +264 -190
  283. package/dist/components/MessageList.d.ts +2 -0
  284. package/dist/components/MessageList.js +3 -1
  285. package/dist/components/SingleMessage.d.ts +2 -0
  286. package/dist/components/SingleMessage.js +4 -2
  287. package/dist/components/StatusBar.d.ts +4 -2
  288. package/dist/components/StatusBar.js +3 -1
  289. package/dist/conductor_branch.js +3 -0
  290. package/dist/config/api_retry.d.ts +6 -1
  291. package/dist/config/api_retry.js +19 -1
  292. package/dist/config/defaults.d.ts +2 -1
  293. package/dist/config/defaults.js +9 -2
  294. package/dist/config/message_display.d.ts +1 -0
  295. package/dist/config/message_display.js +17 -2
  296. package/dist/config/permissions.d.ts +21 -0
  297. package/dist/config/permissions.js +89 -0
  298. package/dist/config/resolved.d.ts +2 -2
  299. package/dist/config/types.d.ts +32 -5
  300. package/dist/config.d.ts +38 -4
  301. package/dist/config.js +290 -42
  302. package/dist/context/project_intelligence.d.ts +44 -0
  303. package/dist/context/project_intelligence.js +246 -0
  304. package/dist/desktop/cli_launch.d.ts +8 -0
  305. package/dist/desktop/cli_launch.js +6 -0
  306. package/dist/desktop/cli_shim.d.ts +8 -0
  307. package/dist/desktop/cli_shim.js +120 -0
  308. package/dist/desktop/runtime.d.ts +16 -0
  309. package/dist/desktop/runtime.js +161 -0
  310. package/dist/desktop/worker_launch.d.ts +7 -0
  311. package/dist/desktop/worker_launch.js +7 -0
  312. package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
  313. package/dist/diagnostics/cargo_mutants_selection.js +48 -0
  314. package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
  315. package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
  316. package/dist/diagnostics/session_evidence_package.d.ts +40 -0
  317. package/dist/diagnostics/session_evidence_package.js +234 -0
  318. package/dist/diagnostics/session_export.d.ts +93 -0
  319. package/dist/diagnostics/session_export.js +634 -0
  320. package/dist/emulation/tool_adapters.js +48 -18
  321. package/dist/emulation/ztc_addendum.d.ts +1 -0
  322. package/dist/emulation/ztc_addendum.js +13 -12
  323. package/dist/environment/service_runner.d.ts +1 -0
  324. package/dist/environment/service_runner.js +68 -0
  325. package/dist/environment/store.d.ts +120 -0
  326. package/dist/environment/store.js +387 -0
  327. package/dist/events.d.ts +40 -1
  328. package/dist/events.js +10 -17
  329. package/dist/goal_contract.d.ts +25 -0
  330. package/dist/goal_contract.js +44 -0
  331. package/dist/headless.d.ts +31 -0
  332. package/dist/headless.js +578 -70
  333. package/dist/headless_cli.js +8 -0
  334. package/dist/headless_cli_args.d.ts +1 -0
  335. package/dist/headless_cli_args.js +1 -0
  336. package/dist/intake/cli.d.ts +1 -0
  337. package/dist/intake/cli.js +33 -0
  338. package/dist/intake/format.d.ts +2 -0
  339. package/dist/intake/format.js +14 -0
  340. package/dist/intake/notifications.d.ts +16 -0
  341. package/dist/intake/notifications.js +132 -0
  342. package/dist/intake/store.d.ts +56 -0
  343. package/dist/intake/store.js +238 -0
  344. package/dist/library.d.ts +8 -0
  345. package/dist/library.js +19 -10
  346. package/dist/mcp/client.d.ts +1 -0
  347. package/dist/mcp/client.js +20 -0
  348. package/dist/modes/builtin/plan.yaml +2 -2
  349. package/dist/modes/handlers.js +1 -1
  350. package/dist/onboarding/first_run.d.ts +3 -0
  351. package/dist/onboarding/first_run.js +33 -25
  352. package/dist/onboarding/setup.d.ts +32 -0
  353. package/dist/onboarding/setup.js +133 -0
  354. package/dist/onboarding/setup_agent_health.d.ts +17 -0
  355. package/dist/onboarding/setup_agent_health.js +79 -0
  356. package/dist/onboarding/setup_environment.d.ts +66 -0
  357. package/dist/onboarding/setup_environment.js +219 -0
  358. package/dist/onboarding/setup_workspace.d.ts +17 -0
  359. package/dist/onboarding/setup_workspace.js +129 -0
  360. package/dist/optimize/adapters/index.d.ts +4 -1
  361. package/dist/optimize/adapters/index.js +7 -0
  362. package/dist/optimize/adapters/kernelbench.js +14 -5
  363. package/dist/optimize/adapters/popcorn.js +3 -2
  364. package/dist/optimize/adapters/profile_benchmark.js +13 -7
  365. package/dist/optimize/adapters/rfbench.js +25 -14
  366. package/dist/optimize/adapters/types.d.ts +3 -0
  367. package/dist/optimize/adapters/zergpod.js +5 -2
  368. package/dist/optimize/baseline.js +10 -21
  369. package/dist/optimize/branch.js +9 -12
  370. package/dist/optimize/combine.js +2 -3
  371. package/dist/optimize/executor.js +34 -48
  372. package/dist/optimize/measurements.d.ts +55 -0
  373. package/dist/optimize/measurements.js +173 -0
  374. package/dist/optimize/results.d.ts +1 -0
  375. package/dist/optimize/results.js +11 -33
  376. package/dist/optimize/tge.js +2 -1
  377. package/dist/panes/initial_input.d.ts +19 -0
  378. package/dist/panes/initial_input.js +206 -0
  379. package/dist/panes/labels.d.ts +16 -0
  380. package/dist/panes/labels.js +42 -0
  381. package/dist/panes/model_catalog.d.ts +3 -3
  382. package/dist/panes/model_catalog.js +28 -4
  383. package/dist/panes/pane_registry.js +6 -2
  384. package/dist/panes/types.d.ts +3 -0
  385. package/dist/panes/ztc_launch.js +19 -0
  386. package/dist/plugin/optimization.d.ts +2 -0
  387. package/dist/plugin/optimization.js +1 -0
  388. package/dist/plugin/runtime.d.ts +2 -0
  389. package/dist/plugin/simulation.d.ts +6 -1
  390. package/dist/plugin/simulation_contract.d.ts +836 -1
  391. package/dist/plugin/simulation_documents.d.ts +22 -0
  392. package/dist/plugin/simulation_documents.js +1 -0
  393. package/dist/plugin/simulation_interventions.d.ts +103 -0
  394. package/dist/plugin/simulation_interventions.js +1 -0
  395. package/dist/plugin/simulation_living.d.ts +1 -0
  396. package/dist/plugin/simulation_living.js +3 -0
  397. package/dist/plugin/simulation_meetings.d.ts +121 -0
  398. package/dist/plugin/simulation_meetings.js +1 -0
  399. package/dist/plugin/simulation_story_review.d.ts +111 -0
  400. package/dist/plugin/simulation_story_review.js +1 -0
  401. package/dist/plugin/simulation_storyteller.d.ts +91 -0
  402. package/dist/plugin/simulation_storyteller.js +1 -0
  403. package/dist/plugin/simulation_structured.d.ts +2 -0
  404. package/dist/plugin/simulation_structured.js +2 -0
  405. package/dist/plugin/simulation_toolkit.d.ts +21 -0
  406. package/dist/plugin/simulation_toolkit.js +24 -0
  407. package/dist/prompts/tool_delegate_task.j2 +1 -1
  408. package/dist/remote-broker/Dockerfile +10 -0
  409. package/dist/remote-broker/archive.py +1227 -0
  410. package/dist/remote-broker/cutover.py +761 -0
  411. package/dist/remote-broker/requirements.txt +5 -0
  412. package/dist/remote-broker/resources.json +6 -0
  413. package/dist/remote-broker/resources.write-staging.example.json +18 -0
  414. package/dist/remote-broker/retained.py +686 -0
  415. package/dist/remote-broker/retained_cleanup.py +550 -0
  416. package/dist/remote-broker/server.py +648 -0
  417. package/dist/remote-broker/worker.py +1007 -0
  418. package/dist/router_auth.d.ts +31 -0
  419. package/dist/router_auth.js +155 -9
  420. package/dist/runbooks/catalog.d.ts +3 -0
  421. package/dist/runbooks/catalog.js +26 -0
  422. package/dist/runbooks/library.d.ts +11 -0
  423. package/dist/runbooks/library.js +95 -0
  424. package/dist/runbooks/package.d.ts +43 -0
  425. package/dist/runbooks/package.js +102 -0
  426. package/dist/session.d.ts +65 -13
  427. package/dist/session.js +548 -43
  428. package/dist/session_handoff.d.ts +25 -0
  429. package/dist/session_handoff.js +322 -0
  430. package/dist/session_handoff_contract.d.ts +89 -0
  431. package/dist/session_handoff_contract.js +179 -0
  432. package/dist/session_media.d.ts +41 -0
  433. package/dist/session_media.js +357 -0
  434. package/dist/session_ownership.d.ts +16 -0
  435. package/dist/session_ownership.js +221 -0
  436. package/dist/session_public.d.ts +10 -2
  437. package/dist/session_public.js +6 -1
  438. package/dist/simulation/dynamic_history.d.ts +42 -0
  439. package/dist/simulation/dynamic_history.js +173 -0
  440. package/dist/simulation/engines/swarm/pane_manager.js +7 -6
  441. package/dist/simulation/inference.d.ts +3 -1
  442. package/dist/simulation/inference.js +19 -1
  443. package/dist/simulation/intervention_generation.d.ts +27 -0
  444. package/dist/simulation/intervention_generation.js +246 -0
  445. package/dist/simulation/intervention_material.d.ts +4 -0
  446. package/dist/simulation/intervention_material.js +81 -0
  447. package/dist/simulation/living/context.d.ts +3130 -0
  448. package/dist/simulation/living/context.js +944 -0
  449. package/dist/simulation/living/definer.d.ts +12 -0
  450. package/dist/simulation/living/definer.js +223 -0
  451. package/dist/simulation/living/definition.d.ts +257 -0
  452. package/dist/simulation/living/definition.js +341 -0
  453. package/dist/simulation/living/frame.d.ts +259 -0
  454. package/dist/simulation/living/frame.js +223 -0
  455. package/dist/simulation/living/identifiers.d.ts +2 -0
  456. package/dist/simulation/living/identifiers.js +12 -0
  457. package/dist/simulation/living/index.d.ts +15 -0
  458. package/dist/simulation/living/index.js +15 -0
  459. package/dist/simulation/living/inference.d.ts +219 -0
  460. package/dist/simulation/living/inference.js +576 -0
  461. package/dist/simulation/living/mechanics.d.ts +54 -0
  462. package/dist/simulation/living/mechanics.js +588 -0
  463. package/dist/simulation/living/model-input.d.ts +25 -0
  464. package/dist/simulation/living/model-input.js +215 -0
  465. package/dist/simulation/living/open-world.d.ts +257 -0
  466. package/dist/simulation/living/open-world.js +102 -0
  467. package/dist/simulation/living/projection.d.ts +7 -0
  468. package/dist/simulation/living/projection.js +31 -0
  469. package/dist/simulation/living/recall.d.ts +17 -0
  470. package/dist/simulation/living/recall.js +25 -0
  471. package/dist/simulation/living/reduce.d.ts +15 -0
  472. package/dist/simulation/living/reduce.js +1853 -0
  473. package/dist/simulation/living/replay.d.ts +6 -0
  474. package/dist/simulation/living/replay.js +22 -0
  475. package/dist/simulation/living/runtime.d.ts +140 -0
  476. package/dist/simulation/living/runtime.js +3020 -0
  477. package/dist/simulation/living/shared-kinds.d.ts +24 -0
  478. package/dist/simulation/living/shared-kinds.js +96 -0
  479. package/dist/simulation/living/types.d.ts +2785 -0
  480. package/dist/simulation/living/types.js +669 -0
  481. package/dist/simulation/llm.d.ts +3 -1
  482. package/dist/simulation/llm.js +90 -30
  483. package/dist/simulation/memory/embedding.d.ts +1 -1
  484. package/dist/simulation/memory/embedding.js +9 -3
  485. package/dist/simulation/memory/filesystem.d.ts +2 -0
  486. package/dist/simulation/memory/filesystem.js +5 -1
  487. package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
  488. package/dist/simulation/memory/filesystem_file_tree.js +41 -10
  489. package/dist/simulation/memory/filesystem_invariants.js +1 -2
  490. package/dist/simulation/memory/filesystem_types.d.ts +1 -0
  491. package/dist/simulation/memory/memory.d.ts +2 -0
  492. package/dist/simulation/memory/memory.js +5 -1
  493. package/dist/simulation/orchestration/intent.js +0 -2
  494. package/dist/simulation/orchestration/lifecycle.js +0 -2
  495. package/dist/simulation/plugin_host.d.ts +25 -1
  496. package/dist/simulation/plugin_host.js +334 -17
  497. package/dist/simulation/session_documents.d.ts +20 -0
  498. package/dist/simulation/session_documents.js +62 -0
  499. package/dist/simulation/session_input_validation.d.ts +43 -0
  500. package/dist/simulation/session_input_validation.js +364 -0
  501. package/dist/simulation/session_inputs.d.ts +32 -0
  502. package/dist/simulation/session_inputs.js +154 -0
  503. package/dist/simulation/telemetry.d.ts +11 -14
  504. package/dist/simulation/telemetry.js +177 -54
  505. package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
  506. package/dist/simulation/toolkit/bounded_turns.js +80 -0
  507. package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
  508. package/dist/simulation/toolkit/dynamic_agents.js +218 -0
  509. package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
  510. package/dist/simulation/toolkit/dynamic_digest.js +8 -0
  511. package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
  512. package/dist/simulation/toolkit/dynamic_documents.js +71 -0
  513. package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
  514. package/dist/simulation/toolkit/dynamic_driver.js +269 -0
  515. package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
  516. package/dist/simulation/toolkit/dynamic_game.js +805 -0
  517. package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
  518. package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
  519. package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
  520. package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
  521. package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
  522. package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
  523. package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
  524. package/dist/simulation/toolkit/dynamic_progress.js +214 -0
  525. package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
  526. package/dist/simulation/toolkit/dynamic_projection.js +219 -0
  527. package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
  528. package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
  529. package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
  530. package/dist/simulation/toolkit/dynamic_state.js +1967 -0
  531. package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
  532. package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
  533. package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
  534. package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
  535. package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
  536. package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
  537. package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
  538. package/dist/simulation/toolkit/dynamic_world.js +377 -0
  539. package/dist/simulation/toolkit/structured_output.d.ts +5 -0
  540. package/dist/simulation/toolkit/structured_output.js +321 -0
  541. package/dist/simulation/types/world.d.ts +2 -0
  542. package/dist/simulation/world/artifact_store.js +1 -1
  543. package/dist/simulation/world/memory_manager.d.ts +5 -0
  544. package/dist/simulation/world/memory_manager.js +17 -2
  545. package/dist/simulation/world/state.d.ts +3 -2
  546. package/dist/simulation/world/state.js +15 -5
  547. package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
  548. package/dist/terminal_attach.d.ts +1 -0
  549. package/dist/terminal_attach.js +113 -0
  550. package/dist/tool_progress.d.ts +3 -0
  551. package/dist/tool_progress.js +27 -0
  552. package/dist/types.d.ts +145 -10
  553. package/dist/types.js +3 -0
  554. package/dist/ui/core/input.d.ts +3 -0
  555. package/dist/ui/core/input_segments.d.ts +18 -1
  556. package/dist/ui/core/input_segments.js +131 -47
  557. package/dist/ui/core/input_state.d.ts +12 -0
  558. package/dist/ui/core/layout_yoga.d.ts +1 -1
  559. package/dist/ui/core/turn_metadata.d.ts +5 -0
  560. package/dist/ui/core/turn_metadata.js +22 -0
  561. package/dist/ui/ink/render.d.ts +2 -1
  562. package/dist/ui/ink/render.js +6 -5
  563. package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
  564. package/dist/ui/ratatui/headless_pane_manager.js +293 -104
  565. package/dist/ui/ratatui/index.d.ts +1 -0
  566. package/dist/ui/ratatui/input.d.ts +4 -0
  567. package/dist/ui/ratatui/input.js +15 -0
  568. package/dist/ui/ratatui/ipc_path.d.ts +2 -0
  569. package/dist/ui/ratatui/ipc_path.js +29 -1
  570. package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
  571. package/dist/ui/ratatui/mux_persistence.js +139 -1
  572. package/dist/ui/ratatui/pane_relay.d.ts +1 -1
  573. package/dist/ui/ratatui/pane_relay.js +55 -27
  574. package/dist/ui/ratatui/process.d.ts +17 -1
  575. package/dist/ui/ratatui/process.js +80 -7
  576. package/dist/ui/ratatui/protocol.d.ts +236 -1
  577. package/dist/ui/ratatui/protocol.js +90 -0
  578. package/dist/ui/scrollback.d.ts +2 -1
  579. package/dist/ui/scrollback.js +9 -4
  580. package/dist/ui/stream_typewriter.d.ts +8 -3
  581. package/dist/ui/stream_typewriter.js +30 -1
  582. package/dist/ui/streaming_scrollback.d.ts +1 -0
  583. package/dist/ui/streaming_scrollback.js +1 -1
  584. package/dist/ui/transcript_render_cache.js +10 -0
  585. package/dist/ui/views/activity_line.d.ts +5 -3
  586. package/dist/ui/views/activity_line.js +65 -7
  587. package/dist/ui/views/app.d.ts +6 -3
  588. package/dist/ui/views/app.js +17 -6
  589. package/dist/ui/views/completion_menu.js +10 -5
  590. package/dist/ui/views/input_area.d.ts +7 -3
  591. package/dist/ui/views/input_area.js +15 -9
  592. package/dist/ui/views/message_list.d.ts +4 -1
  593. package/dist/ui/views/message_list.js +89 -19
  594. package/dist/ui/views/queue_panel.d.ts +3 -1
  595. package/dist/ui/views/queue_panel.js +9 -2
  596. package/dist/ui/views/status_bar.d.ts +4 -2
  597. package/dist/ui/views/status_bar.js +28 -13
  598. package/dist/ui/views/theme.d.ts +2 -0
  599. package/dist/ui/views/theme.js +2 -0
  600. package/dist/ui/widgets/color_panel.js +18 -0
  601. package/dist/ui/widgets/form.js +8 -0
  602. package/dist/ui/widgets/log_view.js +7 -0
  603. package/dist/ui/widgets/navigator_panel.js +8 -0
  604. package/dist/ui/widgets/prompt_viewer.js +2 -0
  605. package/dist/ui/widgets/questionnaire.d.ts +2 -0
  606. package/dist/ui/widgets/questionnaire.js +79 -16
  607. package/dist/ui/widgets/resume_panel.d.ts +2 -0
  608. package/dist/ui/widgets/resume_panel.js +26 -15
  609. package/dist/ui/widgets/rewind_panel.d.ts +2 -2
  610. package/dist/ui/widgets/rewind_panel.js +4 -2
  611. package/dist/ui/widgets/select.js +16 -27
  612. package/dist/ui/widgets/settings_panel.js +16 -0
  613. package/dist/ui/widgets/status_line_panel.d.ts +1 -0
  614. package/dist/ui/widgets/status_line_panel.js +30 -4
  615. package/dist/ui/widgets/text_input.d.ts +2 -0
  616. package/dist/ui/widgets/text_input.js +15 -1
  617. package/dist/ui/widgets/types.d.ts +2 -0
  618. package/dist/usage_projection.d.ts +24 -0
  619. package/dist/usage_projection.js +130 -0
  620. package/dist/usage_snapshot.d.ts +36 -0
  621. package/dist/usage_snapshot.js +131 -0
  622. package/dist/utils/assistant_message.d.ts +2 -0
  623. package/dist/utils/assistant_message.js +5 -0
  624. package/dist/utils/atomic_write.d.ts +6 -2
  625. package/dist/utils/atomic_write.js +29 -4
  626. package/dist/utils/checked_shell.d.ts +25 -0
  627. package/dist/utils/checked_shell.js +107 -0
  628. package/dist/utils/compaction.d.ts +4 -1
  629. package/dist/utils/compaction.js +31 -7
  630. package/dist/utils/context.d.ts +4 -4
  631. package/dist/utils/context.js +14 -12
  632. package/dist/utils/deepseek.d.ts +2 -2
  633. package/dist/utils/deepseek.js +13 -5
  634. package/dist/utils/ephemeral.js +4 -0
  635. package/dist/utils/ephemeral_tools.d.ts +18 -0
  636. package/dist/utils/ephemeral_tools.js +97 -0
  637. package/dist/utils/jev_client.d.ts +4 -0
  638. package/dist/utils/jev_client.js +15 -0
  639. package/dist/utils/model_cache.d.ts +15 -0
  640. package/dist/utils/model_cache.js +143 -0
  641. package/dist/utils/models.d.ts +4 -2
  642. package/dist/utils/models.js +12 -16
  643. package/dist/utils/reasoning.d.ts +8 -1
  644. package/dist/utils/reasoning.js +31 -11
  645. package/dist/utils/router_catalog.d.ts +49 -0
  646. package/dist/utils/router_catalog.js +271 -0
  647. package/dist/utils/sandbox.d.ts +9 -0
  648. package/dist/utils/sandbox.js +118 -15
  649. package/dist/utils/shell.d.ts +7 -0
  650. package/dist/utils/shell.js +98 -34
  651. package/dist/utils/subprocess_env.d.ts +3 -0
  652. package/dist/utils/subprocess_env.js +27 -1
  653. package/dist/web/accounts_mirror.d.ts +3 -1
  654. package/dist/web/accounts_mirror.js +13 -9
  655. package/dist/web/child_publication.d.ts +17 -0
  656. package/dist/web/child_publication.js +45 -0
  657. package/dist/web/mirror_authenticator.d.ts +31 -11
  658. package/dist/web/mirror_authenticator.js +67 -17
  659. package/dist/web/mirror_client.d.ts +31 -4
  660. package/dist/web/mirror_client.js +189 -23
  661. package/dist/web/mirror_stream.d.ts +84 -22
  662. package/dist/web/mirror_stream.js +676 -95
  663. package/dist/web/observer_query_redaction.d.ts +6 -0
  664. package/dist/web/observer_query_redaction.js +58 -0
  665. package/dist/web/pane_registry.d.ts +2 -0
  666. package/dist/web/pane_registry.js +86 -22
  667. package/dist/web/tool_image.d.ts +6 -0
  668. package/dist/web/tool_image.js +17 -0
  669. package/dist/web/view_plugin.d.ts +14 -0
  670. package/dist/web/view_plugin.js +23 -1
  671. package/dist/worker/executor.js +31 -12
  672. package/dist/worker/index.d.ts +1 -0
  673. package/dist/worker/toolsets.js +3 -1
  674. package/dist/worker/types.d.ts +12 -1
  675. package/dist/workflows/registry.js +1 -0
  676. package/dist/workflows/registry_handle.d.ts +2 -0
  677. package/dist/workflows/runtime.d.ts +2 -0
  678. package/dist/workflows/runtime.js +1 -0
  679. package/dist/workspace_agent.d.ts +7 -0
  680. package/dist/workspace_agent.js +36 -0
  681. package/dist/workspace_collision.d.ts +76 -0
  682. package/dist/workspace_collision.js +688 -0
  683. package/dist/workspace_layout.d.ts +18 -0
  684. package/dist/workspace_layout.js +121 -0
  685. package/dist/workspace_runtime.d.ts +44 -0
  686. package/dist/workspace_runtime.js +82 -0
  687. package/dist/workspace_session_context.d.ts +62 -0
  688. package/dist/workspace_session_context.js +160 -0
  689. package/dist/zlm-embed.mjs +32518 -9615
  690. package/dist/zlm.js +1 -0
  691. package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
  692. package/node_modules/@zerg/model-contracts/README.md +90 -0
  693. package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
  694. package/node_modules/@zerg/model-contracts/index.js +223 -0
  695. package/node_modules/@zerg/model-contracts/package.json +8 -0
  696. package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
  697. package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
  698. package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
  699. package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
  700. package/package.json +45 -24
  701. package/packages/model-contracts/LICENSE.md +375 -0
  702. package/packages/model-contracts/README.md +90 -0
  703. package/packages/model-contracts/index.d.ts +20 -0
  704. package/packages/model-contracts/index.js +223 -0
  705. package/packages/model-contracts/package.json +8 -0
  706. package/remote-broker/Dockerfile +10 -0
  707. package/remote-broker/README.md +308 -0
  708. package/remote-broker/archive.py +1227 -0
  709. package/remote-broker/cutover.py +761 -0
  710. package/remote-broker/requirements.txt +5 -0
  711. package/remote-broker/resources.example.json +6 -0
  712. package/remote-broker/resources.write-staging.example.json +18 -0
  713. package/remote-broker/retained.py +686 -0
  714. package/remote-broker/retained_cleanup.py +550 -0
  715. package/remote-broker/server.py +648 -0
  716. package/scripts/build-remote-broker.mjs +13 -0
  717. package/scripts/ensure-local-packages.mjs +6 -0
  718. package/scripts/node-pty-helpers.mjs +103 -0
@@ -4,96 +4,242 @@
4
4
  * Eliminates duplicated session logic between TUI (cli_ratatui.ts) and headless (headless.ts).
5
5
  * Each renderer provides its own deps for message access and logging.
6
6
  */
7
- import { saveSession, saveSessionToFile, saveMuxStateOnly, cleanupOldSessions } from '../session.js';
7
+ import { randomUUID } from 'node:crypto';
8
+ import { createUsageSnapshot, mergeUsageSnapshots } from '../usage_snapshot.js';
9
+ import { createDiagnosticSnapshot, captureSessionDiagnosticSnapshot, mergeDiagnosticSnapshots, recordDiagnosticEvent } from '../diagnostics/session_export.js';
10
+ import { saveSession, saveSessionToFile, saveMuxStateOnly, cleanupOldSessions, retainCurrentSession, loadSessionFromFile } from '../session.js';
8
11
  import { pruneZtcTempDirs } from '../utils/ztc_cleanup.js';
9
12
  import { configStore } from '../config.js';
10
- import { estimateConversationTokens, formatTokenCount, getContextStatus, contextStatusFromUsed, resolveAutoCompact, } from '../utils/context.js';
13
+ import { estimateConversationTokens, formatTokenCount, getContextStatus, getContextWindowSize, contextStatusFromUsed, resolveAutoCompact, } from '../utils/context.js';
11
14
  import { compactConversation, describeCompaction, compactMessages, smartSummarizer, localSummarizer } from '../utils/compaction.js';
12
- import { stripEphemeralMessages } from '../utils/ephemeral.js';
15
+ import { prepareSessionMessages } from './session_messages.js';
13
16
  /**
14
17
  * Manages session persistence, auto-save timers, and context compaction.
15
18
  */
16
19
  export class SessionManager {
17
20
  deps;
21
+ diagnostics = createDiagnosticSnapshot();
22
+ usage = createUsageSnapshot();
23
+ jobDiagnosticStates = new Map();
18
24
  autoSaveTimer = null;
19
25
  saveQueue = Promise.resolve();
20
- cleanupDone = false;
26
+ muxSnapshot;
27
+ muxCapture = null;
28
+ muxGeneration = 0;
29
+ cleanupPromise = null;
21
30
  constructor(deps) {
22
31
  this.deps = deps;
23
32
  }
24
33
  setSessionId(sessionId) {
34
+ if (this.deps.sessionId !== sessionId) {
35
+ this.diagnostics = createDiagnosticSnapshot();
36
+ this.usage = createUsageSnapshot();
37
+ this.jobDiagnosticStates.clear();
38
+ this.muxSnapshot = undefined;
39
+ this.muxCapture = null;
40
+ this.muxGeneration++;
41
+ }
25
42
  this.deps.sessionId = sessionId;
26
43
  }
44
+ /** Capture the current agent before replacement, then return detached canonical facts. */
45
+ getDiagnostics() {
46
+ const current = this.deps.getRuntimeState?.().diagnostics;
47
+ if (current)
48
+ this.diagnostics = mergeDiagnosticSnapshots(this.diagnostics, current);
49
+ this.diagnostics = captureSessionDiagnosticSnapshot({ messages: this.deps.getMessages(), diagnostics: this.diagnostics });
50
+ return structuredClone(this.diagnostics);
51
+ }
52
+ restoreDiagnostics(snapshot) {
53
+ if (snapshot)
54
+ this.diagnostics = mergeDiagnosticSnapshots(this.diagnostics, snapshot);
55
+ }
56
+ getUsageSnapshot() {
57
+ const current = this.deps.getRuntimeState?.().usage;
58
+ if (current)
59
+ this.usage = mergeUsageSnapshots(this.usage, current);
60
+ return structuredClone(this.usage);
61
+ }
62
+ restoreUsageSnapshot(snapshot) {
63
+ if (snapshot)
64
+ this.usage = mergeUsageSnapshots(this.usage, snapshot);
65
+ }
66
+ recordHostDiagnostic(kind, data) {
67
+ this.diagnostics = recordDiagnosticEvent(this.diagnostics, {
68
+ id: randomUUID(), kind, origin: 'host', storedRole: null,
69
+ timestamp: new Date().toISOString(), data,
70
+ });
71
+ }
72
+ recordCommandJob(job) {
73
+ // Observation polling must not create duplicate transitions or imply fresh output.
74
+ const state = JSON.stringify([job.status, job.ended_at ?? null, job.exit_code ?? null]);
75
+ if (this.jobDiagnosticStates.get(job.job_id) === state)
76
+ return;
77
+ this.jobDiagnosticStates.set(job.job_id, state);
78
+ this.recordHostDiagnostic('job', {
79
+ jobId: job.job_id, status: job.status, command: job.command, cwd: job.cwd,
80
+ startedAt: job.started_at, endedAt: job.ended_at ?? null, exitCode: job.exit_code ?? null,
81
+ error: job.error ?? null, logReference: job.log_path, logAvailability: 'not_verified',
82
+ outputTruncated: job.output_truncated ?? null, droppedBytes: job.dropped_bytes ?? null,
83
+ });
84
+ }
27
85
  /**
28
86
  * Run one-time cleanup of stale sessions and temp dirs.
29
87
  * Called after session load so we never delete a session the caller
30
88
  * is about to resume.
31
89
  */
32
90
  runStartupCleanup() {
33
- if (this.cleanupDone)
34
- return;
35
- this.cleanupDone = true;
36
- void cleanupOldSessions(process.cwd()).catch(() => { });
37
- void pruneZtcTempDirs().catch(() => { });
91
+ if (this.cleanupPromise)
92
+ return this.cleanupPromise;
93
+ this.cleanupPromise = (async () => {
94
+ if (!this.deps.sessionFile) {
95
+ try {
96
+ await retainCurrentSession(this.deps.getSessionCwd?.() ?? process.cwd(), this.deps.sessionId);
97
+ await cleanupOldSessions(this.deps.getSessionCwd?.() ?? process.cwd(), configStore.get().sessionRetentionCount ?? null);
98
+ }
99
+ catch (error) {
100
+ this.deps.debugLog(`[SessionManager.cleanup] Session retention skipped: ${error.message}`);
101
+ }
102
+ }
103
+ await pruneZtcTempDirs().catch(() => { });
104
+ })();
105
+ return this.cleanupPromise;
38
106
  }
39
107
  /**
40
108
  * Save the current session, filtering out ephemeral system messages.
41
109
  */
42
110
  async save(options = {}) {
111
+ options.signal?.throwIfAborted();
112
+ // Start a fresh renderer projection outside the durability queue. Required
113
+ // admission saves wait only briefly, retaining the last detached projection
114
+ // if the renderer is unavailable; a responsive renderer supplies its current
115
+ // layout even on the first required save.
116
+ if (options.captureLayout ?? true) {
117
+ const capture = this.refreshMuxState();
118
+ if (options.required && options.captureLayout !== true) {
119
+ let timer;
120
+ try {
121
+ await Promise.race([capture, new Promise(resolve => { timer = setTimeout(resolve, 250); })]);
122
+ }
123
+ finally {
124
+ clearTimeout(timer);
125
+ }
126
+ }
127
+ else
128
+ await capture;
129
+ }
130
+ options.signal?.throwIfAborted();
43
131
  const pendingSave = this.saveQueue.then(() => this.writeCurrentSession(options));
44
132
  this.saveQueue = pendingSave.catch(() => { });
45
133
  return pendingSave;
46
134
  }
135
+ async refreshMuxState() {
136
+ if (!this.deps.getMuxState)
137
+ return;
138
+ if (this.muxCapture)
139
+ return this.muxCapture;
140
+ const generation = this.muxGeneration;
141
+ const read = this.deps.getMuxState;
142
+ const capture = (async () => {
143
+ try {
144
+ const state = await read.call(this.deps);
145
+ if (generation === this.muxGeneration && state !== undefined)
146
+ this.muxSnapshot = structuredClone(state);
147
+ }
148
+ catch (error) {
149
+ this.deps.debugLog(`[SessionManager.save] Optional layout unavailable: ${String(error)}`);
150
+ }
151
+ })();
152
+ this.muxCapture = capture;
153
+ try {
154
+ await capture;
155
+ }
156
+ finally {
157
+ if (this.muxCapture === capture)
158
+ this.muxCapture = null;
159
+ }
160
+ }
47
161
  async writeCurrentSession(options) {
48
- const messages = this.deps.getMessages();
49
- const muxState = this.deps.getMuxState ? await this.deps.getMuxState() : undefined;
50
- const runtimeState = this.deps.getRuntimeState ? this.deps.getRuntimeState() : undefined;
51
- const hostedSettings = this.deps.getHostedSettings ? this.deps.getHostedSettings() : undefined;
52
- const hasRuntimeState = runtimeState !== undefined && (runtimeState.mode !== undefined
162
+ options.signal?.throwIfAborted();
163
+ await this.deps.flushToolResponses?.();
164
+ const muxState = structuredClone(this.muxSnapshot);
165
+ // Capture transcript and runtime together after raw receipt durability;
166
+ // optional layout replies never gate required restart state.
167
+ const messages = structuredClone(this.deps.getMessages());
168
+ const capturedRuntime = this.deps.getRuntimeState ? structuredClone(this.deps.getRuntimeState()) : undefined;
169
+ if (capturedRuntime?.diagnostics)
170
+ this.restoreDiagnostics(capturedRuntime.diagnostics);
171
+ if (capturedRuntime?.usage)
172
+ this.restoreUsageSnapshot(capturedRuntime.usage);
173
+ this.diagnostics = captureSessionDiagnosticSnapshot({ messages, diagnostics: this.diagnostics });
174
+ const hasDiagnostics = this.diagnostics.events.length > 0 || this.diagnostics.omittedEvents > 0
175
+ || this.diagnostics.omittedTextBytes > 0;
176
+ const hasUsage = this.usage.receipts.length > 0 || this.usage.omittedReceipts > 0;
177
+ const runtimeState = {
178
+ ...capturedRuntime,
179
+ authMode: configStore.getResolvedAuthMode(),
180
+ routerOrigin: configStore.getResolvedAuthMode() === 'direct' ? undefined : configStore.get().zergProxyUrl,
181
+ ...(hasUsage ? { usage: structuredClone(this.usage) } : {}),
182
+ ...(hasDiagnostics ? { diagnostics: structuredClone(this.diagnostics) } : {}),
183
+ };
184
+ const hostedSettings = this.deps.getHostedSettings ? structuredClone(this.deps.getHostedSettings()) : undefined;
185
+ const paneSpecs = this.deps.getPaneSpecs ? structuredClone(this.deps.getPaneSpecs()) : undefined;
186
+ const hasRuntimeState = runtimeState !== undefined && (runtimeState.environment != null
187
+ || runtimeState.mode !== undefined
53
188
  || runtimeState.planFile !== undefined
54
189
  || runtimeState.artifactPath !== undefined
55
190
  // A live goal counts as runtime state worth persisting on its own; a null
56
191
  // goal (serialize() with no goal) does not, so empty sessions stay unwritten.
57
- || runtimeState.goal != null);
192
+ || runtimeState.goal != null
193
+ || Boolean(runtimeState.evidence?.records.length)
194
+ || hasDiagnostics
195
+ || hasUsage);
58
196
  if (messages.length === 0 && !muxState && !hasRuntimeState && !options.persistEmpty)
59
197
  return;
60
- // Filter out ephemeral system messages (startup banners, transient toasts).
61
- // See utils/ephemeral.ts — messages are dropped if either (a) they carry
62
- // `metadata.ephemeral === true` or (b) they match a legacy content prefix
63
- // (for backward compat with already-persisted sessions).
64
- const TOOL_RESULT_PERSIST_CAP = 2000;
65
- const persistMessages = stripEphemeralMessages(messages).map(m => {
66
- if (!m.metadata?.toolResult)
67
- return m;
68
- // Truncate tool_result content for session persistence — the full
69
- // output is redundant (buildRequest truncates old results anyway)
70
- // and bloats the session file.
71
- try {
72
- const results = JSON.parse(m.content);
73
- const trimmed = results.map(r => ({
74
- ...r,
75
- content: r.content.length > TOOL_RESULT_PERSIST_CAP
76
- ? r.content.slice(0, TOOL_RESULT_PERSIST_CAP) + '…'
77
- : r.content,
78
- }));
79
- return { ...m, content: JSON.stringify(trimmed) };
80
- }
81
- catch {
82
- return m;
83
- }
84
- });
198
+ const persistMessages = prepareSessionMessages(messages);
85
199
  try {
86
200
  const model = configStore.getModel();
87
201
  const provider = configStore.getProvider();
88
- const paneSpecs = this.deps.getPaneSpecs ? this.deps.getPaneSpecs() : undefined;
202
+ let writtenPath;
89
203
  if (this.deps.sessionFile) {
90
- await saveSessionToFile(this.deps.sessionFile, this.deps.sessionId, process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings);
204
+ writtenPath = await saveSessionToFile(this.deps.sessionFile, this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings, options.signal);
91
205
  this.deps.debugLog(`[SessionManager.save] Saved ${this.deps.sessionId} to ${this.deps.sessionFile} (${persistMessages.length} messages)`);
92
206
  }
93
207
  else {
94
- await saveSession(this.deps.sessionId, process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings);
208
+ writtenPath = await saveSession(this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings, options.signal);
95
209
  this.deps.debugLog(`[SessionManager.save] Saved ${this.deps.sessionId} with ${persistMessages.length} messages`);
96
210
  }
211
+ if (this.deps.onCheckpoint || persistMessages.some(message => message.attachments?.length)) {
212
+ const saved = await loadSessionFromFile(writtenPath, false);
213
+ if (!saved)
214
+ throw new Error('Written session checkpoint could not be read back.');
215
+ // The writer detaches its checkpoint before adopting uploaded images.
216
+ // Rebind only unchanged live sources after the canonical commit; never
217
+ // replace messages that arrived or were edited while disk I/O yielded.
218
+ // Preserve attachment object identity for already captured steering and
219
+ // queue owners, which may still hold that exact accepted upload.
220
+ const current = this.deps.getMessages();
221
+ let rebound = false;
222
+ for (const message of current) {
223
+ const source = persistMessages.find(candidate => candidate.id === message.id
224
+ && candidate.role === message.role && candidate.content === message.content);
225
+ const committed = saved.messages.find(candidate => candidate.id === message.id);
226
+ if (!source || !committed)
227
+ continue;
228
+ for (const attachment of message.attachments ?? []) {
229
+ const captured = source.attachments?.find(candidate => candidate.id === attachment.id);
230
+ const durable = committed.attachments?.find(candidate => candidate.id === attachment.id);
231
+ if (!captured || !durable?.durable
232
+ || JSON.stringify(attachment) !== JSON.stringify(captured)
233
+ || JSON.stringify(attachment) === JSON.stringify(durable))
234
+ continue;
235
+ Object.assign(attachment, durable);
236
+ rebound = true;
237
+ }
238
+ }
239
+ if (rebound)
240
+ this.deps.setMessages([...current]);
241
+ this.deps.onCheckpoint?.(saved);
242
+ }
97
243
  }
98
244
  catch (err) {
99
245
  const msg = err.message;
@@ -117,11 +263,12 @@ export class SessionManager {
117
263
  async saveMuxOnly() {
118
264
  if (!this.deps.getMuxState)
119
265
  return false;
120
- const muxState = await this.deps.getMuxState();
266
+ await this.refreshMuxState();
267
+ const muxState = structuredClone(this.muxSnapshot);
121
268
  if (!muxState)
122
269
  return false;
123
270
  try {
124
- return await saveMuxStateOnly(this.deps.sessionId, process.cwd(), muxState);
271
+ return await saveMuxStateOnly(this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), muxState);
125
272
  }
126
273
  catch (err) {
127
274
  this.deps.debugLog(`[SessionManager.saveMuxOnly] Error: ${err.message}`);
@@ -153,8 +300,8 @@ export class SessionManager {
153
300
  // /context); fall back to the char/4 estimate only before the first API call.
154
301
  const realUsed = this.deps.getContextTokens?.() ?? 0;
155
302
  const status = realUsed > 0
156
- ? contextStatusFromUsed(realUsed, model, this.deps.getContextWindow?.())
157
- : getContextStatus(messages, model);
303
+ ? contextStatusFromUsed(realUsed, model, (configStore.getModelContextWindow(model) !== undefined ? configStore.getModelContextWindow(model) : this.deps.getContextWindow?.()))
304
+ : getContextStatus(messages, model, configStore.getModelContextWindow(model));
158
305
  const threshold = opts?.threshold ?? configStore.getAutoCompactThreshold();
159
306
  const targetPercent = configStore.getCompactionTargetPercent();
160
307
  const triggerMode = configStore.getCompactionTriggerMode();
@@ -164,7 +311,7 @@ export class SessionManager {
164
311
  const decision = resolveAutoCompact({
165
312
  used: realUsed > 0 ? realUsed : estimateConversationTokens(messages),
166
313
  model,
167
- windowOverride: this.deps.getContextWindow?.(),
314
+ windowOverride: (configStore.getModelContextWindow(model) !== undefined ? configStore.getModelContextWindow(model) : this.deps.getContextWindow?.()),
168
315
  thresholdPercent: threshold,
169
316
  triggerMode,
170
317
  tokenBudget: configStore.getContextTokenBudget(),
@@ -176,13 +323,17 @@ export class SessionManager {
176
323
  role: 'system',
177
324
  content: `Context ${Math.round(status.percentage)}% full. Auto-compacting...`,
178
325
  });
179
- const summarizer = this.buildSummarizer();
326
+ const onUsage = this.deps.getUsageObserver?.();
327
+ const activityFinished = onUsage?.workerStarted?.();
328
+ const summarizer = this.buildSummarizer(onUsage);
329
+ const checkpointSources = this.captureCheckpointSources(messages);
180
330
  try {
181
331
  const compaction = configStore.getCompactionSettings();
182
332
  const result = await compactConversation(messages, model, {
183
333
  method: compaction.method,
184
334
  jev: compaction.jev,
185
335
  summarizer,
336
+ onUsage,
186
337
  targetPercentage: targetPercent,
187
338
  keepRecentMin: 10,
188
339
  targetTokens: decision.targetTokens,
@@ -198,8 +349,8 @@ export class SessionManager {
198
349
  });
199
350
  return false;
200
351
  }
201
- this.deps.setMessages(result.messages);
202
- const newStatus = getContextStatus(result.messages, model);
352
+ this.deps.setMessages(this.preserveCheckpointSources(result.messages, checkpointSources));
353
+ const newStatus = getContextStatus(result.messages, model, configStore.getModelContextWindow(model));
203
354
  const verb = describeCompaction(result);
204
355
  this.deps.addMessage({
205
356
  role: 'system',
@@ -215,6 +366,9 @@ export class SessionManager {
215
366
  this.deps.debugLog(`[SessionManager.maybeAutoCompact] Error: ${err.message}`);
216
367
  return false;
217
368
  }
369
+ finally {
370
+ activityFinished?.();
371
+ }
218
372
  }
219
373
  /**
220
374
  * Force compaction regardless of threshold (aggressive settings).
@@ -225,16 +379,23 @@ export class SessionManager {
225
379
  if (messages.length < 3)
226
380
  return false;
227
381
  const model = configStore.getModel();
228
- const summarizer = this.buildSummarizer();
382
+ const onUsage = this.deps.getUsageObserver?.();
383
+ const activityFinished = onUsage?.workerStarted?.();
384
+ const summarizer = this.buildSummarizer(onUsage);
385
+ const checkpointSources = this.captureCheckpointSources(messages);
229
386
  this.deps.debugLog('[SessionManager.forceCompact] Forcing aggressive compaction');
230
387
  try {
231
- const result = await compactMessages(messages, model, summarizer, 30, 5);
388
+ // A provider can reject request structure before its token window fills.
389
+ // Forced recovery must shrink even when the history already fits 30% of
390
+ // that window; otherwise the next request repeats the same rejection.
391
+ const targetTokens = Math.max(1, Math.min(Math.floor((getContextWindowSize(model, configStore.getModelContextWindow(model)) || estimateConversationTokens(messages)) * 0.3), Math.floor(estimateConversationTokens(messages) / 2)));
392
+ const result = await compactMessages(messages, model, summarizer, 30, 5, targetTokens);
232
393
  if (result.removed === 0) {
233
394
  this.deps.debugLog('[SessionManager.forceCompact] Nothing to compact — all messages are recent or system');
234
395
  return false;
235
396
  }
236
- this.deps.setMessages(result.messages);
237
- const newStatus = getContextStatus(result.messages, model);
397
+ this.deps.setMessages(this.preserveCheckpointSources(result.messages, checkpointSources));
398
+ const newStatus = getContextStatus(result.messages, model, configStore.getModelContextWindow(model));
238
399
  this.deps.debugLog(`[SessionManager.forceCompact] Compacted ${result.removed} msgs: ${formatTokenCount(result.tokensBefore)} → ${formatTokenCount(result.tokensAfter)} (${Math.round(newStatus.percentage)}%)`);
239
400
  return true;
240
401
  }
@@ -242,6 +403,9 @@ export class SessionManager {
242
403
  this.deps.debugLog(`[SessionManager.forceCompact] Error: ${err.message}`);
243
404
  return false;
244
405
  }
406
+ finally {
407
+ activityFinished?.();
408
+ }
245
409
  }
246
410
  /**
247
411
  * Start periodic auto-save.
@@ -261,15 +425,54 @@ export class SessionManager {
261
425
  this.autoSaveTimer = null;
262
426
  }
263
427
  }
264
- /**
265
- * Build a summarizer function using the current config's provider/API key.
266
- */
267
- buildSummarizer() {
428
+ /** Capture source signatures before awaiting, including IDs of ordinary rows. */
429
+ captureCheckpointSources(messages) {
430
+ // A summarizer may evict settled calls. Retain their actual sources first.
431
+ this.getDiagnostics();
432
+ return new Map(messages.map(message => [message.id, this.checkpointSourceState(message)]));
433
+ }
434
+ checkpointSourceState(message) {
435
+ return message.toolCalls?.length || message.metadata?.toolResult === true
436
+ || message.metadata?.toolCheckpoint === true || message.metadata?.taskHandoffCorrection
437
+ ? JSON.stringify(message) : null;
438
+ }
439
+ /** Preserve current invocation and correction sources without restoring old settled history. */
440
+ preserveCheckpointSources(compacted, before) {
441
+ const required = new Set((this.deps.getRuntimeState?.().taskHandoffInput?.corrections ?? [])
442
+ .filter(correction => correction.deliveryState !== 'delivered')
443
+ .map(correction => correction.sourceMessageId));
444
+ const live = this.deps.getMessages();
445
+ const byId = new Map(live.map(message => [message.id, message]));
446
+ const unresolved = (message) => Boolean(message.toolCalls?.some(call => call.status === 'pending'
447
+ || call.status === 'running' || (call.result === undefined && call.error === undefined)));
448
+ const changed = (message) => {
449
+ const state = this.checkpointSourceState(message);
450
+ return state !== null && (!before.has(message.id) || before.get(message.id) !== state);
451
+ };
452
+ const rebound = compacted.map(message => {
453
+ const current = byId.get(message.id);
454
+ if (!current)
455
+ return message;
456
+ return unresolved(message) || unresolved(current) || required.has(message.id)
457
+ || current.metadata?.taskHandoffCorrection || changed(current) ? structuredClone(current) : message;
458
+ });
459
+ const retained = new Set(rebound.map(message => message.id));
460
+ const sources = live.filter(message => {
461
+ const raw = message.metadata?.taskHandoffCorrection;
462
+ const pending = raw && typeof raw === 'object' && 'deliveryState' in raw && raw.deliveryState !== 'delivered';
463
+ return !retained.has(message.id) && (required.has(message.id) || pending || unresolved(message) || changed(message));
464
+ });
465
+ // Accepted corrections and original unresolved calls are never replaced
466
+ // by a summarizer's guess about delivery or completion. Read live state
467
+ // after the summarizer awaits so newly accepted sources also survive.
468
+ return [...rebound, ...structuredClone(sources)];
469
+ }
470
+ buildSummarizer(onUsage) {
268
471
  const provider = configStore.getProvider();
269
472
  const apiKey = configStore.getApiKey(provider);
270
473
  return async (msgs) => {
271
474
  if (apiKey) {
272
- return smartSummarizer(msgs, { provider, apiKey });
475
+ return smartSummarizer(msgs, { provider, apiKey, onUsage });
273
476
  }
274
477
  return localSummarizer(msgs);
275
478
  };
@@ -0,0 +1,3 @@
1
+ import type { Message } from '../types.js';
2
+ /** Preserve authored sources while bounding historical tool-result copies. */
3
+ export declare function prepareSessionMessages(messages: readonly Message[]): Message[];
@@ -0,0 +1,60 @@
1
+ import { describeDiagnosticTruncation, redactDiagnosticValue } from '../diagnostics/session_export.js';
2
+ import { stripEphemeralMessages } from '../utils/ephemeral.js';
3
+ /** Preserve authored sources while bounding historical tool-result copies. */
4
+ export function prepareSessionMessages(messages) {
5
+ const TOOL_RESULT_PERSIST_CAP = 2000;
6
+ // Argument labels can identify credentials echoed without labels in output.
7
+ // Hash the same redacted source as the diagnostic ledger, before trimming it.
8
+ const credentialContext = messages.map(message => ({
9
+ content: message.content, args: message.toolCalls?.map(call => call.args) ?? [],
10
+ }));
11
+ return stripEphemeralMessages(messages).map(m => {
12
+ if (!m.metadata?.toolResult)
13
+ return m;
14
+ // Truncate tool_result content for session persistence — the full
15
+ // output is redundant (buildRequest truncates old results anyway)
16
+ // and bloats the session file.
17
+ try {
18
+ const results = JSON.parse(m.content);
19
+ const truncations = {};
20
+ const trimmed = results.map(r => {
21
+ if (typeof r.content !== 'string' || r.content.length <= TOOL_RESULT_PERSIST_CAP)
22
+ return r;
23
+ const content = r.content.slice(0, TOOL_RESULT_PERSIST_CAP) + '…';
24
+ const prior = m.metadata?.toolResultTruncation;
25
+ const previous = prior && typeof prior === 'object'
26
+ ? prior[r.tool_use_id] : undefined;
27
+ if (previous && typeof previous === 'object' && 'originalBytes' in previous && 'retainedBytes' in previous
28
+ && 'sha256' in previous && 'reference' in previous && 'availability' in previous
29
+ && typeof previous.originalBytes === 'number' && Number.isSafeInteger(previous.originalBytes)
30
+ && typeof previous.retainedBytes === 'number' && Number.isSafeInteger(previous.retainedBytes)
31
+ && previous.originalBytes >= previous.retainedBytes && previous.retainedBytes >= 0
32
+ && typeof previous.sha256 === 'string' && /^[a-f0-9]{64}$/.test(previous.sha256)
33
+ && previous.reference === `sha256:${previous.sha256}`
34
+ && (previous.availability === 'unavailable' || previous.availability === 'truncated')
35
+ && content === r.content) {
36
+ // An already trimmed checkpoint carries the original source identity.
37
+ truncations[r.tool_use_id] = { originalBytes: previous.originalBytes,
38
+ retainedBytes: previous.retainedBytes, sha256: previous.sha256,
39
+ reference: previous.reference, availability: previous.availability };
40
+ }
41
+ else {
42
+ const redacted = redactDiagnosticValue({ credentialContext, fullText: r.content,
43
+ retainedText: content }, { propertyNames: path => path.length > 0 });
44
+ const { field: _field, ...provenance } = describeDiagnosticTruncation('content', redacted.fullText, redacted.retainedText, 'unavailable');
45
+ truncations[r.tool_use_id] = provenance;
46
+ }
47
+ return { ...r, content };
48
+ });
49
+ const prior = m.metadata?.toolResultTruncation;
50
+ return { ...m, content: JSON.stringify(trimmed), metadata: { ...m.metadata,
51
+ ...(Object.keys(truncations).length ? { toolResultTruncation: {
52
+ ...(prior && typeof prior === 'object' ? prior : {}), ...truncations,
53
+ } } : {}),
54
+ } };
55
+ }
56
+ catch {
57
+ return m;
58
+ }
59
+ });
60
+ }
@@ -0,0 +1,20 @@
1
+ import { type AgentFactoryOptions } from '../agent/factory.js';
2
+ import type { UsageReceipt } from '../usage_snapshot.js';
3
+ type ScopeDecision = {
4
+ route: 'steer' | 'divergent';
5
+ source: 'classifier' | 'fallback';
6
+ };
7
+ /** Classify a busy submission independently of the live task's backend, tools,
8
+ * credentials binding, and cancellation. Failure always preserves steering. */
9
+ export declare function classifyBusyInput(options: {
10
+ backendOptions: AgentFactoryOptions;
11
+ currentTask: string;
12
+ inputText: string;
13
+ hosted: boolean;
14
+ /** Dedicated routing cancellation only; never pass the parent's run signal. */
15
+ signal?: AbortSignal;
16
+ /** One accounting observation per dispatched request, including cancellation.
17
+ * Published synchronously on cancellation before the host retires its scope. */
18
+ onUsage?: (receipt: UsageReceipt) => void;
19
+ }): Promise<ScopeDecision>;
20
+ export {};