@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,192 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { parseDocument } from 'yaml';
6
+ import { buildZtcPaneLaunchCommand, createZtcLaunchSpec } from '../panes/ztc_launch.js';
7
+ const defaults = { main: 'Main', decisions: 'Decisions', status: 'Status', worker: 'Worker' };
8
+ const isRecord = (value) => value !== null
9
+ && typeof value === 'object' && !Array.isArray(value);
10
+ function integer(value, max, field) {
11
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 1 || value > max) {
12
+ throw new Error(`${field} must be an integer from 1 to ${max}`);
13
+ }
14
+ return value;
15
+ }
16
+ export function loadWorkspacePreset(cwd, name) {
17
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(name)) {
18
+ throw new Error('Layout name must contain 1–64 letters, digits, underscores or hyphens.');
19
+ }
20
+ let data;
21
+ let filename;
22
+ if (['orchestrator', 'pair', 'grid'].includes(name))
23
+ data = { schema_version: 1, template: name };
24
+ else {
25
+ filename = join(cwd, '.ztc', 'layouts', `${name}.yaml`);
26
+ try {
27
+ const bytes = readFileSync(filename);
28
+ if (bytes.length > 65536)
29
+ throw new Error('Layout YAML exceeds 64 KiB');
30
+ const document = parseDocument(bytes.toString('utf8'), { uniqueKeys: true });
31
+ if (document.errors.length)
32
+ throw new Error(document.errors[0].message);
33
+ const parsed = document.toJS({ maxAliasCount: 20 });
34
+ if (!isRecord(parsed))
35
+ throw new Error('Layout must be a YAML object');
36
+ data = parsed;
37
+ }
38
+ catch (error) {
39
+ throw new Error(`${filename}: ${error instanceof Error ? error.message : String(error)}`);
40
+ }
41
+ }
42
+ try {
43
+ for (const key of Object.keys(data)) {
44
+ if (!['schema_version', 'template', 'workers', 'refresh_ms', 'titles'].includes(key))
45
+ throw new Error(`Unknown layout field: ${key}`);
46
+ }
47
+ if (data.schema_version !== 1)
48
+ throw new Error('schema_version must be 1');
49
+ if (typeof data.template !== 'string' || !['orchestrator', 'pair', 'grid'].includes(data.template))
50
+ throw new Error('template must be orchestrator, pair, or grid');
51
+ const template = data.template;
52
+ const workers = integer(data.workers === undefined ? (template === 'grid' ? 4 : 1) : data.workers, 32, 'workers');
53
+ if (template !== 'grid' && data.workers !== undefined)
54
+ throw new Error('workers is only configurable for grid');
55
+ const refresh_ms = integer(data.refresh_ms === undefined ? 600000 : data.refresh_ms, 86400000, 'refresh_ms');
56
+ const titles = { ...defaults };
57
+ if (data.titles !== undefined) {
58
+ if (!isRecord(data.titles))
59
+ throw new Error('titles must be an object');
60
+ for (const [key, value] of Object.entries(data.titles)) {
61
+ if (!Object.hasOwn(defaults, key))
62
+ throw new Error(`Unknown title field: ${key}`);
63
+ if (typeof value !== 'string' || !value.trim() || value.length > 80 || /[\x00-\x1f\x7f]/.test(value))
64
+ throw new Error(`titles.${key} must be 1–80 printable characters`);
65
+ titles[key] = value;
66
+ }
67
+ }
68
+ return { template, workers, refresh_ms, titles };
69
+ }
70
+ catch (error) {
71
+ throw new Error(`${filename ? `${filename}: ` : ''}${error instanceof Error ? error.message : String(error)}`);
72
+ }
73
+ }
74
+ export function buildWorkspaceMonitorLaunch(mode, host, preset) {
75
+ const entry = fileURLToPath(new URL(import.meta.url.endsWith('.ts') ? './workspace_monitor.ts' : './workspace_monitor.js', import.meta.url));
76
+ const loader = import.meta.url.endsWith('.ts') ? ['--import', import.meta.resolve('tsx')] : [];
77
+ return { kind: 'process', command: process.execPath,
78
+ args: [...loader, entry, mode, String(host.mirrorPort), host.workspaceOwnerId, String(preset.refresh_ms)],
79
+ cwd: host.cwd, title: preset.titles[mode], paneType: 'process' };
80
+ }
81
+ const leaves = (node) => node.type === 'leaf' ? [node.pane_id]
82
+ : [...leaves(node.first), ...leaves(node.second)];
83
+ /** Creates only new panes; authored processes in an earlier window remain running. */
84
+ export async function openWorkspacePreset(transport, host, args) {
85
+ const name = args[0];
86
+ const preset = loadWorkspacePreset(host.cwd, name);
87
+ for (let index = 1; index < args.length; index += 2) {
88
+ const flag = args[index];
89
+ const raw = args[index + 1];
90
+ if (!raw || !/^\d+$/.test(raw))
91
+ throw new Error(`${flag} requires a positive integer`);
92
+ if (flag === '--workers' && preset.template === 'grid')
93
+ preset.workers = integer(Number(raw), 32, 'workers');
94
+ else if (flag === '--refresh-ms' && preset.template === 'orchestrator')
95
+ preset.refresh_ms = integer(Number(raw), 86400000, 'refresh_ms');
96
+ else
97
+ throw new Error(`Unsupported layout option: ${flag}`);
98
+ }
99
+ // Build every command before altering native state, including loader/runtime checks.
100
+ const specs = preset.template === 'orchestrator'
101
+ ? [buildWorkspaceMonitorLaunch('decisions', host, preset), buildWorkspaceMonitorLaunch('status', host, preset)]
102
+ : Array.from({ length: preset.template === 'pair' ? 1 : preset.workers }, (_, index) => createZtcLaunchSpec({
103
+ cwd: host.cwd, title: `${preset.titles.worker} ${index + 1}`,
104
+ providerOverride: host.providerOverride, modelOverride: host.modelOverride,
105
+ }));
106
+ const commands = specs.map(spec => {
107
+ if (spec.kind === 'ztc') {
108
+ const built = buildZtcPaneLaunchCommand(spec, host.argv);
109
+ if (built instanceof Error)
110
+ throw built;
111
+ return built;
112
+ }
113
+ if (spec.kind !== 'process')
114
+ throw new Error('Invalid preset process');
115
+ return spec;
116
+ });
117
+ const send = (command) => {
118
+ if (host.isActive && !host.isActive())
119
+ throw new Error('Workspace is closing; layout creation cancelled.');
120
+ if (!transport.send(command))
121
+ throw new Error(`Workspace renderer rejected ${command.type}`);
122
+ };
123
+ const request = (command, match) => new Promise((resolve, reject) => {
124
+ let unsubscribe = () => { };
125
+ const timeout = setTimeout(() => { unsubscribe(); reject(new Error(`Workspace renderer did not acknowledge ${command.type}`)); }, 8000);
126
+ unsubscribe = transport.on(event => {
127
+ if (event.type !== 'error' && !match(event))
128
+ return;
129
+ clearTimeout(timeout);
130
+ unsubscribe();
131
+ if (event.type === 'error')
132
+ reject(new Error(event.message));
133
+ else
134
+ resolve(event);
135
+ });
136
+ try {
137
+ send(command);
138
+ }
139
+ catch (error) {
140
+ clearTimeout(timeout);
141
+ unsubscribe();
142
+ reject(error);
143
+ }
144
+ });
145
+ const snapshot = async () => {
146
+ const event = await request({ type: 'get_session_state' }, event => event.type === 'session_state');
147
+ if (event.type !== 'session_state')
148
+ throw new Error('Unexpected workspace snapshot');
149
+ return event.state;
150
+ };
151
+ const initial = await snapshot();
152
+ const rootWindow = initial.windows?.find(window => leaves(window.layout).includes(0));
153
+ const rootWindowId = rootWindow?.id ?? initial.active_window_id ?? 0;
154
+ const rootLeaves = leaves(rootWindow?.layout ?? initial.layout);
155
+ if (!rootLeaves.includes(0))
156
+ throw new Error('Main is unavailable in this workspace');
157
+ send({ type: 'switch_window', window_id: rootWindowId });
158
+ let windowId = rootWindowId;
159
+ const created = [];
160
+ for (let index = 0; index < specs.length; index++) {
161
+ const spec = specs[index];
162
+ const command = commands[index];
163
+ const requestId = randomUUID();
164
+ host.trackLaunch(requestId, spec);
165
+ const event = await request({ type: 'create_pane', request_id: requestId, command: command.command,
166
+ args: command.args, cwd: command.cwd, title: spec.title, pane_type: spec.kind === 'ztc' ? 'ztc' : 'process',
167
+ env: host.env, target: index === 0 ? 0 : created.at(-1),
168
+ new_window: index === 0 && rootLeaves.length > 1 }, event => event.type === 'pane_created' && event.request_id === requestId);
169
+ if (event.type !== 'pane_created')
170
+ throw new Error('Unexpected pane creation response');
171
+ // A preset name is authored workspace state, independent of child inference.
172
+ send({ type: 'set_pane_title', pane_id: event.pane_id, title: spec.title, source: 'manual' });
173
+ created.push(event.pane_id);
174
+ if (index === 0 && rootLeaves.length > 1) {
175
+ windowId = (await snapshot()).active_window_id ?? rootWindowId;
176
+ send({ type: 'set_pane_window', pane_id: 0, window_id: windowId });
177
+ }
178
+ else {
179
+ send({ type: 'set_pane_window', pane_id: event.pane_id, window_id: windowId });
180
+ }
181
+ send({ type: 'focus_pane', pane_id: event.pane_id });
182
+ }
183
+ send({ type: 'set_pane_title', pane_id: 0, title: preset.titles.main });
184
+ send({ type: 'focus_pane', pane_id: 0 });
185
+ send({ type: 'set_layout', layout: preset.template === 'orchestrator' ? 'main_and_stack' : preset.template === 'pair' ? 'columns' : 'grid' });
186
+ const final = await snapshot();
187
+ const actual = leaves(final.layout);
188
+ if (actual.length !== created.length + 1 || ![0, ...created].every(id => actual.includes(id))) {
189
+ throw new Error(`Renderer layout contains panes ${actual.join(', ')}; expected ${[0, ...created].join(', ')} in window ${windowId}. Created panes are retained for inspection.`);
190
+ }
191
+ return `Opened layout ${JSON.stringify(name)}. ${preset.template === 'orchestrator' ? `Status uses runtime observations; refresh every ${preset.refresh_ms} ms or press r.` : `${created.length} new worker${created.length === 1 ? '' : 's'}.`}`;
192
+ }
@@ -0,0 +1,37 @@
1
+ import type { MirrorEvent, MirrorPaneRecord } from '../web/mirror_stream.js';
2
+ export type AttentionKind = 'question' | 'approval' | 'prompt' | 'blocked' | 'failed' | 'review' | 'stale';
3
+ export interface AttentionItem {
4
+ id: string;
5
+ requestId: string;
6
+ kind: AttentionKind;
7
+ paneId: number;
8
+ sessionId: string;
9
+ agent: string;
10
+ task: string;
11
+ blocker: string;
12
+ createdAt: string;
13
+ primaryAction: 'answer' | 'approve' | 'inspect';
14
+ /** Live request facts let a reconnecting view restore the actual prompt. */
15
+ request?: MirrorEvent;
16
+ requestPreviewUnavailable?: boolean;
17
+ }
18
+ export interface AttentionSnapshot {
19
+ items: AttentionItem[];
20
+ total: number;
21
+ }
22
+ /** Canonical pending-request and attention state, shared by terminal and views. */
23
+ export declare class AttentionQueue {
24
+ private items;
25
+ private settings;
26
+ private tasks;
27
+ observe(event: MirrorEvent, pane?: MirrorPaneRecord): void;
28
+ snapshot(limit?: number, offset?: number): AttentionSnapshot;
29
+ find(id: string): AttentionItem | undefined;
30
+ findRequest(kind: AttentionKind, requestId: string, paneId: number): AttentionItem | undefined;
31
+ hasSettings(requestId: string, paneId: number): boolean;
32
+ closeSettings(requestId: string, paneId: number): void;
33
+ markStale(paneId: number): void;
34
+ resolve(id: string): AttentionItem | undefined;
35
+ private clearSignals;
36
+ private clearPane;
37
+ }
@@ -0,0 +1,183 @@
1
+ const bounded = (value, fallback = '') => typeof value === 'string'
2
+ ? value.replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '').slice(0, 500) : fallback;
3
+ const identity = (value) => {
4
+ if (typeof value !== 'string' || value.length > 4096 || /[\x00-\x1f\x7f]/.test(value))
5
+ return '';
6
+ return value;
7
+ };
8
+ const rank = { approval: 0, question: 1, prompt: 2, failed: 3, blocked: 4, review: 5, stale: 6 };
9
+ const requestKinds = new Set(['question', 'approval', 'prompt']);
10
+ const maxPreviewBytes = 64 * 1024;
11
+ /** Canonical pending-request and attention state, shared by terminal and views. */
12
+ export class AttentionQueue {
13
+ items = new Map();
14
+ settings = new Set();
15
+ tasks = new Map();
16
+ observe(event, pane) {
17
+ const data = event.data;
18
+ const paneId = typeof data.pane_id === 'number' ? data.pane_id : 0;
19
+ const sessionId = bounded(data.origin_session_id);
20
+ if (event.type === 'message' && data.role === 'user') {
21
+ const metadata = data.metadata;
22
+ if (!metadata?.isAskUserAnswer)
23
+ this.tasks.set(paneId, bounded(data.content));
24
+ return;
25
+ }
26
+ if (event.type === 'pane_info' && Array.isArray(data.panes)) {
27
+ for (const entry of data.panes) {
28
+ if (typeof entry.pane_id === 'number' && entry.is_alive === false)
29
+ this.markStale(entry.pane_id);
30
+ }
31
+ return;
32
+ }
33
+ if (event.type === 'widget_settings') {
34
+ const widgetId = identity(data.widget_id);
35
+ if (widgetId)
36
+ this.settings.add(`${paneId}:${widgetId}`);
37
+ return;
38
+ }
39
+ if (event.type === 'attention_resolved') {
40
+ if (typeof data.id === 'string')
41
+ this.items.delete(data.id);
42
+ return;
43
+ }
44
+ if (event.type === 'widget_dismiss') {
45
+ if (typeof data.widget_id === 'string')
46
+ this.settings.delete(`${paneId}:${data.widget_id}`);
47
+ for (const item of this.items.values()) {
48
+ if (item.paneId === paneId && item.kind === 'prompt' && (!data.widget_id || item.requestId === data.widget_id))
49
+ this.items.delete(item.id);
50
+ }
51
+ return;
52
+ }
53
+ if (event.type === 'question_dismiss' || event.type === 'hook_approval_resolved') {
54
+ for (const item of this.items.values()) {
55
+ const kind = event.type === 'question_dismiss' ? 'question' : 'approval';
56
+ const requestId = kind === 'question' ? data.question_id : data.id;
57
+ if (item.paneId === paneId && item.kind === kind && item.requestId === requestId)
58
+ this.items.delete(item.id);
59
+ }
60
+ return;
61
+ }
62
+ if (event.type === 'cancel' || event.type === 'clear') {
63
+ this.clearPane(paneId);
64
+ return;
65
+ }
66
+ if (event.type === 'session_end') {
67
+ this.markStale(paneId);
68
+ return;
69
+ }
70
+ let kind;
71
+ let requestId = '';
72
+ let blocker = '';
73
+ if (event.type === 'ask_user') {
74
+ kind = 'question';
75
+ requestId = identity(data.question_id);
76
+ blocker = bounded(data.question, Array.isArray(data.questions) ? data.questions.flatMap(question => question !== null && typeof question === 'object' && !Array.isArray(question) ? [bounded(question.question)].filter(Boolean) : []).join(' · ') : 'Answer the pending question');
77
+ }
78
+ else if (event.type === 'hook_approval_request') {
79
+ kind = 'approval';
80
+ requestId = identity(data.id);
81
+ blocker = bounded(data.reason, bounded(data.tool_name, 'Approve or deny the requested action'));
82
+ }
83
+ else if (['widget_prompt', 'widget_select', 'widget_questionnaire'].includes(event.type)) {
84
+ kind = 'prompt';
85
+ requestId = identity(data.widget_id);
86
+ blocker = bounded(data.question, bounded(data.title, 'Complete the pending prompt'));
87
+ }
88
+ else if (event.type === 'error') {
89
+ kind = 'failed';
90
+ blocker = bounded(data.message, 'Run failed');
91
+ }
92
+ else if (event.type === 'status') {
93
+ const status = bounded(data.status);
94
+ kind = status === 'error' || status === 'failed' ? 'failed' : status === 'blocked' ? 'blocked'
95
+ : ['review', 'ready_for_review'].includes(status) ? 'review' : status === 'stale' ? 'stale' : undefined;
96
+ if (!kind) {
97
+ // Idle follows both success and failure; it does not acknowledge an
98
+ // operator alert. Actual new work supersedes the previous signal.
99
+ if (['thinking', 'running', 'working', 'executing', 'tool_use'].includes(status))
100
+ this.clearSignals(paneId);
101
+ return;
102
+ }
103
+ blocker = bounded(data.verb, status);
104
+ // A pending prompt already explains this pane's block. Avoid a second row.
105
+ if (kind === 'blocked' && [...this.items.values()].some(item => item.paneId === paneId && requestKinds.has(item.kind)))
106
+ return;
107
+ const previous = [...this.items.values()].find(item => item.paneId === paneId && item.kind === kind && !item.request);
108
+ if (previous)
109
+ return;
110
+ }
111
+ if (!kind)
112
+ return;
113
+ if (requestKinds.has(kind) && !requestId)
114
+ return;
115
+ if (kind === 'question') {
116
+ for (const item of this.items.values())
117
+ if (item.kind === 'question' && item.paneId === paneId && item.requestId !== requestId)
118
+ this.items.delete(item.id);
119
+ }
120
+ if (requestKinds.has(kind))
121
+ this.clearSignals(paneId);
122
+ else {
123
+ this.clearSignals(paneId);
124
+ requestId = `${sessionId}:${event.seq ?? event.timestamp}`;
125
+ }
126
+ const id = `${kind}:${paneId}:${requestId}`;
127
+ if (this.items.has(id))
128
+ return;
129
+ const preview = requestKinds.has(kind) ? JSON.stringify(event) : undefined;
130
+ const previewFits = preview !== undefined && Buffer.byteLength(preview, 'utf8') <= maxPreviewBytes;
131
+ this.items.set(id, { id, requestId, kind, paneId, sessionId,
132
+ agent: bounded(pane?.title, `Pane ${paneId}`), task: bounded(data.task, bounded(pane?.labels?.task, this.tasks.get(paneId) ?? bounded(data.title, blocker))),
133
+ blocker: blocker.slice(0, 500), createdAt: event.timestamp,
134
+ primaryAction: kind === 'approval' ? 'approve' : kind === 'question' || kind === 'prompt' ? 'answer' : 'inspect',
135
+ ...(previewFits ? { request: JSON.parse(preview) } : preview !== undefined ? { requestPreviewUnavailable: true } : {}),
136
+ });
137
+ }
138
+ snapshot(limit = 100, offset = 0) {
139
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100 || !Number.isSafeInteger(offset) || offset < 0)
140
+ throw new Error('Invalid attention page.');
141
+ const items = [...this.items.values()].sort((a, b) => rank[a.kind] - rank[b.kind] || a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
142
+ return { items: structuredClone(items.slice(offset, offset + limit)), total: items.length };
143
+ }
144
+ find(id) { const item = this.items.get(id); return item ? structuredClone(item) : undefined; }
145
+ findRequest(kind, requestId, paneId) {
146
+ const item = [...this.items.values()].find(item => item.kind === kind && item.requestId === requestId && item.paneId === paneId);
147
+ return item ? structuredClone(item) : undefined;
148
+ }
149
+ hasSettings(requestId, paneId) { return this.settings.has(`${paneId}:${requestId}`); }
150
+ closeSettings(requestId, paneId) { this.settings.delete(`${paneId}:${requestId}`); }
151
+ markStale(paneId) {
152
+ for (const item of this.items.values()) {
153
+ if (item.paneId === paneId) {
154
+ item.kind = 'stale';
155
+ item.primaryAction = 'inspect';
156
+ delete item.request;
157
+ }
158
+ }
159
+ this.tasks.delete(paneId);
160
+ for (const id of this.settings)
161
+ if (id.startsWith(`${paneId}:`))
162
+ this.settings.delete(id);
163
+ }
164
+ resolve(id) {
165
+ const item = this.find(id);
166
+ if (item)
167
+ this.items.delete(id);
168
+ return item;
169
+ }
170
+ clearSignals(paneId) {
171
+ for (const item of this.items.values())
172
+ if (item.paneId === paneId && !requestKinds.has(item.kind))
173
+ this.items.delete(item.id);
174
+ }
175
+ clearPane(paneId) {
176
+ for (const item of this.items.values())
177
+ if (item.paneId === paneId)
178
+ this.items.delete(item.id);
179
+ for (const id of this.settings)
180
+ if (id.startsWith(`${paneId}:`))
181
+ this.settings.delete(id);
182
+ }
183
+ }
@@ -109,6 +109,8 @@ export interface RfSessionState {
109
109
  last_update: string;
110
110
  active_backend?: string;
111
111
  backend_note?: string;
112
+ /** Reported optimization comparability; source verification and admission remain independent. */
113
+ measurementReport?: import('../optimize/measurements.js').OptimizationMeasurementReport;
112
114
  }
