@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,3 +1,4 @@
1
+ import type { ManagedCommandObservation } from './runtime/command_jobs.js';
1
2
  /**
2
3
  * Shared loop-policy helpers applied by BOTH run loops (Agent.run and
3
4
  * SubAgent.run) so the two cannot drift (Eng review A5). Pure and stateless
@@ -8,10 +9,12 @@
8
9
  * input, and result content, appends a corrective hint when the SAME call
9
10
  * (name + canonical input) produced a byte-identical result to a previous call
10
11
  * in this run — the non-progressing repeat behind F8 churn / F1 re-fire.
11
- * Result-equality (not raw repeat count) is what spares legitimate polling and
12
- * retries whose output changes between calls.
12
+ * Changed results and host-verified silent managed reads are legitimate
13
+ * observations, so neither receives a corrective warning.
13
14
  */
14
- export declare function createRepeatGuard(): (name: string, input: unknown, content: string) => string;
15
+ export declare function createRepeatGuard(): (name: string, input: unknown, content: string, managedCommand?: ManagedCommandObservation) => string;
16
+ /** This metadata is supplied by the host tools, never inferred from result text. */
17
+ export declare function isHealthyManagedCommandRead(observation?: ManagedCommandObservation): boolean;
15
18
  /** Suffix createRepeatGuard appends to a repeated identical result. */
16
19
  export declare const REPEAT_GUARD_MARKER = "\n\n[repeat-guard] ";
17
20
  /**
@@ -8,12 +8,14 @@
8
8
  * input, and result content, appends a corrective hint when the SAME call
9
9
  * (name + canonical input) produced a byte-identical result to a previous call
10
10
  * in this run — the non-progressing repeat behind F8 churn / F1 re-fire.
11
- * Result-equality (not raw repeat count) is what spares legitimate polling and
12
- * retries whose output changes between calls.
11
+ * Changed results and host-verified silent managed reads are legitimate
12
+ * observations, so neither receives a corrective warning.
13
13
  */
