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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/README.md +398 -45
  2. package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
  3. package/THIRD_PARTY_NOTICES.md +273 -12
  4. package/bin/zmux-darwin-arm64 +0 -0
  5. package/bin/ztc-audio-darwin-arm64 +0 -0
  6. package/bin/ztc-capture-darwin-arm64 +0 -0
  7. package/bin/ztc-computer-darwin-arm64 +0 -0
  8. package/bin/ztc-llm-darwin-arm64 +0 -0
  9. package/bin/ztc-tts-darwin-arm64 +0 -0
  10. package/bin/ztc-tui-darwin-arm64 +0 -0
  11. package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
  12. package/bin/zterm-darwin-arm64 +0 -0
  13. package/dist/App.js +1206 -209
  14. package/dist/agent/agent.d.ts +74 -8
  15. package/dist/agent/agent.js +1073 -184
  16. package/dist/agent/backends/account_rotation.d.ts +4 -0
  17. package/dist/agent/backends/account_rotation.js +8 -2
  18. package/dist/agent/backends/anthropic.d.ts +13 -0
  19. package/dist/agent/backends/anthropic.js +169 -28
  20. package/dist/agent/backends/claude_cli.js +18 -8
  21. package/dist/agent/backends/codex_app_server.d.ts +1 -0
  22. package/dist/agent/backends/codex_app_server.js +55 -3
  23. package/dist/agent/backends/codex_auth.d.ts +1 -0
  24. package/dist/agent/backends/codex_auth.js +67 -13
  25. package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
  26. package/dist/agent/backends/codex_buffered_recovery.js +293 -0
  27. package/dist/agent/backends/gemini.js +3 -1
  28. package/dist/agent/backends/http_error.d.ts +26 -0
  29. package/dist/agent/backends/http_error.js +221 -0
  30. package/dist/agent/backends/index.d.ts +9 -2
  31. package/dist/agent/backends/index.js +22 -2
  32. package/dist/agent/backends/openai.d.ts +0 -6
  33. package/dist/agent/backends/openai.js +5 -2
  34. package/dist/agent/backends/openai_compatible.d.ts +5 -4
  35. package/dist/agent/backends/openai_compatible.js +26 -19
  36. package/dist/agent/backends/openai_responses.d.ts +8 -3
  37. package/dist/agent/backends/openai_responses.js +77 -33
  38. package/dist/agent/backends/provider_ids.d.ts +1 -0
  39. package/dist/agent/backends/provider_ids.js +4 -0
  40. package/dist/agent/backends/request_metrics.js +12 -2
  41. package/dist/agent/backends/types.d.ts +109 -6
  42. package/dist/agent/backends/types.js +5 -1
  43. package/dist/agent/backends/zrouter_stream.d.ts +6 -1
  44. package/dist/agent/backends/zrouter_stream.js +160 -42
  45. package/dist/agent/background_registry.d.ts +2 -0
  46. package/dist/agent/background_registry.js +1 -0
  47. package/dist/agent/claim_observation.d.ts +6 -0
  48. package/dist/agent/claim_observation.js +54 -0
  49. package/dist/agent/commands/accounts.js +46 -177
  50. package/dist/agent/commands/attention.d.ts +2 -0
  51. package/dist/agent/commands/attention.js +67 -0
  52. package/dist/agent/commands/auth.js +18 -2
  53. package/dist/agent/commands/board.d.ts +2 -0
  54. package/dist/agent/commands/board.js +169 -0
  55. package/dist/agent/commands/clipboard.js +50 -1
  56. package/dist/agent/commands/compact.js +21 -13
  57. package/dist/agent/commands/config.js +4 -1
  58. package/dist/agent/commands/context.js +6 -1
  59. package/dist/agent/commands/desktop.d.ts +2 -0
  60. package/dist/agent/commands/desktop.js +29 -0
  61. package/dist/agent/commands/effort.js +14 -6
  62. package/dist/agent/commands/environment.d.ts +3 -0
  63. package/dist/agent/commands/environment.js +109 -0
  64. package/dist/agent/commands/evidence.d.ts +2 -0
  65. package/dist/agent/commands/evidence.js +9 -0
  66. package/dist/agent/commands/fork.js +4 -3
  67. package/dist/agent/commands/goal.d.ts +33 -1
  68. package/dist/agent/commands/goal.js +174 -14
  69. package/dist/agent/commands/goal_exit.d.ts +36 -0
  70. package/dist/agent/commands/goal_exit.js +120 -0
  71. package/dist/agent/commands/help.js +3 -1
  72. package/dist/agent/commands/history.js +3 -1
  73. package/dist/agent/commands/inbox.d.ts +2 -0
  74. package/dist/agent/commands/inbox.js +148 -0
  75. package/dist/agent/commands/index.js +16 -1
  76. package/dist/agent/commands/input_mode.js +8 -6
  77. package/dist/agent/commands/job.d.ts +2 -0
  78. package/dist/agent/commands/job.js +93 -0
  79. package/dist/agent/commands/keybindings.js +4 -1
  80. package/dist/agent/commands/label.d.ts +2 -0
  81. package/dist/agent/commands/label.js +77 -0
  82. package/dist/agent/commands/layout.d.ts +2 -0
  83. package/dist/agent/commands/layout.js +20 -0
  84. package/dist/agent/commands/mirror.js +16 -1
  85. package/dist/agent/commands/model.js +12 -2
  86. package/dist/agent/commands/permissions.d.ts +3 -1
  87. package/dist/agent/commands/permissions.js +79 -89
  88. package/dist/agent/commands/plan.js +5 -15
  89. package/dist/agent/commands/profile.js +21 -2
  90. package/dist/agent/commands/provider_selection.js +20 -1
  91. package/dist/agent/commands/rename.js +1 -1
  92. package/dist/agent/commands/resources.d.ts +2 -0
  93. package/dist/agent/commands/resources.js +67 -0
  94. package/dist/agent/commands/rewind.d.ts +3 -0
  95. package/dist/agent/commands/rewind.js +16 -0
  96. package/dist/agent/commands/runbooks.d.ts +2 -0
  97. package/dist/agent/commands/runbooks.js +73 -0
  98. package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
  99. package/dist/agent/commands/runbooks_lazy.js +8 -0
  100. package/dist/agent/commands/sessions.d.ts +1 -1
  101. package/dist/agent/commands/sessions.js +33 -5
  102. package/dist/agent/commands/settings.js +185 -39
  103. package/dist/agent/commands/setup.d.ts +2 -0
  104. package/dist/agent/commands/setup.js +78 -0
  105. package/dist/agent/commands/share.d.ts +2 -0
  106. package/dist/agent/commands/share.js +64 -0
  107. package/dist/agent/commands/status.js +14 -2
  108. package/dist/agent/commands/types.d.ts +99 -6
  109. package/dist/agent/commands/update.js +8 -0
  110. package/dist/agent/commands/usage.d.ts +2 -0
  111. package/dist/agent/commands/usage.js +8 -0
  112. package/dist/agent/factory.d.ts +11 -0
  113. package/dist/agent/factory.js +113 -88
  114. package/dist/agent/loop_policy.d.ts +6 -3
  115. package/dist/agent/loop_policy.js +12 -3
  116. package/dist/agent/measurement_guidance.d.ts +2 -0
  117. package/dist/agent/measurement_guidance.js +5 -0
  118. package/dist/agent/request_encoder.d.ts +8 -1
  119. package/dist/agent/request_encoder.js +95 -23
  120. package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
  121. package/dist/agent/runtime/benchmark_comparison.js +94 -0
  122. package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
  123. package/dist/agent/runtime/benchmark_contract.js +90 -0
  124. package/dist/agent/runtime/checked_commands.d.ts +32 -0
  125. package/dist/agent/runtime/checked_commands.js +119 -0
  126. package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
  127. package/dist/agent/runtime/command_execution_policy.js +91 -0
  128. package/dist/agent/runtime/command_jobs.d.ts +36 -18
  129. package/dist/agent/runtime/command_jobs.js +151 -13
  130. package/dist/agent/runtime/command_panes.d.ts +59 -0
  131. package/dist/agent/runtime/command_panes.js +398 -0
  132. package/dist/agent/runtime/command_wait.d.ts +19 -0
  133. package/dist/agent/runtime/command_wait.js +167 -0
  134. package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
  135. package/dist/agent/runtime/cpu_benchmark.js +126 -0
  136. package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
  137. package/dist/agent/runtime/delegated_evidence.js +80 -0
  138. package/dist/agent/runtime/evidence.d.ts +127 -0
  139. package/dist/agent/runtime/evidence.js +468 -0
  140. package/dist/agent/runtime/execution_context.d.ts +7 -0
  141. package/dist/agent/runtime/execution_context.js +39 -3
  142. package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
  143. package/dist/agent/runtime/json_verifier_recipe.js +66 -0
  144. package/dist/agent/runtime/measurements.d.ts +110 -0
  145. package/dist/agent/runtime/measurements.js +317 -0
  146. package/dist/agent/runtime/policy.d.ts +4 -0
  147. package/dist/agent/runtime/policy.js +31 -20
  148. package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
  149. package/dist/agent/runtime/provider_native_evidence.js +86 -0
  150. package/dist/agent/runtime/recovery.d.ts +2 -0
  151. package/dist/agent/runtime/recovery.js +45 -2
  152. package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
  153. package/dist/agent/runtime/remote_broker_transport.js +84 -0
  154. package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
  155. package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
  156. package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
  157. package/dist/agent/runtime/remote_journal_replay.js +233 -0
  158. package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
  159. package/dist/agent/runtime/remote_mutation_journal.js +208 -0
  160. package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
  161. package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
  162. package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
  163. package/dist/agent/runtime/remote_resource_errors.js +9 -0
  164. package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
  165. package/dist/agent/runtime/remote_resource_script.js +1009 -0
  166. package/dist/agent/runtime/remote_resources.d.ts +29 -0
  167. package/dist/agent/runtime/remote_resources.js +160 -0
  168. package/dist/agent/runtime/source_verification.d.ts +12 -0
  169. package/dist/agent/runtime/source_verification.js +210 -0
  170. package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
  171. package/dist/agent/runtime/source_verification_contract.js +203 -0
  172. package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
  173. package/dist/agent/runtime/tool_checkpoints.js +26 -0
  174. package/dist/agent/runtime/tool_effects.d.ts +5 -0
  175. package/dist/agent/runtime/tool_progress.d.ts +12 -0
  176. package/dist/agent/runtime/tool_progress.js +76 -0
  177. package/dist/agent/runtime/tool_runtime.d.ts +16 -1
  178. package/dist/agent/runtime/tool_runtime.js +204 -10
  179. package/dist/agent/runtime/tracing.d.ts +1 -1
  180. package/dist/agent/runtime/verifier_capture.d.ts +9 -0
  181. package/dist/agent/runtime/verifier_capture.js +100 -0
  182. package/dist/agent/runtime/verifier_contract.d.ts +24 -0
  183. package/dist/agent/runtime/verifier_contract.js +41 -0
  184. package/dist/agent/subagent.d.ts +20 -10
  185. package/dist/agent/subagent.js +266 -29
  186. package/dist/agent/tool_response_directory.d.ts +24 -0
  187. package/dist/agent/tool_response_directory.js +61 -0
  188. package/dist/agent/tool_response_source.d.ts +8 -0
  189. package/dist/agent/tool_response_source.js +49 -0
  190. package/dist/agent/tool_response_store.d.ts +75 -4
  191. package/dist/agent/tool_response_store.js +583 -64
  192. package/dist/agent/tools/ask_user.d.ts +3 -1
  193. package/dist/agent/tools/ask_user.js +30 -11
  194. package/dist/agent/tools/background.js +1 -0
  195. package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
  196. package/dist/agent/tools/benchmark_cpu.js +102 -0
  197. package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
  198. package/dist/agent/tools/compare_benchmarks.js +53 -0
  199. package/dist/agent/tools/deferred.js +1 -0
  200. package/dist/agent/tools/delegate.js +18 -2
  201. package/dist/agent/tools/helper_requirements.d.ts +7 -0
  202. package/dist/agent/tools/helper_requirements.js +19 -0
  203. package/dist/agent/tools/index.d.ts +1 -0
  204. package/dist/agent/tools/index.js +3 -0
  205. package/dist/agent/tools/measurement_report.d.ts +22 -0
  206. package/dist/agent/tools/measurement_report.js +190 -0
  207. package/dist/agent/tools/pane.d.ts +0 -7
  208. package/dist/agent/tools/pane.js +5 -4
  209. package/dist/agent/tools/project_context.d.ts +3 -0
  210. package/dist/agent/tools/project_context.js +45 -0
  211. package/dist/agent/tools/recall_tool_response.d.ts +3 -5
  212. package/dist/agent/tools/recall_tool_response.js +19 -29
  213. package/dist/agent/tools/registry.d.ts +1 -0
  214. package/dist/agent/tools/registry.js +23 -0
  215. package/dist/agent/tools/related_sessions.d.ts +2 -0
  216. package/dist/agent/tools/related_sessions.js +156 -0
  217. package/dist/agent/tools/routine.js +13 -3
  218. package/dist/agent/tools/session_evidence.d.ts +3 -0
  219. package/dist/agent/tools/session_evidence.js +72 -0
  220. package/dist/agent/tools/shell.d.ts +4 -3
  221. package/dist/agent/tools/shell.js +174 -47
  222. package/dist/agent/tools/tool_search.js +3 -2
  223. package/dist/agent/tools/types.d.ts +28 -0
  224. package/dist/agent/tools/verify_artifact.d.ts +2 -0
  225. package/dist/agent/tools/verify_artifact.js +60 -0
  226. package/dist/agent/tools/workflow.js +1 -0
  227. package/dist/app/activity.d.ts +6 -1
  228. package/dist/app/activity.js +81 -12
  229. package/dist/app/agent_runner.d.ts +6 -1
  230. package/dist/app/agent_runner.js +34 -19
  231. package/dist/app/command_context.js +106 -10
  232. package/dist/app/controller.d.ts +15 -4
  233. package/dist/app/controller.js +29 -3
  234. package/dist/app/escape_stop.d.ts +11 -0
  235. package/dist/app/escape_stop.js +15 -0
  236. package/dist/app/liveness.d.ts +6 -4
  237. package/dist/app/liveness.js +13 -3
  238. package/dist/app/model_catalog_cache.d.ts +5 -0
  239. package/dist/app/model_catalog_cache.js +138 -0
  240. package/dist/app/ordered_transcript.js +43 -4
  241. package/dist/app/prompt_turn.d.ts +14 -0
  242. package/dist/app/prompt_turn.js +53 -0
  243. package/dist/app/recap.d.ts +3 -0
  244. package/dist/app/recap.js +9 -3
  245. package/dist/app/restart.d.ts +3 -2
  246. package/dist/app/restart.js +22 -7
  247. package/dist/app/rewind.d.ts +3 -3
  248. package/dist/app/rewind.js +3 -3
  249. package/dist/app/selection_completion.d.ts +17 -2
  250. package/dist/app/selection_completion.js +84 -9
  251. package/dist/app/session_manager.d.ts +38 -6
  252. package/dist/app/session_manager.js +263 -60
  253. package/dist/app/session_messages.d.ts +3 -0
  254. package/dist/app/session_messages.js +60 -0
  255. package/dist/app/task_scope_router.d.ts +20 -0
  256. package/dist/app/task_scope_router.js +173 -0
  257. package/dist/app/transcript_window.d.ts +2 -0
  258. package/dist/app/transcript_window.js +4 -0
  259. package/dist/app/workspace_admission_details.d.ts +3 -0
  260. package/dist/app/workspace_admission_details.js +26 -0
  261. package/dist/app/workspace_layout_controller.d.ts +11 -0
  262. package/dist/app/workspace_layout_controller.js +88 -0
  263. package/dist/app/workspace_monitor.d.ts +1 -0
  264. package/dist/app/workspace_monitor.js +216 -0
  265. package/dist/app/workspace_presets.d.ts +29 -0
  266. package/dist/app/workspace_presets.js +192 -0
  267. package/dist/attention/queue.d.ts +37 -0
  268. package/dist/attention/queue.js +183 -0
  269. package/dist/bench/rf_shared.d.ts +2 -0
  270. package/dist/board/binding.d.ts +42 -0
  271. package/dist/board/binding.js +38 -0
  272. package/dist/board/client.d.ts +42 -0
  273. package/dist/board/client.js +60 -0
  274. package/dist/cli.js +1 -1
  275. package/dist/cli_args.js +19 -17
  276. package/dist/cli_main.js +110 -13
  277. package/dist/cli_ratatui.d.ts +183 -16
  278. package/dist/cli_ratatui.js +3989 -1255
  279. package/dist/components/ActivityLine.d.ts +3 -2
  280. package/dist/components/ActivityLine.js +2 -2
  281. package/dist/components/InputArea.d.ts +19 -1
  282. package/dist/components/InputArea.js +264 -190
  283. package/dist/components/MessageList.d.ts +2 -0
  284. package/dist/components/MessageList.js +3 -1
  285. package/dist/components/SingleMessage.d.ts +2 -0
  286. package/dist/components/SingleMessage.js +4 -2
  287. package/dist/components/StatusBar.d.ts +4 -2
  288. package/dist/components/StatusBar.js +3 -1
  289. package/dist/conductor_branch.js +3 -0
  290. package/dist/config/api_retry.d.ts +6 -1
  291. package/dist/config/api_retry.js +19 -1
  292. package/dist/config/defaults.d.ts +2 -1
  293. package/dist/config/defaults.js +9 -2
  294. package/dist/config/message_display.d.ts +1 -0
  295. package/dist/config/message_display.js +17 -2
  296. package/dist/config/permissions.d.ts +21 -0
  297. package/dist/config/permissions.js +89 -0
  298. package/dist/config/resolved.d.ts +2 -2
  299. package/dist/config/types.d.ts +32 -5
  300. package/dist/config.d.ts +38 -4
  301. package/dist/config.js +290 -42
  302. package/dist/context/project_intelligence.d.ts +44 -0
  303. package/dist/context/project_intelligence.js +246 -0
  304. package/dist/desktop/cli_launch.d.ts +8 -0
  305. package/dist/desktop/cli_launch.js +6 -0
  306. package/dist/desktop/cli_shim.d.ts +8 -0
  307. package/dist/desktop/cli_shim.js +120 -0
  308. package/dist/desktop/runtime.d.ts +16 -0
  309. package/dist/desktop/runtime.js +161 -0
  310. package/dist/desktop/worker_launch.d.ts +7 -0
  311. package/dist/desktop/worker_launch.js +7 -0
  312. package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
  313. package/dist/diagnostics/cargo_mutants_selection.js +48 -0
  314. package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
  315. package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
  316. package/dist/diagnostics/session_evidence_package.d.ts +40 -0
  317. package/dist/diagnostics/session_evidence_package.js +234 -0
  318. package/dist/diagnostics/session_export.d.ts +93 -0
  319. package/dist/diagnostics/session_export.js +634 -0
  320. package/dist/emulation/tool_adapters.js +48 -18
  321. package/dist/emulation/ztc_addendum.d.ts +1 -0
  322. package/dist/emulation/ztc_addendum.js +13 -12
  323. package/dist/environment/service_runner.d.ts +1 -0
  324. package/dist/environment/service_runner.js +68 -0
  325. package/dist/environment/store.d.ts +120 -0
  326. package/dist/environment/store.js +387 -0
  327. package/dist/events.d.ts +40 -1
  328. package/dist/events.js +10 -17
  329. package/dist/goal_contract.d.ts +25 -0
  330. package/dist/goal_contract.js +44 -0
  331. package/dist/headless.d.ts +31 -0
  332. package/dist/headless.js +578 -70
  333. package/dist/headless_cli.js +8 -0
  334. package/dist/headless_cli_args.d.ts +1 -0
  335. package/dist/headless_cli_args.js +1 -0
  336. package/dist/intake/cli.d.ts +1 -0
  337. package/dist/intake/cli.js +33 -0
  338. package/dist/intake/format.d.ts +2 -0
  339. package/dist/intake/format.js +14 -0
  340. package/dist/intake/notifications.d.ts +16 -0
  341. package/dist/intake/notifications.js +132 -0
  342. package/dist/intake/store.d.ts +56 -0
  343. package/dist/intake/store.js +238 -0
  344. package/dist/library.d.ts +8 -0
  345. package/dist/library.js +19 -10
  346. package/dist/mcp/client.d.ts +1 -0
  347. package/dist/mcp/client.js +20 -0
  348. package/dist/modes/builtin/plan.yaml +2 -2
  349. package/dist/modes/handlers.js +1 -1
  350. package/dist/onboarding/first_run.d.ts +3 -0
  351. package/dist/onboarding/first_run.js +33 -25
  352. package/dist/onboarding/setup.d.ts +32 -0
  353. package/dist/onboarding/setup.js +133 -0
  354. package/dist/onboarding/setup_agent_health.d.ts +17 -0
  355. package/dist/onboarding/setup_agent_health.js +79 -0
  356. package/dist/onboarding/setup_environment.d.ts +66 -0
  357. package/dist/onboarding/setup_environment.js +219 -0
  358. package/dist/onboarding/setup_workspace.d.ts +17 -0
  359. package/dist/onboarding/setup_workspace.js +129 -0
  360. package/dist/optimize/adapters/index.d.ts +4 -1
  361. package/dist/optimize/adapters/index.js +7 -0
  362. package/dist/optimize/adapters/kernelbench.js +14 -5
  363. package/dist/optimize/adapters/popcorn.js +3 -2
  364. package/dist/optimize/adapters/profile_benchmark.js +13 -7
  365. package/dist/optimize/adapters/rfbench.js +25 -14
  366. package/dist/optimize/adapters/types.d.ts +3 -0
  367. package/dist/optimize/adapters/zergpod.js +5 -2
  368. package/dist/optimize/baseline.js +10 -21
  369. package/dist/optimize/branch.js +9 -12
  370. package/dist/optimize/combine.js +2 -3
  371. package/dist/optimize/executor.js +34 -48
  372. package/dist/optimize/measurements.d.ts +55 -0
  373. package/dist/optimize/measurements.js +173 -0
  374. package/dist/optimize/results.d.ts +1 -0
  375. package/dist/optimize/results.js +11 -33
  376. package/dist/optimize/tge.js +2 -1
  377. package/dist/panes/initial_input.d.ts +19 -0
  378. package/dist/panes/initial_input.js +206 -0
  379. package/dist/panes/labels.d.ts +16 -0
  380. package/dist/panes/labels.js +42 -0
  381. package/dist/panes/model_catalog.d.ts +3 -3
  382. package/dist/panes/model_catalog.js +28 -4
  383. package/dist/panes/pane_registry.js +6 -2
  384. package/dist/panes/types.d.ts +3 -0
  385. package/dist/panes/ztc_launch.js +19 -0
  386. package/dist/plugin/optimization.d.ts +2 -0
  387. package/dist/plugin/optimization.js +1 -0
  388. package/dist/plugin/runtime.d.ts +2 -0
  389. package/dist/plugin/simulation.d.ts +6 -1
  390. package/dist/plugin/simulation_contract.d.ts +836 -1
  391. package/dist/plugin/simulation_documents.d.ts +22 -0
  392. package/dist/plugin/simulation_documents.js +1 -0
  393. package/dist/plugin/simulation_interventions.d.ts +103 -0
  394. package/dist/plugin/simulation_interventions.js +1 -0
  395. package/dist/plugin/simulation_living.d.ts +1 -0
  396. package/dist/plugin/simulation_living.js +3 -0
  397. package/dist/plugin/simulation_meetings.d.ts +121 -0
  398. package/dist/plugin/simulation_meetings.js +1 -0
  399. package/dist/plugin/simulation_story_review.d.ts +111 -0
  400. package/dist/plugin/simulation_story_review.js +1 -0
  401. package/dist/plugin/simulation_storyteller.d.ts +91 -0
  402. package/dist/plugin/simulation_storyteller.js +1 -0
  403. package/dist/plugin/simulation_structured.d.ts +2 -0
  404. package/dist/plugin/simulation_structured.js +2 -0
  405. package/dist/plugin/simulation_toolkit.d.ts +21 -0
  406. package/dist/plugin/simulation_toolkit.js +24 -0
  407. package/dist/prompts/tool_delegate_task.j2 +1 -1
  408. package/dist/remote-broker/Dockerfile +10 -0
  409. package/dist/remote-broker/archive.py +1227 -0
  410. package/dist/remote-broker/cutover.py +761 -0
  411. package/dist/remote-broker/requirements.txt +5 -0
  412. package/dist/remote-broker/resources.json +6 -0
  413. package/dist/remote-broker/resources.write-staging.example.json +18 -0
  414. package/dist/remote-broker/retained.py +686 -0
  415. package/dist/remote-broker/retained_cleanup.py +550 -0
  416. package/dist/remote-broker/server.py +648 -0
  417. package/dist/remote-broker/worker.py +1007 -0
  418. package/dist/router_auth.d.ts +31 -0
  419. package/dist/router_auth.js +155 -9
  420. package/dist/runbooks/catalog.d.ts +3 -0
  421. package/dist/runbooks/catalog.js +26 -0
  422. package/dist/runbooks/library.d.ts +11 -0
  423. package/dist/runbooks/library.js +95 -0
  424. package/dist/runbooks/package.d.ts +43 -0
  425. package/dist/runbooks/package.js +102 -0
  426. package/dist/session.d.ts +65 -13
  427. package/dist/session.js +548 -43
  428. package/dist/session_handoff.d.ts +25 -0
  429. package/dist/session_handoff.js +322 -0
  430. package/dist/session_handoff_contract.d.ts +89 -0
  431. package/dist/session_handoff_contract.js +179 -0
  432. package/dist/session_media.d.ts +41 -0
  433. package/dist/session_media.js +357 -0
  434. package/dist/session_ownership.d.ts +16 -0
  435. package/dist/session_ownership.js +221 -0
  436. package/dist/session_public.d.ts +10 -2
  437. package/dist/session_public.js +6 -1
  438. package/dist/simulation/dynamic_history.d.ts +42 -0
  439. package/dist/simulation/dynamic_history.js +173 -0
  440. package/dist/simulation/engines/swarm/pane_manager.js +7 -6
  441. package/dist/simulation/inference.d.ts +3 -1
  442. package/dist/simulation/inference.js +19 -1
  443. package/dist/simulation/intervention_generation.d.ts +27 -0
  444. package/dist/simulation/intervention_generation.js +246 -0
  445. package/dist/simulation/intervention_material.d.ts +4 -0
  446. package/dist/simulation/intervention_material.js +81 -0
  447. package/dist/simulation/living/context.d.ts +3130 -0
  448. package/dist/simulation/living/context.js +944 -0
  449. package/dist/simulation/living/definer.d.ts +12 -0
  450. package/dist/simulation/living/definer.js +223 -0
  451. package/dist/simulation/living/definition.d.ts +257 -0
  452. package/dist/simulation/living/definition.js +341 -0
  453. package/dist/simulation/living/frame.d.ts +259 -0
  454. package/dist/simulation/living/frame.js +223 -0
  455. package/dist/simulation/living/identifiers.d.ts +2 -0
  456. package/dist/simulation/living/identifiers.js +12 -0
  457. package/dist/simulation/living/index.d.ts +15 -0
  458. package/dist/simulation/living/index.js +15 -0
  459. package/dist/simulation/living/inference.d.ts +219 -0
  460. package/dist/simulation/living/inference.js +576 -0
  461. package/dist/simulation/living/mechanics.d.ts +54 -0
  462. package/dist/simulation/living/mechanics.js +588 -0
  463. package/dist/simulation/living/model-input.d.ts +25 -0
  464. package/dist/simulation/living/model-input.js +215 -0
  465. package/dist/simulation/living/open-world.d.ts +257 -0
  466. package/dist/simulation/living/open-world.js +102 -0
  467. package/dist/simulation/living/projection.d.ts +7 -0
  468. package/dist/simulation/living/projection.js +31 -0
  469. package/dist/simulation/living/recall.d.ts +17 -0
  470. package/dist/simulation/living/recall.js +25 -0
  471. package/dist/simulation/living/reduce.d.ts +15 -0
  472. package/dist/simulation/living/reduce.js +1853 -0
  473. package/dist/simulation/living/replay.d.ts +6 -0
  474. package/dist/simulation/living/replay.js +22 -0
  475. package/dist/simulation/living/runtime.d.ts +140 -0
  476. package/dist/simulation/living/runtime.js +3020 -0
  477. package/dist/simulation/living/shared-kinds.d.ts +24 -0
  478. package/dist/simulation/living/shared-kinds.js +96 -0
  479. package/dist/simulation/living/types.d.ts +2785 -0
  480. package/dist/simulation/living/types.js +669 -0
  481. package/dist/simulation/llm.d.ts +3 -1
  482. package/dist/simulation/llm.js +90 -30
  483. package/dist/simulation/memory/embedding.d.ts +1 -1
  484. package/dist/simulation/memory/embedding.js +9 -3
  485. package/dist/simulation/memory/filesystem.d.ts +2 -0
  486. package/dist/simulation/memory/filesystem.js +5 -1
  487. package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
  488. package/dist/simulation/memory/filesystem_file_tree.js +41 -10
  489. package/dist/simulation/memory/filesystem_invariants.js +1 -2
  490. package/dist/simulation/memory/filesystem_types.d.ts +1 -0
  491. package/dist/simulation/memory/memory.d.ts +2 -0
  492. package/dist/simulation/memory/memory.js +5 -1
  493. package/dist/simulation/orchestration/intent.js +0 -2
  494. package/dist/simulation/orchestration/lifecycle.js +0 -2
  495. package/dist/simulation/plugin_host.d.ts +25 -1
  496. package/dist/simulation/plugin_host.js +334 -17
  497. package/dist/simulation/session_documents.d.ts +20 -0
  498. package/dist/simulation/session_documents.js +62 -0
  499. package/dist/simulation/session_input_validation.d.ts +43 -0
  500. package/dist/simulation/session_input_validation.js +364 -0
  501. package/dist/simulation/session_inputs.d.ts +32 -0
  502. package/dist/simulation/session_inputs.js +154 -0
  503. package/dist/simulation/telemetry.d.ts +11 -14
  504. package/dist/simulation/telemetry.js +177 -54
  505. package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
  506. package/dist/simulation/toolkit/bounded_turns.js +80 -0
  507. package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
  508. package/dist/simulation/toolkit/dynamic_agents.js +218 -0
  509. package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
  510. package/dist/simulation/toolkit/dynamic_digest.js +8 -0
  511. package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
  512. package/dist/simulation/toolkit/dynamic_documents.js +71 -0
  513. package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
  514. package/dist/simulation/toolkit/dynamic_driver.js +269 -0
  515. package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
  516. package/dist/simulation/toolkit/dynamic_game.js +805 -0
  517. package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
  518. package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
  519. package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
  520. package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
  521. package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
  522. package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
  523. package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
  524. package/dist/simulation/toolkit/dynamic_progress.js +214 -0
  525. package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
  526. package/dist/simulation/toolkit/dynamic_projection.js +219 -0
  527. package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
  528. package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
  529. package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
  530. package/dist/simulation/toolkit/dynamic_state.js +1967 -0
  531. package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
  532. package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
  533. package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
  534. package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
  535. package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
  536. package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
  537. package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
  538. package/dist/simulation/toolkit/dynamic_world.js +377 -0
  539. package/dist/simulation/toolkit/structured_output.d.ts +5 -0
  540. package/dist/simulation/toolkit/structured_output.js +321 -0
  541. package/dist/simulation/types/world.d.ts +2 -0
  542. package/dist/simulation/world/artifact_store.js +1 -1
  543. package/dist/simulation/world/memory_manager.d.ts +5 -0
  544. package/dist/simulation/world/memory_manager.js +17 -2
  545. package/dist/simulation/world/state.d.ts +3 -2
  546. package/dist/simulation/world/state.js +15 -5
  547. package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
  548. package/dist/terminal_attach.d.ts +1 -0
  549. package/dist/terminal_attach.js +113 -0
  550. package/dist/tool_progress.d.ts +3 -0
  551. package/dist/tool_progress.js +27 -0
  552. package/dist/types.d.ts +145 -10
  553. package/dist/types.js +3 -0
  554. package/dist/ui/core/input.d.ts +3 -0
  555. package/dist/ui/core/input_segments.d.ts +18 -1
  556. package/dist/ui/core/input_segments.js +131 -47
  557. package/dist/ui/core/input_state.d.ts +12 -0
  558. package/dist/ui/core/layout_yoga.d.ts +1 -1
  559. package/dist/ui/core/turn_metadata.d.ts +5 -0
  560. package/dist/ui/core/turn_metadata.js +22 -0
  561. package/dist/ui/ink/render.d.ts +2 -1
  562. package/dist/ui/ink/render.js +6 -5
  563. package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
  564. package/dist/ui/ratatui/headless_pane_manager.js +293 -104
  565. package/dist/ui/ratatui/index.d.ts +1 -0
  566. package/dist/ui/ratatui/input.d.ts +4 -0
  567. package/dist/ui/ratatui/input.js +15 -0
  568. package/dist/ui/ratatui/ipc_path.d.ts +2 -0
  569. package/dist/ui/ratatui/ipc_path.js +29 -1
  570. package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
  571. package/dist/ui/ratatui/mux_persistence.js +139 -1
  572. package/dist/ui/ratatui/pane_relay.d.ts +1 -1
  573. package/dist/ui/ratatui/pane_relay.js +55 -27
  574. package/dist/ui/ratatui/process.d.ts +17 -1
  575. package/dist/ui/ratatui/process.js +80 -7
  576. package/dist/ui/ratatui/protocol.d.ts +236 -1
  577. package/dist/ui/ratatui/protocol.js +90 -0
  578. package/dist/ui/scrollback.d.ts +2 -1
  579. package/dist/ui/scrollback.js +9 -4
  580. package/dist/ui/stream_typewriter.d.ts +8 -3
  581. package/dist/ui/stream_typewriter.js +30 -1
  582. package/dist/ui/streaming_scrollback.d.ts +1 -0
  583. package/dist/ui/streaming_scrollback.js +1 -1
  584. package/dist/ui/transcript_render_cache.js +10 -0
  585. package/dist/ui/views/activity_line.d.ts +5 -3
  586. package/dist/ui/views/activity_line.js +65 -7
  587. package/dist/ui/views/app.d.ts +6 -3
  588. package/dist/ui/views/app.js +17 -6
  589. package/dist/ui/views/completion_menu.js +10 -5
  590. package/dist/ui/views/input_area.d.ts +7 -3
  591. package/dist/ui/views/input_area.js +15 -9
  592. package/dist/ui/views/message_list.d.ts +4 -1
  593. package/dist/ui/views/message_list.js +89 -19
  594. package/dist/ui/views/queue_panel.d.ts +3 -1
  595. package/dist/ui/views/queue_panel.js +9 -2
  596. package/dist/ui/views/status_bar.d.ts +4 -2
  597. package/dist/ui/views/status_bar.js +28 -13
  598. package/dist/ui/views/theme.d.ts +2 -0
  599. package/dist/ui/views/theme.js +2 -0
  600. package/dist/ui/widgets/color_panel.js +18 -0
  601. package/dist/ui/widgets/form.js +8 -0
  602. package/dist/ui/widgets/log_view.js +7 -0
  603. package/dist/ui/widgets/navigator_panel.js +8 -0
  604. package/dist/ui/widgets/prompt_viewer.js +2 -0
  605. package/dist/ui/widgets/questionnaire.d.ts +2 -0
  606. package/dist/ui/widgets/questionnaire.js +79 -16
  607. package/dist/ui/widgets/resume_panel.d.ts +2 -0
  608. package/dist/ui/widgets/resume_panel.js +26 -15
  609. package/dist/ui/widgets/rewind_panel.d.ts +2 -2
  610. package/dist/ui/widgets/rewind_panel.js +4 -2
  611. package/dist/ui/widgets/select.js +16 -27
  612. package/dist/ui/widgets/settings_panel.js +16 -0
  613. package/dist/ui/widgets/status_line_panel.d.ts +1 -0
  614. package/dist/ui/widgets/status_line_panel.js +30 -4
  615. package/dist/ui/widgets/text_input.d.ts +2 -0
  616. package/dist/ui/widgets/text_input.js +15 -1
  617. package/dist/ui/widgets/types.d.ts +2 -0
  618. package/dist/usage_projection.d.ts +24 -0
  619. package/dist/usage_projection.js +130 -0
  620. package/dist/usage_snapshot.d.ts +36 -0
  621. package/dist/usage_snapshot.js +131 -0
  622. package/dist/utils/assistant_message.d.ts +2 -0
  623. package/dist/utils/assistant_message.js +5 -0
  624. package/dist/utils/atomic_write.d.ts +6 -2
  625. package/dist/utils/atomic_write.js +29 -4
  626. package/dist/utils/checked_shell.d.ts +25 -0
  627. package/dist/utils/checked_shell.js +107 -0
  628. package/dist/utils/compaction.d.ts +4 -1
  629. package/dist/utils/compaction.js +31 -7
  630. package/dist/utils/context.d.ts +4 -4
  631. package/dist/utils/context.js +14 -12
  632. package/dist/utils/deepseek.d.ts +2 -2
  633. package/dist/utils/deepseek.js +13 -5
  634. package/dist/utils/ephemeral.js +4 -0
  635. package/dist/utils/ephemeral_tools.d.ts +18 -0
  636. package/dist/utils/ephemeral_tools.js +97 -0
  637. package/dist/utils/jev_client.d.ts +4 -0
  638. package/dist/utils/jev_client.js +15 -0
  639. package/dist/utils/model_cache.d.ts +15 -0
  640. package/dist/utils/model_cache.js +143 -0
  641. package/dist/utils/models.d.ts +4 -2
  642. package/dist/utils/models.js +12 -16
  643. package/dist/utils/reasoning.d.ts +8 -1
  644. package/dist/utils/reasoning.js +31 -11
  645. package/dist/utils/router_catalog.d.ts +49 -0
  646. package/dist/utils/router_catalog.js +271 -0
  647. package/dist/utils/sandbox.d.ts +9 -0
  648. package/dist/utils/sandbox.js +118 -15
  649. package/dist/utils/shell.d.ts +7 -0
  650. package/dist/utils/shell.js +98 -34
  651. package/dist/utils/subprocess_env.d.ts +3 -0
  652. package/dist/utils/subprocess_env.js +27 -1
  653. package/dist/web/accounts_mirror.d.ts +3 -1
  654. package/dist/web/accounts_mirror.js +13 -9
  655. package/dist/web/child_publication.d.ts +17 -0
  656. package/dist/web/child_publication.js +45 -0
  657. package/dist/web/mirror_authenticator.d.ts +31 -11
  658. package/dist/web/mirror_authenticator.js +67 -17
  659. package/dist/web/mirror_client.d.ts +31 -4
  660. package/dist/web/mirror_client.js +189 -23
  661. package/dist/web/mirror_stream.d.ts +84 -22
  662. package/dist/web/mirror_stream.js +676 -95
  663. package/dist/web/observer_query_redaction.d.ts +6 -0
  664. package/dist/web/observer_query_redaction.js +58 -0
  665. package/dist/web/pane_registry.d.ts +2 -0
  666. package/dist/web/pane_registry.js +86 -22
  667. package/dist/web/tool_image.d.ts +6 -0
  668. package/dist/web/tool_image.js +17 -0
  669. package/dist/web/view_plugin.d.ts +14 -0
  670. package/dist/web/view_plugin.js +23 -1
  671. package/dist/worker/executor.js +31 -12
  672. package/dist/worker/index.d.ts +1 -0
  673. package/dist/worker/toolsets.js +3 -1
  674. package/dist/worker/types.d.ts +12 -1
  675. package/dist/workflows/registry.js +1 -0
  676. package/dist/workflows/registry_handle.d.ts +2 -0
  677. package/dist/workflows/runtime.d.ts +2 -0
  678. package/dist/workflows/runtime.js +1 -0
  679. package/dist/workspace_agent.d.ts +7 -0
  680. package/dist/workspace_agent.js +36 -0
  681. package/dist/workspace_collision.d.ts +76 -0
  682. package/dist/workspace_collision.js +688 -0
  683. package/dist/workspace_layout.d.ts +18 -0
  684. package/dist/workspace_layout.js +121 -0
  685. package/dist/workspace_runtime.d.ts +44 -0
  686. package/dist/workspace_runtime.js +82 -0
  687. package/dist/workspace_session_context.d.ts +62 -0
  688. package/dist/workspace_session_context.js +160 -0
  689. package/dist/zlm-embed.mjs +32518 -9615
  690. package/dist/zlm.js +1 -0
  691. package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
  692. package/node_modules/@zerg/model-contracts/README.md +90 -0
  693. package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
  694. package/node_modules/@zerg/model-contracts/index.js +223 -0
  695. package/node_modules/@zerg/model-contracts/package.json +8 -0
  696. package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
  697. package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
  698. package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
  699. package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
  700. package/package.json +45 -24
  701. package/packages/model-contracts/LICENSE.md +375 -0
  702. package/packages/model-contracts/README.md +90 -0
  703. package/packages/model-contracts/index.d.ts +20 -0
  704. package/packages/model-contracts/index.js +223 -0
  705. package/packages/model-contracts/package.json +8 -0
  706. package/remote-broker/Dockerfile +10 -0
  707. package/remote-broker/README.md +308 -0
  708. package/remote-broker/archive.py +1227 -0
  709. package/remote-broker/cutover.py +761 -0
  710. package/remote-broker/requirements.txt +5 -0
  711. package/remote-broker/resources.example.json +6 -0
  712. package/remote-broker/resources.write-staging.example.json +18 -0
  713. package/remote-broker/retained.py +686 -0
  714. package/remote-broker/retained_cleanup.py +550 -0
  715. package/remote-broker/server.py +648 -0
  716. package/scripts/build-remote-broker.mjs +13 -0
  717. package/scripts/ensure-local-packages.mjs +6 -0
  718. package/scripts/node-pty-helpers.mjs +103 -0
