@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
package/dist/config.js CHANGED
@@ -1,7 +1,10 @@
1
- import { join } from 'path';
2
- import { readFile, writeFile, mkdir, chmod, unlink, rename, realpath } from 'fs/promises';
1
+ import { modelContract } from '@zerg/model-contracts';
2
+ import { isLocalSubscriptionProvider } from './agent/backends/provider_ids.js';
3
+ import { resolveRouterModel, readRouterCatalog } from './utils/router_catalog.js';
4
+ import { dirname, join } from 'path';
5
+ import { stat, readFile, writeFile, mkdir, chmod, rm, unlink, rename, realpath } from 'fs/promises';
3
6
  import { randomUUID } from 'crypto';
4
- import { activeProfile, builtinProfileEmulation, profileConfigDir, validateProfileName } from './config/profiles.js';
7
+ import { activeProfile, builtinProfileEmulation, listConfigProfiles, profileConfigDir, validateProfileName } from './config/profiles.js';
5
8
  import { accountSourceToBackendOptions, canonicalAccountProvider, probeAccountIsolated, resolveActiveAccount, resolveRotation, } from './agent/backends/account_pool.js';
6
9
  import { notifyAccountsChanged } from './agent/backends/account_events.js';
7
10
  import { inferDefaultProvider, getDefaultApiKeyForProvider, getDefaultModelForProvider, resolveCodexEffort, unsupportedCodexEffort } from './config/defaults.js';
@@ -118,8 +121,27 @@ export const DEFAULT_PERMISSION_PROFILES = {
118
121
  file_write: false,
119
122
  shell_exec: false,
120
123
  network: true,
124
+ computer_control: false,
125
+ ml_inference: false,
121
126
  },
122
127
  },