113
115
  export interface RfTargetSpec {
114
116
  name: string;
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ export declare const BOARD_PENDING_MAX_BYTES: number;
3
+ /** Credentials never belong to a canonical/shareable session checkpoint. */
4
+ export declare function admitBoardOrigin(value: string): string;
5
+ declare const binding: z.ZodObject<{
6
+ version: z.ZodLiteral<1>;
7
+ sessionId: z.ZodString;
8
+ taskUuid: z.ZodString;
9
+ taskId: z.ZodString;
10
+ origin: z.ZodString;
11
+ boardId: z.ZodString;
12
+ cardId: z.ZodOptional<z.ZodString>;
13
+ revision: z.ZodOptional<z.ZodNumber>;
14
+ pending: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
15
+ kind: z.ZodLiteral<"create">;
16
+ key: z.ZodString;
17
+ body: z.ZodObject<{
18
+ boardId: z.ZodString;
19
+ columnId: z.ZodString;
20
+ title: z.ZodString;
21
+ description: z.ZodString;
22
+ }, z.core.$strict>;
23
+ }, z.core.$strict>, z.ZodObject<{
24
+ kind: z.ZodLiteral<"evidence">;
25
+ key: z.ZodString;
26
+ expectedRevision: z.ZodNumber;
27
+ packageId: z.ZodString;
28
+ body: z.ZodObject<{
29
+ filename: z.ZodString;
30
+ mime_type: z.ZodLiteral<"application/json">;
31
+ data: z.ZodString;
32
+ }, z.core.$strict>;
33
+ }, z.core.$strict>], "kind">>;
34
+ lastEvidence: z.ZodOptional<z.ZodObject<{
35
+ packageId: z.ZodString;
36
+ attachmentId: z.ZodString;
37
+ revision: z.ZodNumber;
38
+ }, z.core.$strict>>;
39
+ }, z.core.$strict>;
40
+ export type BoardSessionBinding = z.infer<typeof binding>;
41
+ export declare function admitBoardSessionBinding(value: unknown, sessionId: string): BoardSessionBinding;
42
+ export {};
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ export const BOARD_PENDING_MAX_BYTES = 512 * 1024;
3
+ const uuid = z.string().uuid();
4
+ const revision = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
5
+ /** Credentials never belong to a canonical/shareable session checkpoint. */
6
+ export function admitBoardOrigin(value) {
7
+ const url = new URL(value);
8
+ if (url.username || url.password || url.search || url.hash || url.pathname !== '/')
9
+ throw new Error('Zergboard origin must be a credential-free origin without a path');
10
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['127.0.0.1', '[::1]', 'localhost'].includes(url.hostname))) {
11
+ throw new Error('Zergboard origin requires HTTPS (HTTP is allowed only for local development)');
12
+ }
13
+ return url.origin;
14
+ }
15
+ const pending = z.discriminatedUnion('kind', [
16
+ z.object({ kind: z.literal('create'), key: uuid, body: z.object({ boardId: uuid, columnId: uuid,
17
+ title: z.string().min(1).max(255), description: z.string().max(2000) }).strict() }).strict(),
18
+ z.object({ kind: z.literal('evidence'), key: uuid, expectedRevision: revision, packageId: z.string().regex(/^[a-f0-9]{64}$/),
19
+ body: z.object({ filename: z.string().min(1).max(255), mime_type: z.literal('application/json'),
20
+ data: z.string().min(1).max(Math.ceil(BOARD_PENDING_MAX_BYTES / 3) * 4).regex(/^[A-Za-z0-9+/]+={0,2}$/) }).strict() }).strict(),
21
+ ]);
22
+ const binding = z.object({ version: z.literal(1), sessionId: z.string().min(1).max(256),
23
+ taskUuid: uuid, taskId: z.string().min(1).max(512), origin: z.string().max(2048), boardId: uuid,
24
+ cardId: uuid.optional(), revision: revision.optional(), pending: pending.optional(),
25
+ lastEvidence: z.object({ packageId: z.string().regex(/^[a-f0-9]{64}$/), attachmentId: uuid, revision }).strict().optional(),
26
+ }).strict();
27
+ export function admitBoardSessionBinding(value, sessionId) {
28
+ const result = binding.parse(value);
29
+ if (result.sessionId !== sessionId || admitBoardOrigin(result.origin) !== result.origin)
30
+ throw new Error('Zergboard binding belongs to a different session or invalid origin');
31
+ if (result.pending?.kind === 'create' && (result.cardId || result.pending.body.boardId !== result.boardId))
32
+ throw new Error('Invalid Zergboard pending creation identity');
33
+ if (result.pending?.kind === 'evidence' && !result.cardId)
34
+ throw new Error('Zergboard pending evidence has no attached card');
35
+ if ((result.cardId === undefined) !== (result.revision === undefined))
36
+ throw new Error('Zergboard card and revision must be paired');
37
+ return result;
38
+ }
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ export declare class BoardApiError extends Error {
3
+ readonly status: number;
4
+ constructor(status: number);
5
+ }
6
+ export declare function configuredBoardOrigin(): string;
7
+ export declare function boardRequest<T>(origin: string, sessionId: string, path: string, schema: z.ZodType<T>, options?: {
8
+ method?: 'POST' | 'PATCH';
9
+ body?: object;
10
+ key?: string;
11
+ revision?: number;
12
+ }): Promise<T>;
13
+ export declare const boardCardResponse: z.ZodObject<{
14
+ card: z.ZodObject<{
15
+ id: z.ZodString;
16
+ board_id: z.ZodString;
17
+ column_id: z.ZodString;
18
+ title: z.ZodString;
19
+ revision: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>, z.ZodTransform<number, string | number>>;
20
+ state_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
21
+ status: z.ZodString;
22
+ }, z.core.$strip>;
23
+ }, z.core.$strip>;
24
+ export declare const boardDetailsResponse: z.ZodObject<{
25
+ board: z.ZodObject<{
26
+ id: z.ZodString;
27
+ }, z.core.$strip>;
28
+ columns: z.ZodArray<z.ZodObject<{
29
+ id: z.ZodString;
30
+ }, z.core.$strip>>;
31
+ states: z.ZodArray<z.ZodObject<{
32
+ id: z.ZodString;
33
+ kind: z.ZodString;
34
+ }, z.core.$strip>>;
35
+ }, z.core.$strip>;
36
+ export declare const boardAttachmentResponse: z.ZodObject<{
37
+ attachment: z.ZodObject<{
38
+ id: z.ZodString;
39
+ card_id: z.ZodString;
40
+ }, z.core.$strip>;
41
+ revision: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>, z.ZodTransform<number, string | number>>;
42
+ }, z.core.$strip>;
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+ import { admitBoardOrigin } from './binding.js';
3
+ export class BoardApiError extends Error {
4
+ status;
5
+ constructor(status) {
6
+ super(status === 409 ? 'Zergboard conflict (409); use /board refresh, review the card and decide again.'
7
+ : `Zergboard request failed (${status}); pending intent is retained.`);
8
+ this.status = status;
9
+ }
10
+ }
11
+ export function configuredBoardOrigin() {
12
+ const configured = process.env.ZTC_ZERGBOARD_ORIGIN;
13
+ if (!configured)
14
+ throw new Error('Set ZTC_ZERGBOARD_ORIGIN to your Zergboard origin');
15
+ return admitBoardOrigin(configured);
16
+ }
17
+ export async function boardRequest(origin, sessionId, path, schema, options = {}) {
18
+ if (admitBoardOrigin(origin) !== configuredBoardOrigin())
19
+ throw new Error('Configured Zergboard origin changed; restore the attached destination before syncing');
20
+ const token = process.env.ZTC_ZERGBOARD_TOKEN;
21
+ if (!token)
22
+ throw new Error('Set ZTC_ZERGBOARD_TOKEN to a token with access to this board');
23
+ const response = await fetch(new URL(path, origin), { method: options.method ?? 'GET', redirect: 'manual',
24
+ signal: AbortSignal.timeout(15_000), headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json',
25
+ 'x-zergboard-agent-session-id': sessionId, ...(options.key ? { 'idempotency-key': options.key } : {}),
26
+ ...(options.revision === undefined ? {} : { 'if-match': String(options.revision) }) },
27
+ ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }) });
28
+ if (!response.ok) {
29
+ await response.body?.cancel();
30
+ throw new BoardApiError(response.status);
31
+ }
32
+ const reader = response.body?.getReader();
33
+ if (!reader)
34
+ throw new Error('Zergboard response has no body; operation outcome is unknown');
35
+ const chunks = [];
36
+ let length = 0;
37
+ try {
38
+ while (true) {
39
+ const { value, done } = await reader.read();
40
+ if (done)
41
+ break;
42
+ length += value.length;
43
+ if (length > 8 * 1024 * 1024)
44
+ throw new Error('Zergboard response exceeds the read limit');
45
+ chunks.push(value);
46
+ }
47
+ }
48
+ finally {
49
+ await reader.cancel();
50
+ }
51
+ return schema.parse(JSON.parse(Buffer.concat(chunks).toString('utf8')));
52
+ }
53
+ const uuid = z.string().uuid();
54
+ const apiRevision = z.union([z.number(), z.string().regex(/^\d+$/)]).transform(Number)
55
+ .refine(value => Number.isSafeInteger(value) && value >= 0, 'Invalid card revision');
56
+ export const boardCardResponse = z.object({ card: z.object({ id: uuid, board_id: uuid, column_id: uuid,
57
+ title: z.string(), revision: apiRevision, state_id: uuid.nullable().optional(), status: z.string() }) });
58
+ export const boardDetailsResponse = z.object({ board: z.object({ id: uuid }), columns: z.array(z.object({ id: uuid })),
59
+ states: z.array(z.object({ id: uuid, kind: z.string() })) });
60
+ export const boardAttachmentResponse = z.object({ attachment: z.object({ id: uuid, card_id: uuid }), revision: apiRevision });
package/dist/cli.js CHANGED
@@ -131,7 +131,7 @@ async function main() {
131
131
  };
132
132
  }
133
133
  // Render the app
134
- const { waitUntilExit } = render(_jsx(App, {}));
134
+ const { waitUntilExit } = render(_jsx(App, {}), { exitOnCtrlC: false });
135
135
  // Handle clean exit
136
136
  waitUntilExit().then(() => {
137
137
  // Disable Kitty keyboard protocol