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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/README.md +398 -45
  2. package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
  3. package/THIRD_PARTY_NOTICES.md +273 -12
  4. package/bin/zmux-darwin-arm64 +0 -0
  5. package/bin/ztc-audio-darwin-arm64 +0 -0
  6. package/bin/ztc-capture-darwin-arm64 +0 -0
  7. package/bin/ztc-computer-darwin-arm64 +0 -0
  8. package/bin/ztc-llm-darwin-arm64 +0 -0
  9. package/bin/ztc-tts-darwin-arm64 +0 -0
  10. package/bin/ztc-tui-darwin-arm64 +0 -0
  11. package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
  12. package/bin/zterm-darwin-arm64 +0 -0
  13. package/dist/App.js +1206 -209
  14. package/dist/agent/agent.d.ts +74 -8
  15. package/dist/agent/agent.js +1073 -184
  16. package/dist/agent/backends/account_rotation.d.ts +4 -0
  17. package/dist/agent/backends/account_rotation.js +8 -2
  18. package/dist/agent/backends/anthropic.d.ts +13 -0
  19. package/dist/agent/backends/anthropic.js +169 -28
  20. package/dist/agent/backends/claude_cli.js +18 -8
  21. package/dist/agent/backends/codex_app_server.d.ts +1 -0
  22. package/dist/agent/backends/codex_app_server.js +55 -3
  23. package/dist/agent/backends/codex_auth.d.ts +1 -0
  24. package/dist/agent/backends/codex_auth.js +67 -13
  25. package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
  26. package/dist/agent/backends/codex_buffered_recovery.js +293 -0
  27. package/dist/agent/backends/gemini.js +3 -1
  28. package/dist/agent/backends/http_error.d.ts +26 -0
  29. package/dist/agent/backends/http_error.js +221 -0
  30. package/dist/agent/backends/index.d.ts +9 -2
  31. package/dist/agent/backends/index.js +22 -2
  32. package/dist/agent/backends/openai.d.ts +0 -6
  33. package/dist/agent/backends/openai.js +5 -2
  34. package/dist/agent/backends/openai_compatible.d.ts +5 -4
  35. package/dist/agent/backends/openai_compatible.js +26 -19
  36. package/dist/agent/backends/openai_responses.d.ts +8 -3
  37. package/dist/agent/backends/openai_responses.js +77 -33
  38. package/dist/agent/backends/provider_ids.d.ts +1 -0
  39. package/dist/agent/backends/provider_ids.js +4 -0
  40. package/dist/agent/backends/request_metrics.js +12 -2
  41. package/dist/agent/backends/types.d.ts +109 -6
  42. package/dist/agent/backends/types.js +5 -1
  43. package/dist/agent/backends/zrouter_stream.d.ts +6 -1
  44. package/dist/agent/backends/zrouter_stream.js +160 -42
  45. package/dist/agent/background_registry.d.ts +2 -0
  46. package/dist/agent/background_registry.js +1 -0
  47. package/dist/agent/claim_observation.d.ts +6 -0
  48. package/dist/agent/claim_observation.js +54 -0
  49. package/dist/agent/commands/accounts.js +46 -177
  50. package/dist/agent/commands/attention.d.ts +2 -0
  51. package/dist/agent/commands/attention.js +67 -0
  52. package/dist/agent/commands/auth.js +18 -2
  53. package/dist/agent/commands/board.d.ts +2 -0
  54. package/dist/agent/commands/board.js +169 -0
  55. package/dist/agent/commands/clipboard.js +50 -1
  56. package/dist/agent/commands/compact.js +21 -13
  57. package/dist/agent/commands/config.js +4 -1
  58. package/dist/agent/commands/context.js +6 -1
  59. package/dist/agent/commands/desktop.d.ts +2 -0
  60. package/dist/agent/commands/desktop.js +29 -0
  61. package/dist/agent/commands/effort.js +14 -6
  62. package/dist/agent/commands/environment.d.ts +3 -0
  63. package/dist/agent/commands/environment.js +109 -0
  64. package/dist/agent/commands/evidence.d.ts +2 -0
  65. package/dist/agent/commands/evidence.js +9 -0
  66. package/dist/agent/commands/fork.js +4 -3
  67. package/dist/agent/commands/goal.d.ts +33 -1
  68. package/dist/agent/commands/goal.js +174 -14
  69. package/dist/agent/commands/goal_exit.d.ts +36 -0
  70. package/dist/agent/commands/goal_exit.js +120 -0
  71. package/dist/agent/commands/help.js +3 -1
  72. package/dist/agent/commands/history.js +3 -1
  73. package/dist/agent/commands/inbox.d.ts +2 -0
  74. package/dist/agent/commands/inbox.js +148 -0
  75. package/dist/agent/commands/index.js +16 -1
  76. package/dist/agent/commands/input_mode.js +8 -6
  77. package/dist/agent/commands/job.d.ts +2 -0
  78. package/dist/agent/commands/job.js +93 -0
  79. package/dist/agent/commands/keybindings.js +4 -1
  80. package/dist/agent/commands/label.d.ts +2 -0
  81. package/dist/agent/commands/label.js +77 -0
  82. package/dist/agent/commands/layout.d.ts +2 -0
  83. package/dist/agent/commands/layout.js +20 -0
  84. package/dist/agent/commands/mirror.js +16 -1
  85. package/dist/agent/commands/model.js +12 -2
  86. package/dist/agent/commands/permissions.d.ts +3 -1
  87. package/dist/agent/commands/permissions.js +79 -89
  88. package/dist/agent/commands/plan.js +5 -15
  89. package/dist/agent/commands/profile.js +21 -2
  90. package/dist/agent/commands/provider_selection.js +20 -1
  91. package/dist/agent/commands/rename.js +1 -1
  92. package/dist/agent/commands/resources.d.ts +2 -0
  93. package/dist/agent/commands/resources.js +67 -0
  94. package/dist/agent/commands/rewind.d.ts +3 -0
  95. package/dist/agent/commands/rewind.js +16 -0
  96. package/dist/agent/commands/runbooks.d.ts +2 -0
  97. package/dist/agent/commands/runbooks.js +73 -0
  98. package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
  99. package/dist/agent/commands/runbooks_lazy.js +8 -0
  100. package/dist/agent/commands/sessions.d.ts +1 -1
  101. package/dist/agent/commands/sessions.js +33 -5
  102. package/dist/agent/commands/settings.js +185 -39
  103. package/dist/agent/commands/setup.d.ts +2 -0
  104. package/dist/agent/commands/setup.js +78 -0
  105. package/dist/agent/commands/share.d.ts +2 -0
  106. package/dist/agent/commands/share.js +64 -0
  107. package/dist/agent/commands/status.js +14 -2
  108. package/dist/agent/commands/types.d.ts +99 -6
  109. package/dist/agent/commands/update.js +8 -0
  110. package/dist/agent/commands/usage.d.ts +2 -0
  111. package/dist/agent/commands/usage.js +8 -0
  112. package/dist/agent/factory.d.ts +11 -0
  113. package/dist/agent/factory.js +113 -88
  114. package/dist/agent/loop_policy.d.ts +6 -3
  115. package/dist/agent/loop_policy.js +12 -3
  116. package/dist/agent/measurement_guidance.d.ts +2 -0
  117. package/dist/agent/measurement_guidance.js +5 -0
  118. package/dist/agent/request_encoder.d.ts +8 -1
  119. package/dist/agent/request_encoder.js +95 -23
  120. package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
  121. package/dist/agent/runtime/benchmark_comparison.js +94 -0
  122. package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
  123. package/dist/agent/runtime/benchmark_contract.js +90 -0
  124. package/dist/agent/runtime/checked_commands.d.ts +32 -0
  125. package/dist/agent/runtime/checked_commands.js +119 -0
  126. package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
  127. package/dist/agent/runtime/command_execution_policy.js +91 -0
  128. package/dist/agent/runtime/command_jobs.d.ts +36 -18
  129. package/dist/agent/runtime/command_jobs.js +151 -13
  130. package/dist/agent/runtime/command_panes.d.ts +59 -0
  131. package/dist/agent/runtime/command_panes.js +398 -0
  132. package/dist/agent/runtime/command_wait.d.ts +19 -0
  133. package/dist/agent/runtime/command_wait.js +167 -0
  134. package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
  135. package/dist/agent/runtime/cpu_benchmark.js +126 -0
  136. package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
  137. package/dist/agent/runtime/delegated_evidence.js +80 -0
  138. package/dist/agent/runtime/evidence.d.ts +127 -0
  139. package/dist/agent/runtime/evidence.js +468 -0
  140. package/dist/agent/runtime/execution_context.d.ts +7 -0
  141. package/dist/agent/runtime/execution_context.js +39 -3
  142. package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
  143. package/dist/agent/runtime/json_verifier_recipe.js +66 -0
  144. package/dist/agent/runtime/measurements.d.ts +110 -0
  145. package/dist/agent/runtime/measurements.js +317 -0
  146. package/dist/agent/runtime/policy.d.ts +4 -0
  147. package/dist/agent/runtime/policy.js +31 -20
  148. package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
  149. package/dist/agent/runtime/provider_native_evidence.js +86 -0
  150. package/dist/agent/runtime/recovery.d.ts +2 -0
  151. package/dist/agent/runtime/recovery.js +45 -2
  152. package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
  153. package/dist/agent/runtime/remote_broker_transport.js +84 -0
  154. package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
  155. package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
  156. package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
  157. package/dist/agent/runtime/remote_journal_replay.js +233 -0
  158. package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
  159. package/dist/agent/runtime/remote_mutation_journal.js +208 -0
  160. package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
  161. package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
  162. package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
  163. package/dist/agent/runtime/remote_resource_errors.js +9 -0
  164. package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
  165. package/dist/agent/runtime/remote_resource_script.js +1009 -0
  166. package/dist/agent/runtime/remote_resources.d.ts +29 -0
  167. package/dist/agent/runtime/remote_resources.js +160 -0
  168. package/dist/agent/runtime/source_verification.d.ts +12 -0
  169. package/dist/agent/runtime/source_verification.js +210 -0
  170. package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
  171. package/dist/agent/runtime/source_verification_contract.js +203 -0
  172. package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
  173. package/dist/agent/runtime/tool_checkpoints.js +26 -0
  174. package/dist/agent/runtime/tool_effects.d.ts +5 -0
  175. package/dist/agent/runtime/tool_progress.d.ts +12 -0
  176. package/dist/agent/runtime/tool_progress.js +76 -0
  177. package/dist/agent/runtime/tool_runtime.d.ts +16 -1
  178. package/dist/agent/runtime/tool_runtime.js +204 -10
  179. package/dist/agent/runtime/tracing.d.ts +1 -1
  180. package/dist/agent/runtime/verifier_capture.d.ts +9 -0
  181. package/dist/agent/runtime/verifier_capture.js +100 -0
  182. package/dist/agent/runtime/verifier_contract.d.ts +24 -0
  183. package/dist/agent/runtime/verifier_contract.js +41 -0
  184. package/dist/agent/subagent.d.ts +20 -10
  185. package/dist/agent/subagent.js +266 -29
  186. package/dist/agent/tool_response_directory.d.ts +24 -0
  187. package/dist/agent/tool_response_directory.js +61 -0
  188. package/dist/agent/tool_response_source.d.ts +8 -0
  189. package/dist/agent/tool_response_source.js +49 -0
  190. package/dist/agent/tool_response_store.d.ts +75 -4
  191. package/dist/agent/tool_response_store.js +583 -64
  192. package/dist/agent/tools/ask_user.d.ts +3 -1
  193. package/dist/agent/tools/ask_user.js +30 -11
  194. package/dist/agent/tools/background.js +1 -0
  195. package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
  196. package/dist/agent/tools/benchmark_cpu.js +102 -0
  197. package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
  198. package/dist/agent/tools/compare_benchmarks.js +53 -0
  199. package/dist/agent/tools/deferred.js +1 -0
  200. package/dist/agent/tools/delegate.js +18 -2
  201. package/dist/agent/tools/helper_requirements.d.ts +7 -0
  202. package/dist/agent/tools/helper_requirements.js +19 -0
  203. package/dist/agent/tools/index.d.ts +1 -0
  204. package/dist/agent/tools/index.js +3 -0
  205. package/dist/agent/tools/measurement_report.d.ts +22 -0
  206. package/dist/agent/tools/measurement_report.js +190 -0
  207. package/dist/agent/tools/pane.d.ts +0 -7
  208. package/dist/agent/tools/pane.js +5 -4
  209. package/dist/agent/tools/project_context.d.ts +3 -0
  210. package/dist/agent/tools/project_context.js +45 -0
  211. package/dist/agent/tools/recall_tool_response.d.ts +3 -5
  212. package/dist/agent/tools/recall_tool_response.js +19 -29
  213. package/dist/agent/tools/registry.d.ts +1 -0
  214. package/dist/agent/tools/registry.js +23 -0
  215. package/dist/agent/tools/related_sessions.d.ts +2 -0
  216. package/dist/agent/tools/related_sessions.js +156 -0
  217. package/dist/agent/tools/routine.js +13 -3
  218. package/dist/agent/tools/session_evidence.d.ts +3 -0
  219. package/dist/agent/tools/session_evidence.js +72 -0
  220. package/dist/agent/tools/shell.d.ts +4 -3
  221. package/dist/agent/tools/shell.js +174 -47
  222. package/dist/agent/tools/tool_search.js +3 -2
  223. package/dist/agent/tools/types.d.ts +28 -0
  224. package/dist/agent/tools/verify_artifact.d.ts +2 -0
  225. package/dist/agent/tools/verify_artifact.js +60 -0
  226. package/dist/agent/tools/workflow.js +1 -0
  227. package/dist/app/activity.d.ts +6 -1
  228. package/dist/app/activity.js +81 -12
  229. package/dist/app/agent_runner.d.ts +6 -1
  230. package/dist/app/agent_runner.js +34 -19
  231. package/dist/app/command_context.js +106 -10
  232. package/dist/app/controller.d.ts +15 -4
  233. package/dist/app/controller.js +29 -3
  234. package/dist/app/escape_stop.d.ts +11 -0
  235. package/dist/app/escape_stop.js +15 -0
  236. package/dist/app/liveness.d.ts +6 -4
  237. package/dist/app/liveness.js +13 -3
  238. package/dist/app/model_catalog_cache.d.ts +5 -0
  239. package/dist/app/model_catalog_cache.js +138 -0
  240. package/dist/app/ordered_transcript.js +43 -4
  241. package/dist/app/prompt_turn.d.ts +14 -0
  242. package/dist/app/prompt_turn.js +53 -0
  243. package/dist/app/recap.d.ts +3 -0
  244. package/dist/app/recap.js +9 -3
  245. package/dist/app/restart.d.ts +3 -2
  246. package/dist/app/restart.js +22 -7
  247. package/dist/app/rewind.d.ts +3 -3
  248. package/dist/app/rewind.js +3 -3
  249. package/dist/app/selection_completion.d.ts +17 -2
  250. package/dist/app/selection_completion.js +84 -9
  251. package/dist/app/session_manager.d.ts +38 -6
  252. package/dist/app/session_manager.js +263 -60
  253. package/dist/app/session_messages.d.ts +3 -0
  254. package/dist/app/session_messages.js +60 -0
  255. package/dist/app/task_scope_router.d.ts +20 -0
  256. package/dist/app/task_scope_router.js +173 -0
  257. package/dist/app/transcript_window.d.ts +2 -0
  258. package/dist/app/transcript_window.js +4 -0
  259. package/dist/app/workspace_admission_details.d.ts +3 -0
  260. package/dist/app/workspace_admission_details.js +26 -0
  261. package/dist/app/workspace_layout_controller.d.ts +11 -0
  262. package/dist/app/workspace_layout_controller.js +88 -0
  263. package/dist/app/workspace_monitor.d.ts +1 -0
  264. package/dist/app/workspace_monitor.js +216 -0
  265. package/dist/app/workspace_presets.d.ts +29 -0
  266. package/dist/app/workspace_presets.js +192 -0
  267. package/dist/attention/queue.d.ts +37 -0
  268. package/dist/attention/queue.js +183 -0
  269. package/dist/bench/rf_shared.d.ts +2 -0
  270. package/dist/board/binding.d.ts +42 -0
  271. package/dist/board/binding.js +38 -0
  272. package/dist/board/client.d.ts +42 -0
  273. package/dist/board/client.js +60 -0
  274. package/dist/cli.js +1 -1
  275. package/dist/cli_args.js +19 -17
  276. package/dist/cli_main.js +110 -13
  277. package/dist/cli_ratatui.d.ts +183 -16
  278. package/dist/cli_ratatui.js +3989 -1255
  279. package/dist/components/ActivityLine.d.ts +3 -2
  280. package/dist/components/ActivityLine.js +2 -2
  281. package/dist/components/InputArea.d.ts +19 -1
  282. package/dist/components/InputArea.js +264 -190
  283. package/dist/components/MessageList.d.ts +2 -0
  284. package/dist/components/MessageList.js +3 -1
  285. package/dist/components/SingleMessage.d.ts +2 -0
  286. package/dist/components/SingleMessage.js +4 -2
  287. package/dist/components/StatusBar.d.ts +4 -2
  288. package/dist/components/StatusBar.js +3 -1
  289. package/dist/conductor_branch.js +3 -0
  290. package/dist/config/api_retry.d.ts +6 -1
  291. package/dist/config/api_retry.js +19 -1
  292. package/dist/config/defaults.d.ts +2 -1
  293. package/dist/config/defaults.js +9 -2
  294. package/dist/config/message_display.d.ts +1 -0
  295. package/dist/config/message_display.js +17 -2
  296. package/dist/config/permissions.d.ts +21 -0
  297. package/dist/config/permissions.js +89 -0
  298. package/dist/config/resolved.d.ts +2 -2
  299. package/dist/config/types.d.ts +32 -5
  300. package/dist/config.d.ts +38 -4
  301. package/dist/config.js +290 -42
  302. package/dist/context/project_intelligence.d.ts +44 -0
  303. package/dist/context/project_intelligence.js +246 -0
  304. package/dist/desktop/cli_launch.d.ts +8 -0
  305. package/dist/desktop/cli_launch.js +6 -0
  306. package/dist/desktop/cli_shim.d.ts +8 -0
  307. package/dist/desktop/cli_shim.js +120 -0
  308. package/dist/desktop/runtime.d.ts +16 -0
  309. package/dist/desktop/runtime.js +161 -0
  310. package/dist/desktop/worker_launch.d.ts +7 -0
  311. package/dist/desktop/worker_launch.js +7 -0
  312. package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
  313. package/dist/diagnostics/cargo_mutants_selection.js +48 -0
  314. package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
  315. package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
  316. package/dist/diagnostics/session_evidence_package.d.ts +40 -0
  317. package/dist/diagnostics/session_evidence_package.js +234 -0
  318. package/dist/diagnostics/session_export.d.ts +93 -0
  319. package/dist/diagnostics/session_export.js +634 -0
  320. package/dist/emulation/tool_adapters.js +48 -18
  321. package/dist/emulation/ztc_addendum.d.ts +1 -0
  322. package/dist/emulation/ztc_addendum.js +13 -12
  323. package/dist/environment/service_runner.d.ts +1 -0
  324. package/dist/environment/service_runner.js +68 -0
  325. package/dist/environment/store.d.ts +120 -0
  326. package/dist/environment/store.js +387 -0
  327. package/dist/events.d.ts +40 -1
  328. package/dist/events.js +10 -17
  329. package/dist/goal_contract.d.ts +25 -0
  330. package/dist/goal_contract.js +44 -0
  331. package/dist/headless.d.ts +31 -0
  332. package/dist/headless.js +578 -70
  333. package/dist/headless_cli.js +8 -0
  334. package/dist/headless_cli_args.d.ts +1 -0
  335. package/dist/headless_cli_args.js +1 -0
  336. package/dist/intake/cli.d.ts +1 -0
  337. package/dist/intake/cli.js +33 -0
  338. package/dist/intake/format.d.ts +2 -0
  339. package/dist/intake/format.js +14 -0
  340. package/dist/intake/notifications.d.ts +16 -0
  341. package/dist/intake/notifications.js +132 -0
  342. package/dist/intake/store.d.ts +56 -0
  343. package/dist/intake/store.js +238 -0
  344. package/dist/library.d.ts +8 -0
  345. package/dist/library.js +19 -10
  346. package/dist/mcp/client.d.ts +1 -0
  347. package/dist/mcp/client.js +20 -0
  348. package/dist/modes/builtin/plan.yaml +2 -2
  349. package/dist/modes/handlers.js +1 -1
  350. package/dist/onboarding/first_run.d.ts +3 -0
  351. package/dist/onboarding/first_run.js +33 -25
  352. package/dist/onboarding/setup.d.ts +32 -0
  353. package/dist/onboarding/setup.js +133 -0
  354. package/dist/onboarding/setup_agent_health.d.ts +17 -0
  355. package/dist/onboarding/setup_agent_health.js +79 -0
  356. package/dist/onboarding/setup_environment.d.ts +66 -0
  357. package/dist/onboarding/setup_environment.js +219 -0
  358. package/dist/onboarding/setup_workspace.d.ts +17 -0
  359. package/dist/onboarding/setup_workspace.js +129 -0
  360. package/dist/optimize/adapters/index.d.ts +4 -1
  361. package/dist/optimize/adapters/index.js +7 -0
  362. package/dist/optimize/adapters/kernelbench.js +14 -5
  363. package/dist/optimize/adapters/popcorn.js +3 -2
  364. package/dist/optimize/adapters/profile_benchmark.js +13 -7
  365. package/dist/optimize/adapters/rfbench.js +25 -14
  366. package/dist/optimize/adapters/types.d.ts +3 -0
  367. package/dist/optimize/adapters/zergpod.js +5 -2
  368. package/dist/optimize/baseline.js +10 -21
  369. package/dist/optimize/branch.js +9 -12
  370. package/dist/optimize/combine.js +2 -3
  371. package/dist/optimize/executor.js +34 -48
  372. package/dist/optimize/measurements.d.ts +55 -0
  373. package/dist/optimize/measurements.js +173 -0
  374. package/dist/optimize/results.d.ts +1 -0
  375. package/dist/optimize/results.js +11 -33
  376. package/dist/optimize/tge.js +2 -1
  377. package/dist/panes/initial_input.d.ts +19 -0
  378. package/dist/panes/initial_input.js +206 -0
  379. package/dist/panes/labels.d.ts +16 -0
  380. package/dist/panes/labels.js +42 -0
  381. package/dist/panes/model_catalog.d.ts +3 -3
  382. package/dist/panes/model_catalog.js +28 -4
  383. package/dist/panes/pane_registry.js +6 -2
  384. package/dist/panes/types.d.ts +3 -0
  385. package/dist/panes/ztc_launch.js +19 -0
  386. package/dist/plugin/optimization.d.ts +2 -0
  387. package/dist/plugin/optimization.js +1 -0
  388. package/dist/plugin/runtime.d.ts +2 -0
  389. package/dist/plugin/simulation.d.ts +6 -1
  390. package/dist/plugin/simulation_contract.d.ts +836 -1
  391. package/dist/plugin/simulation_documents.d.ts +22 -0
  392. package/dist/plugin/simulation_documents.js +1 -0
  393. package/dist/plugin/simulation_interventions.d.ts +103 -0
  394. package/dist/plugin/simulation_interventions.js +1 -0
  395. package/dist/plugin/simulation_living.d.ts +1 -0
  396. package/dist/plugin/simulation_living.js +3 -0
  397. package/dist/plugin/simulation_meetings.d.ts +121 -0
  398. package/dist/plugin/simulation_meetings.js +1 -0
  399. package/dist/plugin/simulation_story_review.d.ts +111 -0
  400. package/dist/plugin/simulation_story_review.js +1 -0
  401. package/dist/plugin/simulation_storyteller.d.ts +91 -0
  402. package/dist/plugin/simulation_storyteller.js +1 -0
  403. package/dist/plugin/simulation_structured.d.ts +2 -0
  404. package/dist/plugin/simulation_structured.js +2 -0
  405. package/dist/plugin/simulation_toolkit.d.ts +21 -0
  406. package/dist/plugin/simulation_toolkit.js +24 -0
  407. package/dist/prompts/tool_delegate_task.j2 +1 -1
  408. package/dist/remote-broker/Dockerfile +10 -0
  409. package/dist/remote-broker/archive.py +1227 -0
  410. package/dist/remote-broker/cutover.py +761 -0
  411. package/dist/remote-broker/requirements.txt +5 -0
  412. package/dist/remote-broker/resources.json +6 -0
  413. package/dist/remote-broker/resources.write-staging.example.json +18 -0
  414. package/dist/remote-broker/retained.py +686 -0
  415. package/dist/remote-broker/retained_cleanup.py +550 -0
  416. package/dist/remote-broker/server.py +648 -0
  417. package/dist/remote-broker/worker.py +1007 -0
  418. package/dist/router_auth.d.ts +31 -0
  419. package/dist/router_auth.js +155 -9
  420. package/dist/runbooks/catalog.d.ts +3 -0
  421. package/dist/runbooks/catalog.js +26 -0
  422. package/dist/runbooks/library.d.ts +11 -0
  423. package/dist/runbooks/library.js +95 -0
  424. package/dist/runbooks/package.d.ts +43 -0
  425. package/dist/runbooks/package.js +102 -0
  426. package/dist/session.d.ts +65 -13
  427. package/dist/session.js +548 -43
  428. package/dist/session_handoff.d.ts +25 -0
  429. package/dist/session_handoff.js +322 -0
  430. package/dist/session_handoff_contract.d.ts +89 -0
  431. package/dist/session_handoff_contract.js +179 -0
  432. package/dist/session_media.d.ts +41 -0
  433. package/dist/session_media.js +357 -0
  434. package/dist/session_ownership.d.ts +16 -0
  435. package/dist/session_ownership.js +221 -0
  436. package/dist/session_public.d.ts +10 -2
  437. package/dist/session_public.js +6 -1
  438. package/dist/simulation/dynamic_history.d.ts +42 -0
  439. package/dist/simulation/dynamic_history.js +173 -0
  440. package/dist/simulation/engines/swarm/pane_manager.js +7 -6
  441. package/dist/simulation/inference.d.ts +3 -1
  442. package/dist/simulation/inference.js +19 -1
  443. package/dist/simulation/intervention_generation.d.ts +27 -0
  444. package/dist/simulation/intervention_generation.js +246 -0
  445. package/dist/simulation/intervention_material.d.ts +4 -0
  446. package/dist/simulation/intervention_material.js +81 -0
  447. package/dist/simulation/living/context.d.ts +3130 -0
  448. package/dist/simulation/living/context.js +944 -0
  449. package/dist/simulation/living/definer.d.ts +12 -0
  450. package/dist/simulation/living/definer.js +223 -0
  451. package/dist/simulation/living/definition.d.ts +257 -0
  452. package/dist/simulation/living/definition.js +341 -0
  453. package/dist/simulation/living/frame.d.ts +259 -0
  454. package/dist/simulation/living/frame.js +223 -0
  455. package/dist/simulation/living/identifiers.d.ts +2 -0
  456. package/dist/simulation/living/identifiers.js +12 -0
  457. package/dist/simulation/living/index.d.ts +15 -0
  458. package/dist/simulation/living/index.js +15 -0
  459. package/dist/simulation/living/inference.d.ts +219 -0
  460. package/dist/simulation/living/inference.js +576 -0
  461. package/dist/simulation/living/mechanics.d.ts +54 -0
  462. package/dist/simulation/living/mechanics.js +588 -0
  463. package/dist/simulation/living/model-input.d.ts +25 -0
  464. package/dist/simulation/living/model-input.js +215 -0
  465. package/dist/simulation/living/open-world.d.ts +257 -0
  466. package/dist/simulation/living/open-world.js +102 -0
  467. package/dist/simulation/living/projection.d.ts +7 -0
  468. package/dist/simulation/living/projection.js +31 -0
  469. package/dist/simulation/living/recall.d.ts +17 -0
  470. package/dist/simulation/living/recall.js +25 -0
  471. package/dist/simulation/living/reduce.d.ts +15 -0
  472. package/dist/simulation/living/reduce.js +1853 -0
  473. package/dist/simulation/living/replay.d.ts +6 -0
  474. package/dist/simulation/living/replay.js +22 -0
  475. package/dist/simulation/living/runtime.d.ts +140 -0
  476. package/dist/simulation/living/runtime.js +3020 -0
  477. package/dist/simulation/living/shared-kinds.d.ts +24 -0
  478. package/dist/simulation/living/shared-kinds.js +96 -0
  479. package/dist/simulation/living/types.d.ts +2785 -0
  480. package/dist/simulation/living/types.js +669 -0
  481. package/dist/simulation/llm.d.ts +3 -1
  482. package/dist/simulation/llm.js +90 -30
  483. package/dist/simulation/memory/embedding.d.ts +1 -1
  484. package/dist/simulation/memory/embedding.js +9 -3
  485. package/dist/simulation/memory/filesystem.d.ts +2 -0
  486. package/dist/simulation/memory/filesystem.js +5 -1
  487. package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
  488. package/dist/simulation/memory/filesystem_file_tree.js +41 -10
  489. package/dist/simulation/memory/filesystem_invariants.js +1 -2
  490. package/dist/simulation/memory/filesystem_types.d.ts +1 -0
  491. package/dist/simulation/memory/memory.d.ts +2 -0
  492. package/dist/simulation/memory/memory.js +5 -1
  493. package/dist/simulation/orchestration/intent.js +0 -2
  494. package/dist/simulation/orchestration/lifecycle.js +0 -2
  495. package/dist/simulation/plugin_host.d.ts +25 -1
  496. package/dist/simulation/plugin_host.js +334 -17
  497. package/dist/simulation/session_documents.d.ts +20 -0
  498. package/dist/simulation/session_documents.js +62 -0
  499. package/dist/simulation/session_input_validation.d.ts +43 -0
  500. package/dist/simulation/session_input_validation.js +364 -0
  501. package/dist/simulation/session_inputs.d.ts +32 -0
  502. package/dist/simulation/session_inputs.js +154 -0
  503. package/dist/simulation/telemetry.d.ts +11 -14
  504. package/dist/simulation/telemetry.js +177 -54
  505. package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
  506. package/dist/simulation/toolkit/bounded_turns.js +80 -0
  507. package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
  508. package/dist/simulation/toolkit/dynamic_agents.js +218 -0
  509. package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
  510. package/dist/simulation/toolkit/dynamic_digest.js +8 -0
  511. package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
  512. package/dist/simulation/toolkit/dynamic_documents.js +71 -0
  513. package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
  514. package/dist/simulation/toolkit/dynamic_driver.js +269 -0
  515. package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
  516. package/dist/simulation/toolkit/dynamic_game.js +805 -0
  517. package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
  518. package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
  519. package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
  520. package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
  521. package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
  522. package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
  523. package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
  524. package/dist/simulation/toolkit/dynamic_progress.js +214 -0
  525. package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
  526. package/dist/simulation/toolkit/dynamic_projection.js +219 -0
  527. package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
  528. package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
  529. package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
  530. package/dist/simulation/toolkit/dynamic_state.js +1967 -0
  531. package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
  532. package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
  533. package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
  534. package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
  535. package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
  536. package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
  537. package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
  538. package/dist/simulation/toolkit/dynamic_world.js +377 -0
  539. package/dist/simulation/toolkit/structured_output.d.ts +5 -0
  540. package/dist/simulation/toolkit/structured_output.js +321 -0
  541. package/dist/simulation/types/world.d.ts +2 -0
  542. package/dist/simulation/world/artifact_store.js +1 -1
  543. package/dist/simulation/world/memory_manager.d.ts +5 -0
  544. package/dist/simulation/world/memory_manager.js +17 -2
  545. package/dist/simulation/world/state.d.ts +3 -2
  546. package/dist/simulation/world/state.js +15 -5
  547. package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
  548. package/dist/terminal_attach.d.ts +1 -0
  549. package/dist/terminal_attach.js +113 -0
  550. package/dist/tool_progress.d.ts +3 -0
  551. package/dist/tool_progress.js +27 -0
  552. package/dist/types.d.ts +145 -10
  553. package/dist/types.js +3 -0
  554. package/dist/ui/core/input.d.ts +3 -0
  555. package/dist/ui/core/input_segments.d.ts +18 -1
  556. package/dist/ui/core/input_segments.js +131 -47
  557. package/dist/ui/core/input_state.d.ts +12 -0
  558. package/dist/ui/core/layout_yoga.d.ts +1 -1
  559. package/dist/ui/core/turn_metadata.d.ts +5 -0
  560. package/dist/ui/core/turn_metadata.js +22 -0
  561. package/dist/ui/ink/render.d.ts +2 -1
  562. package/dist/ui/ink/render.js +6 -5
  563. package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
  564. package/dist/ui/ratatui/headless_pane_manager.js +293 -104
  565. package/dist/ui/ratatui/index.d.ts +1 -0
  566. package/dist/ui/ratatui/input.d.ts +4 -0
  567. package/dist/ui/ratatui/input.js +15 -0
  568. package/dist/ui/ratatui/ipc_path.d.ts +2 -0
  569. package/dist/ui/ratatui/ipc_path.js +29 -1
  570. package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
  571. package/dist/ui/ratatui/mux_persistence.js +139 -1
  572. package/dist/ui/ratatui/pane_relay.d.ts +1 -1
  573. package/dist/ui/ratatui/pane_relay.js +55 -27
  574. package/dist/ui/ratatui/process.d.ts +17 -1
  575. package/dist/ui/ratatui/process.js +80 -7
  576. package/dist/ui/ratatui/protocol.d.ts +236 -1
  577. package/dist/ui/ratatui/protocol.js +90 -0
  578. package/dist/ui/scrollback.d.ts +2 -1
  579. package/dist/ui/scrollback.js +9 -4
  580. package/dist/ui/stream_typewriter.d.ts +8 -3
  581. package/dist/ui/stream_typewriter.js +30 -1
  582. package/dist/ui/streaming_scrollback.d.ts +1 -0
  583. package/dist/ui/streaming_scrollback.js +1 -1
  584. package/dist/ui/transcript_render_cache.js +10 -0
  585. package/dist/ui/views/activity_line.d.ts +5 -3
  586. package/dist/ui/views/activity_line.js +65 -7
  587. package/dist/ui/views/app.d.ts +6 -3
  588. package/dist/ui/views/app.js +17 -6
  589. package/dist/ui/views/completion_menu.js +10 -5
  590. package/dist/ui/views/input_area.d.ts +7 -3
  591. package/dist/ui/views/input_area.js +15 -9
  592. package/dist/ui/views/message_list.d.ts +4 -1
  593. package/dist/ui/views/message_list.js +89 -19
  594. package/dist/ui/views/queue_panel.d.ts +3 -1
  595. package/dist/ui/views/queue_panel.js +9 -2
  596. package/dist/ui/views/status_bar.d.ts +4 -2
  597. package/dist/ui/views/status_bar.js +28 -13
  598. package/dist/ui/views/theme.d.ts +2 -0
  599. package/dist/ui/views/theme.js +2 -0
  600. package/dist/ui/widgets/color_panel.js +18 -0
  601. package/dist/ui/widgets/form.js +8 -0
  602. package/dist/ui/widgets/log_view.js +7 -0
  603. package/dist/ui/widgets/navigator_panel.js +8 -0
  604. package/dist/ui/widgets/prompt_viewer.js +2 -0
  605. package/dist/ui/widgets/questionnaire.d.ts +2 -0
  606. package/dist/ui/widgets/questionnaire.js +79 -16
  607. package/dist/ui/widgets/resume_panel.d.ts +2 -0
  608. package/dist/ui/widgets/resume_panel.js +26 -15
  609. package/dist/ui/widgets/rewind_panel.d.ts +2 -2
  610. package/dist/ui/widgets/rewind_panel.js +4 -2
  611. package/dist/ui/widgets/select.js +16 -27
  612. package/dist/ui/widgets/settings_panel.js +16 -0
  613. package/dist/ui/widgets/status_line_panel.d.ts +1 -0
  614. package/dist/ui/widgets/status_line_panel.js +30 -4
  615. package/dist/ui/widgets/text_input.d.ts +2 -0
  616. package/dist/ui/widgets/text_input.js +15 -1
  617. package/dist/ui/widgets/types.d.ts +2 -0
  618. package/dist/usage_projection.d.ts +24 -0
  619. package/dist/usage_projection.js +130 -0
  620. package/dist/usage_snapshot.d.ts +36 -0
  621. package/dist/usage_snapshot.js +131 -0
  622. package/dist/utils/assistant_message.d.ts +2 -0
  623. package/dist/utils/assistant_message.js +5 -0
  624. package/dist/utils/atomic_write.d.ts +6 -2
  625. package/dist/utils/atomic_write.js +29 -4
  626. package/dist/utils/checked_shell.d.ts +25 -0
  627. package/dist/utils/checked_shell.js +107 -0
  628. package/dist/utils/compaction.d.ts +4 -1
  629. package/dist/utils/compaction.js +31 -7
  630. package/dist/utils/context.d.ts +4 -4
  631. package/dist/utils/context.js +14 -12
  632. package/dist/utils/deepseek.d.ts +2 -2
  633. package/dist/utils/deepseek.js +13 -5
  634. package/dist/utils/ephemeral.js +4 -0
  635. package/dist/utils/ephemeral_tools.d.ts +18 -0
  636. package/dist/utils/ephemeral_tools.js +97 -0
  637. package/dist/utils/jev_client.d.ts +4 -0
  638. package/dist/utils/jev_client.js +15 -0
  639. package/dist/utils/model_cache.d.ts +15 -0
  640. package/dist/utils/model_cache.js +143 -0
  641. package/dist/utils/models.d.ts +4 -2
  642. package/dist/utils/models.js +12 -16
  643. package/dist/utils/reasoning.d.ts +8 -1
  644. package/dist/utils/reasoning.js +31 -11
  645. package/dist/utils/router_catalog.d.ts +49 -0
  646. package/dist/utils/router_catalog.js +271 -0
  647. package/dist/utils/sandbox.d.ts +9 -0
  648. package/dist/utils/sandbox.js +118 -15
  649. package/dist/utils/shell.d.ts +7 -0
  650. package/dist/utils/shell.js +98 -34
  651. package/dist/utils/subprocess_env.d.ts +3 -0
  652. package/dist/utils/subprocess_env.js +27 -1
  653. package/dist/web/accounts_mirror.d.ts +3 -1
  654. package/dist/web/accounts_mirror.js +13 -9
  655. package/dist/web/child_publication.d.ts +17 -0
  656. package/dist/web/child_publication.js +45 -0
  657. package/dist/web/mirror_authenticator.d.ts +31 -11
  658. package/dist/web/mirror_authenticator.js +67 -17
  659. package/dist/web/mirror_client.d.ts +31 -4
  660. package/dist/web/mirror_client.js +189 -23
  661. package/dist/web/mirror_stream.d.ts +84 -22
  662. package/dist/web/mirror_stream.js +676 -95
  663. package/dist/web/observer_query_redaction.d.ts +6 -0
  664. package/dist/web/observer_query_redaction.js +58 -0
  665. package/dist/web/pane_registry.d.ts +2 -0
  666. package/dist/web/pane_registry.js +86 -22
  667. package/dist/web/tool_image.d.ts +6 -0
  668. package/dist/web/tool_image.js +17 -0
  669. package/dist/web/view_plugin.d.ts +14 -0
  670. package/dist/web/view_plugin.js +23 -1
  671. package/dist/worker/executor.js +31 -12
  672. package/dist/worker/index.d.ts +1 -0
  673. package/dist/worker/toolsets.js +3 -1
  674. package/dist/worker/types.d.ts +12 -1
  675. package/dist/workflows/registry.js +1 -0
  676. package/dist/workflows/registry_handle.d.ts +2 -0
  677. package/dist/workflows/runtime.d.ts +2 -0
  678. package/dist/workflows/runtime.js +1 -0
  679. package/dist/workspace_agent.d.ts +7 -0
  680. package/dist/workspace_agent.js +36 -0
  681. package/dist/workspace_collision.d.ts +76 -0
  682. package/dist/workspace_collision.js +688 -0
  683. package/dist/workspace_layout.d.ts +18 -0
  684. package/dist/workspace_layout.js +121 -0
  685. package/dist/workspace_runtime.d.ts +44 -0
  686. package/dist/workspace_runtime.js +82 -0
  687. package/dist/workspace_session_context.d.ts +62 -0
  688. package/dist/workspace_session_context.js +160 -0
  689. package/dist/zlm-embed.mjs +32518 -9615
  690. package/dist/zlm.js +1 -0
  691. package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
  692. package/node_modules/@zerg/model-contracts/README.md +90 -0
  693. package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
  694. package/node_modules/@zerg/model-contracts/index.js +223 -0
  695. package/node_modules/@zerg/model-contracts/package.json +8 -0
  696. package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
  697. package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
  698. package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
  699. package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
  700. package/package.json +45 -24
  701. package/packages/model-contracts/LICENSE.md +375 -0
  702. package/packages/model-contracts/README.md +90 -0
  703. package/packages/model-contracts/index.d.ts +20 -0
  704. package/packages/model-contracts/index.js +223 -0
  705. package/packages/model-contracts/package.json +8 -0
  706. package/remote-broker/Dockerfile +10 -0
  707. package/remote-broker/README.md +308 -0
  708. package/remote-broker/archive.py +1227 -0
  709. package/remote-broker/cutover.py +761 -0
  710. package/remote-broker/requirements.txt +5 -0
  711. package/remote-broker/resources.example.json +6 -0
  712. package/remote-broker/resources.write-staging.example.json +18 -0
  713. package/remote-broker/retained.py +686 -0
  714. package/remote-broker/retained_cleanup.py +550 -0
  715. package/remote-broker/server.py +648 -0
  716. package/scripts/build-remote-broker.mjs +13 -0
  717. package/scripts/ensure-local-packages.mjs +6 -0
  718. package/scripts/node-pty-helpers.mjs +103 -0