14
14
  export function createRepeatGuard() {
15
15
  const seen = new Map();
16
- return (name, input, content) => {
16
+ return (name, input, content, managedCommand) => {
17
+ if (isHealthyManagedCommandRead(managedCommand))
18
+ return content;
17
19
  let sig;
18
20
  try {
19
21
  // NUL separator: unambiguous by construction — it cannot appear in a tool
@@ -31,6 +33,13 @@ export function createRepeatGuard() {
31
33
  return content;
32
34
  };
33
35
  }
36
+ /** This metadata is supplied by the host tools, never inferred from result text. */
37
+ export function isHealthyManagedCommandRead(observation) {
38
+ return observation?.kind === 'read'
39
+ && observation.result.status === 'running'
40
+ && observation.result.output === ''
41
+ && observation.result.has_more === false;
42
+ }
34
43
  /** Suffix createRepeatGuard appends to a repeated identical result. */
35
44
  export const REPEAT_GUARD_MARKER = '\n\n[repeat-guard] ';
36
45
  /**
@@ -0,0 +1,2 @@
1
+ /** Guidance for the generic retained-source checker, only when that tool is reachable. */
2
+ export declare const MEASUREMENT_EVIDENCE_GUIDANCE: string;
@@ -0,0 +1,5 @@
1
+ /** Guidance for the generic retained-source checker, only when that tool is reachable. */
2
+ export const MEASUREMENT_EVIDENCE_GUIDANCE = `
3
+ MEASUREMENT VALIDATION — before ranking a reported optimization target, establish its metric definition and selected runtime path. Discover measurement_report with tool_search and assess original retained managed-command observation IDs against explicit workload/stage/input shape, units, timing domain, scope/ranks and instrumentation requirements. Use the measurement-validation skill for the producer envelope and workflow.
4
+ Compatibility does not establish source verification or benchmark eligibility; both remain unknown. A running startup artifact with passed=false is incomplete, not a failed final run. Demonstrate the expected metric field in a small smoke in the requested mode/path before an expensive full run. Never sum inclusive parent/child spans or overlapping ranks as exclusive wall time. Keep unexplained residuals unattributed hypotheses, not measured removable performance wins. No report grants execution authorization.
5
+ `.trim();
@@ -15,9 +15,12 @@
15
15
  * field write. The tool-result selector itself stays agent-owned: the agent
16
16
  * computes the verdict and passes it in; the encoder only assembles blocks.
17
17
  */
18
- import { Message } from '../types.js';
18
+ import { Message, ToolDefinition } from '../types.js';
19
19
  import { LlmMessage, RequestContentBlock } from './backends/index.js';
20
20
  export interface EncodeDeps {
21
+ preserveNativeHistory?: boolean;
22
+ model?: string;
23
+ nativeContextId?: string;
21
24
  /**
22
25
  * Per-request tool-result selector verdict (tool_use_id -> rendered content),
23
26
  * or null when no tool results are present. Computed by the agent (selector is
@@ -45,12 +48,14 @@ export interface EncodeResult {
45
48
  */
46
49
  transientOverageTokens: number;
47
50
  }
51
+ export declare const STABLE_RESULT_LIMIT = 4096;
48
52
  export declare class RequestEncoder {
49
53
  private readonly deps;
50
54
  private overage;
51
55
  constructor(deps: EncodeDeps);
52
56
  /** Full request encoding: role filter + per-message content + same-role merge. */
53
57
  encode(messages: Message[]): EncodeResult;
58
+ private freezeContent;
54
59
  /**
55
60
  * Build the request content for a single message string: tool-result JSON ->
56
61
  * tool_result blocks (selector-rendered), `[image …]`/`[video …]` -> media
@@ -64,3 +69,5 @@ export declare class RequestEncoder {
64
69
  private parseToolResultForImages;
65
70
  private buildToolResultBlocks;
66
71
  }
72
+ /** Provider reasoning binds the system prompt and ordered tool vocabulary. */
73
+ export declare function nativeHistoryContextId(system: string, tools: ToolDefinition[]): string;
@@ -15,12 +15,15 @@
15
15
  * field write. The tool-result selector itself stays agent-owned: the agent
16
16
  * computes the verdict and passes it in; the encoder only assembles blocks.
17
17
  */
18
+ import { createHash } from 'node:crypto';
18
19
  import { isMirrorMediaPath } from '../utils/mirror_media.js';
20
+ import { readDurableSessionImageSync, SessionMediaError } from '../session_media.js';
19
21
  import { parseImageToolResult } from './tool_result_parsing.js';
22
+ import { assistantClaimReplayContent } from './claim_observation.js';
20
23
  const OLD_RESULT_CAP = 2000;
21
24
  // Rewriting a near-cap result saves little but changes the cacheable history.
22
25
  // Keep small results stable; large historical results still use the 2K cap.
23
- const STABLE_RESULT_LIMIT = 4096;
26
+ export const STABLE_RESULT_LIMIT = 4096;
24
27
  export class RequestEncoder {
25
28
  deps;
26
29
  overage = 0;
@@ -29,7 +32,7 @@ export class RequestEncoder {
29
32
  }
30
33
  /** Full request encoding: role filter + per-message content + same-role merge. */
31
34
  encode(messages) {
32
- const formatted = messages
35
+ const eligibleMessages = messages
33
36
  .filter((m) => {
34
37
  if (m.role !== 'user' && m.role !== 'assistant')
35
38
  return false;
@@ -37,15 +40,44 @@ export class RequestEncoder {
37
40
  return false;
38
41
  return true;
39
42
  })
43
+ .flatMap(message => {
44
+ if (!this.deps.preserveNativeHistory || message.role !== 'assistant' || !Array.isArray(message.nativeContent))
45
+ return [message];
46
+ const observation = assistantClaimReplayContent(message);
47
+ if (observation === message.content
48
+ || message.nativeContent.some(block => block.type === 'text' && block.text === observation))
49
+ return [message];
50
+ // Opaque provider blocks stay unchanged. Place the validated historical
51
+ // observation before this assistant so its tool/result pair remains
52
+ // adjacent and the current authored request retains the final row.
53
+ return [{
54
+ id: `${message.id}_claim_observation`, role: 'user',
55
+ content: observation, timestamp: message.timestamp,
56
+ metadata: { synthetic: true, hostContext: true, preserveUserBoundary: true },
57
+ }, message];
58
+ });
59
+ const formatted = eligibleMessages
40
60
  .map(m => {
61
+ const assistantContent = m.role === 'assistant' ? assistantClaimReplayContent(m) : m.content;
62
+ if (this.deps.preserveNativeHistory && m.nativeContent !== undefined && m.nativeModel === this.deps.model
63
+ && m.nativeContextId === this.deps.nativeContextId) {
64
+ if (typeof m.nativeContent === 'string' && assistantContent !== m.content) {
65
+ // The host may have observed this claim after its plain native text
66
+ // was frozen. Retain the admitted qualification on every replay.
67
+ this.freezeContent(m, assistantContent);
68
+ return { role: m.role, content: assistantContent };
69
+ }
70
+ return { role: m.role, content: structuredClone(m.nativeContent) };
71
+ }
41
72
  if (m.role === 'user') {
42
- // R0: a compaction summary must reach the model as plain text. Skip
43
- // buildUserContentBlocks so its tool-result-array heuristic can't
44
- // re-parse (and drop) a summary that happens to quote JSON.
45
- if (m.metadata?.compactionSummary) {
73
+ // Summaries and host observations quote source text. Preserve those
74
+ // quotes literally rather than treating them as new media directives
75
+ // or tool results. Other synthetic messages can be real tool results.
76
+ if (m.metadata?.compactionSummary || m.metadata?.hostContext === true) {
46
77
  return { role: m.role, content: m.content };
47
78
  }
48
79
  const content = this.buildUserContentBlocks(m.content, m.attachments || []);
80
+ this.freezeContent(m, content);
49
81
  return {
50
82
  role: m.role,
51
83
  content
@@ -54,13 +86,20 @@ export class RequestEncoder {
54
86
  const reasoning = typeof m.metadata?.reasoningContent === 'string'
55
87
  ? m.metadata.reasoningContent
56
88
  : undefined;
89
+ // A model switch starts a fresh reasoning context. Preserve factual
90
+ // native text/tool blocks, but never send another model's signatures.
91
+ if (this.deps.preserveNativeHistory && Array.isArray(m.nativeContent)) {
92
+ const content = m.nativeContent.filter(block => block.type !== 'thinking' && block.type !== 'redacted_thinking');
93
+ this.freezeContent(m, content);
94
+ return { role: m.role, content };
95
+ }
57
96
  // Assistant message - may need to include tool_use blocks
58
97
  if (m.toolCalls && m.toolCalls.length > 0) {
59
98
  // Build content array with text and tool_use blocks
60
99
  const contentBlocks = [];
61
100
  // Add text content if present
62
- if (m.content && m.content.trim() && m.content !== '[Using tools...]') {
63
- contentBlocks.push({ type: 'text', text: m.content });
101
+ if (assistantContent && assistantContent.trim() && assistantContent !== '[Using tools...]') {
102
+ contentBlocks.push({ type: 'text', text: assistantContent });
64
103
  }
65
104
  // Add tool_use blocks
66
105
  for (const tc of m.toolCalls) {
@@ -71,6 +110,7 @@ export class RequestEncoder {
71
110
  input: tc.args
72
111
  });
73
112
  }
113
+ this.freezeContent(m, contentBlocks);
74
114
  return {
75
115
  role: m.role,
76
116
  content: contentBlocks,
@@ -78,9 +118,10 @@ export class RequestEncoder {
78
118
  };
79
119
  }
80
120
  // Plain text assistant message
121
+ this.freezeContent(m, assistantContent);
81
122
  return {
82
123
  role: m.role,
83
- content: m.content,
124
+ content: assistantContent,
84
125
  ...(reasoning ? { reasoning } : {}),
85
126
  };
86
127
  });
@@ -88,8 +129,14 @@ export class RequestEncoder {
88
129
  // Two sources: (1) repair injects synthetic tool_result user before real user prompt,
89
130
  // (2) multi-iteration runs where formatMessages filters intervening role:'tool' messages
90
131
  const merged = [];
91
- for (const msg of formatted) {
92
- if (merged.length > 0 && msg.role === merged[merged.length - 1].role) {
132
+ const preservesUserBoundary = (message) => message?.role === 'user' && message.metadata?.hostContext === true
133
+ && message.metadata.preserveUserBoundary === true;
134
+ for (const [index, msg] of formatted.entries()) {
135
+ // A historical host handoff is its own user row on both sides. Keep this
136
+ // metadata local to encoding; ordinary user and tool-result merging stays intact.
137
+ if (merged.length > 0 && msg.role === merged[merged.length - 1].role
138
+ && !preservesUserBoundary(eligibleMessages[index])
139
+ && !preservesUserBoundary(eligibleMessages[index - 1])) {
93
140
  const prev = merged[merged.length - 1];
94
141
  const prevBlocks = this.toContentBlocks(prev.content);
95
142
  const currBlocks = this.toContentBlocks(msg.content);
@@ -108,6 +155,13 @@ export class RequestEncoder {
108
155
  }
109
156
  return { messages: merged, transientOverageTokens: this.overage };
110
157
  }
158
+ freezeContent(message, content) {
159
+ if (!this.deps.preserveNativeHistory)
160
+ return;
161
+ message.nativeContent = structuredClone(content);
162
+ message.nativeModel = this.deps.model;
163
+ message.nativeContextId = this.deps.nativeContextId;
164
+ }
111
165
  /**
112
166
  * Build the request content for a single message string: tool-result JSON ->
113
167
  * tool_result blocks (selector-rendered), `[image …]`/`[video …]` -> media
@@ -132,10 +186,10 @@ export class RequestEncoder {
132
186
  // block (content must be a string for the API), not as undefined —
133
187
  // which would crash parseImageToolResult and silently degrade the
134
188
  // whole message to plain text, breaking tool_use/tool_result pairing.
135
- content: verdict?.get(r.tool_use_id)
189
+ content: (verdict?.get(r.tool_use_id)
136
190
  ?? this.deps.renderForContext(r.tool_use_id)
137
191
  ?? r.content
138
- ?? '',
192
+ ?? '') + (typeof r.context_annotation === 'string' ? r.context_annotation : ''),
139
193
  }));
140
194
  return this.buildToolResultBlocks(rerendered);
141
195
  }
@@ -211,17 +265,31 @@ export class RequestEncoder {
211
265
  buildAttachmentBlocks(attachments) {
212
266
  const blocks = [];
213
267
  for (const attachment of attachments) {
214
- if (attachment.kind !== 'image' || !attachment.localPath)
215
- continue;
216
- // Structured attachments are read off disk (loadImageBlock -> readFileSync). A child
217
- // pane receives them from the mirror over an unauthenticated wire, so a forged localPath
218
- // pointing outside the mirror media root would be an arbitrary server-file read. Only
219
- // genuine mirror uploads live under MIRROR_MEDIA_ROOT; refuse anything else.
220
- if (!isMirrorMediaPath(attachment.localPath))
268
+ if (attachment.kind !== 'image')
221
269
  continue;
222
- const block = this.deps.loadImageBlock(attachment.localPath);
223
- if (block)
224
- blocks.push(block);
270
+ try {
271
+ const durable = readDurableSessionImageSync(attachment);
272
+ if (durable) {
273
+ blocks.push({ type: 'image', mediaType: durable.mediaType,
274
+ data: durable.data.toString('base64'), path: durable.localPath });
275
+ continue;
276
+ }
277
+ // Keep legacy staging references confined to the admitted upload root.
278
+ if (isMirrorMediaPath(attachment.localPath)) {
279
+ const block = this.deps.loadImageBlock(attachment.localPath);
280
+ if (block) {
281
+ blocks.push(block);
282
+ continue;
283
+ }
284
+ }
285
+ }
286
+ catch (error) {
287
+ if (!(error instanceof SessionMediaError))
288
+ throw error;
289
+ }
290
+ const leaf = typeof attachment.name === 'string' ? attachment.name.split(/[\\/]/).pop() ?? 'image' : 'image';
291
+ const name = leaf.replace(/[\u0000-\u001f\u007f]/g, ' ').slice(0, 120) || 'image';
292
+ blocks.push({ type: 'text', text: `Image attachment "${name}" is unavailable. Reattach the image to inspect it.` });
225
293
  }
226
294
  return blocks;
227
295
  }
@@ -277,3 +345,7 @@ export class RequestEncoder {
277
345
  });
278
346
  }
279
347
  }
348
+ /** Provider reasoning binds the system prompt and ordered tool vocabulary. */
349
+ export function nativeHistoryContextId(system, tools) {
350
+ return createHash('sha256').update(JSON.stringify({ system, tools })).digest('hex');
351
+ }
@@ -0,0 +1,30 @@
1
+ import type { BenchmarkVerifierDecision } from './benchmark_contract.js';
2
+ import type { CommandVerificationReceipt } from './source_verification_contract.js';
3
+ export interface BenchmarkComparisonSource {
4
+ observation_id: string;
5
+ receipt_id: string;
6
+ source_id: string;
7
+ program_sha256: string;
8
+ value_ms: number;
9
+ }
10
+ export interface BenchmarkComparisonDecision {
11
+ schema_version: 1;
12
+ adapter_id: 'cpu_integer_sum_comparison';
13
+ scope: 'benchmark:cpu_integer_sum';
14
+ outcome: 'comparable' | 'incompatible' | 'unknown';
15
+ benchmark_eligibility: 'eligible' | 'ineligible' | 'unknown';
16
+ baseline: BenchmarkComparisonSource | null;
17
+ candidate: BenchmarkComparisonSource | null;
18
+ delta_ms: number | null;
19
+ relative_change_percent: number | null;
20
+ reason: string;
21
+ }
22
+ export interface RegisteredBenchmarkObservation {
23
+ id: string;
24
+ receipt: CommandVerificationReceipt;
25
+ decision: BenchmarkVerifierDecision;
26
+ }
27
+ /** Historical comparison metadata never invents another execution or verifies the observation itself. */
28
+ export declare function parseBenchmarkComparisonDecision(value: unknown): BenchmarkComparisonDecision | null;
29
+ /** Compare declared fixture conditions, never infer causal improvement or a plateau from a delta. */
30
+ export declare function compareRegisteredBenchmarks(baseline: RegisteredBenchmarkObservation | null, candidate: RegisteredBenchmarkObservation | null): BenchmarkComparisonDecision;
@@ -0,0 +1,94 @@
1
+ const encoded = new TextEncoder();
2
+ function object(value, fields) {
3
+ if (!value || typeof value !== 'object' || Array.isArray(value))
4
+ throw new TypeError('Invalid comparison object');
5
+ const proto = Object.getPrototypeOf(value);
6
+ if (proto !== Object.prototype && proto !== null)
7
+ throw new TypeError('Invalid comparison prototype');
8
+ const row = value;
9
+ if (Object.keys(row).length !== fields.length || fields.some(key => !Object.hasOwn(row, key)))
10
+ throw new TypeError('Invalid comparison fields');
11
+ return row;
12
+ }
13
+ const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
14
+ const text = (value, limit) => typeof value === 'string' && value.trim().length > 0
15
+ && encoded.encode(value).length <= limit && !/[\u0000-\u001f\u007f]/u.test(value);
16
+ function source(value) {
17
+ if (value === null)
18
+ return null;
19
+ const row = object(value, ['observation_id', 'receipt_id', 'source_id', 'program_sha256', 'value_ms']);
20
+ if (!text(row.observation_id, 256) || !text(row.receipt_id, 256) || !hash(row.source_id) || !hash(row.program_sha256)
21
+ || typeof row.value_ms !== 'number' || !Number.isFinite(row.value_ms) || row.value_ms <= 0 || row.value_ms > 60000) {
22
+ throw new TypeError('Invalid bounded comparison source');
23
+ }
24
+ return row;
25
+ }
26
+ /** Historical comparison metadata never invents another execution or verifies the observation itself. */
27
+ export function parseBenchmarkComparisonDecision(value) {
28
+ try {
29
+ if (encoded.encode(JSON.stringify(value)).length > 4096)
30
+ return null;
31
+ const row = object(value, ['schema_version', 'adapter_id', 'scope', 'outcome', 'benchmark_eligibility', 'baseline', 'candidate',
32
+ 'delta_ms', 'relative_change_percent', 'reason']);
33
+ if (row.schema_version !== 1 || row.adapter_id !== 'cpu_integer_sum_comparison' || row.scope !== 'benchmark:cpu_integer_sum'
34
+ || !text(row.reason, 512) || !['comparable', 'incompatible', 'unknown'].includes(String(row.outcome)))
35
+ return null;
36
+ const baseline = source(row.baseline);
37
+ const candidate = source(row.candidate);
38
+ if (row.outcome === 'comparable') {
39
+ if (row.benchmark_eligibility !== 'eligible' || !baseline || !candidate
40
+ || baseline.observation_id === candidate.observation_id || baseline.receipt_id === candidate.receipt_id
41
+ || row.delta_ms !== candidate.value_ms - baseline.value_ms
42
+ || typeof row.relative_change_percent !== 'number' || !Number.isFinite(row.relative_change_percent)
43
+ || row.relative_change_percent !== (candidate.value_ms - baseline.value_ms) / baseline.value_ms * 100)
44
+ return null;
45
+ }
46
+ else if (row.delta_ms !== null || row.relative_change_percent !== null
47
+ || row.benchmark_eligibility !== (row.outcome === 'incompatible' ? 'ineligible' : 'unknown'))
48
+ return null;
49
+ return structuredClone(row);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ const describe = (observed) => observed.decision.measurement
56
+ && observed.decision.program_sha256 ? { observation_id: observed.id, receipt_id: observed.receipt.receipt_id,
57
+ source_id: observed.receipt.source.source_id, program_sha256: observed.decision.program_sha256,
58
+ value_ms: observed.decision.measurement.value_ms } : null;
59
+ function sameFields(first, second, fields) {
60
+ const left = first;
61
+ const right = second;
62
+ return fields.every(key => left[key] === right[key]);
63
+ }
64
+ /** Compare declared fixture conditions, never infer causal improvement or a plateau from a delta. */
65
+ export function compareRegisteredBenchmarks(baseline, candidate) {
66
+ const result = { schema_version: 1, adapter_id: 'cpu_integer_sum_comparison', scope: 'benchmark:cpu_integer_sum',
67
+ outcome: 'unknown', benchmark_eligibility: 'unknown', baseline: baseline ? describe(baseline) : null,
68
+ candidate: candidate ? describe(candidate) : null, delta_ms: null, relative_change_percent: null,
69
+ reason: 'Two complete retained host-admitted eligible CPU measurements are required.' };
70
+ if (!baseline || !candidate || baseline.decision.benchmark_eligibility !== 'eligible'
71
+ || candidate.decision.benchmark_eligibility !== 'eligible' || !result.baseline || !result.candidate)
72
+ return result;
73
+ result.outcome = 'incompatible';
74
+ result.benchmark_eligibility = 'ineligible';
75
+ if (baseline.id === candidate.id || baseline.receipt.receipt_id === candidate.receipt.receipt_id) {
76
+ result.reason = 'Two aliases of the same original run are not independent measurements.';
77
+ return result;
78
+ }
79
+ const first = baseline.decision;
80
+ const second = candidate.decision;
81
+ if (first.recipe_sha256 !== second.recipe_sha256 || first.checker_sha256 !== second.checker_sha256
82
+ || !sameFields(first.conditions, second.conditions, ['host_instance_id', 'cpu_model', 'logical_cpus', 'os_release'])
83
+ || !sameFields(baseline.receipt.environment, candidate.receipt.environment, ['platform', 'arch', 'node_version', 'declared_id'])
84
+ || !first.workload || !second.workload || !sameFields(first.workload, second.workload, ['id', 'input_sha256', 'length', 'iterations', 'warmup', 'samples'])) {
85
+ result.reason = 'Workload, checker, runner or declared execution/measurement conditions differ.';
86
+ return result;
87
+ }
88
+ result.outcome = 'comparable';
89
+ result.benchmark_eligibility = 'eligible';
90
+ result.delta_ms = result.candidate.value_ms - result.baseline.value_ms;
91
+ result.relative_change_percent = result.delta_ms / result.baseline.value_ms * 100;
92
+ result.reason = 'Independent registered measurements share the declared workload and conditions; no causal improvement or plateau is inferred.';
93
+ return result;
94
+ }
@@ -0,0 +1,48 @@
1
+ import type { CommandVerificationReceipt } from './source_verification_contract.js';
2
+ /** Eligibility is scoped to this registered CPU fixture and its captured measurement conditions. */
3
+ export interface BenchmarkVerifierDecision {
4
+ schema_version: 1;
5
+ adapter_id: 'cpu_integer_sum';
6
+ recipe_version: 1;
7
+ execution: 'host_node_subprocess';
8
+ recipe_sha256: string;
9
+ receipt_id: string;
10
+ source_id: string;
11
+ scope: 'benchmark:cpu_integer_sum';
12
+ input_path: string;
13
+ config_path: string;
14
+ input_binding: 'immutable_bytes' | 'unknown';
15
+ outcome: 'passed' | 'failed' | 'unknown';
16
+ checks_total: number;
17
+ checks_passed: number;
18
+ reason: string;
19
+ benchmark_eligibility: 'eligible' | 'ineligible' | 'unknown';
20
+ variant: 'for_loop' | 'array_reduce' | null;
21
+ program_sha256: string | null;
22
+ checker_sha256: string;
23
+ conditions: {
24
+ host_instance_id: string;
25
+ cpu_model: string;
26
+ logical_cpus: number;
27
+ os_release: string;
28
+ };
29
+ workload: {
30
+ id: 'cpu_integer_sum/v1';
31
+ input_sha256: string;
32
+ length: number;
33
+ iterations: number;
34
+ warmup: number;
35
+ samples: number;
36
+ } | null;
37
+ measurement: {
38
+ samples_ms: number[];
39
+ value_ms: number;
40
+ unit: 'ms';
41
+ timing_domain: 'node_performance_now';
42
+ scope: 'integer_sum_kernel';
43
+ rank: 0;
44
+ world_size: 1;
45
+ } | null;
46
+ }
47
+ /** Decode a host-admitted decision; provider output must never enter this trusted channel. */
48
+ export declare function parseBenchmarkVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): BenchmarkVerifierDecision | null;
@@ -0,0 +1,90 @@
1
+ const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
2
+ const integer = (value, low, high) => typeof value === 'number'
3
+ && Number.isSafeInteger(value) && value >= low && value <= high;
4
+ const encoded = new TextEncoder();
5
+ const text = (value, bound) => typeof value === 'string' && value.trim().length > 0
6
+ && encoded.encode(value).length <= bound && !/[\u0000-\u001f\u007f]/u.test(value);
7
+ function object(value, fields) {
8
+ if (!value || typeof value !== 'object' || Array.isArray(value))
9
+ throw new TypeError('Invalid benchmark object');
10
+ const proto = Object.getPrototypeOf(value);
11
+ if (proto !== Object.prototype && proto !== null)
12
+ throw new TypeError('Invalid benchmark prototype');
13
+ const row = value;
14
+ if (Object.keys(row).length !== fields.length || fields.some(key => !Object.hasOwn(row, key))) {
15
+ throw new TypeError('Invalid benchmark fields');
16
+ }
17
+ return row;
18
+ }
19
+ /** Decode a host-admitted decision; provider output must never enter this trusted channel. */
20
+ export function parseBenchmarkVerifierDecision(value, receipt) {
21
+ try {
22
+ if (encoded.encode(JSON.stringify(value)).length > 8192)
23
+ return null;
24
+ const row = object(value, ['schema_version', 'adapter_id', 'recipe_version', 'execution', 'recipe_sha256', 'receipt_id', 'source_id',
25
+ 'scope', 'input_path', 'config_path', 'input_binding', 'outcome', 'checks_total', 'checks_passed', 'reason', 'benchmark_eligibility',
26
+ 'variant', 'program_sha256', 'checker_sha256', 'conditions', 'workload', 'measurement']);
27
+ if (row.schema_version !== 1 || row.adapter_id !== 'cpu_integer_sum' || row.recipe_version !== 1
28
+ || row.execution !== 'host_node_subprocess' || row.scope !== 'benchmark:cpu_integer_sum'
29
+ || !hash(row.recipe_sha256) || row.recipe_sha256 !== receipt.command_sha256
30
+ || row.receipt_id !== receipt.receipt_id || row.source_id !== receipt.source.source_id
31
+ || receipt.command_kind !== 'host_verifier' || receipt.purpose !== 'benchmark' || receipt.scope !== row.scope
32
+ || receipt.source.origin !== 'local' || !hash(row.checker_sha256) || !text(row.reason, 512)
33
+ || !['immutable_bytes', 'unknown'].includes(String(row.input_binding))
34
+ || !['passed', 'failed', 'unknown'].includes(String(row.outcome))
35
+ || !['eligible', 'ineligible', 'unknown'].includes(String(row.benchmark_eligibility))
36
+ || !integer(row.checks_total, 0, 9) || !integer(row.checks_passed, 0, row.checks_total))
37
+ return null;
38
+ const input = receipt.source.files.find(file => file.path === row.input_path);
39
+ const config = receipt.source.files.find(file => file.path === row.config_path);
40
+ if (!input || !config || input.path === config.path || receipt.source.files.length !== 2)
41
+ return null;
42
+ if (row.variant !== null && row.variant !== 'for_loop' && row.variant !== 'array_reduce')
43
+ return null;
44
+ if (row.variant === null ? row.program_sha256 !== null : !hash(row.program_sha256))
45
+ return null;
46
+ const conditions = object(row.conditions, ['host_instance_id', 'cpu_model', 'logical_cpus', 'os_release']);
47
+ if (!hash(conditions.host_instance_id) || !text(conditions.cpu_model, 256) || !integer(conditions.logical_cpus, 1, 1024)
48
+ || !text(conditions.os_release, 128))
49
+ return null;
50
+ let workload = null;
51
+ if (row.workload !== null) {
52
+ workload = object(row.workload, ['id', 'input_sha256', 'length', 'iterations', 'warmup', 'samples']);
53
+ if (workload.id !== 'cpu_integer_sum/v1' || workload.input_sha256 !== input.sha256
54
+ || !integer(workload.length, 1, 1024) || !integer(workload.iterations, 1, 2048)
55
+ || !integer(workload.warmup, 0, 4) || !integer(workload.samples, 3, 9) || workload.samples % 2 === 0)
56
+ return null;
57
+ }
58
+ if (row.measurement !== null) {
59
+ const measured = object(row.measurement, ['samples_ms', 'value_ms', 'unit', 'timing_domain', 'scope', 'rank', 'world_size']);
60
+ if (!workload || measured.unit !== 'ms' || measured.timing_domain !== 'node_performance_now'
61
+ || measured.scope !== 'integer_sum_kernel' || measured.rank !== 0 || measured.world_size !== 1
62
+ || !Array.isArray(measured.samples_ms) || measured.samples_ms.length !== workload.samples
63
+ || measured.samples_ms.some(sample => typeof sample !== 'number' || !Number.isFinite(sample) || sample <= 0 || sample > 60000))
64
+ return null;
65
+ const sorted = [...measured.samples_ms].sort((a, b) => a - b);
66
+ if (measured.value_ms !== sorted[Math.floor(sorted.length / 2)])
67
+ return null;
68
+ }
69
+ if (row.outcome === 'unknown') {
70
+ if (row.checks_total !== 0 || row.checks_passed !== 0 || row.measurement !== null || row.benchmark_eligibility === 'eligible')
71
+ return null;
72
+ }
73
+ else {
74
+ if (row.input_binding !== 'immutable_bytes' || receipt.source.coverage !== 'complete'
75
+ || input.kind !== 'file' || config.kind !== 'file' || input.bytes > 65536 || config.bytes > 65536
76
+ || !workload || row.measurement === null || row.variant === null || row.checks_total !== workload.samples
77
+ || receipt.process_outcome !== 'passed')
78
+ return null;
79
+ if (row.outcome === 'passed' ? row.checks_passed !== row.checks_total : row.checks_passed === row.checks_total)
80
+ return null;
81
+ }
82
+ if (row.benchmark_eligibility === 'eligible' && (row.outcome !== 'passed' || receipt.instrumentation !== 'production'
83
+ || receipt.source_binding !== 'observed_endpoints' || receipt.build_identity !== row.recipe_sha256))
84
+ return null;
85
+ return structuredClone(row);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
@@ -0,0 +1,32 @@
1
+ /** Explicit declared-process outcomes; never source or build qualification. */
2
+ export interface CheckedCommandStage {
3
+ executable: string;
4
+ args: string[];
5
+ acceptable_exit_codes?: number[];
6
+ }
7
+ export interface CheckedCommandPlan {
8
+ steps: {
9
+ id: string;
10
+ pipeline: CheckedCommandStage[];
11
+ }[];
12
+ }
13
+ export interface CheckedCommandResult {
14
+ schema_version: 1;
15
+ status: 'passed' | 'failed' | 'incomplete' | 'timed_out' | 'cancelled';
16
+ verification: 'unknown';
17
+ plan_sha256: string;
18
+ steps: {
19
+ id: string;
20
+ status: 'passed' | 'failed' | 'skipped' | 'unknown';
21
+ stages: {
22
+ exit_code: number | null;
23
+ acceptable_exit_codes: number[];
24
+ accepted: boolean | null;
25
+ }[];
26
+ }[];
27
+ reason?: string;
28
+ }
29
+ /** Parse a bounded literal process plan; shell text is never inferred from its arguments. */
30
+ export declare function parseCheckedCommandPlan(value: unknown): CheckedCommandPlan | null;
31
+ /** Parse declared process outcomes without turning them into source or build qualification. */
32
+ export declare function parseCheckedCommandResult(value: unknown): CheckedCommandResult | null;