@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,20 @@
1
1
  import { basename, dirname, join, relative, resolve } from 'path';
2
2
  import { realpathSync } from 'node:fs';
3
3
  import { appendFile } from 'node:fs/promises';
4
+ import { getRuntimeCapabilities } from '../tools/helper_requirements.js';
4
5
  import { ToolCapability } from './capabilities.js';
5
6
  import { configStore } from '../../config.js';
6
7
  import { loadIntentsContext, maybeAutoUpdateIntents } from '../../context/intents_loader.js';
7
8
  import { resolveToolEffect } from './tool_effects.js';
9
+ import { isManagedRemoteResourceTool } from './remote_resources.js';
10
+ import { askUserTool } from '../tools/ask_user.js';
11
+ import { recallToolResponseTool } from '../tools/recall_tool_response.js';
12
+ import { sessionEvidenceTool } from '../tools/session_evidence.js';
13
+ import { parseVerificationRequest } from './source_verification_contract.js';
14
+ import { readCommandTool, runCommandTool, stopCommandTool } from '../tools/shell.js';
15
+ import { verifyArtifactTool } from '../tools/verify_artifact.js';
16
+ import { benchmarkCPUTool } from '../tools/benchmark_cpu.js';
17
+ import { compareBenchmarksTool } from '../tools/compare_benchmarks.js';
8
18
  function getTool(name, tools) {
9
19
  return tools.find(t => t.definition.name === name);
10
20
  }
@@ -24,6 +34,49 @@ function isHostControlPlaneWrite(tool, args, cwd) {
24
34
  return false;
25
35
  }
26
36
  }
