@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
@@ -0,0 +1,221 @@
1
+ import { MAX_TIMER_DELAY_MS } from '../../config/api_retry.js';
2
+ const BODY_BYTES = 16 * 1024;
3
+ const DIAGNOSTIC_BYTES = 4 * 1024;
4
+ const BODY_TIMEOUT_MS = 1000;
5
+ const REDACTED = '[REDACTED]';
6
+ const CREDENTIAL_NAME = 'x[-_]api[-_]key|api[-_]?key|access[-_]?token|refresh[-_]?token|token|password|passwd|client[-_]?secret|secret|authorization|proxy-authorization|cookie|set-cookie';
7
+ const CREDENTIAL_KEY = new RegExp(`^(?:${CREDENTIAL_NAME})$`, 'i');
8
+ const CREDENTIAL_ASSIGNMENT = new RegExp(`(?:["']?)(?:${CREDENTIAL_NAME})(?:["']?)\\s*[:=]\\s*`, 'i');
9
+ /** Retains the canonical API-error envelope consumed by admission and OAuth adapters. */
10
+ export class BackendHttpError extends Error {
11
+ status;
12
+ body;
13
+ httpError;
14
+ /** Transport control only; never copied into the public body diagnostic. */
15
+ retryAtMs;
16
+ constructor(status, body, options = {}) {
17
+ const raw = boundedText(body, BODY_BYTES);
18
+ const state = options.bodyReadState ?? (raw.truncated ? 'truncated' : 'complete');
19
+ const safe = boundedCanonicalBody(redact(raw.text, options.headers, state !== 'complete'));
20
+ super(`${options.prefix ?? 'API'} error (${status}): ${safe.text}`);
21
+ this.name = 'BackendHttpError';
22
+ this.status = status;
23
+ this.body = safe.text;
24
+ if (status === 429) {
25
+ const now = Date.now();
26
+ this.retryAtMs = parseRetryDeadline(options.retryAfter, now, true)
27
+ ?? parseRetryDeadline(options.rateLimitReset, now, false);
28
+ }
29
+ const diagnostic = boundedText(safe.text, DIAGNOSTIC_BYTES);
30
+ this.httpError = {
31
+ status,
32
+ body: diagnostic.text,
33
+ bodyTruncated: raw.truncated || safe.truncated || diagnostic.truncated || state !== 'complete',
34
+ bodyReadState: state,
35
+ };
36
+ }
37
+ }
38
+ function parseRetryDeadline(header, now, allowDate) {
39
+ if (header === undefined || header === null || header.length > 128)
40
+ return undefined;
41
+ const value = header.trim();
42
+ let delayMs;
43
+ if (/^\d+$/.test(value)) {
44
+ delayMs = Number(value) * 1000;
45
+ }
46
+ else if (allowDate && /^[A-Za-z]{3,9},? /.test(value)) {
47
+ // The obsolete asctime form has no zone; HTTP dates are always UTC.
48
+ const date = /^[A-Za-z]{3} [A-Za-z]{3} {1,2}\d{1,2} \d{2}:\d{2}:\d{2} \d{4}$/.test(value)
49
+ ? `${value} GMT` : value;
50
+ delayMs = Date.parse(date) - now;
51
+ }
52
+ else {
53
+ return undefined;
54
+ }
55
+ if (!Number.isFinite(delayMs))
56
+ return undefined;
57
+ return now + Math.min(MAX_TIMER_DELAY_MS, Math.max(0, delayMs));
58
+ }
59
+ /** Respect a server's minimum wait, then spread concurrent callers by up to one second. */
60
+ export function retryAfterDelayMs(error) {
61
+ if (!(error instanceof BackendHttpError) || error.retryAtMs === undefined)
62
+ return 0;
63
+ const remaining = error.retryAtMs - Date.now();
64
+ if (remaining <= 0)
65
+ return 0;
66
+ return Math.min(MAX_TIMER_DELAY_MS, remaining + Math.floor(Math.random() * 1000));
67
+ }
68
+ /** Read at most 16 KiB, then cancel. A failed body never erases already-known status. */
69
+ export async function readHttpErrorBody(response, signal) {
70
+ if (!response.body)
71
+ return { body: '', bodyReadState: 'complete' };
72
+ const reader = response.body.getReader();
73
+ const decoder = new TextDecoder();
74
+ let bytes = 0;
75
+ let body = '';
76
+ let bodyReadState = 'complete';
77
+ let stopRead;
78
+ const stopped = new Promise(resolve => { stopRead = resolve; });
79
+ const timer = setTimeout(() => stopRead('timeout'), BODY_TIMEOUT_MS);
80
+ const aborted = () => stopRead('failed');
81
+ signal?.addEventListener('abort', aborted, { once: true });
82
+ if (signal?.aborted)
83
+ aborted();
84
+ try {
85
+ while (true) {
86
+ const next = await Promise.race([reader.read(), stopped]);
87
+ if (typeof next === 'string') {
88
+ bodyReadState = next;
89
+ break;
90
+ }
91
+ if (next.done) {
92
+ body += decoder.decode();
93
+ break;
94
+ }
95
+ const remaining = BODY_BYTES - bytes;
96
+ body += decoder.decode(next.value.subarray(0, remaining), { stream: true });
97
+ bytes += Math.min(next.value.byteLength, remaining);
98
+ if (next.value.byteLength > remaining) {
99
+ bodyReadState = 'truncated';
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ catch {
105
+ bodyReadState = 'failed';
106
+ }
107
+ finally {
108
+ clearTimeout(timer);
109
+ signal?.removeEventListener('abort', aborted);
110
+ // Cancellation is best-effort: a broken peer must not hold diagnostics open.
111
+ if (bodyReadState !== 'complete')
112
+ void reader.cancel().catch(() => { });
113
+ reader.releaseLock();
114
+ }
115
+ return { body, bodyReadState };
116
+ }
117
+ function boundedText(text, maxBytes) {
118
+ const bytes = Buffer.from(text);
119
+ if (bytes.length <= maxBytes)
120
+ return { text, truncated: false };
121
+ // Streaming decode drops a split final code point rather than exceeding the byte cap.
122
+ return { text: new TextDecoder().decode(bytes.subarray(0, maxBytes), { stream: true }), truncated: true };
123
+ }
124
+ function boundedCanonicalBody(text) {
125
+ const bounded = boundedText(text, BODY_BYTES);
126
+ if (!bounded.truncated)
127
+ return bounded;
128
+ try {
129
+ const value = JSON.parse(text);
130
+ if (!value || typeof value !== 'object' || Array.isArray(value))
131
+ return bounded;
132
+ const source = value;
133
+ // Redaction can expand a complete body. Retain the small canonical fields
134
+ // used by admission and Kimi rate-limit parsing instead of cutting JSON.
135
+ const keys = ['type', 'status', 'statusCode', 'code', 'message', 'detail', 'statusMessage', 'retry_after', 'resets_at', 'provider_dispatched', 'source', 'limit', 'resetSeconds'];
136
+ const project = (record) => Object.fromEntries(keys.flatMap(key => {
137
+ const item = record[key];
138
+ // 39 strings × 64 bytes × worst-case JSON escaping stays below 16 KiB.
139
+ return typeof item === 'string' ? [[key, boundedText(item, 64).text]]
140
+ : typeof item === 'number' || typeof item === 'boolean' ? [[key, item]] : [];
141
+ }));
142
+ const result = project(source);
143
+ for (const key of ['error', 'data']) {
144
+ const item = source[key];
145
+ if (item && typeof item === 'object' && !Array.isArray(item))
146
+ result[key] = project(item);
147
+ else if (typeof item === 'string')
148
+ result[key] = boundedText(item, 64).text;
149
+ else if (typeof item === 'boolean')
150
+ result[key] = item;
151
+ }
152
+ return { text: JSON.stringify(result), truncated: true };
153
+ }
154
+ catch {
155
+ return bounded;
156
+ }
157
+ }
158
+ function redact(text, headers, incomplete) {
159
+ const secrets = new Set();
160
+ for (const [name, value] of new Headers(headers)) {
161
+ if (!/authorization|api[-_]?key|token|secret|credential|cookie/i.test(name) || !value)
162
+ continue;
163
+ secrets.add(value);
164
+ if (/^(?:Bearer|Basic)\s+/i.test(value))
165
+ secrets.add(value.replace(/^\S+\s+/, ''));
166
+ if (/cookie/i.test(name)) {
167
+ for (const part of value.split(';')) {
168
+ const separator = part.indexOf('=');
169
+ if (separator >= 0 && part.slice(separator + 1).trim())
170
+ secrets.add(part.slice(separator + 1).trim());
171
+ }
172
+ }
173
+ }
174
+ try {
175
+ // Decode strings first: credential labels embedded in JSON messages may be
176
+ // escaped on the wire. Sanitizing raw JSON could leave part of that value.
177
+ return JSON.stringify(JSON.parse(text, (key, value) => {
178
+ if (CREDENTIAL_KEY.test(key))
179
+ return REDACTED;
180
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
181
+ return Object.fromEntries(Object.entries(value).map(([name, item]) => [redactText(name, secrets, false), item]));
182
+ }
183
+ return typeof value === 'string' ? redactText(value, secrets, false) : value;
184
+ }));
185
+ }
186
+ catch {
187
+ // A cut JSON message can leave escaped quote delimiters around a credential
188
+ // label. Normalize those delimiters before the conservative raw-body pass.
189
+ return redactText(text.replace(/\\+(["'])/g, '$1'), secrets, incomplete);
190
+ }
191
+ }
192
+ function redactText(text, secrets, incomplete) {
193
+ if (incomplete) {
194
+ // An unfinished quoted credential can contain whitespace. None of the
195
+ // remaining tail is reliable as a delimiter, so keep only its label.
196
+ const assignment = CREDENTIAL_ASSIGNMENT.exec(text);
197
+ if (assignment)
198
+ text = text.slice(0, assignment.index + assignment[0].length) + REDACTED;
199
+ }
200
+ for (const secret of [...secrets].sort((a, b) => b.length - a.length)) {
201
+ for (const form of new Set([secret, JSON.stringify(secret).slice(1, -1), encodeURIComponent(secret)])) {
202
+ text = text.split(form).join(REDACTED);
203
+ if (incomplete) {
204
+ // A raw capture may end inside an echoed credential. Remove its suffix
205
+ // even when the full value never arrived inside our byte budget.
206
+ for (let start = text.lastIndexOf(form[0]); start >= 0; start = text.lastIndexOf(form[0], start - 1)) {
207
+ if (form.startsWith(text.slice(start))) {
208
+ text = text.slice(0, start) + REDACTED;
209
+ break;
210
+ }
211
+ if (start === 0)
212
+ break;
213
+ }
214
+ }
215
+ }
216
+ }
217
+ return text
218
+ .replace(/\b(Bearer|Basic)\s+[A-Za-z0-9._~+/=-]+/gi, '$1 [REDACTED]')
219
+ .replace(/((?:["']?)(?:x[-_]api[-_]key|api[-_]?key|access[-_]?token|refresh[-_]?token|token|password|passwd|client[-_]?secret|secret|authorization|proxy-authorization|cookie|set-cookie)(?:["']?)\s*[:=]\s*)("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[^\s,;}\]]+)/gi, (_match, key, value) => `${key}${value.startsWith('"') ? '"[REDACTED]"' : value.startsWith("'") ? "'[REDACTED]'" : REDACTED}`)
220
+ .replace(/\bsk-[A-Za-z0-9_-]+/g, REDACTED);
221
+ }
@@ -1,4 +1,5 @@
1
- export { AnthropicBackend, AnthropicApiError } from './anthropic.js';
1
+ export { AnthropicBackend, AnthropicApiError, createNativeAnthropicMessagesRouterBackend } from './anthropic.js';
2
+ export type { NativeAnthropicMessagesRouterConfig } from './anthropic.js';
2
3
  export { OpenAIBackend } from './openai.js';
3
4
  export { OpenAICompatibleBackend } from './openai_compatible.js';
4
5
  export { OpenAIResponsesBackend } from './openai_responses.js';
@@ -14,7 +15,7 @@ export { ClarifaiBackend, normalizeClarifaiModel, CLARIFAI_BASE_URL } from './cl
14
15
  export { ClaudeCodeAuthBackend, ClaudeCodeAuthManager } from './claude_code_auth.js';
15
16
  export { KimiCodeAuthBackend, KimiCodeAuthManager, KIMI_CODE_AUTH_SENTINEL, KIMI_CODE_PROVIDER, hasUsableKimiCodeAuth } from './kimi_code_auth.js';
16
17
  export { ClaudeCliBackend, ClaudeCliError, CLAUDE_CODE_AUTH_SENTINEL, hasUsableClaudeCodeCliAuth as hasUsableClaudeCodeAuth } from './claude_cli.js';
17
- export type { AgentBackend, BackendObservation, BackendRequest, BackendResponse, ContentBlock, TextBlock, ToolUseBlock, LlmMessage, RequestContentBlock, RequestVideoBlock, ToolResultBlock, TokenUsage, StreamEvent } from './types.js';
18
+ export type { AgentBackend, BackendObservation, BackendRequest, BackendResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, RedactedThinkingBlock, LlmMessage, RequestContentBlock, RequestVideoBlock, ToolResultBlock, TokenUsage, StreamEvent } from './types.js';
18
19
  import type { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
19
20
  import { AccountPool, type RotationMode } from './account_rotation.js';
20
21
  import type { Message } from '../../types.js';
@@ -58,7 +59,10 @@ export interface CreateBackendOptions {
58
59
  export declare class TracedBackend implements AgentBackend {
59
60
  private readonly provider;
60
61
  private readonly backend;
62
+ get preservesNativeHistory(): boolean;
63
+ isAuthenticationConfigured(): boolean;
61
64
  constructor(provider: string, backend: AgentBackend);
65
+ getModelCapabilities(model: string): import("../../utils/router_catalog.js").RouterModelCapabilities | undefined;
62
66
  steerUserMessage(message: Message): Promise<boolean>;
63
67
  /** Forward disposal so a process-backed inner (RotatingBackend, codex child)
64
68
  * is closed when the agent is. Without this, tracing (ZTC_BACKEND_TRACE=1)
@@ -66,6 +70,9 @@ export declare class TracedBackend implements AgentBackend {
66
70
  close(): void;
67
71
  /** Forward the wrapped backend's per-request streaming nature so the agent's path choice is unchanged by tracing. */
68
72
  streamsSyntheticallyFor(request: BackendRequest): boolean;
73
+ allowsRequestRetryAfterFailure(request: BackendRequest): boolean;
74
+ allowsBufferedFallbackAfterStreamFailure(request: BackendRequest): boolean;
75
+ handlesTransportRetries(request: BackendRequest): boolean;
69
76
  generate(request: BackendRequest): Promise<BackendResponse>;
70
77
  generateStream(request: BackendRequest): AsyncIterable<StreamEvent>;
71
78
  }
@@ -1,4 +1,4 @@
1
- export { AnthropicBackend, AnthropicApiError } from './anthropic.js';
1
+ export { AnthropicBackend, AnthropicApiError, createNativeAnthropicMessagesRouterBackend } from './anthropic.js';
2
2
  export { OpenAIBackend } from './openai.js';
3
3
  export { OpenAICompatibleBackend } from './openai_compatible.js';
4
4
  export { OpenAIResponsesBackend } from './openai_responses.js';
@@ -34,10 +34,13 @@ import { RotatingBackend } from './account_rotation.js';
34
34
  export class TracedBackend {
35
35
  provider;
36
36
  backend;
37
+ get preservesNativeHistory() { return this.backend.preservesNativeHistory ?? false; }
38
+ isAuthenticationConfigured() { return this.backend.isAuthenticationConfigured?.() ?? false; }
37
39
  constructor(provider, backend) {
38
40
  this.provider = provider;
39
41
  this.backend = backend;
40
42
  }
43
+ getModelCapabilities(model) { return this.backend.getModelCapabilities?.(model); }
41
44
  async steerUserMessage(message) {
42
45
  return this.backend.steerUserMessage?.(message) ?? false;
43
46
  }
@@ -51,6 +54,15 @@ export class TracedBackend {
51
54
  streamsSyntheticallyFor(request) {
52
55
  return this.backend.streamsSyntheticallyFor?.(request) ?? false;
53
56
  }
57
+ allowsRequestRetryAfterFailure(request) {
58
+ return this.backend.allowsRequestRetryAfterFailure?.(request) ?? true;
59
+ }
60
+ allowsBufferedFallbackAfterStreamFailure(request) {
61
+ return this.backend.allowsBufferedFallbackAfterStreamFailure?.(request) ?? true;
62
+ }
63
+ handlesTransportRetries(request) {
64
+ return this.backend.handlesTransportRetries?.(request) ?? false;
65
+ }
54
66
  async generate(request) {
55
67
  writeBackendTrace({ event: 'request', provider: this.provider, backend: this.backend.constructor.name, model: request.model });
56
68
  const startedAt = Date.now();
@@ -148,10 +160,17 @@ export function createBackendForProvider(provider, opts) {
148
160
  return traced(provider, new KimiBackend({ apiKey: opts.apiKey }));
149
161
  case 'deepseek':
150
162
  return traced(provider, new OpenAICompatibleBackend({
163
+ provider: 'deepseek',
151
164
  apiKey: opts.apiKey,
152
165
  baseUrl: opts.baseUrl || 'https://api.deepseek.com/v1',
153
166
  requestBodyExtras: deepseekRequestParams,
154
167
  }));
168
+ case 'fireworks':
169
+ return traced(provider, new OpenAICompatibleBackend({
170
+ apiKey: opts.apiKey,
171
+ baseUrl: opts.baseUrl || 'https://api.fireworks.ai/inference/v1',
172
+ provider: 'fireworks',
173
+ }));
155
174
  case 'clarifai':
156
175
  return traced(provider, new ClarifaiBackend({ apiKey: opts.apiKey, headers: opts.extraHeaders }));
157
176
  case CODEX_APP_SERVER_PROVIDER:
@@ -206,7 +225,8 @@ export function createBackendForProvider(provider, opts) {
206
225
  }
207
226
  case 'anthropic':
208
227
  case 'claude':
209
- default:
210
228
  return traced(provider, new AnthropicBackend({ apiKey: opts.apiKey, apiEndpoint: opts.apiEndpoint }));
229
+ default:
230
+ throw new Error(`Unknown provider: ${provider}. Select a Router integration or a supported direct provider.`);
211
231
  }
212
232
  }
@@ -1,9 +1,3 @@
1
- /**
2
- * OpenAI backend — smart router between Chat Completions and Responses API.
3
- *
4
- * Codex models and GPT-6 Sol/Luna use Responses so reasoning and tool calls
5
- * can be combined. Everything else goes through Chat Completions.
6
- */
7
1
  import { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
8
2
  interface OpenAIConfig {
9
3
  apiKey: string;
@@ -1,7 +1,8 @@
1
+ import { modelContract } from '@zerg/model-contracts';
1
2
  /**
2
3
  * OpenAI backend — smart router between Chat Completions and Responses API.
3
4
  *
4
- * Codex models and GPT-6 Sol/Luna use Responses so reasoning and tool calls
5
+ * Codex models and reviewed Responses tool models use Responses so reasoning and tool calls
5
6
  * can be combined. Everything else goes through Chat Completions.
6
7
  */
7
8
  import { OpenAICompatibleBackend } from './openai_compatible.js';
@@ -12,7 +13,8 @@ const RESPONSES_API_PATTERNS = [
12
13
  /^gpt-6-(?:sol|luna)$/i,
13
14
  ];
14
15
  function needsResponsesAPI(model) {
15
- return RESPONSES_API_PATTERNS.some(p => p.test(model));
16
+ return modelContract('openai', model)?.chatToolReasoningEfforts !== undefined
17
+ || RESPONSES_API_PATTERNS.some(p => p.test(model));
16
18
  }
17
19
  export class OpenAIBackend {
18
20
  chatBackend;
@@ -23,6 +25,7 @@ export class OpenAIBackend {
23
25
  apiKey: config.apiKey,
24
26
  baseUrl,
25
27
  apiPath: '/chat/completions',
28
+ provider: 'openai',
26
29
  });
27
30
  this.responsesBackend = new OpenAIResponsesBackend({
28
31
  apiKey: config.apiKey,
@@ -1,3 +1,4 @@
1
+ import { BackendHttpError } from './http_error.js';
1
2
  import { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
2
3
  interface OpenAICompatibleConfig {
3
4
  apiKey: string;
@@ -18,12 +19,11 @@ interface OpenAICompatibleConfig {
18
19
  * Cannot override `model`/`messages`/`tools`/the token limit — those are set
19
20
  * after this spread.
20
21
  */
22
+ provider?: string;
21
23
  requestBodyExtras?: (request: BackendRequest) => Record<string, unknown>;
22
24
  }
23
- export declare class OpenAICompatibleApiError extends Error {
24
- readonly status: number;
25
- readonly body: string;
26
- constructor(status: number, body: string);
25
+ export declare class OpenAICompatibleApiError extends BackendHttpError {
26
+ constructor(status: number, body: string, options?: ConstructorParameters<typeof BackendHttpError>[2]);
27
27
  }
28
28
  export declare class OpenAICompatibleBackend implements AgentBackend {
29
29
  private apiKey;
@@ -31,6 +31,7 @@ export declare class OpenAICompatibleBackend implements AgentBackend {
31
31
  private apiPath;
32
32
  private headers;
33
33
  private extraBody;
34
+ private provider?;
34
35
  private requestBodyExtras?;
35
36
  private authTokenProvider?;
36
37
  constructor(config: OpenAICompatibleConfig);
@@ -1,18 +1,16 @@
1
+ import { fireworksRequestModel, modelContract, reasoningRequestParams } from '@zerg/model-contracts';
1
2
  import { measureResponse, measureStream } from './request_metrics.js';
3
+ import { BackendHttpError, readHttpErrorBody } from './http_error.js';
2
4
  import { parseSSEStream } from './sse.js';
3
5
  import { parseTokenUsage } from './token_usage.js';
4
6
  import { buildOpenAIMessages, buildOpenAIToolDefs } from './openai_format.js';
5
7
  import { isKimiModel } from './kimi_params.js';
6
8
  import { normalizeOpenAICompatibleCompletionState } from '../completion_state.js';
7
9
  import { DEEPSEEK_FLASH_MAX_OUTPUT, isDeepSeekFlashModel } from '../../utils/deepseek.js';
8
- export class OpenAICompatibleApiError extends Error {
9
- status;
10
- body;
11
- constructor(status, body) {
12
- super(`API error (${status}): ${body}`);
10
+ export class OpenAICompatibleApiError extends BackendHttpError {
11
+ constructor(status, body, options) {
12
+ super(status, body, options);
13
13
  this.name = 'OpenAICompatibleApiError';
14
- this.status = status;
15
- this.body = body;
16
14
  }
17
15
  }
18
16
  export class OpenAICompatibleBackend {
@@ -21,6 +19,7 @@ export class OpenAICompatibleBackend {
21
19
  apiPath;
22
20
  headers;
23
21
  extraBody;
22
+ provider;
24
23
  requestBodyExtras;
25
24
  authTokenProvider;
26
25
  constructor(config) {
@@ -29,6 +28,7 @@ export class OpenAICompatibleBackend {
29
28
  this.apiPath = config.apiPath || '/chat/completions';
30
29
  this.headers = config.headers || {};
31
30
  this.extraBody = config.extraBody || {};
31
+ this.provider = config.provider;
32
32
  this.requestBodyExtras = config.requestBodyExtras;
33
33
  this.authTokenProvider = config.authTokenProvider;
34
34
  }
@@ -39,29 +39,36 @@ export class OpenAICompatibleBackend {
39
39
  // O-series (o1, o3, o4-mini) and GPT-5/6 use max_completion_tokens instead of
40
40
  // max_tokens; Moonshot marks max_tokens "Deprecated, please refer to
41
41
  // max_completion_tokens" for the Kimi models too.
42
- const useCompletionTokens = /^o\d/.test(request.model)
42
+ const useCompletionTokens = this.provider === 'fireworks' ? false : /^o\d/.test(request.model)
43
43
  || /^gpt-[56]/.test(request.model)
44
44
  || isKimiModel(request.model);
45
45
  // Cap max_tokens for models with lower limits (gpt-4o: 16384)
46
46
  const isGpt4o = request.model.startsWith('gpt-4o');
47
- const limit = isGpt4o ? 16384 : isDeepSeekFlashModel(request.model) ? DEEPSEEK_FLASH_MAX_OUTPUT : Infinity;
47
+ const reviewedLimit = this.provider ? modelContract(this.provider, request.model)?.maxOutputTokens?.max : undefined;
48
+ const limit = reviewedLimit ?? (isGpt4o ? 16384 : isDeepSeekFlashModel(request.model) ? DEEPSEEK_FLASH_MAX_OUTPUT : Infinity);
48
49
  const effectiveMaxTokens = request.maxTokens === undefined ? undefined : Math.min(request.maxTokens, limit);
49
50
  const tokenParam = effectiveMaxTokens === undefined ? {} : useCompletionTokens
50
51
  ? { max_completion_tokens: effectiveMaxTokens }
51
52
  : { max_tokens: effectiveMaxTokens };
52
- const isGpt6Model = /^gpt-6-(?:sol|luna)$/i.test(request.model);
53
- const reasoningEffort = (request.model === 'gpt-5.6-sol' || isGpt6Model) && request.tools.length > 0
54
- ? 'none'
55
- : isGpt6Model ? request.codexEffort : undefined;
53
+ // Chat tool support differs from Responses. Never silently downgrade an
54
+ // explicit grade; default Chat requests use the reviewed tool-safe value.
55
+ const policyProvider = this.provider ?? 'openai';
56
+ const chatEfforts = modelContract(policyProvider, request.model)?.chatToolReasoningEfforts;
57
+ const toolRestricted = request.tools.length > 0 && chatEfforts !== undefined;
58
+ if (toolRestricted && request.codexEffort !== undefined && !chatEfforts.includes(request.codexEffort)) {
59
+ throw new Error('Use Responses for graded reasoning with tools on this model. Chat Completions supports effort none.');
60
+ }
61
+ const reasoningEffort = toolRestricted ? request.codexEffort ?? 'none' : request.codexEffort;
56
62
  const body = {
57
63
  ...this.extraBody,
64
+ ...reasoningRequestParams(policyProvider, request.model, reasoningEffort),
58
65
  ...(this.requestBodyExtras?.(request) ?? {}),
59
- model: request.model,
66
+ model: this.provider === 'fireworks' ? fireworksRequestModel(request.model) : request.model,
60
67
  ...tokenParam,
61
68
  // Chat Completions accepts GPT-6 Sol/Luna function tools only with
62
69
  // reasoning disabled. The direct OpenAI backend uses Responses instead;
63
70
  // keep this rule for explicitly configured compatible endpoints.
64
- ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),
71
+ ...(toolRestricted ? { reasoning_effort: reasoningEffort } : {}),
65
72
  messages: buildOpenAIMessages(request),
66
73
  ...(request.tools.length > 0 ? { tools: buildOpenAIToolDefs(request.tools) } : {})
67
74
  };
@@ -97,8 +104,8 @@ export class OpenAICompatibleBackend {
97
104
  'Check network access, proxy configuration, and API key/model access.');
98
105
  }
99
106
  if (!response.ok) {
100
- const errorText = await response.text();
101
- throw new OpenAICompatibleApiError(response.status, errorText);
107
+ const failure = await readHttpErrorBody(response, request.signal);
108
+ throw new OpenAICompatibleApiError(response.status, failure.body, { headers, bodyReadState: failure.bodyReadState });
102
109
  }
103
110
  const data = await response.json();
104
111
  const choice = data.choices?.[0];
@@ -168,8 +175,8 @@ export class OpenAICompatibleBackend {
168
175
  'Check network access, proxy configuration, and API key/model access.');
169
176
  }
170
177
  if (!response.ok) {
171
- const errorText = await response.text();
172
- throw new OpenAICompatibleApiError(response.status, errorText);
178
+ const failure = await readHttpErrorBody(response, request.signal);
179
+ throw new OpenAICompatibleApiError(response.status, failure.body, { headers, bodyReadState: failure.bodyReadState });
173
180
  }
174
181
  if (!response.body) {
175
182
  throw new Error('API error: no response body for streaming request');
@@ -72,9 +72,14 @@ export declare function isValidResponsesOutputItem(value: unknown): value is Rec
72
72
  export declare function requireValidResponsesOutputItem(value: unknown): asserts value is Record<string, unknown>;
73
73
  /** A terminal event must carry a valid response shape or follow real output. */
74
74
  export declare function isValidResponsesTerminal(value: unknown, observedOutput?: boolean): value is Record<string, unknown>;
75
- export declare const MAX_RESPONSES_RESPONSE_BYTES = 1048576;
75
+ export declare const MAX_RESPONSES_RESPONSE_BYTES: number;
76
+ export declare const MAX_PROVIDER_ERROR_BYTES: number;
77
+ export declare const MAX_RESPONSES_SSE_EVENT_BYTES: number;
78
+ export declare const MAX_RESPONSES_SSE_STREAM_BYTES: number;
76
79
  /** Read a provider body without allowing fetch helpers to buffer it without limit. */
77
- export declare function readBoundedResponsesText(response: Response): Promise<string>;
80
+ export declare function readBoundedResponsesText(response: Response, maxBytes?: number): Promise<string>;
81
+ /** Keep the HTTP status authoritative when an oversized diagnostic must be omitted. */
82
+ export declare function readBoundedProviderError(response: Response): Promise<string>;
78
83
  interface InputTextContent {
79
84
  type: 'input_text';
80
85
  text: string;
@@ -128,7 +133,7 @@ export declare function parseResponsesOutput(data: {
128
133
  * request was sent with `stream: true`). If the body isn't readable (rare), it
129
134
  * buffers the SSE text and parses it whole — the same events, just not live.
130
135
  */
131
- export declare function streamResponsesSSE(response: Response): AsyncIterable<StreamEvent>;
136
+ export declare function streamResponsesSSE(response: Response, maxBytes?: number): AsyncIterable<StreamEvent>;
132
137
  export declare class OpenAIResponsesBackend extends BaseBackend {
133
138
  private apiKey;
134
139
  private baseUrl;