128
+ safe_edits: {
129
+ description: 'Policy checks: edit files in the current project; shell and computer control are disabled.',
130
+ capabilities: { file_read: true, file_write: true, shell_exec: false, network: true, screen_capture: true, computer_control: false, ml_inference: false },
131
+ allowedPaths: ['.'],
132
+ },
133
+ tests_allowed: {
134
+ description: 'Policy checks: project edits plus host approval for every shell command, including tests. Tests may change files. Requires an OS command sandbox.',
135
+ capabilities: { file_read: true, file_write: true, shell_exec: true, network: true, screen_capture: true, computer_control: false, ml_inference: false },
136
+ approvalRequiredCapabilities: ['shell_exec'],
137
+ allowedPaths: ['.'],
138
+ sandbox: { backend: 'auto', requireOsEnforcement: true },
139
+ },
140
+ local_full: {
141
+ description: 'Policy checks allow full local tool access. No OS command sandbox is requested unless required by host settings.',
142
+ capabilities: { file_read: true, file_write: true, shell_exec: true, network: true, screen_capture: true, computer_control: true, ml_inference: true },
143
+ sandbox: { backend: 'none' },
144
+ },
123
145
  locked_down: {
124
146
  description: 'Disable local filesystem mutation, shell execution, network, screen, computer, and ML tools.',
125
147
  capabilities: {
@@ -205,6 +227,21 @@ function default_provider() {
205
227
  const hasRouteCredential = ROUTE_CREDENTIAL_ENV.some(name => Boolean(process.env[name]?.trim()));
206
228
  return hasRouteCredential ? inferDefaultProvider() : PERSONAL_DEFAULT_PROVIDER;
207
229
  }
230
+ export const DEFAULT_TERMINAL_INTERACTION = {
231
+ mouseCapture: true,
232
+ wheelScrollLines: 3,
233
+ };
234
+ export function resolveTerminalInteractionSettings(value) {
235
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
236
+ return { ...DEFAULT_TERMINAL_INTERACTION };
237
+ }
238
+ const settings = value;
239
+ const wheel = settings.wheelScrollLines;
240
+ return {
241
+ mouseCapture: typeof settings.mouseCapture === 'boolean' ? settings.mouseCapture : true,
242
+ wheelScrollLines: typeof wheel === 'number' && Number.isInteger(wheel) && wheel >= 1 && wheel <= 20 ? wheel : 3,
243
+ };
244
+ }
208
245
  export function build_default_config() {
209
246
  const provider = default_provider();
210
247
  return {
@@ -230,6 +267,7 @@ export function build_default_config() {
230
267
  intents: { ...DEFAULT_INTENTS },
231
268
  contextProgressBar: { ...DEFAULT_CONTEXT_PROGRESS_BAR },
232
269
  messageDisplay: { ...DEFAULT_MESSAGE_DISPLAY },
270
+ terminalInteraction: { ...DEFAULT_TERMINAL_INTERACTION },
233
271
  compaction: resolveCompactionSettings({}),
234
272
  // zmux shortcut overrides edited from /keybindings (empty = all defaults).
235
273
  keybindings: { zmux: {} },
@@ -290,6 +328,20 @@ const ROUTING_SETTING_KEYS = [
290
328
  function normalizedOrigin(value) {
291
329
  return value?.trim().replace(/\/+$/, '') || undefined;
292
330
  }
331
+ /** Explicit deployment routing takes precedence over a saved session origin. */
332
+ function routerOriginFromEnvironment() {
333
+ if (process.env.ZERG_PROXY_URL)
334
+ return process.env.ZERG_PROXY_URL;
335
+ if (process.env.ZERG_ROUTER_BASE_URL)
336
+ return normalizedOrigin(process.env.ZERG_ROUTER_BASE_URL);
337
+ const tiers = {
338
+ local: 'http://host.docker.internal:8000/api/zrouter',
339
+ dev: 'https://api-dev.zergai.com/api/zrouter', development: 'https://api-dev.zergai.com/api/zrouter',
340
+ prod: 'https://api.zergai.com/api/zrouter', production: 'https://api.zergai.com/api/zrouter', main: 'https://api.zergai.com/api/zrouter',
341
+ };
342
+ const tier = process.env.ZERG_DEPLOY_TIER || '';
343
+ return Object.hasOwn(tiers, tier) ? tiers[tier] : undefined;
344
+ }
293
345
  /**
294
346
  * True when the saved provider route can already reach a model: a direct or
295
347
  * platform credential, a subscription or account login, a configured
@@ -300,6 +352,10 @@ function normalizedOrigin(value) {
300
352
  function savedRouteIsUsable(saved) {
301
353
  if (!saved.provider)
302
354
  return false;
355
+ // A hosted native route is deliberately independent of direct keys and
356
+ // personal Router logins. Keep its explicit provider/model during migration.
357
+ if (saved.nativeAnthropicMessagesRouter)
358
+ return true;
303
359
  const provider = normalizeProviderId(saved.provider);
304
360
  if (saved.authMode === 'direct')
305
361
  return true;
@@ -402,6 +458,12 @@ export class ConfigStore {
402
458
  // The legacy slot also carries runtime defaults. Only a configured key may
403
459
  // be migrated into apiKeys or written to disk.
404
460
  legacyApiKeyFromEnvironment = true;
461
+ /**
462
+ * Whether the routing in `this.config` came from a saved file or an explicit
463
+ * choice, rather than the built-in default. A config-less process that never
464
+ * picked a route must not hard-fail on the preset Router route it inherited.
465
+ */
466
+ routingIsConfigured = false;
405
467
  routerCredentials = null;
406
468
  routerCredentialsError = null;
407
469
  routerFallbackWarning = null;
@@ -409,6 +471,7 @@ export class ConfigStore {
409
471
  configScope = 'global';
410
472
  /** Session-local overrides. Never persisted to config.json. */
411
473
  sessionOverrides = {};
474
+ restoredSessionSelection = false;
412
475
  /** CLI-only overrides. Never persisted to config.json. */
413
476
  cliOverrides = {};
414
477
  /**
@@ -475,23 +538,10 @@ export class ConfigStore {
475
538
  else if (tier === 'prod' || tier === 'production' || tier === 'main')
476
539
  this.config.apiEnvironment = 'production';
477
540
  }
478
- // LLM proxy URL (routes through platform ZRouter instead of direct API)
479
- if (process.env.ZERG_PROXY_URL) {
480
- this.config.zergProxyUrl = process.env.ZERG_PROXY_URL;
481
- }
482
- else if (process.env.ZERG_ROUTER_BASE_URL) {
483
- // Standalone ZergRouter (https://zergrouter.com) serves /v1/* at
484
- // its root, no /api/zrouter suffix. Lower precedence than ZERG_PROXY_URL.
485
- this.config.zergProxyUrl = process.env.ZERG_ROUTER_BASE_URL.replace(/\/+$/, '');
486
- }
487
- else if (process.env.ZERG_DEPLOY_TIER) {
488
- const tier = process.env.ZERG_DEPLOY_TIER;
489
- if (tier === 'local')
490
- this.config.zergProxyUrl = 'http://host.docker.internal:8000/api/zrouter';
491
- else if (tier === 'dev' || tier === 'development')
492
- this.config.zergProxyUrl = 'https://api-dev.zergai.com/api/zrouter';
493
- else if (tier === 'prod' || tier === 'production' || tier === 'main')
494
- this.config.zergProxyUrl = 'https://api.zergai.com/api/zrouter';
541
+ // Resolve all explicit origin environment variables through one policy.
542
+ const originOverride = routerOriginFromEnvironment();
543
+ if (originOverride) {
544
+ this.config.zergProxyUrl = originOverride;
495
545
  }
496
546
  else if (!this.config.zergProxyUrl) {
497
547
  // Local default: infer ZRouter from the selected API environment.
@@ -569,9 +619,6 @@ export class ConfigStore {
569
619
  if (saved.provider && saved.model === undefined) {
570
620
  this.config.model = getDefaultModelForProvider(saved.provider);
571
621
  }
572
- if (this.config.model === 'claude-opus-4-5-20250514' || this.config.model === 'claude-opus-4-20250514') {
573
- this.config.model = 'claude-opus-5';
574
- }
575
622
  if (!this.config.spinnerVerbs) {
576
623
  this.config.spinnerVerbs = DEFAULT_SPINNER_VERBS;
577
624
  }
@@ -587,6 +634,7 @@ export class ConfigStore {
587
634
  this.config.intents = { ...DEFAULT_INTENTS, ...(this.config.intents || {}) };
588
635
  this.config.contextProgressBar = { ...DEFAULT_CONTEXT_PROGRESS_BAR, ...(this.config.contextProgressBar || {}) };
589
636
  this.config.messageDisplay = { ...DEFAULT_MESSAGE_DISPLAY, ...(this.config.messageDisplay || {}) };
637
+ this.config.terminalInteraction = resolveTerminalInteractionSettings(this.config.terminalInteraction);
590
638
  this.config.compaction = resolveCompactionSettings(this.config);
591
639
  this.applyEnvOverrides();
592
640
  this.loaded = true;
@@ -599,6 +647,59 @@ export class ConfigStore {
599
647
  this.sessionOverrides = sessionOverrides;
600
648
  this.configScope = scope;
601
649
  }
650
+ /** Copy saved settings and Router credentials, then activate them transactionally.
651
+ * Account registrations retain their credential paths; account homes are not cloned.
652
+ */
653
+ async duplicateProfile(requestedName, source = activeProfile(), activate = () => { }) {
654
+ const name = validateProfileName(requestedName.trim());
655
+ const from = validateProfileName(source);
656
+ if (name === 'default' || builtinProfileEmulation(name)) {
657
+ throw new Error(`Cannot duplicate onto "${name}": it is a built-in profile sharing the default settings. Pick another name.`);
658
+ }
659
+ if (name === from || (await listConfigProfiles()).includes(name)) {
660
+ throw new Error(`Config profile "${name}" already exists. Pick another name.`);
661
+ }
662
+ const sourceDir = profileConfigDir(from);
663
+ const emulation = builtinProfileEmulation(from);
664
+ if (from !== 'default' && !emulation && !(await stat(sourceDir)).isDirectory()) {
665
+ throw new Error(`Config profile "${from}" does not exist.`);
666
+ }
667
+ let saved = {};
668
+ try {
669
+ const parsed = JSON.parse(await readFile(join(sourceDir, 'config.json'), 'utf8'));
670
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
671
+ throw new Error(`Invalid config profile "${from}": expected an object.`);
672
+ }
673
+ saved = parsed;
674
+ }
675
+ catch (error) {
676
+ if (error.code !== 'ENOENT')
677
+ throw error;
678
+ }
679
+ if (emulation)
680
+ saved.emulationId = emulation;
681
+ const destination = profileConfigDir(name);
682
+ await mkdir(dirname(destination), { recursive: true, mode: 0o700 });
683
+ // An existing destination, including one created concurrently, is never ours to modify.
684
+ await mkdir(destination, { mode: 0o700 });
685
+ try {
686
+ await writeFile(join(destination, 'config.json'), JSON.stringify(saved, null, 2), { flag: 'wx', mode: 0o600 });
687
+ try {
688
+ const auth = await readFile(join(sourceDir, 'router-auth.json'));
689
+ await writeFile(join(destination, 'router-auth.json'), auth, { flag: 'wx', mode: 0o600 });
690
+ }
691
+ catch (error) {
692
+ if (error.code !== 'ENOENT')
693
+ throw error;
694
+ }
695
+ await this.switchProfile(name, activate);
696
+ }
697
+ catch (error) {
698
+ await rm(destination, { recursive: true, force: true });
699
+ throw error;
700
+ }
701
+ return name;
702
+ }
602
703
  /** Load a profile in this process; restore the old view if runtime activation fails. */
603
704
  async switchProfile(name, activate) {
604
705
  const next = validateProfileName(name);
@@ -627,6 +728,7 @@ export class ConfigStore {
627
728
  routerCredentialsError: this.routerCredentialsError,
628
729
  routerFallbackWarning: this.routerFallbackWarning,
629
730
  sessionOverrides: this.sessionOverrides,
731
+ restoredSessionSelection: this.restoredSessionSelection,
630
732
  cliOverrides: this.cliOverrides,
631
733
  runtimeActivePerProvider: this.runtimeActivePerProvider,
632
734
  configScope: this.configScope,
@@ -640,6 +742,7 @@ export class ConfigStore {
640
742
  }
641
743
  else {
642
744
  this.sessionOverrides = {};
745
+ this.restoredSessionSelection = false;
643
746
  this.cliOverrides = {};
644
747
  this.runtimeActivePerProvider = {};
645
748
  this.configScope = 'global';
@@ -658,11 +761,13 @@ export class ConfigStore {
658
761
  }
659
762
  }
660
763
  async save() {
764
+ const directory = configDir();
765
+ const path = configFile();
661
766
  if (this.configScope === 'session') {
662
767
  return;
663
768
  }
664
769
  try {
665
- await mkdir(configDir(), { recursive: true });
770
+ await mkdir(directory, { recursive: true });
666
771
  // Don't persist API key if it came from an environment variable
667
772
  const toSave = { ...this.config };
668
773
  if (this.legacyApiKeyFromEnvironment)
@@ -678,8 +783,8 @@ export class ConfigStore {
678
783
  // config.json holds secrets (apiKey, apiKeys, auth.token) — keep it owner-
679
784
  // only. writeFile's mode applies only when it CREATES the file, so also
680
785
  // chmod to tighten an existing 0644 file left by an earlier ZTC.
681
- await writeFile(configFile(), JSON.stringify(toSave, null, 2), { encoding: 'utf-8', mode: 0o600 });
682
- await chmod(configFile(), 0o600);
786
+ await writeFile(path, JSON.stringify(toSave, null, 2), { encoding: 'utf-8', mode: 0o600 });
787
+ await chmod(path, 0o600);
683
788
  }
684
789
  catch (err) {
685
790
  runtimeDiag('error', `Failed to save config: ${err?.message ?? err}`);
@@ -714,7 +819,7 @@ export class ConfigStore {
714
819
  return this.composeConfig(false);
715
820
  }
716
821
  composeConfig(includeEffortOverride) {
717
- return {
822
+ const config = {
718
823
  ...this.config,
719
824
  ...(this.profileEmulation ? { emulationId: this.profileEmulation } : {}),
720
825
  ...this.sessionOverrides,
@@ -727,11 +832,14 @@ export class ConfigStore {
727
832
  provider: this.getProvider(),
728
833
  model: this.getModel(),
729
834
  };
835
+ return { ...config, terminalInteraction: resolveTerminalInteractionSettings(config.terminalInteraction) };
730
836
  }
731
837
  cliOverridesWithoutEffort() {
732
838
  return {
733
839
  ...(this.cliOverrides.provider !== undefined ? { provider: this.cliOverrides.provider } : {}),
734
840
  ...(this.cliOverrides.model !== undefined ? { model: this.cliOverrides.model } : {}),
841
+ ...(this.cliOverrides.authMode !== undefined ? { authMode: this.cliOverrides.authMode } : {}),
842
+ ...(this.cliOverrides.zergProxyUrl !== undefined ? { zergProxyUrl: this.cliOverrides.zergProxyUrl } : {}),
735
843
  };
736
844
  }
737
845
  getMaxTokensSource() {
@@ -747,6 +855,7 @@ export class ConfigStore {
747
855
  }
748
856
  clearSessionOverrides() {
749
857
  this.sessionOverrides = {};
858
+ this.restoredSessionSelection = false;
750
859
  }
751
860
  async withConfigScope(scope, fn) {
752
861
  const previous = this.configScope;
@@ -758,7 +867,23 @@ export class ConfigStore {
758
867
  this.configScope = previous;
759
868
  }
760
869
  }
870
+ releaseRestoredSelection(key) {
871
+ if (!this.restoredSessionSelection || !['provider', 'model', 'authMode', 'zergProxyUrl'].includes(key))
872
+ return;
873
+ for (const route of ['provider', 'model', 'authMode', 'zergProxyUrl'])
874
+ delete this.sessionOverrides[route];
875
+ this.restoredSessionSelection = false;
876
+ }
761
877
  set(key, value) {
878
+ this.releaseRestoredSelection(key);
879
+ if (key === 'terminalInteraction') {
880
+ const normalized = resolveTerminalInteractionSettings(value);
881
+ if (this.configScope === 'session')
882
+ this.sessionOverrides.terminalInteraction = normalized;
883
+ else
884
+ this.config.terminalInteraction = normalized;
885
+ return;
886
+ }
762
887
  if (this.configScope === 'session' || (key === 'emulationId' && this.profileEmulation)) {
763
888
  this.sessionOverrides[key] = value;
764
889
  return;
@@ -768,17 +893,21 @@ export class ConfigStore {
768
893
  this.legacyApiKeyFromEnvironment = false;
769
894
  }
770
895
  setGlobal(key, value) {
896
+ this.releaseRestoredSelection(key);
897
+ if (key === 'terminalInteraction') {
898
+ this.config.terminalInteraction = resolveTerminalInteractionSettings(value);
899
+ return;
900
+ }
771
901
  this.config[key] = value;
772
902
  if (key === 'apiKey')
773
903
  this.legacyApiKeyFromEnvironment = false;
774
904
  }
775
905
  setAll(next) {
906
+ for (const key of Object.keys(next))
907
+ this.releaseRestoredSelection(key);
776
908
  this.config = { ...build_default_config(), ...this.config, ...next };
777
909
  if (Object.hasOwn(next, 'apiKey'))
778
910
  this.legacyApiKeyFromEnvironment = false;
779
- if (this.config.model === 'claude-opus-4-5-20250514' || this.config.model === 'claude-opus-4-20250514') {
780
- this.config.model = 'claude-opus-5';
781
- }
782
911
  if (!this.config.spinnerVerbs) {
783
912
  this.config.spinnerVerbs = DEFAULT_SPINNER_VERBS;
784
913
  }
@@ -794,6 +923,7 @@ export class ConfigStore {
794
923
  this.config.intents = { ...DEFAULT_INTENTS, ...(this.config.intents || {}) };
795
924
  this.config.contextProgressBar = { ...DEFAULT_CONTEXT_PROGRESS_BAR, ...(this.config.contextProgressBar || {}) };
796
925
  this.config.messageDisplay = { ...DEFAULT_MESSAGE_DISPLAY, ...(this.config.messageDisplay || {}) };
926
+ this.config.terminalInteraction = resolveTerminalInteractionSettings(this.config.terminalInteraction);
797
927
  this.config.compaction = resolveCompactionSettings(this.config);
798
928
  this.applyEnvOverrides();
799
929
  this.loaded = true;
@@ -1021,8 +1151,34 @@ export class ConfigStore {
1021
1151
  * Effective Codex effort for the active (or given) provider/model. Priority:
1022
1152
  * per-model > per-provider > global. Defaults to the current provider/model.
1023
1153
  */
1154
+ getReasoningWireSurface(provider = this.getProvider(), model = this.getModel()) {
1155
+ if (provider === 'openai_compatible')
1156
+ return 'chat_tools';
1157
+ if (modelContract(provider, model)?.chatToolReasoningEfforts === undefined)
1158
+ return 'native_api';
1159
+ try {
1160
+ return this.resolveLLMBackendConfig({ provider, model }).useProxy ? 'chat_tools' : 'native_api';
1161
+ }
1162
+ catch (error) {
1163
+ if (error instanceof RouterConfigurationError)
1164
+ return 'chat_tools';
1165
+ throw error;
1166
+ }
1167
+ }
1024
1168
  getCodexEffort(provider, model) {
1025
- return resolveCodexEffort(this.get(), provider ?? this.getProvider(), model ?? this.getModel());
1169
+ const selectedProvider = provider ?? this.getProvider();
1170
+ const selectedModel = model ?? this.getModel();
1171
+ const catalog = this.getRoutedModelCatalog();
1172
+ const capabilities = catalog ? resolveRouterModel(catalog, selectedProvider, selectedModel)?.capabilities : undefined;
1173
+ return resolveCodexEffort(this.get(), selectedProvider, selectedModel, capabilities
1174
+ ?? this.getReasoningWireSurface(selectedProvider, selectedModel));
1175
+ }
1176
+ /** The active transport owns the model's choices, aliases and advertised default. */
1177
+ getReasoningContract(provider = this.getProvider(), model = this.getModel()) {
1178
+ const catalog = this.getRoutedModelCatalog();
1179
+ if (catalog?.version === 1)
1180
+ return resolveRouterModel(catalog, provider, model)?.capabilities?.reasoning ?? [];
1181
+ return this.getReasoningWireSurface(provider, model);
1026
1182
  }
1027
1183
  /** Saved effort the active (or given) model rejects; undefined when it applies. */
1028
1184
  getUnsupportedCodexEffort(provider, model) {
@@ -1201,6 +1357,84 @@ export class ConfigStore {
1201
1357
  authMode: this.getAuthMode(),
1202
1358
  };
1203
1359
  }
1360
+ restoreSessionSelection(metadata) {
1361
+ // Legacy sessions did not persist routes. Explicit launch overrides retain priority.
1362
+ if (!metadata.authMode || this.cliOverrides.provider || this.cliOverrides.model
1363
+ || (metadata.configProfile && metadata.configProfile !== activeProfile()))
1364
+ return;
1365
+ this.restoredSessionSelection = true;
1366
+ this.sessionOverrides.provider = metadata.provider;
1367
+ this.sessionOverrides.model = metadata.model;
1368
+ this.sessionOverrides.authMode = metadata.authMode;
1369
+ if (metadata.authMode !== 'direct' && metadata.routerOrigin && !routerOriginFromEnvironment())
1370
+ this.sessionOverrides.zergProxyUrl = metadata.routerOrigin;
1371
+ }
1372
+ getRouterCatalogConnection(destination = this.get().zergProxyUrl) {
1373
+ const origin = normalizedOrigin(destination);
1374
+ if (!origin)
1375
+ return undefined;
1376
+ const credentials = this.routerCredentials;
1377
+ if (credentials && !this.routerCredentialsError && credentials.origin === origin) {
1378
+ return { origin, token: credentials.token, workspaceId: credentials.workspaceId };
1379
+ }
1380
+ // Platform sessions are scoped to the platform's proxy, never another Router.
1381
+ const token = origin === this.deriveZRouterUrl(this.getApiBaseUrl()) ? this.getAuthToken() : undefined;
1382
+ return token ? { origin, token, workspaceId: this.getActiveWorkspace()?.id.toString() } : undefined;
1383
+ }
1384
+ /** New children use configured routing, not a parent's restored inference route. */
1385
+ getChildAuthMode() {
1386
+ if (!this.restoredSessionSelection)
1387
+ return this.getAuthMode();
1388
+ const { authMode: _restored, ...session } = this.sessionOverrides;
1389
+ return resolveAuthMode({ ...this.config, ...session, ...this.cliOverrides });
1390
+ }
1391
+ async adoptRouterCatalog(catalog) {
1392
+ if (catalog.version !== 1 || catalog.authRequired || this.getResolvedAuthMode() !== 'zrouter')
1393
+ return;
1394
+ const provider = this.getProvider(), model = this.getModel();
1395
+ const row = resolveRouterModel(catalog, provider, model);
1396
+ if (!row || (row.id === model && row.owned_by === provider))
1397
+ return;
1398
+ if (this.cliOverrides.provider || this.cliOverrides.model) {
1399
+ this.cliOverrides.provider = row.owned_by;
1400
+ this.cliOverrides.model = row.id;
1401
+ }
1402
+ else if (this.sessionOverrides.provider || this.sessionOverrides.model) {
1403
+ this.sessionOverrides.provider = row.owned_by;
1404
+ this.sessionOverrides.model = row.id;
1405
+ }
1406
+ else {
1407
+ this.config.provider = row.owned_by;
1408
+ this.config.model = row.id;
1409
+ await this.save();
1410
+ }
1411
+ }
1412
+ getRouterCatalog() {
1413
+ const connection = this.getRouterCatalogConnection();
1414
+ return connection ? readRouterCatalog(connection) : undefined;
1415
+ }
1416
+ getResolvedAuthMode() {
1417
+ const mode = this.getAuthMode();
1418
+ if (mode !== 'auto')
1419
+ return mode;
1420
+ try {
1421
+ return this.resolveLLMBackendConfig().useProxy ? 'zrouter' : 'direct';
1422
+ }
1423
+ catch {
1424
+ return mode;
1425
+ }
1426
+ }
1427
+ getRoutedModelCatalog() {
1428
+ if (isLocalSubscriptionProvider(this.getProvider()))
1429
+ return undefined;
1430
+ return this.getResolvedAuthMode() === 'zrouter' ? this.getRouterCatalog() : undefined;
1431
+ }
1432
+ getModelContextWindow(model = this.getModel(), provider = this.getProvider()) {
1433
+ const catalog = this.getRoutedModelCatalog();
1434
+ if (catalog?.version !== 1)
1435
+ return undefined;
1436
+ return resolveRouterModel(catalog, provider, model)?.capabilities?.context_window ?? null;
1437
+ }
1204
1438
  /**
1205
1439
  * Resolve everything a backend factory needs into one struct. Folds in the
1206
1440
  * provider/model override precedence, the direct-key precedence
@@ -1215,8 +1449,7 @@ export class ConfigStore {
1215
1449
  *
1216
1450
  * Reads through `get()` and the env-aware getters (never raw `this.config`)
1217
1451
  * so cli/session overrides stay honored. `apiKey` is the DIRECT provider key;
1218
- * `authToken`/`useProxy` describe the proxy route separately, so a caller can
1219
- * still prefer a direct key (e.g. Gemini) over the proxy.
1452
+ * `authToken`/`useProxy` describe the selected proxy route separately.
1220
1453
  */
1221
1454
  resolveLLMBackendConfig(opts = {}) {
1222
1455
  // `opts.config` resolves the config reads below (provider, model, authMode,
@@ -1233,15 +1466,15 @@ export class ConfigStore {
1233
1466
  const repoOverride = !opts.provider && !opts.model && !this.hasExplicitModelOverride() && opts.cwd
1234
1467
  ? resolveRepoModelOverride(opts.cwd)
1235
1468
  : null;
1236
- const provider = repoOverride?.provider
1469
+ let provider = repoOverride?.provider
1237
1470
  ?? normalizeProviderId(opts.provider || cfg.provider || this.getProvider());
1238
1471
  const configProvider = cfg.provider ? normalizeProviderId(cfg.provider) : undefined;
1239
- const model = repoOverride?.model
1472
+ let model = repoOverride?.model
1240
1473
  ?? opts.model
1241
1474
  ?? (configProvider === provider ? cfg.model : undefined)
1242
1475
  ?? getDefaultModelForProvider(provider);
1243
- const authMode = resolveAuthMode(cfg);
1244
- const proxyUrl = cfg.zergProxyUrl;
1476
+ const authMode = isLocalSubscriptionProvider(provider) ? 'direct' : resolveAuthMode(cfg);
1477
+ const proxyUrl = normalizedOrigin(cfg.zergProxyUrl);
1245
1478
  // Legacy platform tokens belong only to its /api/zrouter endpoint. A
1246
1479
  // standalone Router requires its own device login, including after logout.
1247
1480
  // Modal shared endpoints are unavailable through the legacy platform proxy.
@@ -1254,7 +1487,7 @@ export class ConfigStore {
1254
1487
  routerError = new Error('Router origin does not match this login. Run ztc auth login --url <origin>.');
1255
1488
  }
1256
1489
  else if (Date.parse(this.routerCredentials.expiresAt) <= Date.now()) {
1257
- routerError = new Error('Router session expired. Run ztc auth login again.');
1490
+ routerError = new RouterConfigurationError('Router session expired. Run ztc auth login again.', 'expired');
1258
1491
  }
1259
1492
  else {
1260
1493
  authToken = this.routerCredentials.token;
@@ -1263,7 +1496,7 @@ export class ConfigStore {
1263
1496
  if (authMode !== 'direct' && routerError) {
1264
1497
  authToken = undefined;
1265
1498
  if (authMode === 'zrouter') {
1266
- throw new RouterConfigurationError(`${routerError.message} For a direct provider, recover with ZTC_LLM_AUTH_MODE=direct.`);
1499
+ throw new RouterConfigurationError(`${routerError.message} For a direct provider, recover with ZTC_LLM_AUTH_MODE=direct.`, routerError instanceof RouterConfigurationError ? routerError.kind : 'configuration');
1267
1500
  }
1268
1501
  if (this.routerFallbackWarning !== routerError.message) {
1269
1502
  runtimeDiag('warn', `${routerError.message} Auto mode is using direct-provider authentication.`);
@@ -1274,7 +1507,7 @@ export class ConfigStore {
1274
1507
  this.routerFallbackWarning = null;
1275
1508
  }
1276
1509
  if (authMode === 'zrouter' && (!proxyUrl || !authToken)) {
1277
- throw new RouterConfigurationError('Router authentication is required. Run ztc auth login before using router mode, or use ZTC_LLM_AUTH_MODE=direct for a direct provider.');
1510
+ throw new RouterConfigurationError('Router authentication is required. Run ztc auth login before using router mode, or use ZTC_LLM_AUTH_MODE=direct for a direct provider.', 'authentication_required');
1278
1511
  }
1279
1512
  // Prefer the per-provider config key over an exported env var for the direct
1280
1513
  // key, matching the pre-seam factory's providerScopedApiKey precedence.
@@ -1293,7 +1526,19 @@ export class ConfigStore {
1293
1526
  || this.getOpenAICompatibleSettings(cfg).baseUrl
1294
1527
  || cfg.openaiCompatibleBaseUrl;
1295
1528
  const proxyAvailable = Boolean(proxyUrl && authToken);
1296
- const useProxy = authMode === 'direct' ? false : proxyAvailable;
1529
+ // Resolve the route here so discovery and backend construction agree. Auto
1530
+ // retains the existing local-subscription and direct-Gemini preferences.
1531
+ const localSubscription = isLocalSubscriptionProvider(provider);
1532
+ const useProxy = authMode === 'direct' ? false : proxyAvailable
1533
+ && !localSubscription && !(authMode === 'auto' && provider === 'gemini' && Boolean(apiKey));
1534
+ if (useProxy) {
1535
+ const catalog = readRouterCatalog({ origin: proxyUrl, token: authToken, workspaceId: this.getRouterCatalogConnection(proxyUrl)?.workspaceId });
1536
+ const descriptor = catalog?.version === 1 ? resolveRouterModel(catalog, provider, model) : undefined;
1537
+ if (descriptor) {
1538
+ provider = descriptor.owned_by;
1539
+ model = descriptor.id;
1540
+ }
1541
+ }
1297
1542
  const compatBaseUrl = provider === 'openai_compatible' && rawCompatBaseUrl
1298
1543
  ? compatEndpoint(rawCompatBaseUrl, { apiKey })
1299
1544
  : rawCompatBaseUrl;
@@ -1314,7 +1559,9 @@ export class ConfigStore {
1314
1559
  codexHome: accountOptions.codexHome,
1315
1560
  codexAuthFilePath: accountOptions.codexAuthFilePath,
1316
1561
  kimiCredsFilePath: accountOptions.kimiCredsFilePath,
1317
- codexEffort: this.getCodexEffort(provider, model),
1562
+ codexEffort: resolveCodexEffort(cfg, provider, model, (useProxy
1563
+ ? this.getRouterCatalog()?.models.find(row => row.id === model && row.owned_by === provider)?.capabilities : undefined)
1564
+ ?? (useProxy || provider === 'openai_compatible' ? 'chat_tools' : 'native_api')),
1318
1565
  };
1319
1566
  }
1320
1567
  getEnvKey(provider) {
@@ -1335,6 +1582,7 @@ export class ConfigStore {
1335
1582
  : undefined;
1336
1583
  case 'openai': return process.env.OPENAI_API_KEY;
1337
1584
  case 'deepseek': return process.env.DEEPSEEK_API_KEY;
1585
+ case 'fireworks': return process.env.FIREWORKS_API_KEY;
1338
1586
  case 'gemini': return process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;
1339
1587
  case 'inception': return process.env.INCEPTION_API_KEY;
1340
1588
  case 'openai_compatible': return process.env.OPENAI_COMPAT_API_KEY;
@@ -0,0 +1,44 @@
1
+ export declare const PROJECT_CONTEXT_SOURCE_LIMIT = 16;
2
+ export declare const PROJECT_CONTEXT_FILE_BYTES: number;
3
+ export declare const PROJECT_CONTEXT_TOTAL_BYTES: number;
4
+ export declare const PROJECT_CONTEXT_INDEX_BYTES: number;
5
+ export declare const PROJECT_CONTEXT_INDEX_PATH = ".ztc/project-context.json";
6
+ export interface ProjectContextSource {
7
+ path: string;
8
+ sha256: string;
9
+ bytes: number;
10
+ git: {
11
+ head: string | null;
12
+ committed: boolean;
13
+ };
14
+ }
15
+ export interface ProjectContextIndexResult {
16
+ status: 'indexed';
17
+ sources: ProjectContextSource[];
18
+ skipped: Array<{
19
+ path: string;
20
+ reason: string;
21
+ }>;
22
+ sourceBytes: number;
23
+ readBytes: number;
24
+ indexPath: string;
25
+ }
26
+ export interface ProjectContextMatch {
27
+ source: ProjectContextSource;
28
+ state: 'current' | 'stale' | 'missing' | 'unreadable';
29
+ excerpt: string;
30
+ line: number;
31
+ excerptTruncated?: true;
32
+ }
33
+ export interface ProjectContextQueryResult {
34
+ status: 'ok' | 'missing_index' | 'invalid_index';
35
+ matches: ProjectContextMatch[];
36
+ unknownSources: Array<{
37
+ path: string;
38
+ reason: string;
39
+ }>;
40
+ indexPath: string;
41
+ omittedMatches: number;
42
+ }
43
+ export declare function indexProjectContext(root: string, paths: string[]): Promise<ProjectContextIndexResult>;
44
+ export declare function queryProjectContext(root: string, query: string, paths?: string[]): Promise<ProjectContextQueryResult>;