@@ -1,10 +1,13 @@
1
1
  import { resolve } from 'path';
2
2
  import { ToolCapability } from '../runtime/capabilities.js';
3
3
  import { runShellCommand } from '../../utils/shell.js';
4
- import { startCommandJob, readCommandJob, stopCommandJob } from '../runtime/command_jobs.js';
4
+ import { startCommandJob, readCommandJob, stopCommandJob, waitForCommandProgress } from '../runtime/command_jobs.js';
5
5
  import { resolveExecutionSettings } from '../../config/execution.js';
6
6
  import { configStore } from '../../config.js';
7
7
  import { assertTemporaryRootSafe, isPathWithinRoot } from '../../utils/temporary_write_root.js';
8
+ import { parseCheckedCommandPlan } from '../runtime/checked_commands.js';
9
+ import { parseVerificationRequest } from '../runtime/source_verification_contract.js';
10
+ import { createCommandVerification, finishCommandVerification, projectCurrentVerification } from '../runtime/source_verification.js';
8
11
  export const FAILURE_OUTPUT_LIMIT = 2000;
9
12
  /**
10
13
  * Bound failure output without losing the tail: build and test summaries and
@@ -20,31 +23,29 @@ export function summarizeCommandFailure(output, limit = FAILURE_OUTPUT_LIMIT) {
20
23
  return `${output.slice(0, headLength)}\n… [${omitted} characters omitted] …\n${output.slice(-tailLength)}`;
21
24
  }
22
25
  /**
23
- * R6/F7: actionable hint for a failed shell command, keyed on exit code and
24
- * stderr pattern. Returns null when nothing useful can be said. Pure + exported
26
+ * R6/F7: actionable hints require observed diagnostics or executor evidence.
27
+ * A nonzero predicate outcome alone establishes neither cause nor completeness.
28
+ * Returns null when nothing useful can be said. Pure + exported
25
29
  * so it can be unit-tested without spawning a process.
26
30
  */