37
+ /** Missing sources still require permission for the resolved parent and leaf. */
38
+ function canonicalSourcePath(path) {
39
+ let probe = path;
40
+ const missing = [];
41
+ while (true) {
42
+ try {
43
+ return join(realpathSync(probe), ...missing);
44
+ }
45
+ catch (error) {
46
+ const code = error.code;
47
+ if (code !== 'ENOENT' && code !== 'ENOTDIR')
48
+ throw error;
49
+ const parent = dirname(probe);
50
+ if (parent === probe)
51
+ throw error;
52
+ missing.unshift(basename(probe));
53
+ probe = parent;
54
+ }
55
+ }
56
+ }
57
+ function sourceReadDecision(cwd, paths, policy) {
58
+ let approvalRequired = false;
59
+ for (const path of paths) {
60
+ const lexical = resolve(cwd, path);
61
+ const check = (target) => policy?.evaluateTool({
62
+ name: 'read_file', args: { path: target }, capabilities: [ToolCapability.FILE_READ],
63
+ }) ?? { allowed: true };
64
+ const lexicalDecision = check(lexical);
65
+ if (!lexicalDecision.allowed)
66
+ return lexicalDecision;
67
+ approvalRequired ||= lexicalDecision.approvalRequired === true;
68
+ try {
69
+ const canonicalDecision = check(canonicalSourcePath(lexical));
70
+ if (!canonicalDecision.allowed)
71
+ return canonicalDecision;
72
+ approvalRequired ||= canonicalDecision.approvalRequired === true;
73
+ }
74
+ catch {
75
+ return { allowed: false, reason: 'Permission denied: source verification path cannot be resolved for read admission.' };
76
+ }
77
+ }
78
+ return { allowed: true, ...(approvalRequired ? { approvalRequired } : {}) };
79
+ }
27
80
  async function executeTool(name, args, tools, context) {
28
81
  const tool = getTool(name, tools);
29
82
  if (!tool)
@@ -43,11 +96,11 @@ function normalizeChangedPath(path, cwd) {
43
96
  const rel = relative(cwd, resolve(cwd, path));
44
97
  return rel.startsWith('..') ? path : rel || '.';
45
98
  }
46
- function extractChangedPaths(tool, output, cwd) {
99
+ function extractChangedPaths(capabilities, output, cwd) {
47
100
  // Only tools that declare FILE_WRITE can produce file-change events.
48
101
  // Inspecting capabilities (rather than tool name) lets new write tools opt
49
102
  // in without changing this file — they just need `.path` or `.paths`.
50
- if (!tool || !tool.capabilities?.includes(ToolCapability.FILE_WRITE))
103
+ if (!capabilities.includes(ToolCapability.FILE_WRITE))
51
104
  return [];
52
105
  try {
53
106
  const parsed = JSON.parse(output);
@@ -109,9 +162,28 @@ async function recordToolTrace(entry) {
109
162
  export async function executeToolWithRuntime(name, args, options) {
110
163
  const tool = getTool(name, options.tools);
111
164
  const traceStartedAt = Date.now();
112
- const capabilities = tool?.capabilities || [];
165
+ const ordinaryCapabilities = getRuntimeCapabilities(tool);
166
+ const requiredCapabilities = (input) => (tool === runCommandTool && Object.hasOwn(input, 'verification')
167
+ ? [...new Set([...ordinaryCapabilities, ToolCapability.FILE_READ])]
168
+ : ordinaryCapabilities);
169
+ let capabilities = requiredCapabilities(args);
113
170
  let effectiveArgs = args;
114
171
  let approvalGranted = false;
172
+ let managedCommand;
173
+ let verificationReceipt;
174
+ let verifierDecision;
175
+ let benchmarkComparisonDecision;
176
+ let policyExecutionCwd;
177
+ // A guarded remote session has a closed host-owned tool surface. This must
178
+ // precede hooks/approval: neither a model, plugin name nor permission update
179
+ // can turn a generic command into the verified remote broker.
180
+ if (options.remoteResourceSession && (!tool || (!isManagedRemoteResourceTool(tool, options.remoteResourceSession)
181
+ && tool !== askUserTool && tool !== recallToolResponseTool && tool !== sessionEvidenceTool))) {
182
+ return {
183
+ content: 'Guarded remote session: use the host-managed remote_resource tool under a required lease. Unrestricted shell, network and plugin execution is blocked.',
184
+ isError: true, effectiveArgs,
185
+ };
186
+ }
115
187
  // R6/F7: the model sometimes passes a shell flag (e.g. `--pane`) as a tool
116
188
  // ARGUMENT KEY rather than inside the command string (`grep: unrecognized
117
189
  // option '--pane'`). A flag-style key the tool does NOT declare is never a
@@ -150,6 +222,7 @@ export async function executeToolWithRuntime(name, args, options) {
150
222
  // drop fields by omitting them. The old replace-semantics turned
151
223
  // `{path: '/tmp/safe'}` into a write of empty content.
152
224
  effectiveArgs = { ...effectiveArgs, ...preHook.updatedArgs };
225
+ capabilities = requiredCapabilities(effectiveArgs);
153
226
  }
154
227
  if (preHook.failed || preHook.decision === 'deny') {
155
228
  return {
@@ -238,14 +311,23 @@ export async function executeToolWithRuntime(name, args, options) {
238
311
  }
239
312
  approvalGranted = true;
240
313
  }
314
+ let profileApprovalRequired = false;
241
315
  if (options.policy
242
316
  && tool
243
317
  && !hostControlPlaneWrite) {
318
+ try {
319
+ policyExecutionCwd = tool.resolveExecutionCwd?.(effectiveArgs, options.context);
320
+ }
321
+ catch (error) {
322
+ return handleToolFailure(error);
323
+ }
244
324
  const decision = options.policy.evaluateTool({
245
325
  name,
246
326
  args: effectiveArgs,
247
- capabilities,
327
+ capabilities: ordinaryCapabilities,
328
+ ...(policyExecutionCwd === undefined ? {} : { executionCwd: policyExecutionCwd }),
248
329
  });
330
+ profileApprovalRequired = decision.approvalRequired === true;
249
331
  if (!decision.allowed) {
250
332
  return {
251
333
  content: decision.reason || `Permission denied: ${name}`,
@@ -254,7 +336,33 @@ export async function executeToolWithRuntime(name, args, options) {
254
336
  };
255
337
  }
256
338
  }
257
- const directlyGated = options.approvalRequiredCapabilities?.some(capability => capabilities.includes(capability)) === true;
339
+ const verificationAdmission = () => {
340
+ const adapter = tool === verifyArtifactTool || tool === benchmarkCPUTool;
341
+ const measured = tool === benchmarkCPUTool;
342
+ if (!adapter && (tool !== runCommandTool || !Object.hasOwn(effectiveArgs, 'verification')))
343
+ return undefined;
344
+ if (!options.context)
345
+ return {
346
+ content: 'Source verification requires a host execution context.', isError: true, effectiveArgs,
347
+ };
348
+ const request = parseVerificationRequest(adapter ? { purpose: measured ? 'benchmark' : 'test', scope: measured ? 'benchmark:cpu_integer_sum' : 'artifact:json_assertions',
349
+ source_paths: [effectiveArgs.input_path, effectiveArgs.config_path], instrumentation: measured ? 'production' : 'unknown' } : effectiveArgs.verification);
350
+ if (!request)
351
+ return { content: `${name}: invalid source verification request`, isError: true, effectiveArgs };
352
+ const cwd = !adapter && effectiveArgs.cwd ? resolve(options.context.cwd, String(effectiveArgs.cwd)) : options.context.cwd;
353
+ const decision = sourceReadDecision(cwd, request.source_paths, options.policy);
354
+ if (!decision.allowed)
355
+ return {
356
+ content: decision.reason || 'Permission denied: source verification requires file_read.',
357
+ isError: true, effectiveArgs,
358
+ };
359
+ profileApprovalRequired ||= decision.approvalRequired === true;
360
+ return undefined;
361
+ };
362
+ const preflight = verificationAdmission();
363
+ if (preflight)
364
+ return preflight;
365
+ const directlyGated = options.approvalRequiredCapabilities?.some(capability => capabilities.includes(capability)) === true || profileApprovalRequired;
258
366
  if (directlyGated && !approvalGranted) {
259
367
  if (!options.approvalRequester) {
260
368
  return {
@@ -283,6 +391,19 @@ export async function executeToolWithRuntime(name, args, options) {
283
391
  }
284
392
  approvalGranted = true;
285
393
  }
394
+ const canInspectVerificationSource = (source) => {
395
+ if (source.origin !== 'local')
396
+ return false;
397
+ // A shell approval for stop_command grants cancellation, not a new read.
398
+ if (options.approvalRequiredCapabilities?.includes(ToolCapability.FILE_READ)
399
+ && !(approvalGranted && capabilities.includes(ToolCapability.FILE_READ)))
400
+ return false;
401
+ const decision = sourceReadDecision(source.cwd, source.files.map(file => file.path), options.policy);
402
+ if (decision.approvalRequired && !(approvalGranted && capabilities.includes(ToolCapability.FILE_READ)))
403
+ return false;
404
+ return decision.allowed;
405
+ };
406
+ let checkpointRejected = false;
286
407
  try {
287
408
  // Systemic tool timeout: read-only tools get a 2-minute timeout to
288
409
  // prevent the agent from hanging indefinitely on stuck searches,
@@ -290,21 +411,69 @@ export async function executeToolWithRuntime(name, args, options) {
290
411
  // are NOT timed out because a write completing after the runtime
291
412
  // returned an error would produce invisible disk mutations.
292
413
  const TOOL_TIMEOUT_MS = 120_000;
414
+ const cwd = options.context?.cwd || options.hooks?.getBaseContext().cwd || process.cwd();
415
+ // Built-in commands and host-created adapters share their actual structured
416
+ // invocation mapping; tools without a declaration retain the base context.
417
+ const effectCwd = policyExecutionCwd ?? tool?.resolveExecutionCwd?.(effectiveArgs, options.context) ?? cwd;
293
418
  const isWriteTool = capabilities.includes(ToolCapability.FILE_WRITE)
294
419
  || capabilities.includes(ToolCapability.SHELL_EXEC);
295
420
  if (tool && options.onToolEffect) {
296
421
  await options.onToolEffect({
297
422
  phase: 'before_execute',
298
423
  toolName: name,
299
- effect: resolveToolEffect(tool),
424
+ effect: resolveToolEffect({ ...tool, capabilities: ordinaryCapabilities }),
300
425
  args: effectiveArgs,
426
+ cwd: effectCwd,
427
+ signal: options.context?.signal,
301
428
  ...(options.context?.toolCallId
302
429
  ? { toolCallId: options.context.toolCallId }
303
430
  : {}),
304
431
  });
305
432
  }
306
- const toolPromise = executeTool(name, effectiveArgs, options.tools, options.context);
307
- const cwd = options.context?.cwd || options.hooks?.getBaseContext().cwd || process.cwd();
433
+ if (options.context?.signal?.aborted)
434
+ return {
435
+ content: 'not_executed: the turn was cancelled before tool dispatch.', isError: true, effectiveArgs,
436
+ };
437
+ if (tool && options.beforeExecute) {
438
+ try {
439
+ await options.beforeExecute(effectiveArgs);
440
+ }
441
+ catch (error) {
442
+ checkpointRejected = true;
443
+ throw error;
444
+ }
445
+ }
446
+ // Approval, observers and checkpoint writes may yield. Recheck the actual
447
+ // dispatch paths and cancellation immediately before invoking the tool.
448
+ if (options.context?.signal?.aborted)
449
+ return {
450
+ content: 'not_executed: the turn was cancelled before tool dispatch.', isError: true, effectiveArgs,
451
+ };
452
+ const dispatchAdmission = verificationAdmission();
453
+ if (dispatchAdmission)
454
+ return dispatchAdmission;
455
+ const toolContext = options.context ? { ...options.context,
456
+ onOutput: tool === runCommandTool || tool?.outputSource === runCommandTool
457
+ ? options.context.onOutput : undefined,
458
+ canInspectVerificationSource: tool === runCommandTool || tool === readCommandTool || tool === stopCommandTool || tool === verifyArtifactTool || tool === benchmarkCPUTool
459
+ ? canInspectVerificationSource : undefined,
460
+ managedCommandWaitSliceMs: tool === readCommandTool || tool === runCommandTool
461
+ ? options.context.managedCommandWaitSliceMs : undefined,
462
+ onManagedCommand: tool === readCommandTool || tool === runCommandTool
463
+ ? (observation) => { managedCommand = observation; }
464
+ : undefined,
465
+ onVerificationReceipt: tool === runCommandTool || tool === stopCommandTool || tool === benchmarkCPUTool
466
+ ? (receipt) => { verificationReceipt = structuredClone(receipt); }
467
+ : undefined,
468
+ onHostVerifier: tool === verifyArtifactTool || tool === benchmarkCPUTool ? (receipt, decision) => {
469
+ verificationReceipt = structuredClone(receipt);
470
+ verifierDecision = structuredClone(decision);
471
+ } : undefined,
472
+ onHostBenchmarkComparison: tool === compareBenchmarksTool ? (decision) => {
473
+ benchmarkComparisonDecision = structuredClone(decision);
474
+ } : undefined,
475
+ } : undefined;
476
+ const toolPromise = executeTool(name, effectiveArgs, options.tools, toolContext);
308
477
  let output;
309
478
  if (isWriteTool) {
310
479
  output = await toolPromise;
@@ -328,6 +497,7 @@ export async function executeToolWithRuntime(name, args, options) {
328
497
  const TOOL_OUTPUT_CAP = 80_000;
329
498
  output = augmentReadResultWithIntent(name, effectiveArgs, output, cwd);
330
499
  let resultContent = output;
500
+ const contentTruncated = resultContent.length > TOOL_OUTPUT_CAP;
331
501
  if (resultContent.length > TOOL_OUTPUT_CAP) {
332
502
  const HEAD = Math.floor(TOOL_OUTPUT_CAP * 0.8);
333
503
  const TAIL = TOOL_OUTPUT_CAP - HEAD;
@@ -336,7 +506,7 @@ export async function executeToolWithRuntime(name, args, options) {
336
506
  + `\n\n[output truncated: ${resultContent.length.toLocaleString()} chars / ~${totalLines.toLocaleString()} lines — showing first ${HEAD.toLocaleString()} and last ${TAIL.toLocaleString()} chars]\n\n`
337
507
  + resultContent.slice(-TAIL);
338
508
  }
339
- const changedPaths = extractChangedPaths(tool, output, cwd);
509
+ const changedPaths = extractChangedPaths(ordinaryCapabilities, output, cwd);
340
510
  // The plan artifact is host control-plane state outside the workspace.
341
511
  // Auto-intents would turn this exact-one-file exception into a second
342
512
  // workspace write, violating plan mode's safety boundary.
@@ -348,12 +518,22 @@ export async function executeToolWithRuntime(name, args, options) {
348
518
  toolName: name,
349
519
  settings: configStore.get().intents,
350
520
  });
521
+ const allChangedPaths = [...new Set([...changedPaths, ...intentChangedPaths])];
522
+ if (allChangedPaths.length > 0 && options.onLocalFileChange) {
523
+ try {
524
+ await options.onLocalFileChange(allChangedPaths, cwd);
525
+ }
526
+ catch {
527
+ // The write has committed. An observation-store error must not invite
528
+ // replay of the successful mutation by presenting it as a tool failure.
529
+ resultContent += '\nLocal workspace evidence unavailable; the file write already completed.';
530
+ }
531
+ }
351
532
  if (options.hooks) {
352
533
  // FileChanged fires before PostToolUse: the write has already committed
353
534
  // to disk, so watchers must observe it regardless of a later PostToolUse
354
535
  // deny. PostToolUse itself is observational — deny surfaces as text,
355
536
  // never isError:true, otherwise the model retries a call that succeeded.
356
- const allChangedPaths = [...new Set([...changedPaths, ...intentChangedPaths])];
357
537
  if (allChangedPaths.length > 0) {
358
538
  await options.hooks.dispatch('FileChanged', {
359
539
  paths: allChangedPaths,
@@ -379,10 +559,22 @@ export async function executeToolWithRuntime(name, args, options) {
379
559
  return {
380
560
  content: resultContent,
381
561
  isError: false,
562
+ contentTruncated,
382
563
  effectiveArgs,
564
+ ...(managedCommand ? { managedCommand } : {}),
565
+ ...(verificationReceipt ? { verificationReceipt } : {}),
566
+ ...(!contentTruncated && verifierDecision ? { verifierDecision } : {}),
567
+ ...(!contentTruncated && benchmarkComparisonDecision ? { benchmarkComparisonDecision } : {}),
383
568
  };
384
569
  }
385
570
  catch (error) {
571
+ // Losing the host's required invocation checkpoint is a fatal persistence
572
+ // failure, never a normal tool error that invites inference to continue.
573
+ if (checkpointRejected)
574
+ throw error;
575
+ return handleToolFailure(error);
576
+ }
577
+ async function handleToolFailure(error) {
386
578
  let message = error instanceof Error ? error.message : String(error);
387
579
  if (options.hooks) {
388
580
  const failureHook = await options.hooks.dispatch('PostToolUseFailure', {
@@ -401,6 +593,8 @@ export async function executeToolWithRuntime(name, args, options) {
401
593
  content: message,
402
594
  isError: true,
403
595
  effectiveArgs,
596
+ ...(managedCommand ? { managedCommand } : {}),
597
+ ...(verificationReceipt ? { verificationReceipt } : {}),
404
598
  };
405
599
  }
406
600
  }
@@ -1,4 +1,4 @@
1
- export type TraceEventType = 'api_request' | 'api_response' | 'request_metrics' | 'prompt_echo' | 'tool_start' | 'tool_end' | 'tool_error' | 'policy_denied' | 'max_iterations';
1
+ export type TraceEventType = 'api_request' | 'api_response' | 'request_metrics' | 'prompt_echo' | 'tool_start' | 'tool_end' | 'tool_error' | 'policy_denied' | 'max_iterations' | 'turn_end';
2
2
  export interface TraceEvent {
3
3
  type: TraceEventType;
4
4
  timestamp: Date;
@@ -0,0 +1,9 @@
1
+ import { type SourceSnapshot } from './source_verification_contract.js';
2
+ import type { ToolContext } from '../tools/types.js';
3
+ export declare const VERIFIER_INPUT_MAX_BYTES = 65536;
4
+ /** The recipe consumes these detached strings, not paths it could reopen.
5
+ * File reads are sequential observations; no atomic filesystem snapshot is claimed. */
6
+ export declare function captureVerifierInputs(context: Pick<ToolContext, 'cwd' | 'signal' | 'canInspectVerificationSource'>, paths: readonly string[]): Promise<{
7
+ source: SourceSnapshot;
8
+ documents: ReadonlyMap<string, string>;
9
+ }>;
@@ -0,0 +1,100 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { lstat, open, realpath } from 'node:fs/promises';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { canonicalSourceContent, canonicalSourceIdentity, parseSourceSnapshot, parseVerificationRequest } from './source_verification_contract.js';
6
+ export const VERIFIER_INPUT_MAX_BYTES = 65536;
7
+ const hash = (bytes) => createHash('sha256').update(bytes).digest('hex');
8
+ function seal(source) {
9
+ const content = canonicalSourceContent(source);
10
+ if (content === null)
11
+ throw new Error('Invalid verifier input capture');
12
+ source.content_sha256 = hash(content);
13
+ const identity = canonicalSourceIdentity(source);
14
+ if (identity === null)
15
+ throw new Error('Invalid verifier source identity');
16
+ source.source_id = hash(identity);
17
+ const parsed = parseSourceSnapshot(source);
18
+ if (!parsed)
19
+ throw new Error('Verifier input metadata exceeds its bound');
20
+ return parsed;
21
+ }
22
+ /** The recipe consumes these detached strings, not paths it could reopen.
23
+ * File reads are sequential observations; no atomic filesystem snapshot is claimed. */
24
+ export async function captureVerifierInputs(context, paths) {
25
+ const request = parseVerificationRequest({ purpose: 'test', scope: 'artifact:json_assertions',
26
+ source_paths: [...paths], instrumentation: 'unknown' });
27
+ if (!request || paths.length !== 2)
28
+ throw new TypeError('Verifier capture requires two distinct scoped relative paths');
29
+ const cwd = await realpath(resolve(context.cwd));
30
+ const source = { schema_version: 1, source_id: '0'.repeat(64), content_sha256: '0'.repeat(64),
31
+ cwd, origin: 'local', captured_at: new Date().toISOString(), git: { commit: null, dirty: null }, coverage: 'incomplete',
32
+ files: [...paths].sort().map(path => ({ path, kind: 'unavailable', sha256: null, bytes: 0, mode: 0 })) };
33
+ const documents = new Map();
34
+ for (const row of source.files) {
35
+ const absolute = resolve(cwd, row.path);
36
+ try {
37
+ if (context.signal?.aborted || (context.canInspectVerificationSource
38
+ && !await context.canInspectVerificationSource(seal(structuredClone(source)))))
39
+ continue;
40
+ // Reject linked parents and leaves, and nonregular files before opening (including FIFOs).
41
+ if (await realpath(dirname(absolute)) !== dirname(absolute))
42
+ continue;
43
+ const location = await lstat(absolute);
44
+ row.bytes = Number.isSafeInteger(location.size) && location.size >= 0 ? location.size : 0;
45
+ row.mode = location.mode & 0o7777;
46
+ if (!location.isFile() || location.size > VERIFIER_INPUT_MAX_BYTES || context.signal?.aborted)
47
+ continue;
48
+ const handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
49
+ try {
50
+ const before = await handle.stat();
51
+ if (!before.isFile() || before.size > VERIFIER_INPUT_MAX_BYTES || before.dev !== location.dev || before.ino !== location.ino)
52
+ continue;
53
+ // One extra byte detects growth without exceeding the capture budget.
54
+ const bytes = Buffer.alloc(before.size + 1);
55
+ let used = 0;
56
+ while (used < bytes.length) {
57
+ if (context.signal?.aborted)
58
+ break;
59
+ const read = await handle.read(bytes, used, bytes.length - used, used);
60
+ if (!read.bytesRead)
61
+ break;
62
+ used += read.bytesRead;
63
+ }
64
+ const after = await handle.stat();
65
+ const current = await lstat(absolute);
66
+ if (context.signal?.aborted || used !== before.size || before.dev !== after.dev || before.ino !== after.ino
67
+ || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs
68
+ || current.dev !== before.dev || current.ino !== before.ino
69
+ || await realpath(dirname(absolute)) !== dirname(absolute))
70
+ continue;
71
+ if (context.canInspectVerificationSource && !await context.canInspectVerificationSource(seal(structuredClone(source))))
72
+ continue;
73
+ if (context.signal?.aborted)
74
+ continue;
75
+ const captured = bytes.subarray(0, used);
76
+ row.kind = 'file';
77
+ row.sha256 = hash(captured);
78
+ row.bytes = used;
79
+ row.mode = before.mode & 0o7777;
80
+ // Preserve the exact byte digest even if the document is not valid UTF-8.
81
+ try {
82
+ documents.set(row.path, new TextDecoder('utf-8', { fatal: true }).decode(captured));
83
+ }
84
+ catch { /* An undecodable input cannot enter the JSON recipe. */ }
85
+ }
86
+ finally {
87
+ await handle.close();
88
+ }
89
+ }
90
+ catch (error) {
91
+ if (error.code === 'ENOENT')
92
+ row.kind = 'missing';
93
+ // Missing, changed, denied and nonregular inputs remain explicitly incomplete.
94
+ }
95
+ }
96
+ source.coverage = source.files.every(row => row.kind === 'file') ? 'complete' : 'incomplete';
97
+ if (source.coverage === 'incomplete')
98
+ source.reason = 'Some verifier inputs were missing, changed, denied, nonregular or exceeded 65536 bytes.';
99
+ return { source: seal(source), documents };
100
+ }
@@ -0,0 +1,24 @@
1
+ import type { CommandVerificationReceipt } from './source_verification_contract.js';
2
+ import { type BenchmarkVerifierDecision } from './benchmark_contract.js';
3
+ /** A registered recipe proves only its configured artifact property, never a whole program or benchmark. */
4
+ export interface VerifierDecision {
5
+ schema_version: 1;
6
+ adapter_id: 'json_assertions';
7
+ recipe_version: 1;
8
+ execution: 'host_in_process';
9
+ recipe_sha256: string;
10
+ receipt_id: string;
11
+ source_id: string;
12
+ scope: 'artifact:json_assertions';
13
+ input_path: string;
14
+ config_path: string;
15
+ input_binding: 'immutable_bytes' | 'unknown';
16
+ outcome: 'passed' | 'failed' | 'unknown';
17
+ checks_total: number;
18
+ checks_passed: number;
19
+ reason: string;
20
+ benchmark_eligibility: 'unknown';
21
+ }
22
+ export type HostVerifierDecision = VerifierDecision | BenchmarkVerifierDecision;
23
+ export declare function parseHostVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): HostVerifierDecision | null;
24
+ export declare function parseVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): VerifierDecision | null;
@@ -0,0 +1,41 @@
1
+ import { parseBenchmarkVerifierDecision } from './benchmark_contract.js';
2
+ export function parseHostVerifierDecision(value, receipt) {
3
+ return parseVerifierDecision(value, receipt) ?? parseBenchmarkVerifierDecision(value, receipt);
4
+ }
5
+ export function parseVerifierDecision(value, receipt) {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value))
7
+ return null;
8
+ const row = value;
9
+ const allowed = ['schema_version', 'adapter_id', 'recipe_version', 'execution', 'recipe_sha256', 'receipt_id', 'source_id', 'scope',
10
+ 'input_path', 'config_path', 'input_binding', 'outcome', 'checks_total', 'checks_passed', 'reason', 'benchmark_eligibility'];
11
+ if (Object.keys(row).length !== allowed.length || Object.keys(row).some(key => !allowed.includes(key)))
12
+ return null;
13
+ if (row.schema_version !== 1 || row.adapter_id !== 'json_assertions' || row.recipe_version !== 1 || row.execution !== 'host_in_process'
14
+ || row.scope !== 'artifact:json_assertions' || row.benchmark_eligibility !== 'unknown'
15
+ || row.receipt_id !== receipt.receipt_id || row.source_id !== receipt.source.source_id
16
+ || row.recipe_sha256 !== receipt.command_sha256 || receipt.command_kind !== 'host_verifier'
17
+ || receipt.scope !== row.scope || receipt.purpose !== 'test' || receipt.source.origin !== 'local'
18
+ || typeof row.reason !== 'string' || !row.reason.trim() || Buffer.byteLength(row.reason) > 512
19
+ || /[\u0000-\u001f\u007f]/u.test(row.reason))
20
+ return null;
21
+ if (!['passed', 'failed', 'unknown'].includes(String(row.outcome))
22
+ || !['immutable_bytes', 'unknown'].includes(String(row.input_binding))
23
+ || typeof row.checks_total !== 'number' || !Number.isSafeInteger(row.checks_total) || row.checks_total < 0 || row.checks_total > 32
24
+ || typeof row.checks_passed !== 'number' || !Number.isSafeInteger(row.checks_passed) || row.checks_passed < 0
25
+ || row.checks_passed > row.checks_total || receipt.process_outcome !== row.outcome)
26
+ return null;
27
+ const input = receipt.source.files.find(file => file.path === row.input_path);
28
+ const config = receipt.source.files.find(file => file.path === row.config_path);
29
+ if (!input || !config || input.path === config.path || receipt.source.files.length !== 2)
30
+ return null;
31
+ if (row.outcome !== 'unknown' && (row.input_binding !== 'immutable_bytes' || receipt.source.coverage !== 'complete'
32
+ || input.kind !== 'file' || config.kind !== 'file' || input.bytes > 65536 || config.bytes > 65536 || row.checks_total === 0))
33
+ return null;
34
+ if (row.outcome === 'passed' && row.checks_passed !== row.checks_total)
35
+ return null;
36
+ if (row.outcome === 'failed' && row.checks_passed === row.checks_total)
37
+ return null;
38
+ if (row.outcome === 'unknown' && (row.checks_total !== 0 || row.checks_passed !== 0))
39
+ return null;
40
+ return structuredClone(row);
41
+ }
@@ -1,19 +1,17 @@
1
- /**
2
- * SubAgent - Isolated agent for context-heavy operations
3
- *
4
- * Spawns a separate agent with its own context to handle tasks like:
5
- * - Exploring codebases
6
- * - Searching for patterns
7
- * - Reading multiple files
8
- *
9
- * Only the final summary is returned to the main agent, keeping the main context clean.
10
- */
1
+ import { Message, type AgentEvent } from '../types.js';
2
+ import type { ModelUsageObserver } from '../types.js';
11
3
  import { AgentBackend } from './backends/index.js';
12
4
  import type { Tool } from './tools/types.js';
5
+ import { type EvidenceSnapshot } from './runtime/evidence.js';
6
+ import { type DelegatedEvidenceHandoff } from './runtime/delegated_evidence.js';
13
7
  import type { Policy } from './runtime/policy.js';
14
8
  import { HookDispatcher } from '../hooks/dispatcher.js';
15
9
  import type { HookApprovalRequester } from '../hooks/types.js';
16
10
  export interface SubAgentConfig {
11
+ /** Host-owned resume handle; checked against the original parent and cwd. */
12
+ resumeSessionId?: string;
13
+ parentSessionId?: string;
14
+ commandPolicy?: import('../utils/sandbox.js').SandboxCommandOptions;
17
15
  provider: string;
18
16
  apiKey: string;
19
17
  model?: string;
@@ -27,6 +25,7 @@ export interface SubAgentConfig {
27
25
  temporaryWriteRoot?: string;
28
26
  }
29
27
  export interface SubAgentResult {
28
+ evidence: DelegatedEvidenceHandoff;
30
29
  summary: string;
31
30
  filesRead: string[];
32
31
  commandsRun: string[];
@@ -63,10 +62,14 @@ export declare class SubAgent {
63
62
  private inputTokens;
64
63
  private outputTokens;
65
64
  private readonly toolResponseStore;
65
+ private readonly sessionId;
66
66
  private readonly discoveredTools;
67
67
  private hooks?;
68
68
  private approvalRequester?;
69
69
  constructor(config: SubAgentConfig);
70
+ getSessionId(): string;
71
+ getEvidenceSnapshot(): EvidenceSnapshot;
72
+ getEvidenceHandoff(summary?: string): DelegatedEvidenceHandoff;
70
73
  /**
71
74
  * Run a task and return a summary.
72
75
  *
@@ -77,12 +80,19 @@ export declare class SubAgent {
77
80
  signal?: AbortSignal;
78
81
  systemPrompt?: string;
79
82
  tools?: Tool[];
83
+ /** Compacted history supplies context, never new source observations. */
84
+ messages?: Message[];
80
85
  onIteration?: (info: {
81
86
  iteration: number;
82
87
  max: number;
83
88
  toolsCalled: string[];
84
89
  }) => void;
90
+ onUsage?: ModelUsageObserver;
91
+ onEvent?: (event: AgentEvent) => void;
85
92
  }): Promise<SubAgentResult>;
93
+ private hasStoredToolIdentity;
94
+ private persistEvidenceCheckpoint;
95
+ private evidenceSource;
86
96
  /**
87
97
  * Track what the sub-agent accessed
88
98
  */