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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/README.md +398 -45
  2. package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
  3. package/THIRD_PARTY_NOTICES.md +273 -12
  4. package/bin/zmux-darwin-arm64 +0 -0
  5. package/bin/ztc-audio-darwin-arm64 +0 -0
  6. package/bin/ztc-capture-darwin-arm64 +0 -0
  7. package/bin/ztc-computer-darwin-arm64 +0 -0
  8. package/bin/ztc-llm-darwin-arm64 +0 -0
  9. package/bin/ztc-tts-darwin-arm64 +0 -0
  10. package/bin/ztc-tui-darwin-arm64 +0 -0
  11. package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
  12. package/bin/zterm-darwin-arm64 +0 -0
  13. package/dist/App.js +1206 -209
  14. package/dist/agent/agent.d.ts +74 -8
  15. package/dist/agent/agent.js +1073 -184
  16. package/dist/agent/backends/account_rotation.d.ts +4 -0
  17. package/dist/agent/backends/account_rotation.js +8 -2
  18. package/dist/agent/backends/anthropic.d.ts +13 -0
  19. package/dist/agent/backends/anthropic.js +169 -28
  20. package/dist/agent/backends/claude_cli.js +18 -8
  21. package/dist/agent/backends/codex_app_server.d.ts +1 -0
  22. package/dist/agent/backends/codex_app_server.js +55 -3
  23. package/dist/agent/backends/codex_auth.d.ts +1 -0
  24. package/dist/agent/backends/codex_auth.js +67 -13
  25. package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
  26. package/dist/agent/backends/codex_buffered_recovery.js +293 -0
  27. package/dist/agent/backends/gemini.js +3 -1
  28. package/dist/agent/backends/http_error.d.ts +26 -0
  29. package/dist/agent/backends/http_error.js +221 -0
  30. package/dist/agent/backends/index.d.ts +9 -2
  31. package/dist/agent/backends/index.js +22 -2
  32. package/dist/agent/backends/openai.d.ts +0 -6
  33. package/dist/agent/backends/openai.js +5 -2
  34. package/dist/agent/backends/openai_compatible.d.ts +5 -4
  35. package/dist/agent/backends/openai_compatible.js +26 -19
  36. package/dist/agent/backends/openai_responses.d.ts +8 -3
  37. package/dist/agent/backends/openai_responses.js +77 -33
  38. package/dist/agent/backends/provider_ids.d.ts +1 -0
  39. package/dist/agent/backends/provider_ids.js +4 -0
  40. package/dist/agent/backends/request_metrics.js +12 -2
  41. package/dist/agent/backends/types.d.ts +109 -6
  42. package/dist/agent/backends/types.js +5 -1
  43. package/dist/agent/backends/zrouter_stream.d.ts +6 -1
  44. package/dist/agent/backends/zrouter_stream.js +160 -42
  45. package/dist/agent/background_registry.d.ts +2 -0
  46. package/dist/agent/background_registry.js +1 -0
  47. package/dist/agent/claim_observation.d.ts +6 -0
  48. package/dist/agent/claim_observation.js +54 -0
  49. package/dist/agent/commands/accounts.js +46 -177
  50. package/dist/agent/commands/attention.d.ts +2 -0
  51. package/dist/agent/commands/attention.js +67 -0
  52. package/dist/agent/commands/auth.js +18 -2
  53. package/dist/agent/commands/board.d.ts +2 -0
  54. package/dist/agent/commands/board.js +169 -0
  55. package/dist/agent/commands/clipboard.js +50 -1
  56. package/dist/agent/commands/compact.js +21 -13
  57. package/dist/agent/commands/config.js +4 -1
  58. package/dist/agent/commands/context.js +6 -1
  59. package/dist/agent/commands/desktop.d.ts +2 -0
  60. package/dist/agent/commands/desktop.js +29 -0
  61. package/dist/agent/commands/effort.js +14 -6
  62. package/dist/agent/commands/environment.d.ts +3 -0
  63. package/dist/agent/commands/environment.js +109 -0
  64. package/dist/agent/commands/evidence.d.ts +2 -0
  65. package/dist/agent/commands/evidence.js +9 -0
  66. package/dist/agent/commands/fork.js +4 -3
  67. package/dist/agent/commands/goal.d.ts +33 -1
  68. package/dist/agent/commands/goal.js +174 -14
  69. package/dist/agent/commands/goal_exit.d.ts +36 -0
  70. package/dist/agent/commands/goal_exit.js +120 -0
  71. package/dist/agent/commands/help.js +3 -1
  72. package/dist/agent/commands/history.js +3 -1
  73. package/dist/agent/commands/inbox.d.ts +2 -0
  74. package/dist/agent/commands/inbox.js +148 -0
  75. package/dist/agent/commands/index.js +16 -1
  76. package/dist/agent/commands/input_mode.js +8 -6
  77. package/dist/agent/commands/job.d.ts +2 -0
  78. package/dist/agent/commands/job.js +93 -0
  79. package/dist/agent/commands/keybindings.js +4 -1
  80. package/dist/agent/commands/label.d.ts +2 -0
  81. package/dist/agent/commands/label.js +77 -0
  82. package/dist/agent/commands/layout.d.ts +2 -0
  83. package/dist/agent/commands/layout.js +20 -0
  84. package/dist/agent/commands/mirror.js +16 -1
  85. package/dist/agent/commands/model.js +12 -2
  86. package/dist/agent/commands/permissions.d.ts +3 -1
  87. package/dist/agent/commands/permissions.js +79 -89
  88. package/dist/agent/commands/plan.js +5 -15
  89. package/dist/agent/commands/profile.js +21 -2
  90. package/dist/agent/commands/provider_selection.js +20 -1
  91. package/dist/agent/commands/rename.js +1 -1
  92. package/dist/agent/commands/resources.d.ts +2 -0
  93. package/dist/agent/commands/resources.js +67 -0
  94. package/dist/agent/commands/rewind.d.ts +3 -0
  95. package/dist/agent/commands/rewind.js +16 -0
  96. package/dist/agent/commands/runbooks.d.ts +2 -0
  97. package/dist/agent/commands/runbooks.js +73 -0
  98. package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
  99. package/dist/agent/commands/runbooks_lazy.js +8 -0
  100. package/dist/agent/commands/sessions.d.ts +1 -1
  101. package/dist/agent/commands/sessions.js +33 -5
  102. package/dist/agent/commands/settings.js +185 -39
  103. package/dist/agent/commands/setup.d.ts +2 -0
  104. package/dist/agent/commands/setup.js +78 -0
  105. package/dist/agent/commands/share.d.ts +2 -0
  106. package/dist/agent/commands/share.js +64 -0
  107. package/dist/agent/commands/status.js +14 -2
  108. package/dist/agent/commands/types.d.ts +99 -6
  109. package/dist/agent/commands/update.js +8 -0
  110. package/dist/agent/commands/usage.d.ts +2 -0
  111. package/dist/agent/commands/usage.js +8 -0
  112. package/dist/agent/factory.d.ts +11 -0
  113. package/dist/agent/factory.js +113 -88
  114. package/dist/agent/loop_policy.d.ts +6 -3
  115. package/dist/agent/loop_policy.js +12 -3
  116. package/dist/agent/measurement_guidance.d.ts +2 -0
  117. package/dist/agent/measurement_guidance.js +5 -0
  118. package/dist/agent/request_encoder.d.ts +8 -1
  119. package/dist/agent/request_encoder.js +95 -23
  120. package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
  121. package/dist/agent/runtime/benchmark_comparison.js +94 -0
  122. package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
  123. package/dist/agent/runtime/benchmark_contract.js +90 -0
  124. package/dist/agent/runtime/checked_commands.d.ts +32 -0
  125. package/dist/agent/runtime/checked_commands.js +119 -0
  126. package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
  127. package/dist/agent/runtime/command_execution_policy.js +91 -0
  128. package/dist/agent/runtime/command_jobs.d.ts +36 -18
  129. package/dist/agent/runtime/command_jobs.js +151 -13
  130. package/dist/agent/runtime/command_panes.d.ts +59 -0
  131. package/dist/agent/runtime/command_panes.js +398 -0
  132. package/dist/agent/runtime/command_wait.d.ts +19 -0
  133. package/dist/agent/runtime/command_wait.js +167 -0
  134. package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
  135. package/dist/agent/runtime/cpu_benchmark.js +126 -0
  136. package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
  137. package/dist/agent/runtime/delegated_evidence.js +80 -0
  138. package/dist/agent/runtime/evidence.d.ts +127 -0
  139. package/dist/agent/runtime/evidence.js +468 -0
  140. package/dist/agent/runtime/execution_context.d.ts +7 -0
  141. package/dist/agent/runtime/execution_context.js +39 -3
  142. package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
  143. package/dist/agent/runtime/json_verifier_recipe.js +66 -0
  144. package/dist/agent/runtime/measurements.d.ts +110 -0
  145. package/dist/agent/runtime/measurements.js +317 -0
  146. package/dist/agent/runtime/policy.d.ts +4 -0
  147. package/dist/agent/runtime/policy.js +31 -20
  148. package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
  149. package/dist/agent/runtime/provider_native_evidence.js +86 -0
  150. package/dist/agent/runtime/recovery.d.ts +2 -0
  151. package/dist/agent/runtime/recovery.js +45 -2
  152. package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
  153. package/dist/agent/runtime/remote_broker_transport.js +84 -0
  154. package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
  155. package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
  156. package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
  157. package/dist/agent/runtime/remote_journal_replay.js +233 -0
  158. package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
  159. package/dist/agent/runtime/remote_mutation_journal.js +208 -0
  160. package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
  161. package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
  162. package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
  163. package/dist/agent/runtime/remote_resource_errors.js +9 -0
  164. package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
  165. package/dist/agent/runtime/remote_resource_script.js +1009 -0
  166. package/dist/agent/runtime/remote_resources.d.ts +29 -0
  167. package/dist/agent/runtime/remote_resources.js +160 -0
  168. package/dist/agent/runtime/source_verification.d.ts +12 -0
  169. package/dist/agent/runtime/source_verification.js +210 -0
  170. package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
  171. package/dist/agent/runtime/source_verification_contract.js +203 -0
  172. package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
  173. package/dist/agent/runtime/tool_checkpoints.js +26 -0
  174. package/dist/agent/runtime/tool_effects.d.ts +5 -0
  175. package/dist/agent/runtime/tool_progress.d.ts +12 -0
  176. package/dist/agent/runtime/tool_progress.js +76 -0
  177. package/dist/agent/runtime/tool_runtime.d.ts +16 -1
  178. package/dist/agent/runtime/tool_runtime.js +204 -10
  179. package/dist/agent/runtime/tracing.d.ts +1 -1
  180. package/dist/agent/runtime/verifier_capture.d.ts +9 -0
  181. package/dist/agent/runtime/verifier_capture.js +100 -0
  182. package/dist/agent/runtime/verifier_contract.d.ts +24 -0
  183. package/dist/agent/runtime/verifier_contract.js +41 -0
  184. package/dist/agent/subagent.d.ts +20 -10
  185. package/dist/agent/subagent.js +266 -29
  186. package/dist/agent/tool_response_directory.d.ts +24 -0
  187. package/dist/agent/tool_response_directory.js +61 -0
  188. package/dist/agent/tool_response_source.d.ts +8 -0
  189. package/dist/agent/tool_response_source.js +49 -0
  190. package/dist/agent/tool_response_store.d.ts +75 -4
  191. package/dist/agent/tool_response_store.js +583 -64
  192. package/dist/agent/tools/ask_user.d.ts +3 -1
  193. package/dist/agent/tools/ask_user.js +30 -11
  194. package/dist/agent/tools/background.js +1 -0
  195. package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
  196. package/dist/agent/tools/benchmark_cpu.js +102 -0
  197. package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
  198. package/dist/agent/tools/compare_benchmarks.js +53 -0
  199. package/dist/agent/tools/deferred.js +1 -0
  200. package/dist/agent/tools/delegate.js +18 -2
  201. package/dist/agent/tools/helper_requirements.d.ts +7 -0
  202. package/dist/agent/tools/helper_requirements.js +19 -0
  203. package/dist/agent/tools/index.d.ts +1 -0
  204. package/dist/agent/tools/index.js +3 -0
  205. package/dist/agent/tools/measurement_report.d.ts +22 -0
  206. package/dist/agent/tools/measurement_report.js +190 -0
  207. package/dist/agent/tools/pane.d.ts +0 -7
  208. package/dist/agent/tools/pane.js +5 -4
  209. package/dist/agent/tools/project_context.d.ts +3 -0
  210. package/dist/agent/tools/project_context.js +45 -0
  211. package/dist/agent/tools/recall_tool_response.d.ts +3 -5
  212. package/dist/agent/tools/recall_tool_response.js +19 -29
  213. package/dist/agent/tools/registry.d.ts +1 -0
  214. package/dist/agent/tools/registry.js +23 -0
  215. package/dist/agent/tools/related_sessions.d.ts +2 -0
  216. package/dist/agent/tools/related_sessions.js +156 -0
  217. package/dist/agent/tools/routine.js +13 -3
  218. package/dist/agent/tools/session_evidence.d.ts +3 -0
  219. package/dist/agent/tools/session_evidence.js +72 -0
  220. package/dist/agent/tools/shell.d.ts +4 -3
  221. package/dist/agent/tools/shell.js +174 -47
  222. package/dist/agent/tools/tool_search.js +3 -2
  223. package/dist/agent/tools/types.d.ts +28 -0
  224. package/dist/agent/tools/verify_artifact.d.ts +2 -0
  225. package/dist/agent/tools/verify_artifact.js +60 -0
  226. package/dist/agent/tools/workflow.js +1 -0
  227. package/dist/app/activity.d.ts +6 -1
  228. package/dist/app/activity.js +81 -12
  229. package/dist/app/agent_runner.d.ts +6 -1
  230. package/dist/app/agent_runner.js +34 -19
  231. package/dist/app/command_context.js +106 -10
  232. package/dist/app/controller.d.ts +15 -4
  233. package/dist/app/controller.js +29 -3
  234. package/dist/app/escape_stop.d.ts +11 -0
  235. package/dist/app/escape_stop.js +15 -0
  236. package/dist/app/liveness.d.ts +6 -4
  237. package/dist/app/liveness.js +13 -3
  238. package/dist/app/model_catalog_cache.d.ts +5 -0
  239. package/dist/app/model_catalog_cache.js +138 -0
  240. package/dist/app/ordered_transcript.js +43 -4
  241. package/dist/app/prompt_turn.d.ts +14 -0
  242. package/dist/app/prompt_turn.js +53 -0
  243. package/dist/app/recap.d.ts +3 -0
  244. package/dist/app/recap.js +9 -3
  245. package/dist/app/restart.d.ts +3 -2
  246. package/dist/app/restart.js +22 -7
  247. package/dist/app/rewind.d.ts +3 -3
  248. package/dist/app/rewind.js +3 -3
  249. package/dist/app/selection_completion.d.ts +17 -2
  250. package/dist/app/selection_completion.js +84 -9
  251. package/dist/app/session_manager.d.ts +38 -6
  252. package/dist/app/session_manager.js +263 -60
  253. package/dist/app/session_messages.d.ts +3 -0
  254. package/dist/app/session_messages.js +60 -0
  255. package/dist/app/task_scope_router.d.ts +20 -0
  256. package/dist/app/task_scope_router.js +173 -0
  257. package/dist/app/transcript_window.d.ts +2 -0
  258. package/dist/app/transcript_window.js +4 -0
  259. package/dist/app/workspace_admission_details.d.ts +3 -0
  260. package/dist/app/workspace_admission_details.js +26 -0
  261. package/dist/app/workspace_layout_controller.d.ts +11 -0
  262. package/dist/app/workspace_layout_controller.js +88 -0
  263. package/dist/app/workspace_monitor.d.ts +1 -0
  264. package/dist/app/workspace_monitor.js +216 -0
  265. package/dist/app/workspace_presets.d.ts +29 -0
  266. package/dist/app/workspace_presets.js +192 -0
  267. package/dist/attention/queue.d.ts +37 -0
  268. package/dist/attention/queue.js +183 -0
  269. package/dist/bench/rf_shared.d.ts +2 -0
  270. package/dist/board/binding.d.ts +42 -0
  271. package/dist/board/binding.js +38 -0
  272. package/dist/board/client.d.ts +42 -0
  273. package/dist/board/client.js +60 -0
  274. package/dist/cli.js +1 -1
  275. package/dist/cli_args.js +19 -17
  276. package/dist/cli_main.js +110 -13
  277. package/dist/cli_ratatui.d.ts +183 -16
  278. package/dist/cli_ratatui.js +3989 -1255
  279. package/dist/components/ActivityLine.d.ts +3 -2
  280. package/dist/components/ActivityLine.js +2 -2
  281. package/dist/components/InputArea.d.ts +19 -1
  282. package/dist/components/InputArea.js +264 -190
  283. package/dist/components/MessageList.d.ts +2 -0
  284. package/dist/components/MessageList.js +3 -1
  285. package/dist/components/SingleMessage.d.ts +2 -0
  286. package/dist/components/SingleMessage.js +4 -2
  287. package/dist/components/StatusBar.d.ts +4 -2
  288. package/dist/components/StatusBar.js +3 -1
  289. package/dist/conductor_branch.js +3 -0
  290. package/dist/config/api_retry.d.ts +6 -1
  291. package/dist/config/api_retry.js +19 -1
  292. package/dist/config/defaults.d.ts +2 -1
  293. package/dist/config/defaults.js +9 -2
  294. package/dist/config/message_display.d.ts +1 -0
  295. package/dist/config/message_display.js +17 -2
  296. package/dist/config/permissions.d.ts +21 -0
  297. package/dist/config/permissions.js +89 -0
  298. package/dist/config/resolved.d.ts +2 -2
  299. package/dist/config/types.d.ts +32 -5
  300. package/dist/config.d.ts +38 -4
  301. package/dist/config.js +290 -42
  302. package/dist/context/project_intelligence.d.ts +44 -0
  303. package/dist/context/project_intelligence.js +246 -0
  304. package/dist/desktop/cli_launch.d.ts +8 -0
  305. package/dist/desktop/cli_launch.js +6 -0
  306. package/dist/desktop/cli_shim.d.ts +8 -0
  307. package/dist/desktop/cli_shim.js +120 -0
  308. package/dist/desktop/runtime.d.ts +16 -0
  309. package/dist/desktop/runtime.js +161 -0
  310. package/dist/desktop/worker_launch.d.ts +7 -0
  311. package/dist/desktop/worker_launch.js +7 -0
  312. package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
  313. package/dist/diagnostics/cargo_mutants_selection.js +48 -0
  314. package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
  315. package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
  316. package/dist/diagnostics/session_evidence_package.d.ts +40 -0
  317. package/dist/diagnostics/session_evidence_package.js +234 -0
  318. package/dist/diagnostics/session_export.d.ts +93 -0
  319. package/dist/diagnostics/session_export.js +634 -0
  320. package/dist/emulation/tool_adapters.js +48 -18
  321. package/dist/emulation/ztc_addendum.d.ts +1 -0
  322. package/dist/emulation/ztc_addendum.js +13 -12
  323. package/dist/environment/service_runner.d.ts +1 -0
  324. package/dist/environment/service_runner.js +68 -0
  325. package/dist/environment/store.d.ts +120 -0
  326. package/dist/environment/store.js +387 -0
  327. package/dist/events.d.ts +40 -1
  328. package/dist/events.js +10 -17
  329. package/dist/goal_contract.d.ts +25 -0
  330. package/dist/goal_contract.js +44 -0
  331. package/dist/headless.d.ts +31 -0
  332. package/dist/headless.js +578 -70
  333. package/dist/headless_cli.js +8 -0
  334. package/dist/headless_cli_args.d.ts +1 -0
  335. package/dist/headless_cli_args.js +1 -0
  336. package/dist/intake/cli.d.ts +1 -0
  337. package/dist/intake/cli.js +33 -0
  338. package/dist/intake/format.d.ts +2 -0
  339. package/dist/intake/format.js +14 -0
  340. package/dist/intake/notifications.d.ts +16 -0
  341. package/dist/intake/notifications.js +132 -0
  342. package/dist/intake/store.d.ts +56 -0
  343. package/dist/intake/store.js +238 -0
  344. package/dist/library.d.ts +8 -0
  345. package/dist/library.js +19 -10
  346. package/dist/mcp/client.d.ts +1 -0
  347. package/dist/mcp/client.js +20 -0
  348. package/dist/modes/builtin/plan.yaml +2 -2
  349. package/dist/modes/handlers.js +1 -1
  350. package/dist/onboarding/first_run.d.ts +3 -0
  351. package/dist/onboarding/first_run.js +33 -25
  352. package/dist/onboarding/setup.d.ts +32 -0
  353. package/dist/onboarding/setup.js +133 -0
  354. package/dist/onboarding/setup_agent_health.d.ts +17 -0
  355. package/dist/onboarding/setup_agent_health.js +79 -0
  356. package/dist/onboarding/setup_environment.d.ts +66 -0
  357. package/dist/onboarding/setup_environment.js +219 -0
  358. package/dist/onboarding/setup_workspace.d.ts +17 -0
  359. package/dist/onboarding/setup_workspace.js +129 -0
  360. package/dist/optimize/adapters/index.d.ts +4 -1
  361. package/dist/optimize/adapters/index.js +7 -0
  362. package/dist/optimize/adapters/kernelbench.js +14 -5
  363. package/dist/optimize/adapters/popcorn.js +3 -2
  364. package/dist/optimize/adapters/profile_benchmark.js +13 -7
  365. package/dist/optimize/adapters/rfbench.js +25 -14
  366. package/dist/optimize/adapters/types.d.ts +3 -0
  367. package/dist/optimize/adapters/zergpod.js +5 -2
  368. package/dist/optimize/baseline.js +10 -21
  369. package/dist/optimize/branch.js +9 -12
  370. package/dist/optimize/combine.js +2 -3
  371. package/dist/optimize/executor.js +34 -48
  372. package/dist/optimize/measurements.d.ts +55 -0
  373. package/dist/optimize/measurements.js +173 -0
  374. package/dist/optimize/results.d.ts +1 -0
  375. package/dist/optimize/results.js +11 -33
  376. package/dist/optimize/tge.js +2 -1
  377. package/dist/panes/initial_input.d.ts +19 -0
  378. package/dist/panes/initial_input.js +206 -0
  379. package/dist/panes/labels.d.ts +16 -0
  380. package/dist/panes/labels.js +42 -0
  381. package/dist/panes/model_catalog.d.ts +3 -3
  382. package/dist/panes/model_catalog.js +28 -4
  383. package/dist/panes/pane_registry.js +6 -2
  384. package/dist/panes/types.d.ts +3 -0
  385. package/dist/panes/ztc_launch.js +19 -0
  386. package/dist/plugin/optimization.d.ts +2 -0
  387. package/dist/plugin/optimization.js +1 -0
  388. package/dist/plugin/runtime.d.ts +2 -0
  389. package/dist/plugin/simulation.d.ts +6 -1
  390. package/dist/plugin/simulation_contract.d.ts +836 -1
  391. package/dist/plugin/simulation_documents.d.ts +22 -0
  392. package/dist/plugin/simulation_documents.js +1 -0
  393. package/dist/plugin/simulation_interventions.d.ts +103 -0
  394. package/dist/plugin/simulation_interventions.js +1 -0
  395. package/dist/plugin/simulation_living.d.ts +1 -0
  396. package/dist/plugin/simulation_living.js +3 -0
  397. package/dist/plugin/simulation_meetings.d.ts +121 -0
  398. package/dist/plugin/simulation_meetings.js +1 -0
  399. package/dist/plugin/simulation_story_review.d.ts +111 -0
  400. package/dist/plugin/simulation_story_review.js +1 -0
  401. package/dist/plugin/simulation_storyteller.d.ts +91 -0
  402. package/dist/plugin/simulation_storyteller.js +1 -0
  403. package/dist/plugin/simulation_structured.d.ts +2 -0
  404. package/dist/plugin/simulation_structured.js +2 -0
  405. package/dist/plugin/simulation_toolkit.d.ts +21 -0
  406. package/dist/plugin/simulation_toolkit.js +24 -0
  407. package/dist/prompts/tool_delegate_task.j2 +1 -1
  408. package/dist/remote-broker/Dockerfile +10 -0
  409. package/dist/remote-broker/archive.py +1227 -0
  410. package/dist/remote-broker/cutover.py +761 -0
  411. package/dist/remote-broker/requirements.txt +5 -0
  412. package/dist/remote-broker/resources.json +6 -0
  413. package/dist/remote-broker/resources.write-staging.example.json +18 -0
  414. package/dist/remote-broker/retained.py +686 -0
  415. package/dist/remote-broker/retained_cleanup.py +550 -0
  416. package/dist/remote-broker/server.py +648 -0
  417. package/dist/remote-broker/worker.py +1007 -0
  418. package/dist/router_auth.d.ts +31 -0
  419. package/dist/router_auth.js +155 -9
  420. package/dist/runbooks/catalog.d.ts +3 -0
  421. package/dist/runbooks/catalog.js +26 -0
  422. package/dist/runbooks/library.d.ts +11 -0
  423. package/dist/runbooks/library.js +95 -0
  424. package/dist/runbooks/package.d.ts +43 -0
  425. package/dist/runbooks/package.js +102 -0
  426. package/dist/session.d.ts +65 -13
  427. package/dist/session.js +548 -43
  428. package/dist/session_handoff.d.ts +25 -0
  429. package/dist/session_handoff.js +322 -0
  430. package/dist/session_handoff_contract.d.ts +89 -0
  431. package/dist/session_handoff_contract.js +179 -0
  432. package/dist/session_media.d.ts +41 -0
  433. package/dist/session_media.js +357 -0
  434. package/dist/session_ownership.d.ts +16 -0
  435. package/dist/session_ownership.js +221 -0
  436. package/dist/session_public.d.ts +10 -2
  437. package/dist/session_public.js +6 -1
  438. package/dist/simulation/dynamic_history.d.ts +42 -0
  439. package/dist/simulation/dynamic_history.js +173 -0
  440. package/dist/simulation/engines/swarm/pane_manager.js +7 -6
  441. package/dist/simulation/inference.d.ts +3 -1
  442. package/dist/simulation/inference.js +19 -1
  443. package/dist/simulation/intervention_generation.d.ts +27 -0
  444. package/dist/simulation/intervention_generation.js +246 -0
  445. package/dist/simulation/intervention_material.d.ts +4 -0
  446. package/dist/simulation/intervention_material.js +81 -0
  447. package/dist/simulation/living/context.d.ts +3130 -0
  448. package/dist/simulation/living/context.js +944 -0
  449. package/dist/simulation/living/definer.d.ts +12 -0
  450. package/dist/simulation/living/definer.js +223 -0
  451. package/dist/simulation/living/definition.d.ts +257 -0
  452. package/dist/simulation/living/definition.js +341 -0
  453. package/dist/simulation/living/frame.d.ts +259 -0
  454. package/dist/simulation/living/frame.js +223 -0
  455. package/dist/simulation/living/identifiers.d.ts +2 -0
  456. package/dist/simulation/living/identifiers.js +12 -0
  457. package/dist/simulation/living/index.d.ts +15 -0
  458. package/dist/simulation/living/index.js +15 -0
  459. package/dist/simulation/living/inference.d.ts +219 -0
  460. package/dist/simulation/living/inference.js +576 -0
  461. package/dist/simulation/living/mechanics.d.ts +54 -0
  462. package/dist/simulation/living/mechanics.js +588 -0
  463. package/dist/simulation/living/model-input.d.ts +25 -0
  464. package/dist/simulation/living/model-input.js +215 -0
  465. package/dist/simulation/living/open-world.d.ts +257 -0
  466. package/dist/simulation/living/open-world.js +102 -0
  467. package/dist/simulation/living/projection.d.ts +7 -0
  468. package/dist/simulation/living/projection.js +31 -0
  469. package/dist/simulation/living/recall.d.ts +17 -0
  470. package/dist/simulation/living/recall.js +25 -0
  471. package/dist/simulation/living/reduce.d.ts +15 -0
  472. package/dist/simulation/living/reduce.js +1853 -0
  473. package/dist/simulation/living/replay.d.ts +6 -0
  474. package/dist/simulation/living/replay.js +22 -0
  475. package/dist/simulation/living/runtime.d.ts +140 -0
  476. package/dist/simulation/living/runtime.js +3020 -0
  477. package/dist/simulation/living/shared-kinds.d.ts +24 -0
  478. package/dist/simulation/living/shared-kinds.js +96 -0
  479. package/dist/simulation/living/types.d.ts +2785 -0
  480. package/dist/simulation/living/types.js +669 -0
  481. package/dist/simulation/llm.d.ts +3 -1
  482. package/dist/simulation/llm.js +90 -30
  483. package/dist/simulation/memory/embedding.d.ts +1 -1
  484. package/dist/simulation/memory/embedding.js +9 -3
  485. package/dist/simulation/memory/filesystem.d.ts +2 -0
  486. package/dist/simulation/memory/filesystem.js +5 -1
  487. package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
  488. package/dist/simulation/memory/filesystem_file_tree.js +41 -10
  489. package/dist/simulation/memory/filesystem_invariants.js +1 -2
  490. package/dist/simulation/memory/filesystem_types.d.ts +1 -0
  491. package/dist/simulation/memory/memory.d.ts +2 -0
  492. package/dist/simulation/memory/memory.js +5 -1
  493. package/dist/simulation/orchestration/intent.js +0 -2
  494. package/dist/simulation/orchestration/lifecycle.js +0 -2
  495. package/dist/simulation/plugin_host.d.ts +25 -1
  496. package/dist/simulation/plugin_host.js +334 -17
  497. package/dist/simulation/session_documents.d.ts +20 -0
  498. package/dist/simulation/session_documents.js +62 -0
  499. package/dist/simulation/session_input_validation.d.ts +43 -0
  500. package/dist/simulation/session_input_validation.js +364 -0
  501. package/dist/simulation/session_inputs.d.ts +32 -0
  502. package/dist/simulation/session_inputs.js +154 -0
  503. package/dist/simulation/telemetry.d.ts +11 -14
  504. package/dist/simulation/telemetry.js +177 -54
  505. package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
  506. package/dist/simulation/toolkit/bounded_turns.js +80 -0
  507. package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
  508. package/dist/simulation/toolkit/dynamic_agents.js +218 -0
  509. package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
  510. package/dist/simulation/toolkit/dynamic_digest.js +8 -0
  511. package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
  512. package/dist/simulation/toolkit/dynamic_documents.js +71 -0
  513. package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
  514. package/dist/simulation/toolkit/dynamic_driver.js +269 -0
  515. package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
  516. package/dist/simulation/toolkit/dynamic_game.js +805 -0
  517. package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
  518. package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
  519. package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
  520. package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
  521. package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
  522. package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
  523. package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
  524. package/dist/simulation/toolkit/dynamic_progress.js +214 -0
  525. package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
  526. package/dist/simulation/toolkit/dynamic_projection.js +219 -0
  527. package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
  528. package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
  529. package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
  530. package/dist/simulation/toolkit/dynamic_state.js +1967 -0
  531. package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
  532. package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
  533. package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
  534. package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
  535. package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
  536. package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
  537. package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
  538. package/dist/simulation/toolkit/dynamic_world.js +377 -0
  539. package/dist/simulation/toolkit/structured_output.d.ts +5 -0
  540. package/dist/simulation/toolkit/structured_output.js +321 -0
  541. package/dist/simulation/types/world.d.ts +2 -0
  542. package/dist/simulation/world/artifact_store.js +1 -1
  543. package/dist/simulation/world/memory_manager.d.ts +5 -0
  544. package/dist/simulation/world/memory_manager.js +17 -2
  545. package/dist/simulation/world/state.d.ts +3 -2
  546. package/dist/simulation/world/state.js +15 -5
  547. package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
  548. package/dist/terminal_attach.d.ts +1 -0
  549. package/dist/terminal_attach.js +113 -0
  550. package/dist/tool_progress.d.ts +3 -0
  551. package/dist/tool_progress.js +27 -0
  552. package/dist/types.d.ts +145 -10
  553. package/dist/types.js +3 -0
  554. package/dist/ui/core/input.d.ts +3 -0
  555. package/dist/ui/core/input_segments.d.ts +18 -1
  556. package/dist/ui/core/input_segments.js +131 -47
  557. package/dist/ui/core/input_state.d.ts +12 -0
  558. package/dist/ui/core/layout_yoga.d.ts +1 -1
  559. package/dist/ui/core/turn_metadata.d.ts +5 -0
  560. package/dist/ui/core/turn_metadata.js +22 -0
  561. package/dist/ui/ink/render.d.ts +2 -1
  562. package/dist/ui/ink/render.js +6 -5
  563. package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
  564. package/dist/ui/ratatui/headless_pane_manager.js +293 -104
  565. package/dist/ui/ratatui/index.d.ts +1 -0
  566. package/dist/ui/ratatui/input.d.ts +4 -0
  567. package/dist/ui/ratatui/input.js +15 -0
  568. package/dist/ui/ratatui/ipc_path.d.ts +2 -0
  569. package/dist/ui/ratatui/ipc_path.js +29 -1
  570. package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
  571. package/dist/ui/ratatui/mux_persistence.js +139 -1
  572. package/dist/ui/ratatui/pane_relay.d.ts +1 -1
  573. package/dist/ui/ratatui/pane_relay.js +55 -27
  574. package/dist/ui/ratatui/process.d.ts +17 -1
  575. package/dist/ui/ratatui/process.js +80 -7
  576. package/dist/ui/ratatui/protocol.d.ts +236 -1
  577. package/dist/ui/ratatui/protocol.js +90 -0
  578. package/dist/ui/scrollback.d.ts +2 -1
  579. package/dist/ui/scrollback.js +9 -4
  580. package/dist/ui/stream_typewriter.d.ts +8 -3
  581. package/dist/ui/stream_typewriter.js +30 -1
  582. package/dist/ui/streaming_scrollback.d.ts +1 -0
  583. package/dist/ui/streaming_scrollback.js +1 -1
  584. package/dist/ui/transcript_render_cache.js +10 -0
  585. package/dist/ui/views/activity_line.d.ts +5 -3
  586. package/dist/ui/views/activity_line.js +65 -7
  587. package/dist/ui/views/app.d.ts +6 -3
  588. package/dist/ui/views/app.js +17 -6
  589. package/dist/ui/views/completion_menu.js +10 -5
  590. package/dist/ui/views/input_area.d.ts +7 -3
  591. package/dist/ui/views/input_area.js +15 -9
  592. package/dist/ui/views/message_list.d.ts +4 -1
  593. package/dist/ui/views/message_list.js +89 -19
  594. package/dist/ui/views/queue_panel.d.ts +3 -1
  595. package/dist/ui/views/queue_panel.js +9 -2
  596. package/dist/ui/views/status_bar.d.ts +4 -2
  597. package/dist/ui/views/status_bar.js +28 -13
  598. package/dist/ui/views/theme.d.ts +2 -0
  599. package/dist/ui/views/theme.js +2 -0
  600. package/dist/ui/widgets/color_panel.js +18 -0
  601. package/dist/ui/widgets/form.js +8 -0
  602. package/dist/ui/widgets/log_view.js +7 -0
  603. package/dist/ui/widgets/navigator_panel.js +8 -0
  604. package/dist/ui/widgets/prompt_viewer.js +2 -0
  605. package/dist/ui/widgets/questionnaire.d.ts +2 -0
  606. package/dist/ui/widgets/questionnaire.js +79 -16
  607. package/dist/ui/widgets/resume_panel.d.ts +2 -0
  608. package/dist/ui/widgets/resume_panel.js +26 -15
  609. package/dist/ui/widgets/rewind_panel.d.ts +2 -2
  610. package/dist/ui/widgets/rewind_panel.js +4 -2
  611. package/dist/ui/widgets/select.js +16 -27
  612. package/dist/ui/widgets/settings_panel.js +16 -0
  613. package/dist/ui/widgets/status_line_panel.d.ts +1 -0
  614. package/dist/ui/widgets/status_line_panel.js +30 -4
  615. package/dist/ui/widgets/text_input.d.ts +2 -0
  616. package/dist/ui/widgets/text_input.js +15 -1
  617. package/dist/ui/widgets/types.d.ts +2 -0
  618. package/dist/usage_projection.d.ts +24 -0
  619. package/dist/usage_projection.js +130 -0
  620. package/dist/usage_snapshot.d.ts +36 -0
  621. package/dist/usage_snapshot.js +131 -0
  622. package/dist/utils/assistant_message.d.ts +2 -0
  623. package/dist/utils/assistant_message.js +5 -0
  624. package/dist/utils/atomic_write.d.ts +6 -2
  625. package/dist/utils/atomic_write.js +29 -4
  626. package/dist/utils/checked_shell.d.ts +25 -0
  627. package/dist/utils/checked_shell.js +107 -0
  628. package/dist/utils/compaction.d.ts +4 -1
  629. package/dist/utils/compaction.js +31 -7
  630. package/dist/utils/context.d.ts +4 -4
  631. package/dist/utils/context.js +14 -12
  632. package/dist/utils/deepseek.d.ts +2 -2
  633. package/dist/utils/deepseek.js +13 -5
  634. package/dist/utils/ephemeral.js +4 -0
  635. package/dist/utils/ephemeral_tools.d.ts +18 -0
  636. package/dist/utils/ephemeral_tools.js +97 -0
  637. package/dist/utils/jev_client.d.ts +4 -0
  638. package/dist/utils/jev_client.js +15 -0
  639. package/dist/utils/model_cache.d.ts +15 -0
  640. package/dist/utils/model_cache.js +143 -0
  641. package/dist/utils/models.d.ts +4 -2
  642. package/dist/utils/models.js +12 -16
  643. package/dist/utils/reasoning.d.ts +8 -1
  644. package/dist/utils/reasoning.js +31 -11
  645. package/dist/utils/router_catalog.d.ts +49 -0
  646. package/dist/utils/router_catalog.js +271 -0
  647. package/dist/utils/sandbox.d.ts +9 -0
  648. package/dist/utils/sandbox.js +118 -15
  649. package/dist/utils/shell.d.ts +7 -0
  650. package/dist/utils/shell.js +98 -34
  651. package/dist/utils/subprocess_env.d.ts +3 -0
  652. package/dist/utils/subprocess_env.js +27 -1
  653. package/dist/web/accounts_mirror.d.ts +3 -1
  654. package/dist/web/accounts_mirror.js +13 -9
  655. package/dist/web/child_publication.d.ts +17 -0
  656. package/dist/web/child_publication.js +45 -0
  657. package/dist/web/mirror_authenticator.d.ts +31 -11
  658. package/dist/web/mirror_authenticator.js +67 -17
  659. package/dist/web/mirror_client.d.ts +31 -4
  660. package/dist/web/mirror_client.js +189 -23
  661. package/dist/web/mirror_stream.d.ts +84 -22
  662. package/dist/web/mirror_stream.js +676 -95
  663. package/dist/web/observer_query_redaction.d.ts +6 -0
  664. package/dist/web/observer_query_redaction.js +58 -0
  665. package/dist/web/pane_registry.d.ts +2 -0
  666. package/dist/web/pane_registry.js +86 -22
  667. package/dist/web/tool_image.d.ts +6 -0
  668. package/dist/web/tool_image.js +17 -0
  669. package/dist/web/view_plugin.d.ts +14 -0
  670. package/dist/web/view_plugin.js +23 -1
  671. package/dist/worker/executor.js +31 -12
  672. package/dist/worker/index.d.ts +1 -0
  673. package/dist/worker/toolsets.js +3 -1
  674. package/dist/worker/types.d.ts +12 -1
  675. package/dist/workflows/registry.js +1 -0
  676. package/dist/workflows/registry_handle.d.ts +2 -0
  677. package/dist/workflows/runtime.d.ts +2 -0
  678. package/dist/workflows/runtime.js +1 -0
  679. package/dist/workspace_agent.d.ts +7 -0
  680. package/dist/workspace_agent.js +36 -0
  681. package/dist/workspace_collision.d.ts +76 -0
  682. package/dist/workspace_collision.js +688 -0
  683. package/dist/workspace_layout.d.ts +18 -0
  684. package/dist/workspace_layout.js +121 -0
  685. package/dist/workspace_runtime.d.ts +44 -0
  686. package/dist/workspace_runtime.js +82 -0
  687. package/dist/workspace_session_context.d.ts +62 -0
  688. package/dist/workspace_session_context.js +160 -0
  689. package/dist/zlm-embed.mjs +32518 -9615
  690. package/dist/zlm.js +1 -0
  691. package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
  692. package/node_modules/@zerg/model-contracts/README.md +90 -0
  693. package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
  694. package/node_modules/@zerg/model-contracts/index.js +223 -0
  695. package/node_modules/@zerg/model-contracts/package.json +8 -0
  696. package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
  697. package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
  698. package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
  699. package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
  700. package/package.json +45 -24
  701. package/packages/model-contracts/LICENSE.md +375 -0
  702. package/packages/model-contracts/README.md +90 -0
  703. package/packages/model-contracts/index.d.ts +20 -0
  704. package/packages/model-contracts/index.js +223 -0
  705. package/packages/model-contracts/package.json +8 -0
  706. package/remote-broker/Dockerfile +10 -0
  707. package/remote-broker/README.md +308 -0
  708. package/remote-broker/archive.py +1227 -0
  709. package/remote-broker/cutover.py +761 -0
  710. package/remote-broker/requirements.txt +5 -0
  711. package/remote-broker/resources.example.json +6 -0
  712. package/remote-broker/resources.write-staging.example.json +18 -0
  713. package/remote-broker/retained.py +686 -0
  714. package/remote-broker/retained_cleanup.py +550 -0
  715. package/remote-broker/server.py +648 -0
  716. package/scripts/build-remote-broker.mjs +13 -0
  717. package/scripts/ensure-local-packages.mjs +6 -0
  718. package/scripts/node-pty-helpers.mjs +103 -0
