@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
@@ -101,8 +101,12 @@ export declare class RotatingBackend implements AgentBackend {
101
101
  */
102
102
  private current;
103
103
  private steeringAccepted;
104
+ private lastRequestRetryAllowed;
104
105
  constructor(opts: RotatingBackendOptions);
105
106
  steerUserMessage(message: Message): Promise<boolean>;
107
+ /** Preserve the admission decision of the backend that actually dispatched,
108
+ * even after rotation selects a different account for the next user turn. */
109
+ allowsRequestRetryAfterFailure(): boolean;
106
110
  /** Close a per-turn inner and forget it as current if it still is. */
107
111
  private releaseInner;
108
112
  /**
@@ -121,6 +121,7 @@ export class RotatingBackend {
121
121
  */
122
122
  current = null;
123
123
  steeringAccepted = false;
124
+ lastRequestRetryAllowed = true;
124
125
  constructor(opts) {
125
126
  this.opts = opts;
126
127
  this.now = opts.now ?? (() => Date.now());
@@ -131,6 +132,9 @@ export class RotatingBackend {
131
132
  this.steeringAccepted = true;
132
133
  return accepted;
133
134
  }
135
+ /** Preserve the admission decision of the backend that actually dispatched,
136
+ * even after rotation selects a different account for the next user turn. */
137
+ allowsRequestRetryAfterFailure() { return this.lastRequestRetryAllowed; }
134
138
  /** Close a per-turn inner and forget it as current if it still is. */
135
139
  releaseInner(inner) {
136
140
  if (this.current === inner) {
@@ -229,6 +233,7 @@ export class RotatingBackend {
229
233
  if (!account)
230
234
  throw this.terminalError();
231
235
  const inner = this.current = this.opts.buildInner(account);
236
+ this.lastRequestRetryAllowed = inner.allowsRequestRetryAfterFailure?.(req) !== false;
232
237
  this.steeringAccepted = false;
233
238
  try {
234
239
  return await inner.generate(req);
@@ -250,7 +255,7 @@ export class RotatingBackend {
250
255
  const next = this.rotate(account, sig);
251
256
  // A dynamic tool already ran this turn -> replaying re-fires its side
252
257
  // effect. Cool the failed account for the next turn, but surface this error.
253
- if (replayUnsafe || this.steeringAccepted)
258
+ if (!this.lastRequestRetryAllowed || replayUnsafe || this.steeringAccepted)
254
259
  throw error;
255
260
  if (!next)
256
261
  throw this.terminalError();
@@ -273,6 +278,7 @@ export class RotatingBackend {
273
278
  throw this.terminalError();
274
279
  let emitted = false;
275
280
  const inner = this.current = this.opts.buildInner(account);
281
+ this.lastRequestRetryAllowed = inner.allowsRequestRetryAfterFailure?.(req) !== false;
276
282
  this.steeringAccepted = false;
277
283
  try {
278
284
  // generateStream is required on AgentBackend — no fallback probe.
@@ -299,7 +305,7 @@ export class RotatingBackend {
299
305
  const next = this.rotate(account, sig);
300
306
  // Mid-stream partial output OR a dynamic tool that already ran -> can't
301
307
  // replay cleanly. Pool is rotated for the next turn; surface this error.
302
- if (emitted || replayUnsafe || this.steeringAccepted)
308
+ if (!this.lastRequestRetryAllowed || emitted || replayUnsafe || this.steeringAccepted)
303
309
  throw error;
304
310
  if (!next)
305
311
  throw this.terminalError();
@@ -4,14 +4,27 @@ interface AnthropicBackendConfig {
4
4
  authToken?: string;
5
5
  authTokenProvider?: () => Promise<string>;
6
6
  apiEndpoint?: string;
7
+ validateStrictTools?: boolean;
8
+ preserveNativeHistory?: boolean;
7
9
  }
10
+ export interface NativeAnthropicMessagesRouterConfig {
11
+ baseUrl: string;
12
+ authToken?: string;
13
+ authTokenProvider?: () => Promise<string>;
14
+ }
15
+ /** Hosted transport with no provider-key or ambient-credential path. */
16
+ export declare function createNativeAnthropicMessagesRouterBackend(config: NativeAnthropicMessagesRouterConfig): AnthropicBackend;
8
17
  export declare class AnthropicBackend implements AgentBackend {
18
+ readonly preservesNativeHistory: boolean;
9
19
  private apiKey?;
10
20
  private authToken?;
11
21
  private authTokenProvider?;
12
22
  private apiEndpoint;
13
23
  private cacheControl;
24
+ private readonly validateStrictTools;
14
25
  constructor(config: AnthropicBackendConfig);
26
+ isAuthenticationConfigured(): boolean;
27
+ allowsBufferedFallbackAfterStreamFailure(): boolean;
15
28
  private buildHeaders;
16
29
  private buildBody;
17
30
  generate(request: BackendRequest): Promise<BackendResponse>;
@@ -1,5 +1,57 @@
1
+ import { modelContract } from '@zerg/model-contracts';
1
2
  import { parseSSEStream } from './sse.js';
2
- import { getSupportedClaudeReasoningEfforts } from '../../utils/models.js';
3
+ import { readBoundedProviderError } from './openai_responses.js';
4
+ /** Hosted transport with no provider-key or ambient-credential path. */
5
+ export function createNativeAnthropicMessagesRouterBackend(config) {
6
+ const url = new URL(config.baseUrl);
7
+ if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) {
8
+ throw new Error('Native Anthropic Router requires an HTTP(S) base URL without credentials, query or fragment');
9
+ }
10
+ if (!config.authToken?.trim() && !config.authTokenProvider) {
11
+ throw new Error('Native Anthropic Router requires a scoped bearer credential');
12
+ }
13
+ return new AnthropicBackend({
14
+ apiEndpoint: `${url.toString().replace(/\/+$/, '')}/v1/messages`,
15
+ authToken: config.authToken,
16
+ authTokenProvider: config.authTokenProvider,
17
+ validateStrictTools: true,
18
+ preserveNativeHistory: true,
19
+ });
20
+ }
21
+ /** Reject unsupported strict constraints; never silently narrow an open map. */
22
+ function validateNativeStrictSchema(name, schema) {
23
+ if ((schema.type === 'object' || schema.properties !== undefined || schema.additionalProperties !== undefined)
24
+ && schema.additionalProperties !== false) {
25
+ throw new Error(`Native Anthropic Router tool "${name}" requires additionalProperties:false on every object; use a closed schema or a validated JSON string`);
26
+ }
27
+ for (const key of ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',
28
+ 'minLength', 'maxLength', 'maxItems', 'uniqueItems', 'contains', 'minContains', 'maxContains']) {
29
+ if (schema[key] !== undefined)
30
+ throw new Error(`Native Anthropic Router tool "${name}" does not support ${key}; validate that constraint in the host`);
31
+ }
32
+ if (schema.minItems !== undefined && schema.minItems !== 0 && schema.minItems !== 1) {
33
+ throw new Error(`Native Anthropic Router tool "${name}" supports only minItems 0 or 1`);
34
+ }
35
+ if (typeof schema.$ref === 'string' && !schema.$ref.startsWith('#/')) {
36
+ throw new Error(`Native Anthropic Router tool "${name}" does not support external schema references`);
37
+ }
38
+ for (const key of ['properties', '$defs', 'definitions']) {
39
+ const definitions = schema[key];
40
+ if (definitions && typeof definitions === 'object' && !Array.isArray(definitions)) {
41
+ for (const child of Object.values(definitions)) {
42
+ if (child && typeof child === 'object' && !Array.isArray(child))
43
+ validateNativeStrictSchema(name, child);
44
+ }
45
+ }
46
+ }
47
+ for (const key of ['items', 'anyOf', 'allOf', 'oneOf']) {
48
+ const children = schema[key];
49
+ for (const child of Array.isArray(children) ? children : [children]) {
50
+ if (child && typeof child === 'object' && !Array.isArray(child))
51
+ validateNativeStrictSchema(name, child);
52
+ }
53
+ }
54
+ }
3
55
  // The TRUE context size for a request = uncached input + cache-read + cache-write.
4
56
  // Reading only input_tokens makes the context bar jump BACKWARDS on a cache hit
5
57
  // (input_tokens is then just the small uncached delta), which looks non-monotonic.
@@ -10,29 +62,37 @@ function anthropicInputTokens(usage) {
10
62
  }
11
63
  const EXTENDED_CACHE_BETA = 'extended-cache-ttl-2025-04-11';
12
64
  export class AnthropicBackend {
65
+ preservesNativeHistory;
13
66
  apiKey;
14
67
  authToken;
15
68
  authTokenProvider;
16
69
  apiEndpoint;
17
70
  cacheControl;
71
+ validateStrictTools;
18
72
  constructor(config) {
19
73
  this.apiKey = config.apiKey;
20
74
  this.authToken = config.authToken;
21
75
  this.authTokenProvider = config.authTokenProvider;
22
76
  this.apiEndpoint = config.apiEndpoint || 'https://api.anthropic.com/v1/messages';
77
+ this.validateStrictTools = config.validateStrictTools ?? false;
78
+ this.preservesNativeHistory = config.preserveNativeHistory ?? false;
23
79
  const ttl = (process.env.ZTC_PROMPT_CACHE_TTL || '1h').toLowerCase();
24
80
  this.cacheControl = ttl === 'off' ? null : ttl === '5m' ? { type: 'ephemeral' } : { type: 'ephemeral', ttl: '1h' };
25
81
  }
82
+ isAuthenticationConfigured() {
83
+ return Boolean(this.apiKey || this.authToken || this.authTokenProvider);
84
+ }
85
+ allowsBufferedFallbackAfterStreamFailure() { return false; }
26
86
  async buildHeaders() {
27
87
  const headers = {
28
88
  'Content-Type': 'application/json',
29
89
  'anthropic-version': '2023-06-01'
30
90
  };
31
91
  const authToken = this.authTokenProvider ? await this.authTokenProvider() : this.authToken;
32
- if (authToken) {
92
+ if (authToken?.trim()) {
33
93
  headers.Authorization = `Bearer ${authToken}`;
34
94
  }
35
- else if (this.apiKey) {
95
+ else if (this.apiKey && !this.authTokenProvider) {
36
96
  headers['x-api-key'] = this.apiKey;
37
97
  }
38
98
  else {
@@ -60,6 +120,9 @@ export class AnthropicBackend {
60
120
  if (block.type === 'tool_use') {
61
121
  return block;
62
122
  }
123
+ if (block.type === 'thinking' || block.type === 'redacted_thinking') {
124
+ return block;
125
+ }
63
126
  if (block.type === 'video') {
64
127
  return { type: 'video', source: { type: 'base64', media_type: block.mediaType, data: block.data } };
65
128
  }
@@ -67,11 +130,28 @@ export class AnthropicBackend {
67
130
  return { type: 'image', source: { type: 'base64', media_type: block.mediaType, data: block.data } };
68
131
  })
69
132
  }));
70
- const tools = request.tools.map(t => ({
71
- name: t.name,
72
- description: t.description,
73
- input_schema: t.parameters
74
- }));
133
+ const opus55 = /^claude-opus-5-5(?:$|-)/.test(request.model);
134
+ const tools = request.tools.map(t => {
135
+ let strict = false;
136
+ if (opus55) {
137
+ try {
138
+ validateNativeStrictSchema(t.name, t.parameters);
139
+ strict = true;
140
+ }
141
+ catch (error) {
142
+ // The hosted native transport requires closed, supported schemas.
143
+ // Direct credentials retain the caller's valid non-strict schemas.
144
+ if (this.validateStrictTools)
145
+ throw error;
146
+ }
147
+ }
148
+ return {
149
+ name: t.name,
150
+ description: t.description,
151
+ input_schema: t.parameters,
152
+ ...(strict ? { strict: true } : {}),
153
+ };
154
+ });
75
155
  // Render order is tools → system → messages. A breakpoint on the last system
76
156
  // block caches tools+system together; a breakpoint on the last message block
77
157
  // caches the conversation prefix. On the next turn (or a wake within the TTL)
@@ -89,8 +169,12 @@ export class AnthropicBackend {
89
169
  lastMsg.content = [{ type: 'text', text: lastMsg.content, cache_control: cc }];
90
170
  }
91
171
  else if (Array.isArray(lastMsg.content) && lastMsg.content.length > 0) {
92
- const i = lastMsg.content.length - 1;
93
- lastMsg.content[i] = { ...lastMsg.content[i], cache_control: cc };
172
+ // Signed blocks cannot accept cache-control or any other mutation.
173
+ let i = lastMsg.content.length - 1;
174
+ while (i >= 0 && ['thinking', 'redacted_thinking'].includes(lastMsg.content[i].type))
175
+ i--;
176
+ if (i >= 0)
177
+ lastMsg.content[i] = { ...lastMsg.content[i], cache_control: cc };
94
178
  }
95
179
  }
96
180
  // With no system to anchor it, the tools cache needs its own breakpoint on
@@ -99,16 +183,11 @@ export class AnthropicBackend {
99
183
  tools[tools.length - 1] = { ...tools[tools.length - 1], cache_control: cc };
100
184
  }
101
185
  }
102
- // Reasoning effort (GA on Opus 4.5+/Sonnet 4.6): output_config.effort. The
103
- // value rides on request.codexEffort (the generic per-pane effort). 'minimal'
104
- // is codex-only; the Anthropic API accepts low|medium|high|xhigh|max. Gate on
105
- // the target model too: Haiku exposes NO effort parameter, so sending one
106
- // hard-400s every turn — getSupportedClaudeReasoningEfforts returns [] for it
107
- // (drop) and undefined for unrecognized ids (stay permissive).
108
- const effort = request.codexEffort;
109
- const supportedEfforts = getSupportedClaudeReasoningEfforts(request.model);
110
- const modelAllowsEffort = supportedEfforts === undefined ||
111
- (effort !== undefined && supportedEfforts.includes(effort));
186
+ // Exact reviewed families, including dated aliases, own the effort ladder.
187
+ // Unknown families and Haiku expose no unverified effort parameter.
188
+ const effort = request.codexEffort ?? (opus55 ? 'high' : undefined);
189
+ const supportedEfforts = modelContract('anthropic', request.model)?.reasoningEfforts ?? [];
190
+ const modelAllowsEffort = effort !== undefined && supportedEfforts.includes(effort);
112
191
  const outputConfig = effort && ['low', 'medium', 'high', 'xhigh', 'max'].includes(effort) && modelAllowsEffort
113
192
  ? { output_config: { effort } }
114
193
  : {};
@@ -119,6 +198,7 @@ export class AnthropicBackend {
119
198
  system,
120
199
  messages,
121
200
  tools,
201
+ ...(opus55 ? { thinking: { type: 'adaptive' }, tool_choice: { type: 'auto' } } : {}),
122
202
  ...outputConfig,
123
203
  };
124
204
  }
@@ -131,7 +211,7 @@ export class AnthropicBackend {
131
211
  signal: request.signal,
132
212
  });
133
213
  if (!response.ok) {
134
- const errorText = await response.text();
214
+ const errorText = await readBoundedProviderError(response);
135
215
  throw new AnthropicApiError(response.status, errorText);
136
216
  }
137
217
  const data = await response.json();
@@ -140,6 +220,7 @@ export class AnthropicBackend {
140
220
  return {
141
221
  content: data.content,
142
222
  stopReason: data.stop_reason,
223
+ ...(data.stop_details ? { stopDetails: data.stop_details } : {}),
143
224
  usage: data.usage ? {
144
225
  inputTokens,
145
226
  outputTokens,
@@ -156,13 +237,18 @@ export class AnthropicBackend {
156
237
  signal: request.signal,
157
238
  });
158
239
  if (!response.ok) {
159
- const errorText = await response.text();
240
+ const errorText = await readBoundedProviderError(response);
160
241
  throw new AnthropicApiError(response.status, errorText);
161
242
  }
162
243
  if (!response.body) {
163
244
  throw new Error('API error: no response body for streaming request');
164
245
  }
165
246
  let stopReason = 'end_turn';
247
+ let messageCompleted = false;
248
+ let stopDetails;
249
+ let accumulatedUsage = {};
250
+ const blocks = new Map();
251
+ const toolInputs = new Map();
166
252
  // Track index → real tool ID mapping (Anthropic sends real ID only in content_block_start)
167
253
  const indexToId = new Map();
168
254
  for await (const jsonStr of parseSSEStream(response.body)) {
@@ -171,12 +257,28 @@ export class AnthropicBackend {
171
257
  event = JSON.parse(jsonStr);
172
258
  }
173
259
  catch {
260
+ if (this.validateStrictTools)
261
+ throw new Error('Anthropic stream contained malformed JSON');
174
262
  continue;
175
263
  }
176
264
  const eventType = event.type;
177
- if (eventType === 'content_block_start') {
265
+ request.onActivity?.();
266
+ if (eventType === 'error') {
267
+ const providerError = event.error;
268
+ if (providerError?.type === 'overloaded_error') {
269
+ throw new AnthropicApiError(529, JSON.stringify({ error: { type: 'overloaded_error', message: 'Anthropic stream failed' } }));
270
+ }
271
+ throw new Error('Anthropic stream failed');
272
+ }
273
+ else if (eventType === 'message_stop') {
274
+ messageCompleted = true;
275
+ }
276
+ else if (eventType === 'content_block_start') {
178
277
  const index = event.index;
179
278
  const block = event.content_block;
279
+ if (['thinking', 'redacted_thinking', 'text', 'tool_use'].includes(String(block.type))) {
280
+ blocks.set(index, { ...block });
281
+ }
180
282
  if (block.type === 'tool_use') {
181
283
  const id = block.id;
182
284
  indexToId.set(index, id);
@@ -185,17 +287,43 @@ export class AnthropicBackend {
185
287
  }
186
288
  else if (eventType === 'content_block_delta') {
187
289
  const delta = event.delta;
290
+ const index = event.index;
291
+ const block = blocks.get(index);
188
292
  if (delta.type === 'text_delta') {
293
+ if (block?.type === 'text')
294
+ block.text += delta.text;
189
295
  yield { type: 'text_delta', text: delta.text };
190
296
  }
297
+ else if (delta.type === 'thinking_delta') {
298
+ if (block?.type === 'thinking')
299
+ block.thinking += delta.thinking;
300
+ yield { type: 'reasoning_delta', text: delta.thinking };
301
+ }
302
+ else if (delta.type === 'signature_delta') {
303
+ if (block?.type === 'thinking')
304
+ block.signature += delta.signature;
305
+ }
191
306
  else if (delta.type === 'input_json_delta') {
192
- const index = event.index;
307
+ toolInputs.set(index, (toolInputs.get(index) ?? '') + String(delta.partial_json ?? ''));
193
308
  const id = indexToId.get(index) || `_idx_${index}`;
194
309
  yield { type: 'tool_use_delta', id, input_json: delta.partial_json };
195
310
  }
196
311
  }
197
312
  else if (eventType === 'content_block_stop') {
198
313
  const index = event.index;
314
+ const block = blocks.get(index);
315
+ if (block) {
316
+ if (block.type === 'tool_use' && toolInputs.has(index)) {
317
+ try {
318
+ block.input = JSON.parse(toolInputs.get(index));
319
+ }
320
+ catch {
321
+ throw new Error('Anthropic stream ended a tool block with invalid JSON');
322
+ }
323
+ }
324
+ yield { type: 'content_block', block };
325
+ blocks.delete(index);
326
+ }
199
327
  if (indexToId.has(index)) {
200
328
  yield { type: 'tool_use_end', id: indexToId.get(index) };
201
329
  }
@@ -204,15 +332,23 @@ export class AnthropicBackend {
204
332
  const delta = event.delta;
205
333
  if (delta.stop_reason) {
206
334
  stopReason = delta.stop_reason;
335
+ // A terminal message_delta is also a complete response boundary;
336
+ // older compatible relays omit the trailing message_stop frame.
337
+ messageCompleted = true;
207
338
  }
339
+ if (delta.stop_details && typeof delta.stop_details === 'object')
340
+ stopDetails = delta.stop_details;
208
341
  const usage = event.usage;
209
342
  if (usage) {
343
+ accumulatedUsage = { ...accumulatedUsage, ...usage };
210
344
  yield {
211
345
  type: 'usage',
212
346
  usage: {
213
- inputTokens: anthropicInputTokens(usage),
214
- outputTokens: usage.output_tokens ?? 0,
215
- totalTokens: anthropicInputTokens(usage) + (usage.output_tokens ?? 0)
347
+ inputTokens: anthropicInputTokens(accumulatedUsage),
348
+ outputTokens: accumulatedUsage.output_tokens ?? 0,
349
+ totalTokens: anthropicInputTokens(accumulatedUsage) + (accumulatedUsage.output_tokens ?? 0),
350
+ ...(accumulatedUsage.cache_read_input_tokens === undefined ? {} : { cachedInputTokens: accumulatedUsage.cache_read_input_tokens }),
351
+ ...(accumulatedUsage.cache_creation_input_tokens === undefined ? {} : { cacheWriteInputTokens: accumulatedUsage.cache_creation_input_tokens }),
216
352
  }
217
353
  };
218
354
  }
@@ -221,6 +357,7 @@ export class AnthropicBackend {
221
357
  const message = event.message;
222
358
  const usage = message.usage;
223
359
  if (usage) {
360
+ accumulatedUsage = { ...accumulatedUsage, ...usage };
224
361
  yield {
225
362
  type: 'usage',
226
363
  usage: {
@@ -232,7 +369,11 @@ export class AnthropicBackend {
232
369
  }
233
370
  }
234
371
  }
235
- yield { type: 'done', stopReason };
372
+ if (blocks.size > 0)
373
+ throw new Error('Anthropic stream ended before a native content block completed');
374
+ if (!messageCompleted)
375
+ throw new Error('Anthropic stream ended before message completion');
376
+ yield { type: 'done', stopReason, ...(stopDetails ? { stopDetails } : {}) };
236
377
  }
237
378
  }
238
379
  export class AnthropicApiError extends Error {
@@ -160,18 +160,17 @@ export function normalizeClaudeCliModel(model) {
160
160
  const trimmed = model.trim();
161
161
  if (!trimmed)
162
162
  return 'claude-sonnet-4-5';
163
- // Claude Code CLI's `sonnet` alias currently selects the 1M context model,
164
- // which requires usage credits. Use the standard-context Sonnet model for ZTC's picker.
165
- if (trimmed === 'claude-opus-4-20250514' || trimmed === 'claude-3-opus-20240229') {
166
- return 'opus';
167
- }
168
- if (trimmed === 'claude-code-sonnet' || trimmed === 'sonnet' || trimmed.startsWith('claude-sonnet-') || trimmed.includes('sonnet')) {
163
+ // Retain ZTC's standard-context choice for its exact legacy Sonnet aliases.
164
+ // Do not reinterpret other Sonnet selections as these legacy aliases.
165
+ if (trimmed === 'claude-code-sonnet' || trimmed === 'sonnet') {
169
166
  return 'claude-sonnet-4-5';
170
167
  }
171
- if (trimmed.startsWith('claude-opus-') || trimmed.includes('opus')) {
168
+ // Reserve compatibility mappings for exact picker aliases; explicit names
169
+ // and context suffixes are selections for the CLI to resolve or reject.
170
+ if (trimmed === 'claude-code-opus' || trimmed === 'opus') {
172
171
  return 'opus';
173
172
  }
174
- if (trimmed.startsWith('claude-haiku-') || trimmed.includes('haiku')) {
173
+ if (trimmed === 'claude-code-haiku' || trimmed === 'haiku') {
175
174
  return 'haiku';
176
175
  }
177
176
  return trimmed;
@@ -215,6 +214,9 @@ function blockToText(block) {
215
214
  return `[tool result ${block.tool_use_id}] ${typeof block.content === 'string' ? block.content : JSON.stringify(block.content)}`;
216
215
  case 'tool_use':
217
216
  return `[assistant tool use ${block.name}] ${JSON.stringify(block.input)}`;
217
+ case 'thinking':
218
+ case 'redacted_thinking':
219
+ return ''; // Native signed reasoning belongs only to its originating API.
218
220
  default: {
219
221
  const neverBlock = block;
220
222
  return JSON.stringify(neverBlock);
@@ -301,6 +303,8 @@ export function parseClaudeCliOutput(stdout) {
301
303
  usage: typeof inputTokens === 'number' && typeof outputTokens === 'number'
302
304
  ? { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens }
303
305
  : undefined,
306
+ ...(typeof parsed.total_cost_usd === 'number' && Number.isFinite(parsed.total_cost_usd)
307
+ && parsed.total_cost_usd >= 0 ? { costUsd: parsed.total_cost_usd } : {}),
304
308
  };
305
309
  }
306
310
  catch (error) {
@@ -455,6 +459,7 @@ export class ClaudeCliBackend {
455
459
  content: [{ type: 'tool_use', id: `cli_${randomUUID()}`, name: call.name, input: call.input }],
456
460
  stopReason: 'tool_use',
457
461
  usage: resp.usage,
462
+ costUsd: resp.costUsd,
458
463
  };
459
464
  }
460
465
  /**
@@ -497,6 +502,7 @@ export class ClaudeCliBackend {
497
502
  let stderr = '';
498
503
  let streamedText = false;
499
504
  let resultUsage;
505
+ let resultCostUsd;
500
506
  let stopReason = 'end_turn';
501
507
  let resultText = '';
502
508
  // Tool-marker guard. `fullText` is everything the model produced; `emittedLen`
@@ -565,6 +571,8 @@ export class ClaudeCliBackend {
565
571
  return;
566
572
  }
567
573
  resultUsage = evt.usage;
574
+ resultCostUsd = typeof evt.total_cost_usd === 'number' && Number.isFinite(evt.total_cost_usd)
575
+ && evt.total_cost_usd >= 0 ? evt.total_cost_usd : undefined;
568
576
  stopReason = evt.stop_reason || 'end_turn';
569
577
  resultText = typeof evt.result === 'string' ? evt.result : '';
570
578
  }
@@ -616,6 +624,8 @@ export class ClaudeCliBackend {
616
624
  const inputTokens = resultUsage.input_tokens + (resultUsage.cache_read_input_tokens ?? 0) + (resultUsage.cache_creation_input_tokens ?? 0);
617
625
  push({ type: 'usage', usage: { inputTokens, outputTokens: resultUsage.output_tokens, totalTokens: inputTokens + resultUsage.output_tokens } });
618
626
  }
627
+ if (resultCostUsd !== undefined)
628
+ push({ type: 'cost', costUsd: resultCostUsd });
619
629
  push({ type: 'done', stopReason });
620
630
  finish();
621
631
  });
@@ -215,6 +215,7 @@ export declare class CodexAppServerClient {
215
215
  export declare class CodexAppServerBackend implements AgentBackend {
216
216
  private client;
217
217
  constructor(client?: CodexAppServerClient, options?: CodexAppServerClientOptions);
218
+ allowsRequestRetryAfterFailure(): boolean;
218
219
  /** The sandbox this backend's thread runs under. Observable so the factory's
219
220
  * plan-mode read-only downgrade can be asserted. */
220
221
  get sandbox(): CodexSandboxMode;
@@ -2,6 +2,7 @@ import { spawn } from 'node:child_process';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { RateLimitError, parseResetAt } from './rate_limit.js';
4
4
  import { CODEX_APP_SERVER_PROVIDER } from './provider_ids.js';
5
+ import { NativeObservationLimitError } from '../runtime/provider_native_evidence.js';
5
6
  export const MAX_CODEX_APP_SERVER_FRAME_BYTES = 1_048_576;
6
7
  export const MAX_CODEX_APP_SERVER_QUEUED_FRAMES = 1_024;
7
8
  /** Keep managed profiles on their own auth.json and ChatGPT subscription. */
@@ -14,6 +15,7 @@ const MAX_CODEX_APP_SERVER_REQUEST_TIMEOUT_MS = 120_000;
14
15
  const DEFAULT_CODEX_APP_SERVER_TURN_TIMEOUT_MS = 30 * 60_000;
15
16
  const MAX_CODEX_APP_SERVER_TURN_TIMEOUT_MS = 60 * 60_000;
16
17
  const MAX_CODEX_APP_SERVER_TOOL_CALLS_PER_TURN = 64;
18
+ const MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN = 128;
17
19
  const MAX_CODEX_APP_SERVER_MODEL_PAGES = 20;
18
20
  const MAX_CODEX_APP_SERVER_MODELS = 2_000;
19
21
  /**
@@ -119,7 +121,30 @@ export function codexItemToObservation(rawItem) {
119
121
  const { type: _t, id: _i, ...detail } = item;
120
122
  void _t;
121
123
  void _i;
122
- return { kind: 'action', id, label: type, detail };
124
+ const changes = Array.isArray(item.changes) ? item.changes : [];
125
+ const artifact = (value) => ({ path: value.path,
126
+ ...(typeof value.sha256 === 'string' ? { sha256: value.sha256 } : {}) });
127
+ const artifacts = changes.filter((change) => !!change && typeof change === 'object'
128
+ && typeof change.path === 'string').map(artifact);
129
+ let partial = changes.length !== artifacts.length;
130
+ if (typeof item.path === 'string')
131
+ artifacts.unshift(artifact({ path: item.path, sha256: item.sha256 }));
132
+ let output = typeof item.output === 'string' ? item.output : undefined;
133
+ let isError;
134
+ if (type === 'mcpToolCall' && item.result && typeof item.result === 'object') {
135
+ const result = item.result;
136
+ if (Array.isArray(result.content)) {
137
+ const content = result.content.filter((entry) => !!entry
138
+ && typeof entry === 'object' && entry.type === 'text' && typeof entry.text === 'string').map(entry => ({ type: entry.type, text: entry.text }));
139
+ isError = result.isError === true;
140
+ partial ||= content.length !== result.content.length;
141
+ output = JSON.stringify({ content, isError });
142
+ }
143
+ }
144
+ return { kind: 'action', id, label: type, detail,
145
+ ...(typeof item.status === 'string' ? { status: item.status } : {}),
146
+ ...(output === undefined ? {} : { output }), ...(partial === undefined ? {} : { partial }),
147
+ ...(isError === undefined ? {} : { isError }), artifacts };
123
148
  }
124
149
  }
125
150
  }
@@ -587,6 +612,8 @@ export class CodexAppServerClient {
587
612
  onToolCall: toolsActive ? options.onToolCall : undefined,
588
613
  toolChain: Promise.resolve(),
589
614
  toolCallCount: 0,
615
+ observationCount: 0,
616
+ observationFailure: false,
590
617
  terminalReceived: false,
591
618
  toolCancellation: new AbortController(),
592
619
  };
@@ -994,7 +1021,29 @@ export class CodexAppServerClient {
994
1021
  if (observation) {
995
1022
  for (const waiter of this.turnWaiters) {
996
1023
  if (waiter.threadId === params.threadId && waiter.turnId === nonEmptyId(params.turnId)) {
997
- waiter.onObservation?.(observation);
1024
+ if (waiter.terminalReceived)
1025
+ continue;
1026
+ if (++waiter.observationCount > MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN) {
1027
+ waiter.terminalReceived = true;
1028
+ waiter.toolCancellation.abort();
1029
+ waiter.toolChain = waiter.toolChain.then(() => {
1030
+ waiter.queue.fail(new NativeObservationLimitError(MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN));
1031
+ });
1032
+ continue;
1033
+ }
1034
+ const scoped = { ...observation, native: { provider: CODEX_APP_SERVER_PROVIDER,
1035
+ threadId: waiter.threadId, turnId: waiter.turnId } };
1036
+ // Completed reports join the same drain as native dynamic calls. A
1037
+ // terminal response cannot outrun durable report capture.
1038
+ waiter.toolChain = waiter.toolChain.then(async () => {
1039
+ if (!waiter.observationFailure)
1040
+ await waiter.onObservation?.(scoped);
1041
+ }).catch(error => {
1042
+ waiter.observationFailure = true;
1043
+ waiter.terminalReceived = true;
1044
+ waiter.toolCancellation.abort();
1045
+ waiter.queue.fail(error instanceof Error ? error : new Error(String(error)));
1046
+ });
998
1047
  }
999
1048
  }
1000
1049
  }
@@ -1222,7 +1271,7 @@ export class CodexAppServerClient {
1222
1271
  trust: message.role === 'user' ? 'authorized_user_request' : 'assistant_context',
1223
1272
  };
1224
1273
  }
1225
- const content = message.content.map((block) => {
1274
+ const content = message.content.filter(block => block.type !== 'thinking' && block.type !== 'redacted_thinking').map((block) => {
1226
1275
  if (block.type === 'text') {
1227
1276
  return {
1228
1277
  type: block.type,
@@ -1309,6 +1358,9 @@ export class CodexAppServerBackend {
1309
1358
  constructor(client, options = {}) {
1310
1359
  this.client = client || new CodexAppServerClient(options);
1311
1360
  }
1361
+ // Dispatch starts a native tool loop. A failed turn can have effects even
1362
+ // before a completed-item observation; generic retries must not regenerate it.
1363
+ allowsRequestRetryAfterFailure() { return false; }
1312
1364
  /** The sandbox this backend's thread runs under. Observable so the factory's
1313
1365
  * plan-mode read-only downgrade can be asserted. */
1314
1366
  get sandbox() {
@@ -71,6 +71,7 @@ export declare class CodexAuthBackend implements AgentBackend {
71
71
  private buildHeaders;
72
72
  /** POST the streaming Responses request, refreshing the token once on 401. */
73
73
  private fetchResponses;
74
+ private boundResponse;
74
75
  /** Buffered path — kept as the fallback when streaming can't run. */
75
76
  generate(request: BackendRequest): Promise<BackendResponse>;
76
77
  /**