@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
@@ -11,9 +11,10 @@ import { randomBytes } from 'crypto';
11
11
  import { chmodSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'fs';
12
12
  import { homedir } from 'os';
13
13
  import { join } from 'path';
14
- import { buildResponsesInput, isValidResponsesTerminal, parseResponsesOutput, readBoundedResponsesText, requireValidResponsesOutputItem, streamResponsesSSE, } from './openai_responses.js';
14
+ import { buildResponsesInput, isValidResponsesTerminal, parseResponsesOutput, readBoundedResponsesText, readBoundedProviderError, requireValidResponsesOutputItem, streamResponsesSSE, } from './openai_responses.js';
15
15
  import { RateLimitError, parseResetAt } from './rate_limit.js';
16
16
  import { CODEX_LEGACY_PROVIDER } from './provider_ids.js';
17
+ import { CodexBufferedRecovery } from './codex_buffered_recovery.js';
17
18
  /**
18
19
  * Shared auth file with Codex CLI (~/.codex/auth.json). Both ZTC and Codex CLI
19
20
  * read and write this file. ZTC replaces it atomically, so concurrent readers
@@ -33,6 +34,8 @@ function resolveClientId(fileClientId) {
33
34
  return process.env.CODEX_OAUTH_CLIENT_ID || fileClientId || DEFAULT_CODEX_CLIENT_ID;
34
35
  }
35
36
  const CODEX_OAUTH_TIMEOUT_MS = 30_000;
37
+ // Credential refresh is small control-plane JSON, not an inference response.
38
+ const CODEX_OAUTH_RESPONSE_BYTES = 1_048_576;
36
39
  function isRecord(value) {
37
40
  return value !== null && typeof value === 'object' && !Array.isArray(value);
38
41
  }
@@ -209,7 +212,7 @@ export class CodexAuthManager {
209
212
  }
210
213
  let rawData;
211
214
  try {
212
- const body = await readBoundedResponsesText(res);
215
+ const body = await readBoundedResponsesText(res, CODEX_OAUTH_RESPONSE_BYTES);
213
216
  rawData = JSON.parse(body);
214
217
  }
215
218
  catch (error) {
@@ -321,7 +324,7 @@ export class CodexAuthBackend {
321
324
  return headers;
322
325
  }
323
326
  /** POST the streaming Responses request, refreshing the token once on 401. */
324
- async fetchResponses(request, _retried = false) {
327
+ async fetchResponses(request, _retried = false, recovery) {
325
328
  const headers = await this.buildHeaders(request.signal);
326
329
  const input = buildResponsesInput(request.messages);
327
330
  const tools = request.tools.map(t => ({
@@ -330,9 +333,10 @@ export class CodexAuthBackend {
330
333
  description: t.description,
331
334
  parameters: t.parameters,
332
335
  }));
336
+ const system = request.system || 'You are a helpful assistant.';
333
337
  const body = {
334
338
  model: request.model,
335
- instructions: request.system || 'You are a helpful assistant.',
339
+ instructions: request.outputTokenGuidance ? `${system}\nAim for at most ${request.maxTokens} output tokens.` : system,
336
340
  input,
337
341
  stream: true,
338
342
  store: false,
@@ -344,6 +348,11 @@ export class CodexAuthBackend {
344
348
  body.tools = tools;
345
349
  body.tool_choice = 'auto';
346
350
  }
351
+ if (request.outputSchema !== undefined) {
352
+ body.text = { format: {
353
+ type: 'json_schema', name: 'ztc_response', strict: request.outputSchemaStrict ?? false, schema: request.outputSchema,
354
+ } };
355
+ }
347
356
  // Codex/GPT reasoning effort + fast mode (Responses API shape). Always
348
357
  // request a reasoning summary so the agent's thinking streams to the UI as a
349
358
  // collapsed thinking block (gpt-5.x are reasoning models).
@@ -353,18 +362,20 @@ export class CodexAuthBackend {
353
362
  if (request.codexFastMode) {
354
363
  body.service_tier = 'priority';
355
364
  }
356
- const response = await fetch(`${CODEX_API_BASE}/responses`, {
365
+ const response = await (recovery?.fetch ?? fetch)(`${CODEX_API_BASE}/responses`, {
357
366
  method: 'POST',
358
367
  headers,
359
368
  body: JSON.stringify(body),
360
369
  signal: request.signal,
361
370
  });
362
371
  if (!response.ok) {
363
- if (response.status === 401 && !_retried) {
372
+ if (response.status === 401 && !_retried && (!recovery || recovery.canPost())) {
373
+ if (recovery)
374
+ await response.body?.cancel();
364
375
  await this.authManager.refreshToken(request.signal);
365
- return this.fetchResponses(request, true);
376
+ return this.fetchResponses(request, true, recovery);
366
377
  }
367
- const errorText = await readBoundedResponsesText(response);
378
+ const errorText = await readBoundedProviderError(response);
368
379
  if (response.status === 429) {
369
380
  // Typed so the rotation engine can cool this account and fail over.
370
381
  const now = Date.now();
@@ -384,12 +395,55 @@ export class CodexAuthBackend {
384
395
  }
385
396
  throw new Error(`Codex API error (${response.status}): ${errorText}`);
386
397
  }
387
- return response;
398
+ return request.maxResponseBytes === undefined ? response : this.boundResponse(response, request.maxResponseBytes);
399
+ }
400
+ boundResponse(response, maxBytes) {
401
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1) {
402
+ void response.body?.cancel();
403
+ throw new Error('Codex response byte budget must be a positive integer');
404
+ }
405
+ if (!response.body)
406
+ return response;
407
+ const reader = response.body.getReader();
408
+ let received = 0;
409
+ const body = new ReadableStream({
410
+ async pull(controller) {
411
+ try {
412
+ const { done, value } = await reader.read();
413
+ if (done) {
414
+ controller.close();
415
+ reader.releaseLock();
416
+ return;
417
+ }
418
+ received += value.byteLength;
419
+ if (received > maxBytes) {
420
+ const error = new Error('Codex response byte budget exceeded');
421
+ controller.error(error);
422
+ await reader.cancel(error);
423
+ reader.releaseLock();
424
+ return;
425
+ }
426
+ controller.enqueue(value);
427
+ }
428
+ catch (error) {
429
+ controller.error(error);
430
+ }
431
+ },
432
+ async cancel(reason) {
433
+ await reader.cancel(reason);
434
+ reader.releaseLock();
435
+ },
436
+ }, { highWaterMark: 0 });
437
+ return new Response(body, { status: response.status, headers: response.headers });
388
438
  }
389
439
  /** Buffered path — kept as the fallback when streaming can't run. */
390
440
  async generate(request) {
441
+ if (request.bufferedRecovery) {
442
+ const recovery = new CodexBufferedRecovery(request.bufferedRecovery, request.signal);
443
+ return recovery.run(async () => this.parseSSEResponse(await this.fetchResponses(request, false, recovery), request.maxResponseBytes));
444
+ }
391
445
  const response = await this.fetchResponses(request);
392
- return this.parseSSEResponse(response);
446
+ return this.parseSSEResponse(response, request.maxResponseBytes);
393
447
  }
394
448
  /**
395
449
  * Real incremental streaming over the Responses API SSE. Delegates to the
@@ -398,15 +452,15 @@ export class CodexAuthBackend {
398
452
  * tool_use + usage + stopReason assembled from the completed output items.
399
453
  */
400
454
  async *generateStream(request) {
401
- yield* streamResponsesSSE(await this.fetchResponses(request));
455
+ yield* streamResponsesSSE(await this.fetchResponses(request), request.maxResponseBytes);
402
456
  }
403
457
  /**
404
458
  * Parse SSE stream and build a BackendResponse.
405
459
  * The ChatGPT backend streams output items via response.output_item.done
406
460
  * events, while response.completed carries usage but has output: [].
407
461
  */
408
- async parseSSEResponse(response) {
409
- const text = await readBoundedResponsesText(response);
462
+ async parseSSEResponse(response, maxBytes) {
463
+ const text = await readBoundedResponsesText(response, maxBytes);
410
464
  const outputItems = [];
411
465
  let usage;
412
466
  let terminalStatus;
@@ -0,0 +1,27 @@
1
+ import type { BufferedRecoveryRequest } from './types.js';
2
+ export declare class CodexBufferedDeadlineError extends Error {
3
+ constructor();
4
+ }
5
+ /** Pull-through transport only. The caller retains its existing SSE/output parser. */
6
+ export declare class CodexBufferedRecovery {
7
+ private readonly policy;
8
+ private readonly parent?;
9
+ private readonly controller;
10
+ private readonly deadlineTimer;
11
+ private readonly onParentAbort;
12
+ private readonly epochAtStart;
13
+ private readonly monotonicAtStart;
14
+ private readonly interrupted;
15
+ private readonly duration;
16
+ private posts;
17
+ private body;
18
+ private last;
19
+ constructor(policy: BufferedRecoveryRequest, parent?: AbortSignal | undefined);
20
+ /** Epoch-shaped stamps share one monotonic clock across both physical attempts. */
21
+ private now;
22
+ canPost(): boolean;
23
+ private emit;
24
+ private canRecover;
25
+ run<T>(complete: () => Promise<T>): Promise<T>;
26
+ readonly fetch: (url: string, init: RequestInit) => Promise<Response>;
27
+ }
@@ -0,0 +1,293 @@
1
+ import { createHash } from 'node:crypto';
2
+ export class CodexBufferedDeadlineError extends Error {
3
+ constructor() { super('Buffered Codex absolute deadline exceeded'); this.name = 'CodexBufferedDeadlineError'; }
4
+ }
5
+ /** Pull-through transport only. The caller retains its existing SSE/output parser. */
6
+ export class CodexBufferedRecovery {
7
+ policy;
8
+ parent;
9
+ controller = new AbortController();
10
+ deadlineTimer;
11
+ onParentAbort;
12
+ epochAtStart = Date.now();
13
+ monotonicAtStart = performance.now();
14
+ interrupted;
15
+ duration;
16
+ posts = 0;
17
+ body;
18
+ last;
19
+ constructor(policy, parent) {
20
+ this.policy = policy;
21
+ this.parent = parent;
22
+ this.interrupted = policy.version === 'codex-buffered-idle-overload-interrupted-v1' || policy.version === 'codex-buffered-idle-overload-duration-interrupted-v1';
23
+ this.duration = policy.version === 'codex-buffered-idle-overload-duration-v1' || policy.version === 'codex-buffered-idle-overload-duration-interrupted-v1';
24
+ if (!['codex-buffered-idle-v1', 'codex-buffered-idle-overload-v1', 'codex-buffered-idle-overload-duration-v1', 'codex-buffered-idle-overload-interrupted-v1', 'codex-buffered-idle-overload-duration-interrupted-v1'].includes(policy.version) || policy.idleTimeoutMs !== 8000
25
+ || (this.duration && (!('firstBodyTimeoutMs' in policy) || policy.firstBodyTimeoutMs !== 30000))
26
+ || !Number.isFinite(policy.deadlineAtMs))
27
+ throw new Error('Unsupported buffered Codex recovery policy');
28
+ this.onParentAbort = () => this.controller.abort(parent?.reason);
29
+ if (parent?.aborted)
30
+ this.onParentAbort();
31
+ else
32
+ parent?.addEventListener('abort', this.onParentAbort, { once: true });
33
+ this.deadlineTimer = setTimeout(() => this.controller.abort(new CodexBufferedDeadlineError()), Math.max(0, policy.deadlineAtMs - this.now()));
34
+ }
35
+ /** Epoch-shaped stamps share one monotonic clock across both physical attempts. */
36
+ now() {
37
+ return this.epochAtStart + (performance.now() - this.monotonicAtStart);
38
+ }
39
+ canPost() {
40
+ return this.posts < 2 && !this.controller.signal.aborted && this.now() < this.policy.deadlineAtMs;
41
+ }
42
+ emit(event) {
43
+ try {
44
+ this.policy.onAttempt?.({ ...event });
45
+ }
46
+ catch { /* Missing metadata invalidates capture, not gameplay. */ }
47
+ }
48
+ canRecover() {
49
+ const event = this.last?.event;
50
+ return event?.reason === 'idle' || (this.duration && event?.reason === 'body-duration')
51
+ || (this.interrupted && event?.reason === 'body-interrupted')
52
+ || (this.policy.version !== 'codex-buffered-idle-v1'
53
+ && event?.reason === 'complete' && event.status === 200 && event.eofAtMs !== undefined
54
+ && event.providerFailure === 'provider-overload');
55
+ }
56
+ async run(complete) {
57
+ try {
58
+ while (true) {
59
+ this.controller.signal.throwIfAborted();
60
+ try {
61
+ return await complete();
62
+ }
63
+ catch (error) {
64
+ if (!this.canRecover() || !this.canPost())
65
+ throw error;
66
+ // Cancellation must finish before the next POST. The same absolute abort still wins.
67
+ await new Promise((resolve, reject) => {
68
+ const abort = () => reject(this.controller.signal.reason);
69
+ this.controller.signal.addEventListener('abort', abort, { once: true });
70
+ void this.last.settled.then(resolve, reject).finally(() => this.controller.signal.removeEventListener('abort', abort));
71
+ if (this.controller.signal.aborted)
72
+ abort();
73
+ });
74
+ this.controller.signal.throwIfAborted();
75
+ if (!this.canRecover() || !this.canPost())
76
+ throw error;
77
+ }
78
+ }
79
+ }
80
+ finally {
81
+ clearTimeout(this.deadlineTimer);
82
+ this.parent?.removeEventListener('abort', this.onParentAbort);
83
+ }
84
+ }
85
+ fetch = async (url, init) => {
86
+ this.controller.signal.throwIfAborted();
87
+ if (!this.canPost())
88
+ throw new Error('Buffered Codex POST budget exhausted');
89
+ this.body ??= String(init.body);
90
+ const attemptController = new AbortController();
91
+ const signal = AbortSignal.any([this.controller.signal, attemptController.signal]);
92
+ const event = {
93
+ trigger: this.posts === 0 ? 'initial' : this.last?.event.reason === 'idle' ? 'body-idle' : this.last?.event.reason === 'body-duration' ? 'body-duration' : this.last?.event.reason === 'body-interrupted' ? 'body-interrupted' : this.last?.event.providerFailure === 'provider-overload' ? 'provider-overload' : 'auth-refresh',
94
+ timingClock: 'monotonic-epoch-v1', type: 'started', attempt: ++this.posts, bodySha256: createHash('sha256').update(this.body).digest('hex'),
95
+ bodyBytes: Buffer.byteLength(this.body), startedAtMs: this.now(), deadlineAtMs: this.policy.deadlineAtMs, bytes: 0, chunks: 0, usage: 'unknown',
96
+ };
97
+ let settle;
98
+ const settled = new Promise(resolve => { settle = resolve; });
99
+ this.last = { event, settled };
100
+ this.emit(event);
101
+ let finished = false;
102
+ let idleTimer;
103
+ let bodyTimer;
104
+ let removeAbort = () => { };
105
+ const finish = (reason) => {
106
+ if (finished)
107
+ return;
108
+ finished = true;
109
+ clearTimeout(idleTimer);
110
+ clearTimeout(bodyTimer);
111
+ removeAbort();
112
+ event.type = 'settled';
113
+ event.reason = reason;
114
+ event.endedAtMs = this.now();
115
+ this.emit(event);
116
+ settle();
117
+ };
118
+ let response;
119
+ try {
120
+ response = await fetch(url, { ...init, body: this.body, signal });
121
+ event.status = response.status;
122
+ event.headersAtMs = this.now();
123
+ }
124
+ catch (error) {
125
+ if (signal.aborted)
126
+ event.abortAtMs = this.now();
127
+ finish(signal.aborted ? 'abort' : 'transport-error');
128
+ throw error;
129
+ }
130
+ if (!response.body) {
131
+ event.eofAtMs = this.now();
132
+ finish(response.ok ? 'complete' : 'http-error');
133
+ return response;
134
+ }
135
+ const reader = response.body.getReader();
136
+ const decoder = new TextDecoder();
137
+ let lines = '';
138
+ let retryAllowed = true;
139
+ let overload = false;
140
+ let stopping = false;
141
+ let pending;
142
+ let output;
143
+ const stop = async (reason, error) => {
144
+ if (stopping || finished)
145
+ return settled;
146
+ stopping = true;
147
+ clearTimeout(idleTimer);
148
+ clearTimeout(bodyTimer);
149
+ event.reason = reason;
150
+ event.cancelledAtMs = this.now();
151
+ const cancellation = reader.cancel(error);
152
+ event.abortAtMs = this.now();
153
+ attemptController.abort(error);
154
+ if (reason !== 'consumer-cancel')
155
+ output.error(error);
156
+ try {
157
+ await cancellation;
158
+ await pending?.catch(() => { });
159
+ }
160
+ catch (failure) {
161
+ event.reason = 'transport-error';
162
+ throw failure;
163
+ }
164
+ finally {
165
+ reader.releaseLock();
166
+ finish(response.ok ? event.reason : 'http-error');
167
+ }
168
+ };
169
+ const armCutoff = (reason, observedAtMs, timeoutMs) => {
170
+ const check = () => {
171
+ if (finished || stopping || !retryAllowed || this.posts !== 1)
172
+ return;
173
+ const remaining = observedAtMs + timeoutMs - this.now();
174
+ if (remaining > 0) {
175
+ const timer = setTimeout(check, Math.ceil(remaining));
176
+ if (reason === 'idle')
177
+ idleTimer = timer;
178
+ else
179
+ bodyTimer = timer;
180
+ return;
181
+ }
182
+ void stop(reason, new Error(reason === 'idle' ? 'Buffered Codex body idle cutoff' : 'Buffered Codex first body duration cutoff')).catch(() => { });
183
+ };
184
+ const timer = setTimeout(check, timeoutMs);
185
+ if (reason === 'idle')
186
+ idleTimer = timer;
187
+ else
188
+ bodyTimer = timer;
189
+ };
190
+ const observeLine = (line) => {
191
+ if (!line.startsWith('data:'))
192
+ return;
193
+ const data = line.slice(5).trim();
194
+ let type;
195
+ let message;
196
+ try {
197
+ const parsed = data === '[DONE]' ? { type: '[DONE]' } : JSON.parse(data);
198
+ type = parsed.type;
199
+ message = (parsed.response?.error ?? parsed.error)?.message;
200
+ }
201
+ catch {
202
+ retryAllowed = false;
203
+ overload = false;
204
+ clearTimeout(bodyTimer);
205
+ }
206
+ if (type && ['response.completed', 'response.incomplete', 'response.failed', 'error', '[DONE]'].includes(type)) {
207
+ overload = this.policy.version !== 'codex-buffered-idle-v1' && retryAllowed
208
+ && type === 'response.failed' && message === 'Our servers are currently overloaded. Please try again later.';
209
+ if (!this.interrupted || event.semanticTerminal === undefined) {
210
+ event.semanticTerminal = type;
211
+ event.semanticTerminalAtMs = this.now();
212
+ }
213
+ retryAllowed = false;
214
+ clearTimeout(bodyTimer);
215
+ }
216
+ };
217
+ const observe = (chunk) => {
218
+ event.bytes += chunk.byteLength;
219
+ event.chunks += 1;
220
+ event.lastChunkAtMs = this.now();
221
+ if (this.duration && response.status === 200
222
+ && chunk.byteLength > 0 && event.firstChunkAtMs === undefined) {
223
+ event.firstChunkAtMs = event.lastChunkAtMs;
224
+ if (retryAllowed && this.posts === 1)
225
+ armCutoff('body-duration', event.firstChunkAtMs, 30000);
226
+ }
227
+ lines += decoder.decode(chunk, { stream: true });
228
+ let end;
229
+ while ((end = lines.indexOf('\n')) !== -1) {
230
+ const line = lines.slice(0, end).trim();
231
+ lines = lines.slice(end + 1);
232
+ observeLine(line);
233
+ }
234
+ clearTimeout(idleTimer);
235
+ if (response.status === 200 && retryAllowed && this.posts === 1) {
236
+ armCutoff('idle', event.lastChunkAtMs, this.policy.idleTimeoutMs);
237
+ }
238
+ };
239
+ const now = () => this.now();
240
+ const interruptionPolicy = this.interrupted;
241
+ const overloadPolicy = this.policy.version !== 'codex-buffered-idle-v1';
242
+ const stream = new ReadableStream({
243
+ start(controller) {
244
+ output = controller;
245
+ const abort = () => { void stop('abort', signal.reason).catch(() => { }); };
246
+ signal.addEventListener('abort', abort, { once: true });
247
+ removeAbort = () => signal.removeEventListener('abort', abort);
248
+ if (signal.aborted)
249
+ abort();
250
+ },
251
+ async pull(controller) {
252
+ try {
253
+ pending = reader.read();
254
+ const { done, value } = await pending;
255
+ if (stopping)
256
+ return;
257
+ if (done) {
258
+ if (overloadPolicy) {
259
+ observeLine((lines + decoder.decode()).trim());
260
+ if (overload && response.status === 200)
261
+ event.providerFailure = 'provider-overload';
262
+ }
263
+ event.eofAtMs = now();
264
+ reader.releaseLock();
265
+ finish(response.ok ? 'complete' : 'http-error');
266
+ if (interruptionPolicy && response.ok && event.semanticTerminal !== 'response.completed') {
267
+ controller.error(new Error('Buffered Codex body ended without a completed response'));
268
+ }
269
+ else
270
+ controller.close();
271
+ }
272
+ else {
273
+ observe(value);
274
+ controller.enqueue(value);
275
+ }
276
+ }
277
+ catch (error) {
278
+ if (stopping)
279
+ return;
280
+ // A terminal event without a newline must still prohibit replacing its output.
281
+ if (interruptionPolicy)
282
+ observeLine((lines + decoder.decode()).trim());
283
+ const interrupted = interruptionPolicy && !signal.aborted && response.status === 200 && event.bytes > 0 && retryAllowed;
284
+ reader.releaseLock();
285
+ finish(signal.aborted ? 'abort' : interrupted ? 'body-interrupted' : 'transport-error');
286
+ controller.error(error);
287
+ }
288
+ },
289
+ cancel: reason => stop('consumer-cancel', reason),
290
+ }, { highWaterMark: 0 });
291
+ return new Response(stream, { status: response.status, headers: response.headers });
292
+ };
293
+ }
@@ -1,3 +1,4 @@
1
+ import { reasoningRequestParams } from '@zerg/model-contracts';
1
2
  import { BaseBackend } from './base.js';
2
3
  export class GeminiBackend extends BaseBackend {
3
4
  apiKey;
@@ -13,7 +14,7 @@ export class GeminiBackend extends BaseBackend {
13
14
  if (typeof content === 'string') {
14
15
  return [{ text: content }];
15
16
  }
16
- return content.map(block => {
17
+ return content.filter(block => block.type !== 'thinking' && block.type !== 'redacted_thinking').map(block => {
17
18
  if (block.type === 'text') {
18
19
  return { text: block.text };
19
20
  }
@@ -33,6 +34,7 @@ export class GeminiBackend extends BaseBackend {
33
34
  });
34
35
  };
35
36
  const body = {
37
+ ...reasoningRequestParams('gemini', request.model, request.codexEffort),
36
38
  systemInstruction: { parts: [{ text: request.system }] },
37
39
  contents: request.messages.map(m => ({
38
40
  role: m.role === 'assistant' ? 'model' : 'user',
@@ -0,0 +1,26 @@
1
+ import type { HttpErrorDiagnostic } from './types.js';
2
+ type BodyReadState = HttpErrorDiagnostic['bodyReadState'];
3
+ /** Retains the canonical API-error envelope consumed by admission and OAuth adapters. */
4
+ export declare class BackendHttpError extends Error {
5
+ readonly status: number;
6
+ readonly body: string;
7
+ readonly httpError: HttpErrorDiagnostic;
8
+ /** Transport control only; never copied into the public body diagnostic. */
9
+ readonly retryAtMs?: number;
10
+ constructor(status: number, body: string, options?: {
11
+ prefix?: string;
12
+ headers?: RequestInit['headers'];
13
+ bodyReadState?: BodyReadState;
14
+ retryAfter?: string | null;
15
+ /** Router defines x-ratelimit-reset as relative seconds, not an epoch. */
16
+ rateLimitReset?: string | null;
17
+ });
18
+ }
19
+ /** Respect a server's minimum wait, then spread concurrent callers by up to one second. */
20
+ export declare function retryAfterDelayMs(error: unknown): number;
21
+ /** Read at most 16 KiB, then cancel. A failed body never erases already-known status. */
22
+ export declare function readHttpErrorBody(response: Response, signal?: AbortSignal): Promise<{
23
+ body: string;
24
+ bodyReadState: BodyReadState;
25
+ }>;
26
+ export {};