@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
@@ -1,12 +1,15 @@
1
+ import { modelContract, normalizeContractModel } from '@zerg/model-contracts';
2
+ import { readRouterCatalog, resolveRouterModel } from '../../utils/router_catalog.js';
1
3
  import { randomUUID } from 'node:crypto';
2
4
  import { measureResponse, measureStream } from './request_metrics.js';
5
+ import { BackendHttpError, readHttpErrorBody, retryAfterDelayMs } from './http_error.js';
3
6
  import { parseSSEEvents } from './sse.js';
4
7
  import { buildOpenAIMessages, buildOpenAIToolDefs } from './openai_format.js';
5
- import { buildKimiRequestParams, isKimiModel } from './kimi_params.js';
8
+ import { isKimiModel } from './kimi_params.js';
6
9
  import { runtimeDiag } from '../../utils/debug_log.js';
7
10
  import { createZrouterEventMapper } from './zrouter_events.js';
8
11
  import { parseTokenUsage } from './token_usage.js';
9
- import { deepseekRequestParams, DEEPSEEK_FLASH_MAX_OUTPUT, isModalDeepSeekFlashModel, MODAL_DEEPSEEK_FLASH_MAX_OUTPUT, isDeepSeekFlashModel } from '../../utils/deepseek.js';
12
+ import { DEEPSEEK_FLASH_MAX_OUTPUT, isModalDeepSeekFlashModel, MODAL_DEEPSEEK_FLASH_MAX_OUTPUT, isDeepSeekFlashModel } from '../../utils/deepseek.js';
10
13
  import { getVersion } from '../../utils/version.js';
11
14
  import { isTransportError } from './transport_errors.js';
12
15
  const ZROUTER_HEADERS_TIMEOUT_MS = 90_000;
@@ -23,19 +26,13 @@ const PINNABLE_DECORATION = /^[A-Za-z0-9._:-]{1,64}$/;
23
26
  function isPinnableDecoration(value) {
24
27
  return value !== undefined && PINNABLE_DECORATION.test(value);
25
28
  }
26
- // Transport reconnects must outlive a Router deploy or a Redis blip, not just a
27
- // lost packet: a Fly machine recycle RSTs every client's stream at once, so the
28
- // whole fleet sees "fetch failed" at the same moment. Three sub-second retries
29
- // used to hand a live turn back to the agent as a dead "Network error". Six
30
- // attempts with capped exponential backoff buy roughly 8-15s inside this
31
- // backend; the agent's own retry loop layers a second budget on top, and the
32
- // Router keeps buffering the producer under the same turn id the whole time, so
33
- // the reconnect resumes instead of restarting. Every knob is env-overridable
34
- // because a self-hosted Router may restart more slowly.
35
- const DEFAULT_RECONNECT_ATTEMPTS = 6;
36
- const DEFAULT_RECONNECT_BASE_MS = 500;
37
- const DEFAULT_RECONNECT_CAP_MS = 10_000;
38
- const MAX_RECONNECT_ATTEMPTS = 20;
29
+ // Allow Router restarts to recover through bounded, cancellable retries. Each
30
+ // reconnect reports progress and resumes the same turn/cursor. Hosts can tune
31
+ // the attempt count and backoff through the environment.
32
+ const DEFAULT_RECONNECT_ATTEMPTS = 120;
33
+ const DEFAULT_RECONNECT_BASE_MS = 1_000;
34
+ const DEFAULT_RECONNECT_CAP_MS = 30_000;
35
+ const MAX_RECONNECT_ATTEMPTS = 120;
39
36
  const MAX_RECONNECT_MS = 300_000;