27
- export function shellErrorHint(exitCode, stderr, hasStdout) {
28
- // 124 is the timeout kill path (utils/shell.ts). Checked first: a timed-out
29
- // command may have printed partial output, and the partial-output branch
30
- // below would diagnose it as a permission problem.
31
- if (exitCode === 124) {
32
- return 'The command hit its timeout and was killed — its output is incomplete. Retry with a larger timeout (maximum 600000 ms), or narrow the command so it finishes sooner.';
31
+ export function shellErrorHint(exitCode, stderr, hasStdout, timedOut = false) {
32
+ // A program can exit 124 without a timer firing. Only the executor knows the cause.
33
+ if (timedOut) {
34
+ return 'The command hit its timeout and local cleanup was requested; its output is incomplete. Retry with a larger timeout, use a managed background command for longer work, or narrow the command so it finishes sooner. Remote cleanup is unknown.';
33
35
  }
34
36
  if (/unrecognized option|invalid option|illegal option/i.test(stderr)) {
35
37
  return "The command rejected an option it does not recognize. If it looks like a ZTC concept (e.g. '--pane'), that is not a shell flag — pane targeting uses the pane tools (create_ztc_pane / ask_ztc_pane). Otherwise re-run with valid flags only.";
36
38
  }
37
- if (exitCode === 127) {
39
+ if (exitCode === 127 && /not found/i.test(stderr)) {
38
40
  return 'Command not found — the binary is not installed or not on PATH. Check the name or install it.';
39
41
  }
40
- // Partial-output wins over permission-denied: a command that printed results yet
41
- // exited non-zero (e.g. `find` hitting a permission-denied subtree) is the F7
42
- // "treated partial output as authoritative" trap — warn about completeness first.
43
- if (hasStdout) {
44
- return 'This command produced output but exited non-zero — the output is PARTIAL, not authoritative. Some entries were likely skipped (e.g. permission-denied subtrees). Do not treat it as complete; narrow the path or read specific files directly.';
42
+ if (/permission denied|EACCES/i.test(stderr)) {
43
+ return hasStdout
44
+ ? 'Permission denied — the command reported an access failure while producing output. Do not treat the output as complete for the inaccessible resources; inspect the reported paths and correct access or narrow the command.'
45
+ : 'Permission denied — the command reported an access failure. Inspect the reported path and permissions or use a different command.';
45
46
  }
46
- if (exitCode === 126 || /permission denied|EACCES/i.test(stderr)) {
47
- return 'Permission denied — the file is not executable or you lack access. Check permissions or use a different command.';
47
+ if (hasStdout) {
48
+ return 'This command produced output and exited non-zero. Output completeness and the failure cause are unknown; inspect the captured diagnostics and the program’s exit-status contract before retrying.';
48
49
  }
49
50
  return null;
50
51
  }
@@ -56,14 +57,27 @@ function failedCommandReceipt(content) {
56
57
  return false;
57
58
  }
58
59
  }
60
+ function executionObservation(policy) {
61
+ if (!policy)
62
+ return {};
63
+ const observed = Date.now();
64
+ const elapsed = observed - Date.parse(policy.started_at);
65
+ return { execution_policy: policy, ...(Number.isSafeInteger(elapsed) && elapsed >= 0
66
+ ? { observed_at: new Date(observed).toISOString(), elapsed_ms: elapsed } : {}) };
67
+ }
59
68
  // --- Shell Tool ---
69
+ function resolveRunCommandCwd(args, context) {
70
+ const baseCwd = context?.cwd || process.cwd();
71
+ return args.cwd ? resolve(baseCwd, String(args.cwd)) : baseCwd;
72
+ }
60
73
  export const runCommandTool = {
61
74
  isErrorResult: failedCommandReceipt,
75
+ resolveExecutionCwd: resolveRunCommandCwd,
62
76
  capabilities: [ToolCapability.SHELL_EXEC],
63
77
  definition: {
64
78
  name: 'run_command',
65
79
  overlapsProviderHarness: true,
66
- description: 'Run a shell command in the workspace and return stdout/stderr. Use for inspection, builds, servers, or scripts that are better expressed as commands than file tools.',
80
+ description: 'Run either ordinary shell text or an explicit checked literal-argv plan. For builds/tests prefer checked steps and bounded managed logs instead of piping shell text into tail. Checked pipelines report every declared stage and gate later steps; they do not certify source/build correctness or child-script internals. Local macOS/Linux Bash only.',
67
81
  parameters: {
68
82
  type: 'object',
69
83
  properties: {
@@ -71,34 +85,74 @@ export const runCommandTool = {
71
85
  type: 'string',
72
86
  description: 'Shell command to execute'
73
87
  },
88
+ checked: {
89
+ type: 'object', description: 'Mutually exclusive with command. Up to 8 ordered steps, each with up to 8 concurrent pipeline stages. Literal executable/args only; default acceptable_exit_codes [0]. A later step runs only after every prior declared stage is accepted. Explicit predicates may accept 1 or 141; exit 141 is not proven SIGPIPE. Total normalized plan ≤16KiB.',
90
+ properties: { steps: { type: 'array', minItems: 1, maxItems: 8, items: {
91
+ type: 'object', required: ['id', 'pipeline'], additionalProperties: false,
92
+ properties: { id: { type: 'string', maxLength: 64 }, pipeline: {
93
+ type: 'array', minItems: 1, maxItems: 8, items: {
94
+ type: 'object', required: ['executable', 'args'], additionalProperties: false,
95
+ properties: { executable: { type: 'string', maxLength: 512 }, args: {
96
+ type: 'array', maxItems: 64, items: { type: 'string', maxLength: 4096 }
97
+ },
98
+ acceptable_exit_codes: { type: 'array', minItems: 1, maxItems: 8,
99
+ items: { type: 'integer', minimum: 0, maximum: 255 } } },
100
+ },
101
+ } },
102
+ } } }, required: ['steps'], additionalProperties: false,
103
+ },
74
104
  cwd: {
75
105
  type: 'string',
76
106
  description: 'Working directory for the command'
77
107
  },
108
+ verification: {
109
+ type: 'object', description: 'Optional scoped source observations. Declared purpose is separate from actual process outcome and never certifies semantic qualification. Capture up to64 relative files (2MiB each,8MiB total), with source digests and Git metadata; current/stale/unknown applicability is checked separately. Local execution only.',
110
+ required: ['purpose', 'scope', 'source_paths'], additionalProperties: false,
111
+ properties: {
112
+ purpose: { type: 'string', enum: ['compile', 'test', 'benchmark', 'qualification'] },
113
+ scope: { type: 'string', maxLength: 512 },
114
+ source_paths: { type: 'array', minItems: 1, maxItems: 64, items: { type: 'string', maxLength: 512 } },
115
+ environment_id: { type: 'string', maxLength: 256 }, build_identity: { type: 'string', maxLength: 256 },
116
+ instrumentation: { type: 'string', enum: ['production', 'diagnostic', 'unknown'] },
117
+ },
118
+ },
78
119
  timeout: {
79
- type: 'string',
80
- description: 'Timeout in milliseconds (default: 30000)'
120
+ type: 'integer', minimum: 1, maximum: 86400000,
121
+ description: 'Process lifetime in milliseconds. Foreground: 1–600000, omitted uses local 30000 or Docker 120000. Native background: 1–86400000 (24 hours), omitted is unlimited. Independent of initial yield and read waits. Outer owner deadlines still apply; local wrapper cleanup does not prove remote cleanup.'
81
122
  },
82
123
  background: { type: 'boolean', description: 'Start a managed background job. Use read_command and stop_command with its job_id; survives a turn interrupt by default.' },
83
- yield_time_ms: { type: 'number', description: 'Initial background wait, 0–60000ms (default 1000).' },
124
+ yield_time_ms: { type: 'integer', minimum: 0, maximum: 60000, description: 'Initial background observation wait, 0–60000ms (default 1000). Expiry returns a running receipt and does not stop the process.' },
84
125
  stdin: {
85
126
  type: 'string',
86
127
  description: 'Optional text written to the command stdin. Prefer this over heredocs or nested quoting for multi-line payloads (e.g. git commit -F -).'
87
128
  }
88
129
  },
89
- required: ['command']
130
+ oneOf: [{ required: ['command'] }, { required: ['checked'] }],
90
131
  }
91
132
  },
92
133
  execute: async (args, context) => {
93
- if (args.command === undefined || args.command === null) {
134
+ const hasChecked = Object.hasOwn(args, 'checked');
135
+ const hasVerification = Object.hasOwn(args, 'verification');
136
+ const verificationRequest = hasVerification ? parseVerificationRequest(args.verification) : undefined;
137
+ if (hasVerification && !verificationRequest)
138
+ throw new Error('run_command: invalid source verification request');
139
+ if (hasVerification && process.env.ZTC_DOCKER_CONTAINER) {
140
+ throw new Error('Source verification supports local execution only; Docker source inputs cannot be captured from this host.');
141
+ }
142
+ if (hasChecked && Object.hasOwn(args, 'command')) {
143
+ throw new Error('run_command: provide exactly one of command or checked; they are mutually exclusive');
144
+ }
145
+ const checked = hasChecked ? parseCheckedCommandPlan(args.checked) : undefined;
146
+ if (hasChecked && !checked)
147
+ throw new Error('run_command: invalid checked plan');
148
+ if (!hasChecked && (args.command === undefined || args.command === null)) {
94
149
  throw new Error('run_command: command argument is required but was not provided');
95
150
  }
96
- const command = String(args.command);
151
+ const command = checked ? JSON.stringify(checked) : String(args.command);
97
152
  if (command === 'undefined' || command.trim() === '') {
98
153
  throw new Error(`run_command: command argument is invalid: "${command}"`);
99
154
  }
100
- const baseCwd = context?.cwd || process.cwd();
101
- const cwd = args.cwd ? resolve(baseCwd, String(args.cwd)) : baseCwd;
155
+ const cwd = resolveRunCommandCwd(args, context);
102
156
  const temporaryWriteRoot = context?.temporaryWriteRoot === undefined
103
157
  ? undefined
104
158
  : resolve(context.temporaryWriteRoot);
@@ -117,17 +171,23 @@ export const runCommandTool = {
117
171
  if (parsed <= 0) {
118
172
  throw new Error('run_command: timeout must be greater than 0 milliseconds');
119
173
  }
120
- if (parsed > 600000) {
121
- throw new Error('run_command: timeout must be less than or equal to 600000 milliseconds');
174
+ if (typeof args.timeout === 'boolean' || !Number.isSafeInteger(parsed)) {
175
+ throw new Error('run_command: timeout must be an integer number of milliseconds');
176
+ }
177
+ const maximum = args.background === true ? 86400000 : 600000;
178
+ if (parsed > maximum) {
179
+ throw new Error(`run_command: timeout must be less than or equal to ${maximum} milliseconds`);
122
180
  }
123
- timeoutMs = Math.floor(parsed);
181
+ timeoutMs = parsed;
124
182
  }
125
183
  // Use runShellCommand which handles docker routing via ZTC_DOCKER_CONTAINER
126
184
  const config = configStore.get();
127
- const profileId = config.permissionProfile || 'trusted';
128
- const baseProfile = config.permissionProfiles?.[profileId];
185
+ const admitted = context?.commandPolicy;
186
+ const profileId = admitted?.profileId ?? config.permissionProfile ?? 'trusted';
187
+ const baseProfile = admitted === undefined ? config.permissionProfiles?.[profileId] : admitted.profile;
188
+ const baseSandbox = admitted === undefined ? config.sandbox : admitted.sandbox;
129
189
  const profile = temporaryWriteRoot === undefined
130
- ? config.permissionProfiles?.[profileId]
190
+ ? baseProfile
131
191
  : {
132
192
  ...(baseProfile || {}),
133
193
  allowedPaths: [temporaryWriteRoot],
@@ -137,9 +197,9 @@ export const runCommandTool = {
137
197
  },
138
198
  };
139
199
  const sandbox = temporaryWriteRoot === undefined
140
- ? config.sandbox
200
+ ? baseSandbox
141
201
  : {
142
- ...(config.sandbox || {}),
202
+ ...(baseSandbox || {}),
143
203
  requireOsEnforcement: true,
144
204
  };
145
205
  const stdin = typeof args.stdin === 'string'
@@ -153,6 +213,7 @@ export const runCommandTool = {
153
213
  temporaryWriteRoot,
154
214
  stdin,
155
215
  env: context?.subprocessEnv,
216
+ ...(checked ? { checked } : {}),
156
217
  };
157
218
  if (args.background === true) {
158
219
  if (temporaryWriteRoot)
@@ -163,44 +224,107 @@ export const runCommandTool = {
163
224
  if (!Number.isSafeInteger(wait) || wait < 0 || wait > 60000)
164
225
  throw new Error('yield_time_ms must be between 0 and 60000');
165
226
  const settings = resolveExecutionSettings(config.execution);
227
+ const verification = verificationRequest ? await createCommandVerification(verificationRequest, cwd, command, checked ? 'checked' : 'shell') : undefined;
166
228
  const receipt = await startCommandJob({ sessionId: context.sessionId, command, cwd, timeoutMs,
167
229
  shell: shellOptions, maxJobs: settings.maxBackgroundJobs,
168
- signal: settings.interruptBackgroundJobs ? context.signal : undefined });
169
- return JSON.stringify(await readCommandJob(context.sessionId, receipt.job_id, 0, wait, context.signal));
230
+ signal: settings.interruptBackgroundJobs ? context.signal : undefined, verification,
231
+ canInspectVerificationSource: context.canInspectVerificationSource });
232
+ const result = await readCommandJob(context.sessionId, receipt.job_id, 0, wait, context.signal, context.canInspectVerificationSource);
233
+ context.onManagedCommand?.({ sessionId: context.sessionId, result, requestedWaitMs: wait, kind: 'launch' });
234
+ return JSON.stringify(result);
235
+ }
236
+ const initialVerification = verificationRequest ? await createCommandVerification(verificationRequest, cwd, command, checked ? 'checked' : 'shell') : undefined;
237
+ let launchPolicy;
238
+ let result;
239
+ try {
240
+ result = await runShellCommand(command, cwd, context?.signal, timeoutMs, { ...shellOptions,
241
+ onExecutionPolicy: policy => { launchPolicy = policy; },
242
+ onOutput: (stream, chunk) => {
243
+ try {
244
+ context?.onOutput?.(stream, chunk);
245
+ }
246
+ catch { /* informational observer only */ }
247
+ } });
248
+ }
249
+ catch (error) {
250
+ if (!initialVerification)
251
+ throw error;
252
+ const observation = executionObservation(launchPolicy);
253
+ const cancelled = Boolean(context?.signal?.aborted);
254
+ const verification = await finishCommandVerification(initialVerification, cancelled ? 'cancelled' : 'unknown', context?.canInspectVerificationSource);
255
+ context?.onVerificationReceipt?.(verification);
256
+ return JSON.stringify({ command, cwd, stdout: '', stderr: error.message,
257
+ ...observation,
258
+ status: cancelled ? 'cancelled' : 'failed', verification,
259
+ verification_current: await projectCurrentVerification(verification, context?.canInspectVerificationSource) });
260
+ }
261
+ const observation = executionObservation(result.execution_policy);
262
+ if (initialVerification) {
263
+ const outcome = result.checked ? result.checked.status === 'passed' ? 'passed'
264
+ : result.checked.status === 'timed_out' ? 'timed_out' : result.checked.status === 'cancelled' ? 'cancelled' : 'failed'
265
+ : result.timedOut === true ? 'timed_out' : result.exitCode === 0 ? 'passed' : 'failed';
266
+ const verification = await finishCommandVerification(initialVerification, outcome, context?.canInspectVerificationSource);
267
+ context?.onVerificationReceipt?.(verification);
268
+ return JSON.stringify({ command: result.command, cwd: result.cwd, stdout: result.stdout, stderr: result.stderr,
269
+ truncated: result.truncated, exit_code: result.exitCode,
270
+ ...observation,
271
+ status: outcome === 'passed' ? 'completed' : outcome === 'timed_out' ? 'timed_out' : outcome === 'cancelled' ? 'cancelled' : 'failed',
272
+ ...(result.checked ? { checked: result.checked } : {}), verification,
273
+ verification_current: await projectCurrentVerification(verification, context?.canInspectVerificationSource) });
274
+ }
275
+ if (result.checked) {
276
+ return JSON.stringify({ command: result.command, cwd: result.cwd, stdout: result.stdout,
277
+ stderr: result.stderr, truncated: result.truncated, exit_code: result.exitCode,
278
+ ...observation,
279
+ status: result.checked.status === 'passed' ? 'completed' : result.checked.status === 'timed_out'
280
+ ? 'timed_out' : result.checked.status === 'cancelled' ? 'cancelled' : 'failed', checked: result.checked });
170
281
  }
171
- const result = await runShellCommand(command, cwd, context?.signal, timeoutMs, shellOptions);
172
282
  // Handle non-zero exit codes
173
283
  if (result.exitCode !== 0) {
174
284
  const output = [result.stdout, result.stderr].filter(Boolean).join('\n').trim();
175
285
  const outputSnippet = summarizeCommandFailure(output) || '(no output)';
176
- // R6/F7: an exit code alone is not actionable — add a cause+fix hint so the
177
- // model self-corrects instead of re-running the mistake or trusting partial
178
- // output as authoritative.
179
- const hint = shellErrorHint(result.exitCode, result.stderr ?? '', Boolean(result.stdout?.trim()));
180
- throw new Error(`Command failed (exit ${result.exitCode}):\n${outputSnippet}${hint ? `\n\nhint: ${hint}` : ''}`);
286
+ // R6/F7: retain the failed status; hints distinguish observed causes from
287
+ // unknown completeness without guessing which compound stage failed.
288
+ const hint = shellErrorHint(result.exitCode, result.stderr ?? '', Boolean(result.stdout?.trim()), result.timedOut === true);
289
+ throw new Error(`Command failed (exit ${result.exitCode}):\n${outputSnippet}${result.execution_policy ? `\nexecution: ${JSON.stringify(observation)}` : ''}${hint ? `\n\nhint: ${hint}` : ''}`);
181
290
  }
182
291
  return JSON.stringify({
183
292
  command: result.command,
184
293
  cwd: result.cwd,
185
294
  stdout: result.stdout,
186
295
  stderr: result.stderr,
187
- truncated: result.truncated
296
+ truncated: result.truncated,
297
+ ...observation
188
298
  });
189
299
  }
190
300
  };
191
301
  export const readCommandTool = {
302
+ parallelSafe: true,
192
303
  isErrorResult: failedCommandReceipt,
193
304
  capabilities: [ToolCapability.FILE_READ],
194
305
  definition: {
195
- name: 'read_command', description: 'Read a managed command receipt and up to 16KB of incremental output. Cursor is a byte offset returned by the previous receipt. Wait is bounded; status running does not mean success.',
306
+ name: 'read_command', description: 'Read a managed command receipt and up to 16KB of incremental output. Cursor is a byte offset returned by the previous receipt. Zero wait is nonblocking. A positive wait wakes on output or terminal state; the host may keep waiting on a healthy silent job between model requests. Running does not mean success.',
196
307
  parameters: { type: 'object', properties: {
197
- job_id: { type: 'string', description: 'Session-owned job ID from run_command.' }, cursor: { type: 'number', description: 'Byte cursor from the previous read (default 0).' }, wait_ms: { type: 'number', description: '0–60000ms; waits for completion or deadline.' },
308
+ job_id: { type: 'string', description: 'Session-owned job ID from run_command.' }, cursor: { type: 'number', description: 'Byte cursor from the previous read (default 0).' }, wait_ms: { type: 'number', description: '0–60000ms; wakes for output, terminal state or this read deadline. Zero requests an immediate inspection.' },
198
309
  }, required: ['job_id'] },
199
310
  },
200
311
  execute: async (args, context) => {
201
312
  if (!context?.sessionId)
202
313
  throw new Error('Managed commands require a session ID.');
203
- return JSON.stringify(await readCommandJob(context.sessionId, String(args.job_id), Number(args.cursor ?? 0), Number(args.wait_ms ?? 0), context.signal));
314
+ const requestedWaitMs = Number(args.wait_ms ?? 0);
315
+ if (!Number.isSafeInteger(requestedWaitMs) || requestedWaitMs < 0 || requestedWaitMs > 60000) {
316
+ throw new Error('wait_ms must be an integer between 0 and 60000.');
317
+ }
318
+ const slice = context.managedCommandWaitSliceMs;
319
+ if (slice !== undefined && (!Number.isSafeInteger(slice) || slice < 0 || slice > 60000)) {
320
+ throw new Error('managedCommandWaitSliceMs must be an integer between 0 and 60000.');
321
+ }
322
+ const maxWaitMs = slice === undefined ? requestedWaitMs : Math.min(requestedWaitMs, slice);
323
+ const result = requestedWaitMs === 0
324
+ ? await readCommandJob(context.sessionId, String(args.job_id), Number(args.cursor ?? 0), 0, context.signal, context.canInspectVerificationSource)
325
+ : (await waitForCommandProgress(context.sessionId, String(args.job_id), { cursor: Number(args.cursor ?? 0), maxWaitMs, signal: context.signal, canInspectVerificationSource: context.canInspectVerificationSource })).result;
326
+ context.onManagedCommand?.({ sessionId: context.sessionId, result, requestedWaitMs, kind: 'read' });
327
+ return JSON.stringify(result);
204
328
  },
205
329
  };
206
330
  export const stopCommandTool = {
@@ -212,6 +336,9 @@ export const stopCommandTool = {
212
336
  execute: async (args, context) => {
213
337
  if (!context?.sessionId)
214
338
  throw new Error('Managed commands require a session ID.');
215
- return JSON.stringify(await stopCommandJob(context.sessionId, String(args.job_id)));
339
+ const result = await stopCommandJob(context.sessionId, String(args.job_id), context.canInspectVerificationSource);
340
+ if (result.verification)
341
+ context.onVerificationReceipt?.(result.verification);
342
+ return JSON.stringify(result);
216
343
  },
217
344
  };
@@ -4,6 +4,7 @@
4
4
  * ranking tokens), or `foo bar` (ranked keyword search).
5
5
  */
6
6
  import { ToolCapability } from '../runtime/capabilities.js';
7
+ import { captureHelperRequirements } from './helper_requirements.js';
7
8
  import { defaultTools } from './registry.js';
8
9
  import { getDeferredDefinitions } from './deferred.js';
9
10
  import { getToolBundle, listToolBundles } from './bundle_registry.js';
@@ -112,7 +113,7 @@ function searchToolSpecs(query, deferred, maxResults) {
112
113
  schemas,
113
114
  };
114
115
  }
115
- export const toolSearchTool = {
116
+ export const toolSearchTool = captureHelperRequirements({
116
117
  capabilities: [ToolCapability.FILE_READ],
117
118
  definition: {
118
119
  name: 'tool_search',
@@ -181,4 +182,4 @@ export const toolSearchTool = {
181
182
  }
182
183
  return JSON.stringify(result);
183
184
  },
184
- };
185
+ });
@@ -1,23 +1,51 @@
1
1
  import { ToolDefinition } from '../../types.js';
2
+ import type { ModelUsageObserver } from '../../types.js';
2
3
  import { ToolCapability } from '../runtime/capabilities.js';
3
4
  import type { ToolEffectKind } from '../runtime/tool_effects.js';
4
5
  import type { ToolResponseStore } from '../tool_response_store.js';
6
+ import type { ManagedCommandObservation } from '../runtime/command_jobs.js';
7
+ import type { CommandVerificationReceipt, SourceSnapshot } from '../runtime/source_verification_contract.js';
8
+ import type { HostVerifierDecision } from '../runtime/verifier_contract.js';
9
+ import type { BenchmarkComparisonDecision } from '../runtime/benchmark_comparison.js';
5
10
  export interface ToolContext {
11
+ /** Host-owned command launch policy; never accepted from tool arguments. */
12
+ commandPolicy?: import('../../utils/sandbox.js').SandboxCommandOptions;
6
13
  cwd: string;
7
14
  /** The model-provided tool-use id that originated this execution. */
8
15
  toolCallId?: string;
16
+ /** Captured owner of the request which dispatched this tool. */
17
+ onUsage?: ModelUsageObserver;
9
18
  sessionId?: string;
10
19
  signal?: AbortSignal;
11
20
  temporaryWriteRoot?: string;
12
21
  /** Exact environment for shell-tool subprocesses; undefined inherits legacy ambient env. */
13
22
  subprocessEnv?: NodeJS.ProcessEnv;
23
+ /** Host-owned informational output channel for trusted built-in commands. */
24
+ onOutput?: (stream: 'stdout' | 'stderr', chunk: string) => void;
14
25
  toolResponseStore: ToolResponseStore;
15
26
  discoveredTools: Set<string>;
16
27
  availableTools?: Tool[];
17
28
  workflowTimeoutMs?: number;
29
+ /** Host-owned initial read slice; the agent waits after recording the tool pair. */
30
+ managedCommandWaitSliceMs?: number;
31
+ /** Runtime-owned observation channel; exposed only to the built-in managed command tools. */
32
+ onManagedCommand?: (observation: ManagedCommandObservation) => void;
33
+ /** Genuine built-in command observation; custom tool output cannot populate this channel. */
34
+ onVerificationReceipt?: (receipt: CommandVerificationReceipt) => void;
35
+ /** Runtime-owned admission for fresh source reads; never supplied to custom tools. */
36
+ canInspectVerificationSource?: (source: SourceSnapshot) => boolean | Promise<boolean>;
37
+ /** Trusted registered adapter admission; stripped from all custom tools. */
38
+ onHostVerifier?: (receipt: CommandVerificationReceipt, decision: HostVerifierDecision) => void;
39
+ /** Trusted registered comparison; original measurements remain in the canonical evidence store. */
40
+ onHostBenchmarkComparison?: (decision: BenchmarkComparisonDecision) => void;
18
41
  }
19
42
  export interface Tool {
20
43
  definition: ToolDefinition;
44
+ /** Host-created adapter reference to the canonical command output source. */
45
+ outputSource?: Tool;
46
+ /** Host-created structured directory mapping, shared with execution. This
47
+ * describes invocation arguments, not directories inferred from shell text. */
48
+ resolveExecutionCwd?: (args: Record<string, unknown>, context?: ToolContext) => string;
21
49
  /** Explicit scheduling opt-in; only read effects may run concurrently. */
22
50
  parallelSafe?: boolean;
23
51
  isErrorResult?: (content: string) => boolean;
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const verifyArtifactTool: Tool;
@@ -0,0 +1,60 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { join } from 'node:path';
3
+ import { ToolCapability } from '../runtime/capabilities.js';
4
+ import { jsonAssertionsRecipe } from '../runtime/json_verifier_recipe.js';
5
+ import { captureVerifierInputs } from '../runtime/verifier_capture.js';
6
+ import { parseCommandVerificationReceipt, parseVerificationRequest } from '../runtime/source_verification_contract.js';
7
+ import { parseVerifierDecision } from '../runtime/verifier_contract.js';
8
+ const recipeText = jsonAssertionsRecipe.toString();
9
+ const hash = (value) => createHash('sha256').update(value).digest('hex');
10
+ export const verifyArtifactTool = Object.freeze({
11
+ capabilities: [ToolCapability.FILE_READ], effect: 'read', parallelSafe: true,
12
+ definition: {
13
+ name: 'verify_artifact',
14
+ description: 'Run the registered host json_assertions verifier against bounded immutable captures of a JSON input artifact and assertion configuration. Configuration: {schema_version:1,checks:[{path:JSON_pointer,op:"equals",value:scalar} or {path:JSON_pointer,op:"number_close",value:number,absolute_tolerance:number}]}. Proves only these configured artifact assertions, not producer correctness, whole-program verification or benchmark eligibility. Each file must be a regular local file of at most 65536 bytes. Changed captures remain unknown; later edits stale applicability. Never supplies a custom recipe or a claimed outcome.',
15
+ parameters: { type: 'object', additionalProperties: false, properties: {
16
+ adapter_id: { type: 'string', enum: ['json_assertions'] },
17
+ input_path: { type: 'string', description: 'Relative JSON artifact path under the current admitted working directory.' },
18
+ config_path: { type: 'string', description: 'Relative assertion configuration path; distinct from input_path.' },
19
+ }, required: ['adapter_id', 'input_path', 'config_path'] },
20
+ },
21
+ execute: async (args, context) => {
22
+ if (!context)
23
+ throw new Error('verify_artifact requires a host execution context');
24
+ if (Object.keys(args).some(key => !['adapter_id', 'input_path', 'config_path'].includes(key)) || args.adapter_id !== 'json_assertions') {
25
+ throw new TypeError('verify_artifact accepts only a registered adapter and input/config paths');
26
+ }
27
+ const request = parseVerificationRequest({ purpose: 'test', scope: 'artifact:json_assertions',
28
+ source_paths: [args.input_path, args.config_path], instrumentation: 'unknown' });
29
+ if (!request)
30
+ throw new TypeError('verify_artifact requires two distinct bounded relative input/config paths');
31
+ const captured = await captureVerifierInputs(context, request.source_paths);
32
+ const receipt = { schema_version: 1, receipt_id: randomUUID(), source: captured.source,
33
+ end_source: null, purpose: 'test', scope: 'artifact:json_assertions', command_sha256: hash(recipeText), command_kind: 'host_verifier',
34
+ environment: { platform: process.platform, arch: process.arch, node_version: process.version, declared_id: null },
35
+ build_identity: null, instrumentation: 'unknown', process_outcome: 'running', source_binding: 'unknown', qualification: 'unverified', artifact_refs: [] };
36
+ const input = captured.documents.get(String(args.input_path));
37
+ const config = captured.documents.get(String(args.config_path));
38
+ const binding = input !== undefined && config !== undefined && !context.signal?.aborted
39
+ ? 'immutable_bytes' : 'unknown';
40
+ const result = binding === 'immutable_bytes'
41
+ ? jsonAssertionsRecipe(input, config) : { outcome: 'unknown', checks_total: 0, checks_passed: 0,
42
+ reason: 'The complete immutable UTF-8 input capture was unavailable, changed, denied or cancelled.' };
43
+ const end = (await captureVerifierInputs(context, request.source_paths)).source;
44
+ const finished = { ...receipt, end_source: end, process_outcome: result.outcome,
45
+ source_binding: receipt.source.coverage === 'complete' && end.coverage === 'complete'
46
+ && receipt.source.source_id === end.source_id ? 'observed_endpoints' : 'unknown' };
47
+ finished.artifact_refs = receipt.source.files.filter(file => file.kind === 'file').map(file => ({
48
+ origin: 'local', path: join(receipt.source.cwd, file.path), sha256: file.sha256,
49
+ }));
50
+ const verifier = parseVerifierDecision({ schema_version: 1, adapter_id: 'json_assertions', recipe_version: 1, execution: 'host_in_process',
51
+ recipe_sha256: hash(recipeText), receipt_id: receipt.receipt_id, source_id: receipt.source.source_id,
52
+ scope: 'artifact:json_assertions', input_path: args.input_path, config_path: args.config_path,
53
+ input_binding: binding, ...result, benchmark_eligibility: 'unknown' }, finished);
54
+ if (!parseCommandVerificationReceipt(finished) || !verifier)
55
+ throw new Error('The host adapter produced an invalid bounded decision');
56
+ if (!context.signal?.aborted)
57
+ context.onHostVerifier?.(finished, verifier);
58
+ return JSON.stringify({ verification: finished, verifier });
59
+ },
60
+ });
@@ -39,6 +39,7 @@ export const workflowTool = {
39
39
  args: args.args,
40
40
  budgetTokens: readBudgetTokens(args.budgetTokens),
41
41
  workflowTimeoutMs: context?.workflowTimeoutMs,
42
+ onUsage: context?.onUsage,
42
43
  });
43
44
  if (args.background === true) {
44
45
  return `Workflow started in background: ${runId}`;
@@ -1,9 +1,11 @@
1
- import { type AgentEvent, type AgentState } from '../types.js';
1
+ import { type AgentEvent, type AgentState, type CommandWaitingState } from '../types.js';
2
2
  export type ActivityWireStatus = 'idle' | 'thinking' | 'tool_executing' | 'streaming' | 'error';
3
3
  export interface ActivityDisplayState {
4
4
  wireStatus: ActivityWireStatus;
5
5
  verb?: string;
6
6
  label: string | null;
7
+ waiting?: CommandWaitingState;
8
+ toolProgress?: AgentState['toolProgress'];
7
9
  }
8
10
  export declare function applyAgentEventToState(previous: AgentState, event: AgentEvent): AgentState;
9
11
  export declare function buildActivityDisplayState(state: AgentState, thinkingLabel: string | null): ActivityDisplayState;
@@ -14,6 +16,9 @@ export declare function buildActivityDisplayState(state: AgentState, thinkingLab
14
16
  * Returns null for idle/error.
15
17
  */
16
18
  export declare function getAgentActionLabel(state: AgentState): string | null;
19
+ export declare function formatApiRetryNotice(event: Extract<AgentEvent, {
20
+ type: 'api_retry';
21
+ }>): string;
17
22
  /**
18
23
  * Placeholder text for the composer while the agent is active.
19
24
  * Shared by every renderer so Ink and Ratatui show the same prompt.