@@ -0,0 +1,219 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { basename, win32 } from 'node:path';
3
+ import { sanitizeTerminalText } from '../ui/core/text_width.js';
4
+ const PROBE_TIMEOUT_MS = 2000;
5
+ const INSTALL_TIMEOUT_MS = 120_000;
6
+ const TERMINATION_GRACE_MS = 150;
7
+ const OUTPUT_LIMIT_BYTES = 8192;
8
+ const CONCURRENT_PROBES = 4;
9
+ const SHELL_SENTINEL = 'ZTC_SETUP_SHELL_READY';
10
+ const PROBES = [
11
+ { id: 'git', label: 'Git', command: 'git', args: ['--version'], version: /\bgit version (\d[^\s]*)/, required: true },
12
+ { id: 'rg', label: 'ripgrep', command: 'rg', args: ['--version'], version: /\bripgrep (\d[^\s]*)/, required: false },
13
+ { id: 'gh', label: 'GitHub CLI', command: 'gh', args: ['--version'], version: /\bgh version (\d[^\s]*)/, required: false },
14
+ { id: 'python', label: 'Python', command: 'python3', args: ['--version'], version: /\bPython (\d[^\s]*)/, required: false },
15
+ { id: 'bun', label: 'Bun', command: 'bun', args: ['--version'], version: /^(\d+\.\d+[^\s]*)/m, required: false },
16
+ { id: 'deno', label: 'Deno', command: 'deno', args: ['--version'], version: /\bdeno (\d[^\s]*)/, required: false },
17
+ { id: 'make', label: 'Make', command: 'make', args: ['--version'], version: /\b(?:GNU )?Make (\d[^\s]*)/i, required: false },
18
+ { id: 'curl', label: 'curl', command: 'curl', args: ['--version'], version: /\bcurl (\d[^\s]*)/, required: false },
19
+ { id: 'ssh', label: 'SSH', command: 'ssh', args: ['-V'], version: /\bOpenSSH[_ ](\d[^\s,]*)/, required: false },
20
+ { id: 'tar', label: 'tar', command: 'tar', args: ['--version'], version: /\b(?:bsdtar|tar(?: \(GNU tar\))?) (\d[^\s]*)/, required: false },
21
+ { id: 'unzip', label: 'unzip', command: 'unzip', args: ['-v'], version: /\bUnZip (\d[^\s]*)/, required: false },
22
+ ];
23
+ function text(value) {
24
+ return sanitizeTerminalText(value).replace(/\s+/g, ' ').trim().slice(0, 256);
25
+ }
26
+ function environment(options) {
27
+ return { ...(options.env ?? process.env) };
28
+ }
29
+ /** A fixed executable/argv process, never a caller-provided shell command. */
30
+ async function run(command, args, options, timeoutMs) {
31
+ if (options.signal?.aborted)
32
+ return { status: 'cancelled', output: '' };
33
+ return new Promise(resolve => {
34
+ const child = spawn(command, [...args], {
35
+ cwd: options.cwd, env: environment(options), shell: false,
36
+ stdio: ['ignore', 'pipe', 'pipe'], detached: process.platform !== 'win32',
37
+ });
38
+ let reason;
39
+ let bytes = 0;
40
+ let output = '';
41
+ let escalation;
42
+ let errorCode;
43
+ const terminate = (signal) => {
44
+ if (!child.pid)
45
+ return;
46
+ try {
47
+ if (process.platform !== 'win32')
48
+ process.kill(-child.pid, signal);
49
+ else
50
+ child.kill(signal);
51
+ }
52
+ catch (error) {
53
+ if (error.code !== 'ESRCH')
54
+ child.kill(signal);
55
+ }
56
+ };
57
+ const stop = (status) => {
58
+ if (reason)
59
+ return;
60
+ reason = status;
61
+ terminate('SIGTERM');
62
+ escalation = setTimeout(() => terminate('SIGKILL'), TERMINATION_GRACE_MS);
63
+ };
64
+ const deadline = setTimeout(() => stop('timeout'), timeoutMs);
65
+ const abort = () => stop('cancelled');
66
+ options.signal?.addEventListener('abort', abort, { once: true });
67
+ const receive = (chunk) => {
68
+ bytes += chunk.length;
69
+ if (bytes > OUTPUT_LIMIT_BYTES) {
70
+ stop('output_limit');
71
+ return;
72
+ }
73
+ if (!reason)
74
+ output += chunk.toString('utf8');
75
+ };
76
+ child.stdout.on('data', receive);
77
+ child.stderr.on('data', receive);
78
+ child.on('error', error => {
79
+ errorCode = error.code;
80
+ reason ??= errorCode === 'ENOENT' ? 'missing' : 'failed';
81
+ });
82
+ child.on('close', (exitCode, signal) => {
83
+ clearTimeout(deadline);
84
+ if (escalation)
85
+ clearTimeout(escalation);
86
+ options.signal?.removeEventListener('abort', abort);
87
+ resolve({ status: reason ?? (exitCode === 0 && signal === null ? 'ready' : 'failed'),
88
+ output: reason ? '' : output, ...(exitCode !== null ? { exitCode } : {}), ...(errorCode ? { errorCode } : {}) });
89
+ });
90
+ });
91
+ }
92
+ function failureDetail(label, result) {
93
+ switch (result.status) {
94
+ case 'missing': return `${label} is missing from PATH. Install it or use /setup to select a supported installation.`;
95
+ case 'timeout': return `${label} probe timed out. Check the executable and retry /setup.`;
96
+ case 'cancelled': return `${label} check was cancelled. Retry /setup when ready.`;
97
+ case 'output_limit': return `${label} exceeded the bounded output limit. Check the executable and retry /setup.`;
98
+ default: return `${label} failed${result.exitCode !== undefined ? ` with exit ${result.exitCode}` : result.errorCode ? ` (${text(result.errorCode)})` : ''}. Repair the tool or PATH and retry /setup.`;
99
+ }
100
+ }
101
+ async function inspectTool(probe, options) {
102
+ const result = await run(probe.command, probe.args, options, PROBE_TIMEOUT_MS);
103
+ const version = result.status === 'ready' ? probe.version.exec(result.output)?.[1] : undefined;
104
+ return { id: probe.id, label: probe.label, required: probe.required,
105
+ status: result.status === 'ready' && !version ? 'failed' : result.status,
106
+ detail: result.status === 'ready' ? version ? `${probe.label} is available.` : `${probe.label} did not return a recognized version. Repair the executable and retry /setup.` : failureDetail(probe.label, result),
107
+ ...(version ? { version: text(version) } : {}) };
108
+ }
109
+ async function inspectGitHubAuth(options) {
110
+ // Do not request --show-token/JSON or retain any auth stdout/stderr in the report.
111
+ const result = await run('gh', ['auth', 'status', '--active', '--hostname', 'github.com'], options, PROBE_TIMEOUT_MS);
112
+ return { id: 'gh_auth', label: 'GitHub authentication', required: false, status: result.status,
113
+ detail: result.status === 'ready' ? 'The active GitHub account is authenticated for github.com.'
114
+ : result.status === 'failed' ? 'GitHub authentication is unavailable. Run gh auth login manually, then retry /setup.'
115
+ : failureDetail('GitHub authentication', result) };
116
+ }
117
+ /** Health uses only an allowlisted shell name and a fixed, literal sentinel. */
118
+ export async function runSetupShellHealth(options = {}) {
119
+ const env = environment(options);
120
+ const path = (process.platform === 'win32' ? env.COMSPEC ?? env.ComSpec ?? 'cmd.exe' : env.SHELL ?? '/bin/sh');
121
+ const name = (process.platform === 'win32' ? win32.basename(path) : basename(path)).toLowerCase().replace(/\.exe$/, '');
122
+ let args;
123
+ if (['sh', 'bash', 'zsh', 'dash', 'ksh', 'fish'].includes(name))
124
+ args = ['-c', `printf %s ${SHELL_SENTINEL}`];
125
+ else if (name === 'cmd' && process.platform === 'win32')
126
+ args = ['/d', '/s', '/c', `echo ${SHELL_SENTINEL}`];
127
+ else if (['powershell', 'pwsh'].includes(name))
128
+ args = ['-NoLogo', '-NoProfile', '-NonInteractive', '-Command', `[Console]::Write('${SHELL_SENTINEL}')`];
129
+ else
130
+ return { name: text(name), path: text(path), status: 'unsupported', detail: 'Selected shell is unsupported. Select sh, bash, zsh, fish, PowerShell or cmd outside ZTC and retry /setup.' };
131
+ if (!path || path.length > 1024 || /[\0\r\n]/.test(path)) {
132
+ return { name: text(name), path: text(path), status: 'unsupported', detail: 'Selected shell path is invalid. Correct the shell environment and retry /setup.' };
133
+ }
134
+ const result = await run(path, args, options, PROBE_TIMEOUT_MS);
135
+ const healthReady = result.status === 'ready' && result.output.trim() === SHELL_SENTINEL;
136
+ return { name: text(name), path: text(path), status: result.status === 'ready' && !healthReady ? 'failed' : result.status,
137
+ detail: healthReady ? 'Selected shell executed the setup health sentinel.'
138
+ : result.status === 'ready' ? 'Selected shell did not return the expected health sentinel. Repair its startup configuration and retry /setup.' : failureDetail('Selected shell', result) };
139
+ }
140
+ async function bounded(work) {
141
+ const result = new Array(work.length);
142
+ let next = 0;
143
+ await Promise.all(Array.from({ length: Math.min(CONCURRENT_PROBES, work.length) }, async () => {
144
+ while (next < work.length) {
145
+ const index = next++;
146
+ result[index] = await work[index]();
147
+ }
148
+ }));
149
+ return result;
150
+ }
151
+ export async function inspectSetupEnvironment(options = {}) {
152
+ const managers = process.platform === 'darwin' ? ['brew']
153
+ : process.platform === 'linux' ? ['apt', 'dnf', 'brew'] : [];
154
+ const work = [
155
+ () => runSetupShellHealth(options), ...PROBES.map(probe => () => inspectTool(probe, options)),
156
+ () => inspectGitHubAuth(options), ...managers.map(manager => () => run(manager === 'apt' ? 'apt-get' : manager, ['--version'], options, PROBE_TIMEOUT_MS)),
157
+ ];
158
+ const results = await bounded(work);
159
+ const shell = results[0];
160
+ const checks = results.slice(1, PROBES.length + 2);
161
+ const managerResults = results.slice(PROBES.length + 2);
162
+ const managerIndex = managerResults.findIndex((result, index) => result.status === 'ready'
163
+ && (managers[index] === 'brew' ? /\bHomebrew \d/.test(result.output) : managers[index] === 'apt' ? /\bapt \d/.test(result.output) : /^(?:dnf5? version )?\d+\./m.test(result.output)));
164
+ const problemManager = managerResults.find(result => result.status !== 'missing');
165
+ const packageManager = managerIndex >= 0
166
+ ? { id: managers[managerIndex], status: 'ready', detail: `${managers[managerIndex]} is available for explicitly selected Git/ripgrep installations.` }
167
+ : managers.length === 0 ? { id: null, status: 'unsupported', detail: 'Automatic tool installation supports Homebrew, apt and dnf. Install missing tools manually on this platform.' }
168
+ : problemManager ? { id: null, status: problemManager.status === 'ready' ? 'failed' : problemManager.status, detail: failureDetail('Supported package manager', { ...problemManager, status: problemManager.status === 'ready' ? 'failed' : problemManager.status }) }
169
+ : { id: null, status: 'missing', detail: 'No supported package manager is available. Install missing tools manually or configure Homebrew, apt or dnf outside ZTC.' };
170
+ const runtimeKind = options.runtimeKind ?? 'host';
171
+ const nodeReady = /^v\d+\./.test(process.version) && Number(process.versions.node.split('.')[0]) >= 20;
172
+ const node = {
173
+ version: process.version, executable: process.execPath, runtimeKind,
174
+ status: nodeReady ? 'ready' : 'unsupported',
175
+ detail: nodeReady ? `The running ${runtimeKind === 'bundled' ? 'bundled' : 'host'} Node runtime meets ZTC's Node 20 requirement.`
176
+ : runtimeKind === 'bundled' ? 'The bundled runtime requires Node 20 or later. Update or reinstall the desktop app.' : 'ZTC requires Node 20 or later. Update the Node runtime used to launch ZTC.',
177
+ };
178
+ return { platform: process.platform, shell, node, packageManager, checks,
179
+ ready: nodeReady && shell.status === 'ready' && checks.filter(check => check.required).every(check => check.status === 'ready') };
180
+ }
181
+ /** Only fixed package names/argv are supported; no sudo or arbitrary command input. */
182
+ export async function installMissingSetupTools(options) {
183
+ if (!Array.isArray(options.tools) || options.tools.length > 16 || options.tools.some(tool => tool !== 'git' && tool !== 'rg')) {
184
+ throw new RangeError('Unsupported setup install tool: choose Git and/or ripgrep.');
185
+ }
186
+ const tools = [...new Set(options.tools)];
187
+ const before = await inspectSetupEnvironment(options);
188
+ const attempts = [];
189
+ for (const tool of tools) {
190
+ const check = before.checks.find(entry => entry.id === tool);
191
+ if (options.signal?.aborted || check.status === 'cancelled') {
192
+ attempts.push({ tool, status: 'cancelled', action: 'not_installed', detail: 'Installation was cancelled. Retry /setup when ready.' });
193
+ continue;
194
+ }
195
+ if (check.status !== 'missing') {
196
+ attempts.push({ tool, status: check.status, action: 'skipped', detail: check.status === 'ready' ? `${check.label} is already available; no installation is needed.` : `${check.label} is present but unhealthy. Repair the executable before retrying installation.` });
197
+ continue;
198
+ }
199
+ const manager = before.packageManager.id;
200
+ if (!manager) {
201
+ attempts.push({ tool, status: 'unsupported', action: 'not_installed', detail: 'No supported package manager is available. Install this tool manually, then retry /setup.' });
202
+ continue;
203
+ }
204
+ // Official fixed install syntax: docs.brew.sh/Manpage; Debian apt-get(8); dnf command_ref.
205
+ const command = manager === 'apt' ? 'apt-get' : manager;
206
+ const packageName = tool === 'rg' ? 'ripgrep' : 'git';
207
+ const args = manager === 'brew' ? ['install', packageName] : ['install', '-y', packageName];
208
+ const env = { ...environment(options), ...(manager === 'brew' ? { HOMEBREW_NO_AUTO_UPDATE: '1', HOMEBREW_NO_INSTALL_CLEANUP: '1' } : manager === 'apt' ? { DEBIAN_FRONTEND: 'noninteractive' } : {}) };
209
+ const result = await run(command, args, { ...options, env }, INSTALL_TIMEOUT_MS);
210
+ const verification = result.status === 'ready' ? await inspectTool(PROBES.find(probe => probe.id === tool), options) : undefined;
211
+ const installed = result.status === 'ready' && verification?.status === 'ready';
212
+ attempts.push({ tool, status: installed ? 'ready' : result.status === 'ready' ? 'failed' : result.status,
213
+ action: installed ? 'installed' : 'not_installed', command, args,
214
+ detail: installed ? `${check.label} installation was verified.`
215
+ : result.status === 'ready' ? `${check.label} installation could not be verified; the tool is still missing or unhealthy. Check PATH and retry /setup.`
216
+ : `${failureDetail(`${check.label} installation`, result)} No privilege escalation was attempted; use your system administrator's normal installation process if permissions are required.` });
217
+ }
218
+ return { before, attempts, after: tools.length ? await inspectSetupEnvironment(options) : before };
219
+ }
@@ -0,0 +1,17 @@
1
+ export declare class SetupWorkspaceError extends Error {
2
+ readonly code: 'unowned' | 'invalid_marker' | 'unsupported_path' | 'invalid_configuration' | 'cancelled' | 'persistence';
3
+ constructor(message: string, code: 'unowned' | 'invalid_marker' | 'unsupported_path' | 'invalid_configuration' | 'cancelled' | 'persistence');
4
+ }
5
+ export interface SetupWorkspaceOptions {
6
+ workspaceRoot?: string;
7
+ provider: string;
8
+ model: string;
9
+ signal?: AbortSignal;
10
+ }
11
+ export interface SetupWorkspaceResult {
12
+ path: string;
13
+ sessionId: string;
14
+ created: boolean;
15
+ }
16
+ /** Create only our sample files; reruns preserve the marker, session and edits. */
17
+ export declare function ensureSetupWorkspace(options: SetupWorkspaceOptions): Promise<SetupWorkspaceResult>;
@@ -0,0 +1,129 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, mkdir, open, writeFile } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { profileConfigDir } from '../config/profiles.js';
5
+ import { generateSessionId, loadSessionById, saveSession, setSessionName } from '../session.js';
6
+ const MARKER = '.ztc-setup.json';
7
+ const SAMPLE_FILES = {
8
+ 'hello.js': "console.log('Hello from ZTC');\n",
9
+ 'README.md': '# Getting started with ZTC\n\nAsk ZTC to explain hello.js, then make a small change and review the diff.\nYour current project and conversation remain separate from this sample.\n',
10
+ };
11
+ export class SetupWorkspaceError extends Error {
12
+ code;
13
+ constructor(message, code) {
14
+ super(message);
15
+ this.code = code;
16
+ this.name = 'SetupWorkspaceError';
17
+ }
18
+ }
19
+ function requireActive(signal) {
20
+ if (signal?.aborted)
21
+ throw new SetupWorkspaceError('Setup was cancelled. Run /setup to try again.', 'cancelled');
22
+ }
23
+ function parseMarker(text) {
24
+ let value;
25
+ try {
26
+ value = JSON.parse(text);
27
+ }
28
+ catch {
29
+ throw new SetupWorkspaceError('The sample workspace marker is unreadable. Preserve this directory and choose a different sample location.', 'invalid_marker');
30
+ }
31
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
32
+ throw new SetupWorkspaceError('The sample workspace marker is invalid. Preserve this directory and choose a different sample location.', 'invalid_marker');
33
+ }
34
+ const marker = value;
35
+ if (marker._schema_version !== 1 || marker.product !== 'ZTC'
36
+ || typeof marker.sessionId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9_-]{1,127}$/.test(marker.sessionId)
37
+ || typeof marker.provider !== 'string' || !marker.provider.trim()
38
+ || typeof marker.model !== 'string' || !marker.model.trim()) {
39
+ throw new SetupWorkspaceError('The sample workspace marker is invalid. Preserve this directory and choose a different sample location.', 'invalid_marker');
40
+ }
41
+ return { _schema_version: 1, product: 'ZTC', sessionId: marker.sessionId, provider: marker.provider, model: marker.model };
42
+ }
43
+ async function readMarker(path) {
44
+ let handle;
45
+ try {
46
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
47
+ }
48
+ catch (error) {
49
+ if (error.code === 'ENOENT') {
50
+ throw new SetupWorkspaceError('Setup will not overwrite an existing directory that it does not own. Preserve it and choose another sample location.', 'unowned');
51
+ }
52
+ throw new SetupWorkspaceError('The sample workspace marker cannot be opened as a regular file.', 'invalid_marker');
53
+ }
54
+ try {
55
+ const stat = await handle.stat();
56
+ if (!stat.isFile() || stat.size > 4096)
57
+ throw new SetupWorkspaceError('The sample workspace marker is invalid or too large.', 'invalid_marker');
58
+ return parseMarker(await handle.readFile('utf8'));
59
+ }
60
+ finally {
61
+ await handle.close();
62
+ }
63
+ }
64
+ /** Create only our sample files; reruns preserve the marker, session and edits. */
65
+ export async function ensureSetupWorkspace(options) {
66
+ requireActive(options.signal);
67
+ if (!options.provider.trim() || !options.model.trim()) {
68
+ throw new SetupWorkspaceError('Choose an account and model before creating the sample workspace.', 'invalid_configuration');
69
+ }
70
+ const path = resolve(options.workspaceRoot ?? join(profileConfigDir(), 'workspaces', 'getting-started'));
71
+ const markerPath = join(path, MARKER);
72
+ let created = false;
73
+ let marker;
74
+ try {
75
+ const parent = dirname(path);
76
+ await mkdir(parent, { recursive: true });
77
+ requireActive(options.signal);
78
+ await mkdir(path);
79
+ created = true;
80
+ }
81
+ catch (error) {
82
+ if (error.code !== 'EEXIST')
83
+ throw error;
84
+ const stat = await lstat(path);
85
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
86
+ throw new SetupWorkspaceError('The sample path must be an ordinary directory. Choose another sample location.', 'unsupported_path');
87
+ }
88
+ }
89
+ if (created) {
90
+ marker = { _schema_version: 1, product: 'ZTC', sessionId: generateSessionId(), provider: options.provider, model: options.model };
91
+ requireActive(options.signal);
92
+ // Exclusive publication prevents a rerun from replacing another workspace's identity.
93
+ const handle = await open(markerPath, 'wx', 0o600);
94
+ try {
95
+ await handle.writeFile(JSON.stringify(marker, null, 2) + '\n', 'utf8');
96
+ await handle.sync();
97
+ }
98
+ finally {
99
+ await handle.close();
100
+ }
101
+ }
102
+ else {
103
+ marker = await readMarker(markerPath);
104
+ }
105
+ for (const [name, content] of Object.entries(SAMPLE_FILES)) {
106
+ requireActive(options.signal);
107
+ try {
108
+ await writeFile(join(path, name), content, { flag: 'wx', mode: 0o600 });
109
+ }
110
+ catch (error) {
111
+ if (error.code !== 'EEXIST')
112
+ throw error;
113
+ }
114
+ }
115
+ requireActive(options.signal);
116
+ const existing = await loadSessionById(marker.sessionId, path);
117
+ if (!existing) {
118
+ await saveSession(marker.sessionId, path, [], marker.model, marker.provider);
119
+ const named = await setSessionName(marker.sessionId, path, 'Getting started with ZTC');
120
+ if (!named || named.metadata.id !== marker.sessionId) {
121
+ throw new SetupWorkspaceError('The sample session could not be saved. Check storage permissions and rerun /setup.', 'persistence');
122
+ }
123
+ }
124
+ const saved = await loadSessionById(marker.sessionId, path);
125
+ if (!saved || saved.metadata.id !== marker.sessionId || saved.metadata.cwd !== path) {
126
+ throw new SetupWorkspaceError('The sample session could not be verified. Check storage permissions and rerun /setup.', 'persistence');
127
+ }
128
+ return { path, sessionId: marker.sessionId, created };
129
+ }
@@ -1,7 +1,10 @@
1
1
  import type { OptimizationSpec } from '../types.js';