40
37
  function envBoundedInt(name, fallback, min, max) {
41
38
  const parsed = Number(process.env[name]);
@@ -59,6 +56,10 @@ function resolveReconnectPolicy() {
59
56
  * uses the unified chat endpoint so routing can fall back across providers.
60
57
  */
61
58
  export class ZRouterStreamBackend {
59
+ initialCatalog;
60
+ get catalog() {
61
+ return readRouterCatalog({ origin: this.proxyUrl, token: this.apiKey, workspaceId: this.workspaceId }) ?? this.initialCatalog;
62
+ }
62
63
  apiKey;
63
64
  proxyUrl;
64
65
  provider;
@@ -67,6 +68,7 @@ export class ZRouterStreamBackend {
67
68
  conversationId;
68
69
  clientName;
69
70
  constructor(config) {
71
+ this.initialCatalog = config.catalog ? structuredClone(config.catalog) : undefined;
70
72
  this.apiKey = config.apiKey;
71
73
  this.proxyUrl = config.proxyUrl.replace(/\/+$/, '');
72
74
  this.provider = config.provider;
@@ -87,12 +89,45 @@ export class ZRouterStreamBackend {
87
89
  handlesTransportRetries() {
88
90
  return true;
89
91
  }
92
+ getModelCapabilities(model) {
93
+ return this.catalog?.version === 1
94
+ ? resolveRouterModel(this.catalog, this.provider, model)?.capabilities : undefined;
95
+ }
90
96
  buildOpenAIBody(request) {
91
- // ZTC stores the model separately from its provider. Router's global model
97
+ if (this.catalog?.version === 1) {
98
+ const descriptor = resolveRouterModel(this.catalog, this.provider, request.model);
99
+ if (!descriptor?.capabilities?.chat)
100
+ throw new Error('This model is no longer in the Router chat catalog. Refresh /model.');
101
+ const caps = descriptor.capabilities;
102
+ if (request.codexEffort && caps.reasoning && !caps.reasoning.choices.includes(request.codexEffort)) {
103
+ throw new Error(`Unsupported reasoning effort: ${request.codexEffort}`);
104
+ }
105
+ if (request.maxTokens !== undefined && caps.max_output_tokens !== undefined && request.maxTokens > caps.max_output_tokens) {
106
+ throw new Error(`Max output tokens exceeds the advertised limit (${caps.max_output_tokens}).`);
107
+ }
108
+ if (caps.images === false && request.messages.some(message => Array.isArray(message.content)
109
+ && message.content.some(block => block.type === 'image' || block.type === 'video')))
110
+ throw new Error('This model does not support images.');
111
+ const prepared = caps.tools === false ? chatOnlyRequest(request) : request;
112
+ return { provider: descriptor.owned_by, model: descriptor.id,
113
+ ...(request.routePlan ? { route: request.routePlan } : {}),
114
+ ...(request.maxTokens === undefined ? {} : { max_output_tokens: request.maxTokens }),
115
+ ...(caps.reasoning && request.codexEffort ? { reasoning_effort: request.codexEffort } : {}),
116
+ messages: buildOpenAIMessages(prepared),
117
+ ...(prepared.tools.length ? { tools: buildOpenAIToolDefs(prepared.tools) } : {}),
118
+ };
119
+ }
120
+ // Legacy contract for older Routers only. ZTC stores the model separately from its provider. Router's global model
92
121
  // namespace is a wire concern; keep existing namespaced IDs compatible.
93
122
  if (this.provider === 'modal' && !/^modal\//i.test(request.model)) {
94
123
  request = { ...request, model: `modal/${request.model}` };
95
124
  }
125
+ // Router resolves the Fireworks upstream id from the NAMESPACED form:
126
+ // fireworksUpstreamModelId returns null without the prefix and provider-client
127
+ // then answers 400 before dispatch. ZTC stores the bare slug, so add it here.
128
+ if (this.provider === 'fireworks') {
129
+ request = { ...request, model: `fireworks/${normalizeContractModel('fireworks', request.model)}` };
130
+ }
96
131
  // Kimi deprecates max_tokens in favour of max_completion_tokens, same as the
97
132
  // o-series and GPT-5+; keep this in step with the direct backend so the token
98
133
  // field does not depend on how the user authenticated.
@@ -115,20 +150,42 @@ export class ZRouterStreamBackend {
115
150
  model: request.model,
116
151
  ...(request.routePlan ? { route: request.routePlan } : {}),
117
152
  ...tokenParam,
118
- // Kimi honors a reasoning_effort the picker exposes; without this the same
119
- // selection applied on a direct key and vanished through the proxy.
120
- // No-op for every non-Kimi model.
121
- // Modal uses Kimi's effort ladder but keeps its own max_tokens contract.
122
- ...buildKimiRequestParams(this.provider === 'modal'
123
- ? { ...request, model: request.model.slice('modal/'.length) }
124
- : request),
125
- ...deepseekRequestParams(request),
153
+ ...(request.codexEffort && modelContract(this.provider, request.model, 'chat_tools')?.reasoningEfforts.includes(request.codexEffort)
154
+ ? { reasoning_effort: request.codexEffort } : {}),
126
155
  messages: buildOpenAIMessages(request),
127
156
  ...(request.tools.length > 0 ? { tools: buildOpenAIToolDefs(request.tools) } : {})
128
157
  };
129
158
  }
130
- buildBody(request) {
131
- return this.buildOpenAIBody(request);
159
+ serializeBody(request, stream = false) {
160
+ const body = {
161
+ ...this.buildOpenAIBody(request),
162
+ ...(stream ? { stream: true } : {}),
163
+ };
164
+ const serialized = JSON.stringify(body);
165
+ // Funded DeepSeek admission scans at most 10,000 JSON values, independently
166
+ // of the model's token window. A longer text history is otherwise rejected
167
+ // as non-text trial input, and resumable streaming masks that as a 5xx.
168
+ // Signal context overflow locally so hosts compact and retry, including
169
+ // when an agent's tool loop crosses the limit before returning to idle.
170
+ if (body.model === 'modal/deepseek-v4.1-flash'
171
+ || body.model === 'fireworks/deepseek-v4p1-flash') {
172
+ // Count the serialized wire shape: undefined properties disappear, and
173
+ // tool calls/results expand into separate messages during encoding.
174
+ const pending = [JSON.parse(serialized)];
175
+ let values = 1;
176
+ while (pending.length > 0) {
177
+ const value = pending.pop();
178
+ if (value === null || typeof value !== 'object')
179
+ continue;
180
+ for (const child of Object.values(value)) {
181
+ if (++values > 10_000) {
182
+ throw new Error('Prompt is too long for Router\'s context structure limit (10,000 JSON values). Compact the conversation before retrying.');
183
+ }
184
+ pending.push(child);
185
+ }
186
+ }
187
+ }
188
+ return serialized;
132
189
  }
133
190
  async buildHeaders(request) {
134
191
  const token = this.authTokenProvider
@@ -141,6 +198,7 @@ export class ZRouterStreamBackend {
141
198
  const conversationPin = this.conversationPin(request);
142
199
  return {
143
200
  'Content-Type': 'application/json',
201
+ ...(this.catalog?.version === 1 ? { 'X-Zerg-Model-Contract': '1' } : {}),
144
202
  'Authorization': `Bearer ${normalizedToken}`,
145
203
  'X-Zerg-Client': this.clientName,
146
204
  'X-Zerg-Client-Version': getVersion(),
@@ -183,7 +241,7 @@ export class ZRouterStreamBackend {
183
241
  return measureResponse(routedRequest, fetcher => this.generateResponse(routedRequest, fetcher));
184
242
  }
185
243
  async generateResponse(request, fetcher) {
186
- const body = this.buildBody(request);
244
+ const body = this.serializeBody(request);
187
245
  const headers = await this.buildHeaders(request);
188
246
  // Proof-chain log: the exact router endpoint + model this turn dispatches to.
189
247
  runtimeDiag('info', `[ztc] zrouter dispatch ${JSON.stringify({
@@ -195,15 +253,23 @@ export class ZRouterStreamBackend {
195
253
  const response = await fetcher(this.endpointFor(), {
196
254
  method: 'POST',
197
255
  headers,
198
- body: JSON.stringify(body),
256
+ body,
199
257
  signal: request.signal,
200
258
  });
201
259
  if (!response.ok) {
202
- const errorText = await response.text();
203
- throw new Error(`ZRouter API error (${response.status}): ${errorText}`);
260
+ const failure = await readHttpErrorBody(response, request.signal);
261
+ const error = new BackendHttpError(response.status, failure.body, { prefix: 'ZRouter API', headers,
262
+ bodyReadState: failure.bodyReadState, retryAfter: response.headers.get('retry-after'),
263
+ rateLimitReset: response.headers.get('x-ratelimit-reset') });
264
+ error.message += failureHeaderSuffix(response);
265
+ throw error;
204
266
  }
205
267
  const data = await response.json();
206
- return this.parseOpenAIResponse(data);
268
+ const parsed = this.parseOpenAIResponse(data);
269
+ if (this.getModelCapabilities(request.model)?.tools === false && parsed.content.some(block => block.type === 'tool_use')) {
270
+ throw new Error('Chat-only model returned tools; execution is disabled.');
271
+ }
272
+ return parsed;
207
273
  }
208
274
  parseOpenAIResponse(data) {
209
275
  // ZRouter wraps OpenAI responses in OpenAI-compatible format
@@ -248,12 +314,15 @@ export class ZRouterStreamBackend {
248
314
  return measureStream(routedRequest, fetcher => this.streamResponse(routedRequest, fetcher));
249
315
  }
250
316
  async *streamResponse(request, fetcher) {
251
- const body = { ...this.buildBody(request), stream: true };
317
+ const body = this.serializeBody(request, true);
252
318
  const mapEvent = createZrouterEventMapper();
253
319
  let resumeAfter;
254
320
  let emittedMappedEvent = false;
255
321
  let resumeSupported = false;
256
322
  const policy = resolveReconnectPolicy();
323
+ let reconnectStarted;
324
+ const budget = () => resumeAfter ? 300_000 : 30_000;
325
+ const remaining = () => budget() - (reconnectStarted === undefined ? 0 : Date.now() - reconnectStarted);
257
326
  for (let attempt = 1; attempt <= policy.attempts; attempt++) {
258
327
  try {
259
328
  const headers = await this.buildHeaders(request);
@@ -262,12 +331,16 @@ export class ZRouterStreamBackend {
262
331
  const response = await fetchWithHeadersTimeout(fetcher, this.endpointFor(), {
263
332
  method: 'POST',
264
333
  headers,
265
- body: JSON.stringify(body),
334
+ body,
266
335
  signal: request.signal,
267
- }, ZROUTER_HEADERS_TIMEOUT_MS);
336
+ }, Math.min(ZROUTER_HEADERS_TIMEOUT_MS, Math.max(1, remaining())));
268
337
  if (!response.ok) {
269
- const errorText = await response.text();
270
- throw new Error(`ZRouter API error (${response.status}): ${errorText}`);
338
+ const failure = await readHttpErrorBody(response, request.signal);
339
+ const error = new BackendHttpError(response.status, failure.body, { prefix: 'ZRouter API', headers,
340
+ bodyReadState: failure.bodyReadState, retryAfter: response.headers.get('retry-after'),
341
+ rateLimitReset: response.headers.get('x-ratelimit-reset') });
342
+ error.message += failureHeaderSuffix(response);
343
+ throw error;
271
344
  }
272
345
  if (!response.body) {
273
346
  throw new Error('ZRouter API error: no response body for streaming request');
@@ -295,9 +368,12 @@ export class ZRouterStreamBackend {
295
368
  const status = Number.isInteger(suppliedStatus) && suppliedStatus >= 400 && suppliedStatus <= 599
296
369
  ? suppliedStatus
297
370
  : 502;
298
- throw new Error(`ZRouter API error (${status}): ${JSON.stringify(ev.body ?? {})}`);
371
+ throw new BackendHttpError(status, JSON.stringify(ev.body ?? {}), { prefix: 'ZRouter API', headers });
299
372
  }
300
373
  const mapped = mapEvent(ev);
374
+ if (this.getModelCapabilities(request.model)?.tools === false && mapped.some(event => event.type.startsWith('tool_use'))) {
375
+ throw new Error('Chat-only model returned tools; execution is disabled.');
376
+ }
301
377
  if (mapped.length > 0) {
302
378
  // Heartbeats are liveness, not model output. A drop while only
303
379
  // heartbeats have arrived cannot duplicate visible text, so it
@@ -317,8 +393,9 @@ export class ZRouterStreamBackend {
317
393
  // emitted output. So a transient HTTP failure on a resume (the Router's
318
394
  // coordination 503 while its shared store blips, a gateway 502/504) is
319
395
  // retryable here, not just a raw socket error.
320
- const retryable = isTransportError(error)
321
- || (resumeAfter !== undefined && isRetryableResumeStatus(error));
396
+ const retryable = error instanceof BackendHttpError
397
+ ? resumeAfter !== undefined && isRetryableResumeStatus(error)
398
+ : isTransportError(error);
322
399
  if (request.signal?.aborted
323
400
  || !retryable
324
401
  || (emittedMappedEvent && (!resumeSupported || !resumeAfter))) {
@@ -328,15 +405,23 @@ export class ZRouterStreamBackend {
328
405
  // second copy of the turn, so fail the attempt instead.
329
406
  throw error;
330
407
  }
331
- if (attempt === policy.attempts)
408
+ reconnectStarted ??= Date.now();
409
+ const attempts = resumeAfter ? policy.attempts : Math.min(6, policy.attempts);
410
+ if (attempt >= attempts || remaining() <= 0)
332
411
  throw error;
333
412
  // The Router keeps producing under this turn id, so waiting costs the
334
413
  // turn nothing: the next attempt resumes from the cursor, not from zero.
335
- const delayMs = reconnectDelay(policy, attempt);
414
+ const delayMs = Math.min(Math.max(reconnectDelay(policy, attempt), retryAfterDelayMs(error)), remaining());
336
415
  const reason = error instanceof Error ? error.message : String(error);
337
416
  runtimeDiag('warn', `[ztc] zrouter stream dropped (${reason}); reconnecting in ${delayMs}ms (attempt ${attempt + 1}/${policy.attempts})`);
338
- request.onTransportRetry?.({ attempt, maxAttempts: policy.attempts, delayMs, reason });
417
+ const publicReason = isRetryableResumeStatus(error)
418
+ ? `Router temporarily unavailable ${reason.match(/\(\d{3}\)/)?.[0] ?? ''}. Resuming the response.`
419
+ : reason;
420
+ request.onTransportRetry?.({ attempt, maxAttempts: attempts, delayMs, reason: publicReason,
421
+ ...(error instanceof BackendHttpError && error.status === 429 ? { rateLimited: true } : {}) });
339
422
  await waitForReconnect(delayMs, request.signal);
423
+ if (remaining() <= 0)
424
+ throw error;
340
425
  }
341
426
  }
342
427
  }
@@ -387,6 +472,27 @@ async function waitForReconnect(delayMs, signal) {
387
472
  signal?.addEventListener('abort', abort, { once: true });
388
473
  });
389
474
  }
475
+ /**
476
+ * Diagnostics that survive a body-less failure.
477
+ *
478
+ * A gateway that throws before it can classify anything often answers with a
479
+ * bare `Server Error` and puts the identifying information in the headers
480
+ * instead. Fly (Router's host) stamps a request id on every response; carrying
481
+ * it into the error is the only way to correlate a client-visible 500 with the
482
+ * server-side exception, since the body has nothing to correlate on.
483
+ *
484
+ * Bounded and header-only: never reads the body (already consumed), and caps
485
+ * each value so a hostile/proxied header cannot bloat an error message.
486
+ */
487
+ function failureHeaderSuffix(response) {
488
+ const parts = [];
489
+ for (const name of ['fly-request-id', 'x-request-id', 'cf-ray', 'x-zerg-error-code']) {
490
+ const value = response.headers.get(name)?.trim();
491
+ if (value && value.length <= 128 && !/[\r\n\0]/.test(value))
492
+ parts.push(`${name}=${value}`);
493
+ }
494
+ return parts.length > 0 ? ` [${parts.join(' ')}]` : '';
495
+ }
390
496
  /**
391
497
  * True for a `ZRouter API error (NNN)` a resume is worth retrying: a gateway or
392
498
  * rate-limit failure that is expected to clear. Kept separate from
@@ -415,3 +521,15 @@ function normalizeHeaderValue(value, label, maxLength) {
415
521
  }
416
522
  return normalized;
417
523
  }
524
+ /** A wire-only projection: saved tool history remains byte-for-byte intact. */
525
+ function chatOnlyRequest(request) {
526
+ return { ...request, tools: [], messages: request.messages.map(message => ({ ...message,
527
+ content: typeof message.content === 'string' ? message.content : message.content.map(block => {
528
+ if (block.type === 'tool_use')
529
+ return { type: 'text', text: `Previous tool call ${block.name} (${block.id}): ${JSON.stringify(block.input)}` };
530
+ if (block.type === 'tool_result')
531
+ return { type: 'text', text: `Previous tool result (${block.tool_use_id}): ${typeof block.content === 'string' ? block.content : block.content.map(part => part.type === 'text' ? part.text : '[image]').join('\n')}` };
532
+ return block;
533
+ }),
534
+ })) };
535
+ }
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import type { WorkerExecutor } from '../worker/index.js';
15
15
  import type { WorkerResult } from '../worker/index.js';
16
+ import type { ModelUsageObserver } from '../types.js';
16
17
  export type BackgroundTaskStatus = 'running' | 'completed' | 'failed' | 'cancelled';
17
18
  /** Public view of a background task — omits internal abort machinery. */
18
19
  export interface BackgroundTaskInfo {
@@ -45,6 +46,7 @@ export interface BackgroundRegistryConfig {
45
46
  timeoutMs?: number;
46
47
  }
47
48
  export interface SpawnOptions {
49
+ onUsage?: ModelUsageObserver;
48
50
  maxIterations?: number;
49
51
  cwd?: string;
50
52
  timeoutMs?: number;
@@ -73,6 +73,7 @@ export class BackgroundTaskRegistry {
73
73
  task.status = 'running';
74
74
  }
75
75
  },
76
+ onUsage: opts?.onUsage,
76
77
  })
77
78
  .then((result) => {
78
79
  // If already marked cancelled (by cancel() before abort propagated),
@@ -0,0 +1,6 @@
1
+ import type { HostClaimObservation, Message } from '../types.js';
2
+ export declare function claimObservationWarning(basis: HostClaimObservation['basis']): string;
3
+ /** Canonical message metadata; the original text, identity, and timestamp stay intact. */
4
+ export declare function withHostClaimObservation(message: Message, basis: HostClaimObservation['basis'], toolCallCount: number, observedAt: Date): Message;
5
+ /** This is a historical host observation, not proof that the requested work occurred. */
6
+ export declare function assistantClaimReplayContent(message: Message): string;
@@ -0,0 +1,54 @@
1
+ import { createHash } from 'node:crypto';
2
+ export function claimObservationWarning(basis) {
3
+ return basis === 'no_tool_calls'
4
+ ? 'Heads up: the agent claimed completion without actually invoking any tools. '
5
+ + 'The task likely was not performed. Retry with a more specific instruction, '
6
+ + 'or break the work into smaller steps.'
7
+ : 'Heads up: the agent reported success while its own tool output showed errors. '
8
+ + 'Check the result above before trusting it, and retry if the work is incomplete.';
9
+ }
10
+ function sourceDigest(content) {
11
+ return createHash('sha256').update(content, 'utf8').digest('hex');
12
+ }
13
+ /** Validate persisted observations against their unchanged authored source. */
14
+ function validObservation(message, value) {
15
+ if (message.role !== 'assistant' || !value || typeof value !== 'object' || Array.isArray(value))
16
+ return false;
17
+ const record = value;
18
+ return Object.keys(record).length === 6
19
+ && record.version === 1
20
+ && typeof record.sourceMessageId === 'string'
21
+ && record.sourceMessageId === message.id
22
+ && Buffer.byteLength(record.sourceMessageId, 'utf8') > 0
23
+ && Buffer.byteLength(record.sourceMessageId, 'utf8') <= 256
24
+ && !/[\u0000-\u001f\u007f]/.test(record.sourceMessageId)
25
+ && record.sourceSha256 === sourceDigest(message.content)
26
+ && (record.basis === 'no_tool_calls' || record.basis === 'contradictory_tool_output')
27
+ && Number.isSafeInteger(record.toolCallCount)
28
+ && (record.basis === 'no_tool_calls' ? record.toolCallCount === 0 : record.toolCallCount > 0)
29
+ && typeof record.observedAt === 'string'
30
+ && record.observedAt.length === 24
31
+ && Number.isFinite(Date.parse(record.observedAt))
32
+ && new Date(record.observedAt).toISOString() === record.observedAt;
33
+ }
34
+ /** Canonical message metadata; the original text, identity, and timestamp stay intact. */
35
+ export function withHostClaimObservation(message, basis, toolCallCount, observedAt) {
36
+ const observation = {
37
+ version: 1, sourceMessageId: message.id, sourceSha256: sourceDigest(message.content),
38
+ basis, toolCallCount, observedAt: observedAt.toISOString(),
39
+ };
40
+ if (!validObservation(message, observation))
41
+ throw new RangeError('Invalid host claim observation source or count');
42
+ return { ...message, metadata: { ...message.metadata, hostClaimObservation: observation } };
43
+ }
44
+ /** This is a historical host observation, not proof that the requested work occurred. */
45
+ export function assistantClaimReplayContent(message) {
46
+ const observation = message.metadata?.hostClaimObservation;
47
+ if (!validObservation(message, observation))
48
+ return message.content;
49
+ return '[Unverified assistant claim; historical host observation for source '
50
+ + JSON.stringify(observation.sourceMessageId) + ' at ' + observation.observedAt + ']\n'
51
+ + claimObservationWarning(observation.basis) + '\n'
52
+ + 'Treat the following original statement as unverified, not as evidence of completed work:\n'
53
+ + message.content;
54
+ }