@@ -1,94 +1,84 @@
1
- const ALL_CAPS = ['file_read', 'file_write', 'shell_exec', 'network'];
2
- function normalize(value) {
3
- return value.trim().toLowerCase();
1
+ import { DEFAULT_PERMISSION_PROFILES } from '../../config.js';
2
+ import { PERMISSION_CAPABILITIES, describePermissionChanges, describePermissionPolicy, projectPermissionPolicy, readRepoPermissionProfiles } from '../../config/permissions.js';
3
+ const usage = '/permissions show | profiles [--repo] | use <profile|repo:name> | set <capability> <on|off>';
4
+ const normalize = (value) => value.trim().toLowerCase();
5
+ export async function activatePermissionConfig(next, ctx) {
6
+ if (ctx.commandOrigin === 'agent')
7
+ throw new Error('Permission changes require an explicit user command.');
8
+ const previous = ctx.config.get(), after = projectPermissionPolicy(next);
9
+ if (after.commandSandbox.required && after.commandSandbox.enforcement !== 'os') {
10
+ throw new Error(`OS command sandbox required but unavailable for ${after.id}; profile unchanged. ${describePermissionPolicy(after)}`);
11
+ }
12
+ let change;
13
+ try {
14
+ change = describePermissionChanges(projectPermissionPolicy(previous), after);
15
+ }
16
+ catch {
17
+ change = `Previous permission profile was invalid.\n${describePermissionPolicy(after)}`;
18
+ }
19
+ try {
20
+ ctx.config.set('permissionProfiles', next.permissionProfiles);
21
+ ctx.config.set('toolPermissions', next.toolPermissions);
22
+ ctx.config.set('permissionProfile', next.permissionProfile);
23
+ ctx.config.set('sandbox', next.sandbox);
24
+ await ctx.reloadAgent();
25
+ await ctx.config.save();
26
+ }
27
+ catch (error) {
28
+ ctx.config.set('permissionProfiles', previous.permissionProfiles);
29
+ ctx.config.set('toolPermissions', previous.toolPermissions);
30
+ ctx.config.set('permissionProfile', previous.permissionProfile);
31
+ ctx.config.set('sandbox', previous.sandbox);
32
+ await ctx.reloadAgent();
33
+ throw error;
34
+ }
35
+ return `Permission profile active: ${after.id}\n${change}`;
4
36
  }
5
- export const permissionsCommand = {
6
- name: 'permissions',
7
- description: 'View or update tool permissions',
8
- usage: {
9
- default: '<show|set|profiles|use>',
10
- variants: [
11
- { when: { 0: ['set'] }, usage: '<show|set|profiles|use> <capability> <on|off>' },
12
- { when: { 0: ['use'] }, usage: '<show|set|profiles|use> <profile>' },
13
- ],
14
- },
15
- handler: async (args, ctx) => {
16
- const subCmd = normalize(args[0] || 'show');
17
- const config = ctx.config.get();
18
- const current = config.toolPermissions || {};
19
- if (subCmd === 'show') {
20
- const lines = ALL_CAPS.map(cap => {
21
- const value = current[cap];
22
- const label = value === false ? 'off' : 'on';
23
- return ` ${cap}: ${label}`;
24
- });
25
- const profile = config.permissionProfile || 'trusted';
26
- ctx.addMessage({
27
- role: 'system',
28
- content: [`Tool permissions:`, ` profile: ${profile}`, ...lines].join('\n')
29
- });
30
- return;
31
- }
32
- if (subCmd === 'profiles') {
33
- const profiles = config.permissionProfiles || {};
34
- const lines = Object.entries(profiles).map(([id, profile]) => {
35
- const marker = id === config.permissionProfile ? '*' : ' ';
36
- return `${marker} ${id}: ${profile.description || 'No description'}`;
37
- });
38
- ctx.addMessage({
39
- role: 'system',
40
- content: ['Permission profiles:', ...lines].join('\n')
41
- });
42
- return;
37
+ async function run(args, ctx) {
38
+ const action = normalize(args[0] ?? 'show'), config = ctx.config.get();
39
+ if (['use', 'set'].includes(action) && ctx.commandOrigin === 'agent')
40
+ return 'Permission changes require an explicit user command.';
41
+ if (action === 'show')
42
+ return args.length > 1 ? usage : describePermissionPolicy(projectPermissionPolicy(config));
43
+ if (action === 'profiles') {
44
+ if (args.length > 2 || (args.length === 2 && args[1] !== '--repo'))
45
+ return usage;
46
+ const repo = args[1] === '--repo';
47
+ const profiles = repo ? await readRepoPermissionProfiles(ctx.shell.getCwd()) : { ...DEFAULT_PERMISSION_PROFILES, ...config.permissionProfiles };
48
+ return ['Permission profiles (policy checks; not session-wide OS isolation):', ...Object.entries(profiles).map(([id, profile]) => `${(repo ? `repo:${id}` : id) === config.permissionProfile ? '*' : ' '} ${repo ? `repo:${id}` : id}: ${profile.description ?? 'Custom capability/path/command policy'}`)].join('\n');
49
+ }
50
+ if (action === 'use') {
51
+ if (args.length !== 2)
52
+ return usage;
53
+ const id = normalize(args[1]);
54
+ let profiles = { ...DEFAULT_PERMISSION_PROFILES, ...config.permissionProfiles };
55
+ if (id.startsWith('repo:')) {
56
+ const imported = await readRepoPermissionProfiles(ctx.shell.getCwd());
57
+ const profile = imported[id.slice(5)];
58
+ if (!profile)
59
+ return `Unknown repo permission profile: ${id}. Use /permissions profiles --repo.`;
60
+ profiles = { ...profiles, [id]: profile };
43
61
  }
44
- if (subCmd === 'use') {
45
- const profile = normalize(args[1] || '');
46
- if (!profile || !config.permissionProfiles?.[profile]) {
47
- ctx.addMessage({
48
- role: 'system',
49
- content: 'Usage: /permissions use <profile>. Run /permissions profiles to list available profiles.'
50
- });
51
- return;
52
- }
53
- ctx.config.set('permissionProfile', profile);
54
- await ctx.config.save();
55
- ctx.reloadAgent();
56
- ctx.addMessage({
57
- role: 'system',
58
- content: `✓ Permission profile active: ${profile}`
59
- });
60
- return;
62
+ if (!Object.hasOwn(profiles, id))
63
+ return `Unknown permission profile: ${id}. Use /permissions profiles.`;
64
+ return activatePermissionConfig({ ...config, permissionProfile: id, permissionProfiles: profiles }, ctx);
65
+ }
66
+ if (action === 'set') {
67
+ const cap = normalize(args[1] ?? ''), value = normalize(args[2] ?? '');
68
+ if (args.length !== 3 || !PERMISSION_CAPABILITIES.includes(cap) || !['on', 'off'].includes(value))
69
+ return usage;
70
+ return activatePermissionConfig({ ...config, toolPermissions: { ...config.toolPermissions, [cap]: value === 'on' } }, ctx);
71
+ }
72
+ return usage;
73
+ }
74
+ export const permissionsCommand = {
75
+ name: 'permissions', description: 'Inspect and explicitly switch shared autonomy policy profiles', usage,
76
+ async handler(args, ctx) {
77
+ try {
78
+ ctx.addMessage({ role: 'system', content: await run(args, ctx) });
61
79
  }
62
- if (subCmd === 'set') {
63
- const cap = normalize(args[1] || '');
64
- const value = normalize(args[2] || '');
65
- if (!cap || !ALL_CAPS.includes(cap)) {
66
- ctx.addMessage({
67
- role: 'system',
68
- content: `Usage: /permissions set <${ALL_CAPS.join('|')}> <on|off>`
69
- });
70
- return;
71
- }
72
- if (value !== 'on' && value !== 'off') {
73
- ctx.addMessage({
74
- role: 'system',
75
- content: 'Usage: /permissions set <capability> <on|off>'
76
- });
77
- return;
78
- }
79
- const next = { ...current, [cap]: value === 'on' };
80
- ctx.config.set('toolPermissions', next);
81
- await ctx.config.save();
82
- ctx.reloadAgent();
83
- ctx.addMessage({
84
- role: 'system',
85
- content: `✓ Permission updated: ${cap} ${value}`
86
- });
87
- return;
80
+ catch (error) {
81
+ ctx.addMessage({ role: 'system', content: `Permissions: ${error instanceof Error ? error.message : 'Profile could not be applied'}` });
88
82
  }
89
- ctx.addMessage({
90
- role: 'system',
91
- content: 'Usage: /permissions <show|set|profiles|use> [capability|profile] [on|off]'
92
- });
93
- }
83
+ },
94
84
  };
@@ -438,23 +438,14 @@ export function commitPlan(planFile, planContent, tasks, ctx, autoApprove) {
438
438
  ctx.setMode?.(previousMode);
439
439
  throw error;
440
440
  }
441
- // Publish tasks only after the normal agent exists. A failed rebuild must
442
- // not leave a plan-mode session with implementation todos already armed.
443
- if (ctx.setTodos && tasks.length > 0) {
444
- ctx.setTodos(tasks.map((content, i) => ({
445
- id: `plan_task_${i}`,
446
- content,
447
- status: 'pending',
448
- })));
449
- }
450
441
  ctx.addMessage({
451
442
  role: 'system',
452
- content: `Plan approved. Beginning implementation.
443
+ content: `Plan mode off. Plan approved. Beginning implementation.
453
444
 
454
445
  Plan: ${planFile}
455
446
  Tasks extracted: ${tasks.length}
456
447
 
457
- ${tasks.length > 0 ? 'Tasks have been added to the todo list.' : 'No tasks found in Implementation Steps section.'}`,
448
+ ${tasks.length > 0 ? 'Implementation steps are included in the plan below.' : 'No tasks found in Implementation Steps section.'}`,
458
449
  });
459
450
  // Add plan as context for the agent with explicit implementation instructions
460
451
  if (tasks.length > 0) {
@@ -462,12 +453,11 @@ ${tasks.length > 0 ? 'Tasks have been added to the todo list.' : 'No tasks found
462
453
  role: 'user',
463
454
  content: `Implement the following plan.
464
455
 
465
- IMPORTANT - after ALL implementation steps are done you MUST do these three things:
456
+ IMPORTANT - after ALL implementation steps are done you MUST do these two things:
466
457
  1. Run the verification commands from the plan's Verification section to confirm everything works
467
- 2. Use todo_write to mark ALL tasks as "completed"
468
- 3. Print a brief final summary listing what was built and whether verification passed
458
+ 2. Print a brief final summary listing what was built and whether verification passed
469
459
 
470
- Do NOT skip steps 1-3. They are required.
460
+ Do NOT skip steps 1-2. They are required.
471
461
 
472
462
  ${planContent}`,
473
463
  });
@@ -6,12 +6,13 @@ const USAGE = [
6
6
  ' /profile <name> switch this session to an existing profile',
7
7
  ' /profile use <name> same as above',
8
8
  ' /profile create <name> create and switch to a custom profile',
9
+ ' /profile duplicate [name] copy the active profile and switch to the copy',
9
10
  ].join('\n');
10
11
  const OLD_BENCHMARK_COMMANDS = new Set(['show', 'gates', 'command', 'run', 'optimize', 'sweep']);
11
12
  export const profileCommand = {
12
13
  name: 'profile',
13
- description: 'List and switch configuration profiles',
14
- usage: '[list|<name>|use <name>|create <name>]',
14
+ description: 'List, switch, create, and duplicate configuration profiles',
15
+ usage: '[list|<name>|use <name>|create <name>|duplicate [name]]',
15
16
  handler: async (args, ctx) => {
16
17
  const [action, ...rest] = args;
17
18
  if (!action || action === 'list' || action === 'configs' || action === 'help') {
@@ -31,6 +32,24 @@ export const profileCommand = {
31
32
  ctx.addMessage({ role: 'system', content: `Config profiles (* active):\n${lines.join('\n')}${!action ? `\n\n${USAGE}` : ''}` });
32
33
  return;
33
34
  }
35
+ if (action === 'duplicate' || action === 'copy' || action === 'clone') {
36
+ if (rest.length > 1) {
37
+ ctx.addMessage({ role: 'system', content: USAGE });
38
+ return;
39
+ }
40
+ const source = activeProfile();
41
+ const target = rest[0] ?? `${source}-copy`;
42
+ try {
43
+ if (!ctx.duplicateProfile)
44
+ throw new Error('This renderer cannot switch config profiles in place.');
45
+ const name = await ctx.duplicateProfile(target, source);
46
+ ctx.addMessage({ role: 'system', content: `Duplicated config profile ${source} to ${name} and switched to it.` });
47
+ }
48
+ catch (error) {
49
+ ctx.addMessage({ role: 'system', content: `Profile duplicate failed: ${error.message}` });
50
+ }
51
+ return;
52
+ }
34
53
  if (OLD_BENCHMARK_COMMANDS.has(action)) {
35
54
  ctx.addMessage({ role: 'system', content: 'Use /emulation to inspect prompt modes. Profile benchmark gates remain available through npm run profiles:baseline.' });
36
55
  return;
@@ -4,6 +4,7 @@ import { applyRuntimeModelSelection, getEffectiveModel } from './runtime_model.j
4
4
  import { canRouteThroughRouter, canonicalProvider } from './provider_choices.js';
5
5
  import { resolveModelAndProvider } from '../../panes/model_catalog.js';
6
6
  import { getDefaultModel } from '../../utils/models.js';
7
+ import { resolveRouterModel, RouterCatalogAuthenticationError } from '../../utils/router_catalog.js';
7
8
  /** Apply a provider and optional model in one validated config transition. */
8
9
  export async function selectProviderModel(args, ctx) {
9
10
  const values = args.filter(Boolean);
@@ -27,11 +28,29 @@ export async function selectProviderModel(args, ctx) {
27
28
  const authMode = routed ? 'zrouter' : 'direct';
28
29
  const defaultModel = provider === 'inception' ? getDefaultModel(provider) : getDefaultModelForProvider(provider);
29
30
  const explicitModel = values[choice === 'zergrouter' ? 2 : 1];
30
- const model = explicitModel || (provider === current ? getEffectiveModel(ctx)
31
+ let model = explicitModel || (provider === current ? getEffectiveModel(ctx)
31
32
  : provider === 'openai_compatible'
32
33
  ? (ctx.config.getOpenAICompatibleSettings?.().defaultModel || getDefaultModelForProvider(provider))
33
34
  : resolveModelAndProvider(defaultModel, provider).model);
34
35
  try {
36
+ if (routed && ctx.models.catalog) {
37
+ const catalog = await ctx.models.catalog(undefined, { refresh: !explicitModel }).catch(error => {
38
+ if (error instanceof RouterCatalogAuthenticationError)
39
+ throw error;
40
+ return undefined;
41
+ });
42
+ if (catalog?.authRequired)
43
+ throw new Error('Router authentication rejected. Run /auth login and retry.');
44
+ if (catalog?.version === 1) {
45
+ const models = catalog.models.filter(row => row.owned_by === provider && row.capabilities?.chat);
46
+ if (!explicitModel)
47
+ model = models.find(row => row.is_default)?.id ?? models[0]?.id ?? '';
48
+ const selected = resolveRouterModel(catalog, provider, model);
49
+ if (!selected?.capabilities?.chat)
50
+ throw new Error('Model is not in the Router catalog. Run /model zergrouter to choose an available model.');
51
+ model = selected.id;
52
+ }
53
+ }
35
54
  const llm = ctx.config.resolveLLMBackendConfig({ provider, model,
36
55
  config: { ...ctx.config.get(), provider, model, authMode } });
37
56
  if (llm.authMode !== authMode) {
@@ -29,7 +29,7 @@ export const renameCommand = {
29
29
  return;
30
30
  }
31
31
  const sessionId = ctx.getSessionId();
32
- const cwd = ctx.shell.getCwd();
32
+ const cwd = (ctx.getSessionCwd?.() ?? ctx.shell.getCwd());
33
33
  if (args.length === 0) {
34
34
  ctx.addMessage({
35
35
  role: 'system',
@@ -0,0 +1,2 @@
1
+ import type { Command } from './types.js';
2
+ export declare const resourcesCommand: Command;
@@ -0,0 +1,67 @@
1
+ import { guardedRemoteSession, requestRemoteResource } from '../runtime/remote_resources.js';
2
+ export const resourcesCommand = {
3
+ name: 'resources',
4
+ description: 'Inspect ownership and reconcile uncertain guarded remote mutations',
5
+ agentRunnable: false,
6
+ usage: '/resources <show|claim|transfer|stop|reconcile|resolve> [resource] [generation-or-operation-id] [target-owner-or-observation-token] [ttl-seconds]',
7
+ handler: async (args, ctx) => {
8
+ const report = (content) => ctx.addMessage({ role: 'system', content });
9
+ if (ctx.commandOrigin === 'agent') {
10
+ report('Resource ownership changes require the user to type /resources. Chat and agent requests cannot grant ownership.');
11
+ return;
12
+ }
13
+ if (!ctx.getSessionId) {
14
+ report('Remote resource controls require a host session identity.');
15
+ return;
16
+ }
17
+ const session = guardedRemoteSession(ctx.getSessionId(), ctx.config.get().remoteResources);
18
+ if (!session) {
19
+ report('Configure remoteResources in the active profile to start a guarded remote session.');
20
+ return;
21
+ }
22
+ const operation = args[0] || 'show';
23
+ let leaseDispatched = false;
24
+ try {
25
+ if (operation === 'show') {
26
+ const resources = args[1] ? session.resources.filter(resource => resource.id === args[1]) : session.resources;
27
+ if (args[1] && !resources.length)
28
+ throw new Error(`Unknown host-managed resource: ${args[1]}`);
29
+ const lines = [`Immutable owner ID: ${session.ownerId}`];
30
+ for (const resource of resources) {
31
+ const status = await requestRemoteResource(session, resource.id, 'status');
32
+ lines.push(`${resource.id}: ${JSON.stringify(status)}`);
33
+ }
34
+ report(lines.join('\n'));
35
+ return;
36
+ }
37
+ if (operation === 'reconcile' || operation === 'resolve') {
38
+ if (!args[1] || !args[2] || !/^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/.test(args[2]))
39
+ throw new Error('Reconciliation requires a resource and canonical operation UUID.');
40
+ if (operation === 'resolve' && (!args[3] || !/^[a-f0-9]{64}$/.test(args[3])))
41
+ throw new Error('Inspect reconcile first, then supply its exact observation token to accept the current state.');
42
+ const result = await requestRemoteResource(session, args[1], operation, { receipt_id: args[2], observation_token: args[3] });
43
+ report(`${args[1]} ${operation}${operation === 'resolve' ? ' confirmed' : ''}: ${JSON.stringify(result)}${operation === 'reconcile'
44
+ ? '\nAccept current state only after reviewing the receipt, current target and retained staging data: /resources resolve ' + args[1] + ' ' + args[2] + ' <observation-token>. This releases admission; it does not replay the operation or prove an uncertain earlier effect.' : ''}`);
45
+ return;
46
+ }
47
+ if (!['claim', 'transfer', 'stop'].includes(operation) || !args[1] || !args[2]) {
48
+ throw new Error('Usage: /resources show [resource]; /resources claim <resource> <generation> [ttl-seconds]; /resources transfer <resource> <generation> <target-owner-id> [ttl-seconds]; /resources stop <resource> <generation>. Inspect show before confirming.');
49
+ }
50
+ const generation = Number(args[2]);
51
+ if (!Number.isSafeInteger(generation) || generation < 0)
52
+ throw new Error('Expected generation must be a non-negative integer from /resources show.');
53
+ const ttl = Number(args[operation === 'transfer' ? 4 : 3] ?? 900);
54
+ leaseDispatched = true;
55
+ const result = await requestRemoteResource(session, args[1], operation, {
56
+ expected_generation: generation,
57
+ ...(operation === 'transfer' ? { target_owner_id: args[3] } : {}),
58
+ ttl_seconds: ttl,
59
+ });
60
+ report(`${args[1]} ${operation} confirmed: ${JSON.stringify(result)}`);
61
+ }
62
+ catch (error) {
63
+ report(`Resource action failed: ${error.message}${leaseDispatched
64
+ ? `\nInspect the current owner and generation with /resources show ${args[1]} before retrying; a failed response alone does not establish the lease outcome.` : ''}`);
65
+ }
66
+ },
67
+ };
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ /** History replacement is an explicit user action, separate from stopping. */
3
+ export declare const rewindCommand: Command;
@@ -0,0 +1,16 @@
1
+ /** History replacement is an explicit user action, separate from stopping. */
2
+ export const rewindCommand = {
3
+ name: 'rewind',
4
+ description: 'Choose an earlier prompt to restore and remove its following context',
5
+ usage: '/rewind',
6
+ handler: (_, ctx) => {
7
+ if (!ctx.rewindPanel) {
8
+ ctx.addMessage({
9
+ role: 'system',
10
+ content: 'The rewind picker requires the Ratatui renderer. Start a Ratatui ZTC terminal and use /rewind to choose an earlier prompt.',
11
+ });
12
+ return;
13
+ }
14
+ ctx.rewindPanel.open();
15
+ },
16
+ };
@@ -0,0 +1,2 @@
1
+ import type { Command } from './types.js';
2
+ export declare const runbooksCommand: Command;
@@ -0,0 +1,73 @@
1
+ import { findRunbook, installRunbook, listRunbooks } from '../../runbooks/library.js';
2
+ import { prepareRunbookRun } from '../../runbooks/package.js';
3
+ import { ensureWorkflowRegistry } from '../../workflows/registry_lazy.js';
4
+ function describe(book) {
5
+ const value = book.package;
6
+ return [value.name, value.description, `Source: ${book.source}`, `Content SHA256: ${book.digest}`,
7
+ ...(book.installedFrom ? [`Recorded install source (advisory): ${book.installedFrom.source}; source content SHA256: ${book.installedFrom.digest}`] : []),
8
+ `Package schema: ${value.schemaVersion}; requires Node ${value.minimumNodeMajor}+`,
9
+ `Required tools: ${value.requiredTools.map(names => names.join(' or ')).join('; ') || 'none'}`,
10
+ 'Inputs:', ...value.inputs.map(input => ` ${input.name}${input.required ? ' (required)' : ' (optional)'}: ${input.description}`),
11
+ 'Expected evidence (not observed verification):', ...value.expectedEvidence.map(text => ` ${text}`),
12
+ `Workflow entrypoint: ${value.entrypoint}; scripts: ${Object.keys(value.scripts).join(', ')}`,
13
+ '', value.instructions, '', 'Installation does not authorize execution. Invocation retains current workflow and tool permissions.'].join('\n');
14
+ }
15
+ export const runbooksCommand = {
16
+ name: 'runbooks', description: 'Browse, inspect, install, and invoke runbooks',
17
+ usage: '/runbooks [list|show|install|run]', agentRunnable: false, category: 'workflow',
18
+ handler: async (args, ctx) => {
19
+ if (ctx.commandOrigin === 'agent') {
20
+ ctx.addMessage({ role: 'system', content: 'Runbook installation and invocation require an explicit user command.' });
21
+ return;
22
+ }
23
+ const cwd = ctx.shell.getCwd();
24
+ try {
25
+ const action = args[0] ?? 'list';
26
+ if (action === 'list') {
27
+ const catalog = await listRunbooks(cwd);
28
+ ctx.addMessage({ role: 'system', content: ['Available runbooks:',
29
+ ...catalog.runbooks.map(book => ` ${book.package.id}: ${book.package.description} (${book.source})`),
30
+ ...catalog.errors.map(error => `Library error: ${error}`),
31
+ 'Use /runbooks show <id> to inspect prerequisites, inputs, instructions and expected evidence.'].join('\n') });
32
+ return;
33
+ }
34
+ const source = args[1];
35
+ if (!source || !['show', 'install', 'run'].includes(action))
36
+ throw new Error('Usage: /runbooks [list|show <id-or-path>|install <id-or-path>|run <id-or-path> [--args <JSON>]]');
37
+ if (action === 'install') {
38
+ const installed = await installRunbook(source, cwd);
39
+ ctx.addMessage({ role: 'system', content: `Runbook installed: ${installed.path}\nSource: ${installed.book.source}\nContent SHA256: ${installed.book.digest}\nNo scripts were executed. Inspect with /runbooks show ${installed.book.package.id}; invoke explicitly with /runbooks run ${installed.book.package.id}. Current permissions still apply.` });
40
+ return;
41
+ }
42
+ const book = await findRunbook(source, cwd);
43
+ if (action === 'show') {
44
+ ctx.addMessage({ role: 'system', content: describe(book) });
45
+ return;
46
+ }
47
+ if (args.length > 2 && (args[2] !== '--args' || args.length < 4))
48
+ throw new Error('Use /runbooks run <id-or-path> [--args <JSON object>].');
49
+ let inputs = {};
50
+ if (args.length >= 4) {
51
+ // ZTC splits slash input on whitespace, as does the existing workflow command.
52
+ try {
53
+ inputs = JSON.parse(args.slice(3).join(' '));
54
+ }
55
+ catch {
56
+ throw new Error('Runbook --args must be a valid JSON object.');
57
+ }
58
+ }
59
+ const execution = ctx.getExecutionContext?.();
60
+ if (!execution)
61
+ throw new Error('Current tool capabilities are unavailable. Open a compatible configured ZTC session before invoking a runbook.');
62
+ const prepared = prepareRunbookRun(book, inputs, execution.tools);
63
+ const registry = await ensureWorkflowRegistry();
64
+ if (!registry)
65
+ throw new Error('Workflow registry is not initialized. Configure an API provider before invoking a runbook.');
66
+ const runId = registry.startInline(prepared);
67
+ ctx.addMessage({ role: 'system', content: `Runbook ${book.package.id} started: ${runId}\nSource: ${book.source}\nContent SHA256: ${book.digest}\nExpected evidence is a plan, not verified output. Inspect actual results with /workflows show ${runId}.` });
68
+ }
69
+ catch (error) {
70
+ ctx.addMessage({ role: 'system', content: error instanceof Error ? error.message : String(error) });
71
+ }
72
+ },
73
+ };
@@ -0,0 +1,2 @@
1
+ import type { Command } from './types.js';
2
+ export declare const runbooksCommand: Command;
@@ -0,0 +1,8 @@
1
+ export const runbooksCommand = {
2
+ name: 'runbooks', description: 'Browse, inspect, install, and invoke runbooks',
3
+ usage: '/runbooks [list|show|install|run]', agentRunnable: false, category: 'workflow',
4
+ handler: async (args, ctx) => {
5
+ const { runbooksCommand: implementation } = await import('./runbooks.js');
6
+ return implementation.handler(args, ctx);
7
+ },
8
+ };
@@ -1,2 +1,2 @@
1
- import { Command } from './types.js';
1
+ import type { Command } from './types.js';
2
2
  export declare const sessionsCommand: Command;
@@ -1,11 +1,35 @@
1
1
  import { listSessions, deleteSession } from '../../session.js';
2
+ import { inspectWorkspaceSessions, formatWorkspaceSnapshot } from '../../workspace_collision.js';
2
3
  export const sessionsCommand = {
3
4
  name: 'sessions',
4
- description: 'List or manage saved sessions for current directory',
5
- usage: '/sessions [list|delete <id>]',
5
+ description: 'Inspect active local workspace peers or manage saved sessions',
6
+ usage: '/sessions [active|continue|isolate|list|delete <id>]',
6
7
  handler: async (args, ctx) => {
7
- const cwd = ctx.shell.getCwd();
8
+ const cwd = (ctx.getSessionCwd?.() ?? ctx.shell.getCwd());
8
9
  const subcommand = args[0] || 'list';
10
+ if (subcommand === 'active') {
11
+ const snapshot = ctx.workspace
12
+ ? await ctx.workspace.getSnapshot()
13
+ : await inspectWorkspaceSessions(cwd, ctx.getSessionId?.());
14
+ ctx.addMessage({ role: 'system', content: formatWorkspaceSnapshot(snapshot) });
15
+ return;
16
+ }
17
+ if (subcommand === 'continue' || subcommand === 'isolate') {
18
+ if (ctx.commandOrigin === 'agent') {
19
+ ctx.addMessage({ role: 'system', content: 'Local workspace continuation and isolation require the user to choose. Remote authority remains unchanged.' });
20
+ return;
21
+ }
22
+ if (args.length !== 1) {
23
+ ctx.addMessage({ role: 'system', content: 'Usage: /sessions continue | /sessions isolate' });
24
+ return;
25
+ }
26
+ if (!ctx.workspace) {
27
+ ctx.addMessage({ role: 'system', content: 'This surface cannot continue or isolate a local session. Use an interactive ZTC session. No workspace or remote authority was changed.' });
28
+ return;
29
+ }
30
+ await ctx.workspace[subcommand]();
31
+ return;
32
+ }
9
33
  if (subcommand === 'list') {
10
34
  const sessions = await listSessions(cwd);
11
35
  if (sessions.length === 0) {
@@ -16,16 +40,20 @@ export const sessionsCommand = {
16
40
  return;
17
41
  }
18
42
  const lines = ['Saved sessions:\n'];
43
+ sessions.sort((a, b) => Number(Boolean(b.labels?.pinned)) - Number(Boolean(a.labels?.pinned)) || (a.labels?.group ?? '').localeCompare(b.labels?.group ?? ''));
19
44
  for (const session of sessions) {
20
45
  const date = new Date(session.updatedAt).toLocaleString();
46
+ const labelTag = [session.labels?.pinned ? 'pinned' : undefined, session.labels?.group, session.labels?.project, session.labels?.task].filter(Boolean).join(' · ');
21
47
  const nameTag = session.name ? ` [${session.name}]` : '';
22
48
  lines.push(` ${session.id}${nameTag} ${date} (${session.messageCount} messages)`);
49
+ if (labelTag)
50
+ lines.push(` ${labelTag}`);
23
51
  lines.push(` ${session.title.slice(0, 60)}${session.title.length > 60 ? '...' : ''}\n`);
24
52
  }
25
53
  lines.push('\nResume with: /resume (interactive picker)');
26
54
  lines.push('Or directly: ztc resume <id-or-name>');
27
55
  lines.push('Or: ztc resume (opens the picker), ztc -c (most recent)');
28
- lines.push('Set a name with: /rename <name>');
56
+ lines.push('Set a name with: /rename <name>. Pin or group with: /label pin, /label group <name>');
29
57
  lines.push('If the session was saved in zmux, resume also restores its pane layout.');
30
58
  lines.push('Legacy alias: ztc --resume [id-or-name]');
31
59
  ctx.addMessage({
@@ -59,7 +87,7 @@ export const sessionsCommand = {
59
87
  else {
60
88
  ctx.addMessage({
61
89
  role: 'system',
62
- content: 'Usage: /sessions [list|delete <id>]',
90
+ content: 'Usage: /sessions [active|continue|isolate|list|delete <id>]',
63
91
  });
64
92
  }
65
93
  },