2
- import type { OptimizationAdapter } from './types.js';
2
+ import type { OptimizationAdapter, OptimizationExecutionResult, OptimizationExecutorDeps } from './types.js';
3
+ import type { OptimizationPlanArtifacts } from '../types.js';
3
4
  export declare function list_optimization_adapters(): OptimizationAdapter[];
4
5
  export declare function resolve_optimization_adapter(spec: OptimizationSpec): OptimizationAdapter | null;
6
+ /** Canonical result projection for built-in and plugin producers, including legacy or failed output. */
7
+ export declare function evaluate_optimization_adapter(adapter: OptimizationAdapter, spec: OptimizationSpec, deps: OptimizationExecutorDeps, artifacts: OptimizationPlanArtifacts): Promise<OptimizationExecutionResult>;
5
8
  export { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
6
9
  export { popcornOptimizationAdapter } from './popcorn.js';
7
10
  export { profileBenchmarkOptimizationAdapter } from './profile_benchmark.js';
@@ -1,3 +1,4 @@
1
+ import { describeOptimizationResult } from '../measurements.js';
1
2
  import { runtimePluginRegistry } from '../../plugin/runtime_registry.js';
2
3
  import { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
3
4
  import { popcornOptimizationAdapter } from './popcorn.js';
@@ -26,6 +27,12 @@ export function resolve_optimization_adapter(spec) {
26
27
  }
27
28
  return null;
28
29
  }
30
+ /** Canonical result projection for built-in and plugin producers, including legacy or failed output. */
31
+ export async function evaluate_optimization_adapter(adapter, spec, deps, artifacts) {
32
+ return describeOptimizationResult(adapter.evaluate
33
+ ? await adapter.evaluate(spec, deps, artifacts)
34
+ : await adapter.execute(spec, deps, artifacts));
35
+ }
29
36
  export { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
30
37
  export { popcornOptimizationAdapter } from './popcorn.js';
31
38
  export { profileBenchmarkOptimizationAdapter } from './profile_benchmark.js';
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { join, resolve } from 'path';
3
+ import { captureAdapterOptimizationMeasurement } from '../measurements.js';
3
4
  import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
4
5
  import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
5
6
  function request_includes(spec, needle) {
@@ -141,7 +142,8 @@ function load_kernelbench_metrics(spec, stdout) {
141
142
  return null;
142
143
  }
143
144
  try {
144
- const payload = JSON.parse(readFileSync(stackReportPath, 'utf-8'));
145
+ const rawOutput = readFileSync(stackReportPath, 'utf-8');
146
+ const payload = JSON.parse(rawOutput);
145
147
  const rows = payload.layers || [];
146
148
  if (rows.length === 0) {
147
149
  return null;
@@ -162,6 +164,7 @@ function load_kernelbench_metrics(spec, stdout) {
162
164
  && candidateSpeedup > baselineSpeedup);
163
165
  const layerName = typeof finalLayer.layer === 'string' ? finalLayer.layer : 'final';
164
166
  return {
167
+ sourcePath: stackReportPath, rawOutput,
165
168
  summary: `KernelBench execution completed. Final layer ${layerName} scored ${candidateScore.toFixed(3)}.`,
166
169
  notes: [
167
170
  `KernelBench selected layer: ${layerName}.`,
@@ -370,7 +373,7 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
370
373
  const name = typeof payload.name === 'string' ? payload.name : 'unknown';
371
374
  const mode = typeof payload.mode === 'string' ? payload.mode : 'structural';
372
375
  const correctness = Boolean(payload.correctness);
373
- return {
376
+ return captureAdapterOptimizationMeasurement({
374
377
  ok: shellResult.exitCode === 0 && candidateScore !== undefined,
375
378
  status: shellResult.exitCode === 0 && candidateScore !== undefined ? 'completed' : 'failed',
376
379
  adapterId: 'kernelbench',
@@ -400,7 +403,10 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
400
403
  improved: undefined,
401
404
  }
402
405
  : undefined,
403
- };
406
+ }, stdoutPath, shellResult.stdout || '', !shellResult.truncated, { runId: artifacts.runId, unit: 'score', selection: {
407
+ repositoryRoot: resolve_benchmark_repo_root(spec.cwd), selector: JSON.stringify(parse_kernelbench_task_selector(spec)),
408
+ profile: spec.profile, gpuRequested: build_kernelbench_flags(spec).gpu, mode, reportedLevel: level, reportedProblem: problemId,
409
+ } });
404
410
  }
405
411
  function build_command(spec, model) {
406
412
  const { supportedStages, deferredStages } = executable_stages(spec);
@@ -541,7 +547,7 @@ export const kernelbenchOptimizationAdapter = {
541
547
  const loadedMetrics = shellResult.exitCode === 0
542
548
  ? load_kernelbench_metrics(spec, shellResult.stdout || '')
543
549
  : null;
544
- return {
550
+ return captureAdapterOptimizationMeasurement({
545
551
  ok: shellResult.exitCode === 0,
546
552
  status: shellResult.exitCode === 0 ? 'completed' : 'failed',
547
553
  adapterId: 'kernelbench',
@@ -558,6 +564,9 @@ export const kernelbenchOptimizationAdapter = {
558
564
  deferredStages: plan.deferredStages,
559
565
  notes: [...plan.notes, ...(loadedMetrics?.notes || [])],
560
566
  metrics: loadedMetrics?.metrics,
561
- };
567
+ }, loadedMetrics?.sourcePath || stdoutPath, loadedMetrics?.rawOutput || shellResult.stdout || '', !shellResult.truncated && loadedMetrics !== null && !build_kernelbench_flags(spec).random, { runId: artifacts.runId, unit: 'score', selection: { repositoryRoot: resolve_benchmark_repo_root(spec.cwd),
568
+ evaluator: spec.evaluator?.ref ?? null, profile: spec.profile, model: deps.model ?? null,
569
+ flags: JSON.stringify(build_kernelbench_flags(spec)),
570
+ } });
562
571
  },
563
572
  };
@@ -1,5 +1,6 @@
1
1
  import { mkdirSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { captureAdapterOptimizationMeasurement } from '../measurements.js';
3
4
  import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
4
5
  import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
5
6
  function parse_gpu(spec) {
@@ -252,7 +253,7 @@ async function evaluate_candidate(spec, deps, artifacts) {
252
253
  const breakdown = payload.score_breakdown && typeof payload.score_breakdown === 'object'
253
254
  ? JSON.stringify(payload.score_breakdown)
254
255
  : null;
255
- return {
256
+ return captureAdapterOptimizationMeasurement({
256
257
  ok: benchmarkResult.exitCode === 0 && candidateValue !== undefined,
257
258
  status: benchmarkResult.exitCode === 0 && candidateValue !== undefined ? 'completed' : 'failed',
258
259
  adapterId: 'popcorn',
@@ -280,7 +281,7 @@ async function evaluate_candidate(spec, deps, artifacts) {
280
281
  improved: undefined,
281
282
  }
282
283
  : undefined,
283
- };
284
+ }, stdoutPath, benchmarkResult.stdout || '', !benchmarkResult.truncated && !testResult.truncated, { runId: artifacts.runId, unit: 'microseconds', selection: { repositoryRoot: repoRoot, leaderboard, gpu, profile: spec.profile } });
284
285
  }
285
286
  export const popcornOptimizationAdapter = {
286
287
  id: 'popcorn',
@@ -1,5 +1,6 @@
1
1
  import { writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { captureAdapterOptimizationMeasurement, describeOptimizationResult } from '../measurements.js';
3
4
  import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
4
5
  const SUPPORTED_PROFILE_BENCHMARKS = new Set([
5
6
  'ifbench',
@@ -218,13 +219,12 @@ async function evaluate(spec, deps, artifacts) {
218
219
  writeFileSync(stdoutPath, result.stdout || '', 'utf-8');
219
220
  writeFileSync(stderrPath, result.stderr || '', 'utf-8');
220
221
  const parsed = parse_summary(result.stdout || '');
221
- const ok = result.exitCode === 0 && parsed !== null;
222
- return {
223
- ok,
224
- status: ok ? 'completed' : 'failed',
222
+ const execution = captureAdapterOptimizationMeasurement({
223
+ ok: result.exitCode === 0,
224
+ status: result.exitCode === 0 ? 'completed' : 'failed',
225
225
  adapterId: profileBenchmarkOptimizationAdapter.id,
226
- summary: ok
227
- ? `${benchmark_name(spec)} completed with ${parsed.passed}/${parsed.total} passing.`
226
+ summary: parsed
227
+ ? `${benchmark_name(spec)} completed with ${parsed.passed}/${parsed.total} reported passing.`
228
228
  : `${benchmark_name(spec)} benchmark did not produce a parseable successful summary.`,
229
229
  command: adapterPlan.command,
230
230
  planPath: artifacts.planPath,
@@ -240,7 +240,13 @@ async function evaluate(spec, deps, artifacts) {
240
240
  direction: 'maximize',
241
241
  candidateValue: parsed.score,
242
242
  } : undefined,
243
- };
243
+ }, stdoutPath, result.stdout || '', !result.truncated, { runId: artifacts.runId, unit: 'fraction', selection: {
244
+ repositoryRoot: repoRoot, benchmark: benchmark_name(spec), selector: benchmark_selector(spec),
245
+ profile: spec.profile, limit: parse_limit(spec), reportedTotal: parsed?.total ?? null, model: benchmark_model_arg(deps.model) ?? null,
246
+ } });
247
+ const ok = result.exitCode === 0 && (parsed !== null || execution.measurementReport?.value !== null && execution.measurementReport?.value !== undefined);
248
+ return describeOptimizationResult({ ...execution, ok, status: ok ? 'completed' : 'failed',
249
+ summary: parsed ? execution.summary : ok ? `${benchmark_name(spec)} completed with an explicitly declared reported objective.` : execution.summary });
244
250
  }
245
251
  export const profileBenchmarkOptimizationAdapter = {
246
252
  id: 'profile-benchmark',
@@ -1,5 +1,7 @@
1
1
  import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { basename, dirname, join, resolve } from 'path';
3
+ import { captureAdapterOptimizationMeasurement, assessOptimizationResult } from '../measurements.js';
4
+ import { is_better_result, result_score } from '../results.js';
3
5
  import { build_rf_report, } from '../../bench/rf_shared.js';
4
6
  import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
5
7
  function failed_openems_backend_result(candidate, targetSpec, payload) {
@@ -391,6 +393,8 @@ function read_candidate_evaluation_pair(resultRunDir) {
391
393
  function load_combine_donors(branchRecords) {
392
394
  const donors = [];
393
395
  for (const record of branchRecords) {
396
+ if (record.survivedFamilyPolicy !== true)
397
+ continue;
394
398
  const candidatePath = record.selectedTarget || record.materializedTarget;
395
399
  if (!candidatePath || !existsSync(candidatePath)) {
396
400
  continue;
@@ -1429,26 +1433,30 @@ async function try_openems_evaluation(projectDir, candidatePath, targetSpecPath,
1429
1433
  };
1430
1434
  }
1431
1435
  function write_backend_status(projectDir, payload) {
1436
+ ensure_bench_artifact_dirs(projectDir);
1432
1437
  const paths = bench_paths(projectDir);
1433
1438
  writeFileSync(paths.backendStatus, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
1434
1439
  }
1435
- function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEval, candidate, evaluation, score, note, backend, backendNote, pipeline, baselineScore, runId) {
1440
+ function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEval, candidate, evaluation, score, note, backend, backendNote, pipeline, baselineScore, runId, execution) {
1436
1441
  ensure_bench_artifact_dirs(projectDir);
1437
1442
  const paths = bench_paths(projectDir);
1438
1443
  const timestamp = new Date().toISOString();
1439
- let bestScore = -Infinity;
1440
- if (existsSync(paths.bestCandidate)) {
1441
- const best = read_json(paths.bestCandidate);
1442
- bestScore = Number(best.score);
1443
- }
1444
+ const bestResultPath = join(projectDir, 'artifacts', 'best_optimization_result.json');
1445
+ const bestExists = existsSync(paths.bestCandidate);
1446
+ const previousResult = bestExists && existsSync(bestResultPath) ? read_json(bestResultPath) : null;
1447
+ // Historical best files remain readable; no scalar-only incumbent or new output confers comparison authority.
1448
+ const promoted = result_score(execution) !== null && (bestExists
1449
+ ? previousResult !== null && is_better_result(previousResult, execution)
1450
+ : is_better_result(null, execution));
1451
+ const measurementReport = assessOptimizationResult(execution);
1444
1452
  writeFileSync(paths.currentCandidate, `${JSON.stringify(candidate, null, 2)}\n`, 'utf-8');
1445
1453
  writeFileSync(paths.currentEval, `${JSON.stringify(evaluation, null, 2)}\n`, 'utf-8');
1446
1454
  writeFileSync(paths.baselineCandidate, `${JSON.stringify(baselineCandidate, null, 2)}\n`, 'utf-8');
1447
1455
  writeFileSync(paths.baselineEval, `${JSON.stringify(baselineEval, null, 2)}\n`, 'utf-8');
1448
- const promoted = score >= bestScore;
1449
1456
  if (promoted) {
1450
1457
  writeFileSync(paths.bestCandidate, `${JSON.stringify(candidate, null, 2)}\n`, 'utf-8');
1451
1458
  writeFileSync(paths.bestEval, `${JSON.stringify(evaluation, null, 2)}\n`, 'utf-8');
1459
+ writeFileSync(bestResultPath, `${JSON.stringify(execution, null, 2)}\n`, 'utf-8');
1452
1460
  }
1453
1461
  const previousState = existsSync(paths.sessionState)
1454
1462
  ? read_json(paths.sessionState)
@@ -1460,9 +1468,10 @@ function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEva
1460
1468
  generation: nextGeneration,
1461
1469
  evaluations: previousEvaluations + 1,
1462
1470
  population_size: Number(previousState.population_size) || 24,
1463
- elite_id: promoted ? candidate.id : String(previousState.elite_id || candidate.id),
1464
- best_score: promoted ? score : Number(previousState.best_score) || score,
1465
- phase: promoted ? 'elite_update' : 'candidate_evaluation',
1471
+ elite_id: promoted ? candidate.id : String(previousState.elite_id || ''),
1472
+ best_score: promoted ? measurementReport.value : Number(previousState.best_score) || 0,
1473
+ measurementReport,
1474
+ phase: promoted ? 'reported_elite_update' : 'candidate_evaluation',
1466
1475
  strategy: note,
1467
1476
  checkpoint_path: `artifacts/checkpoints/g${String(nextGeneration).padStart(3, '0')}_checkpoint.json`,
1468
1477
  current_job: `evaluate:${candidate.id}`,
@@ -1475,7 +1484,7 @@ function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEva
1475
1484
  generation: nextGeneration,
1476
1485
  candidate: candidate.id,
1477
1486
  score,
1478
- outcome: promoted ? 'promoted' : 'accepted',
1487
+ outcome: promoted ? 'reported_comparable_selection' : 'recorded_unqualified',
1479
1488
  note,
1480
1489
  timestamp,
1481
1490
  })}\n`, 'utf-8');
@@ -1710,7 +1719,6 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
1710
1719
  });
1711
1720
  const pipeline = spec.pipeline.map((stage) => stage.engine).join(' -> ');
1712
1721
  const note = finalCandidate.mutation_summary || `evaluated ${finalCandidate.topology}`;
1713
- sync_bench_state(projectDir, targetSpec, finalBaselineCandidate, finalBaselineEvaluation, finalCandidateWithScore, finalEvaluation, finalScored.score, [note, strategyAdjusted.note, diversityAdjusted.note].filter(Boolean).join('; '), finalBackend, backendAttempt.note, pipeline, finalBaselineScore, artifacts.runId);
1714
1722
  writeFileSync(join(artifacts.runDir, 'candidate_normalized.json'), `${JSON.stringify(finalCandidateWithScore, null, 2)}\n`, 'utf-8');
1715
1723
  writeFileSync(join(artifacts.runDir, 'evaluation.json'), `${JSON.stringify(finalEvaluation, null, 2)}\n`, 'utf-8');
1716
1724
  writeFileSync(join(artifacts.runDir, 'baseline_evaluation.json'), `${JSON.stringify(finalBaselineEvaluation, null, 2)}\n`, 'utf-8');
@@ -1747,9 +1755,12 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
1747
1755
  improved: finalScored.score > finalBaselineScore,
1748
1756
  },
1749
1757
  };
1750
- writeFileSync(join(artifacts.runDir, 'execution_result.json'), `${JSON.stringify(result, null, 2)}\n`, 'utf-8');
1758
+ const capturedResult = captureAdapterOptimizationMeasurement(result, join(artifacts.runDir, 'evaluation.json'), `${JSON.stringify(finalEvaluation, null, 2)}\n`, true, { runId: artifacts.runId, unit: 'score', selection: { projectDir, benchName, backend: finalBackend,
1759
+ targetSpec: JSON.stringify(targetSpec), baselineScore: finalBaselineScore, profile: spec.profile } });
1760
+ sync_bench_state(projectDir, targetSpec, finalBaselineCandidate, finalBaselineEvaluation, finalCandidateWithScore, finalEvaluation, finalScored.score, [note, strategyAdjusted.note, diversityAdjusted.note].filter(Boolean).join('; '), finalBackend, backendAttempt.note, pipeline, finalBaselineScore, artifacts.runId, capturedResult);
1761
+ writeFileSync(join(artifacts.runDir, 'execution_result.json'), `${JSON.stringify(capturedResult, null, 2)}\n`, 'utf-8');
1751
1762
  deps.onProgress?.(`RF bench: ${finalCandidateWithScore.id} completed with candidate_value=${finalScored.score.toFixed(4)} baseline_value=${finalBaselineScore.toFixed(4)} improved=${finalScored.score > finalBaselineScore}.`);
1752
- return result;
1763
+ return capturedResult;
1753
1764
  }
1754
1765
  export const rfbenchOptimizationAdapter = {
1755
1766
  id: 'rfbench',