@oh-my-pi-zen/pi-coding-agent 16.3.6-zen.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 (2454) hide show
  1. package/CHANGELOG.md +13088 -0
  2. package/README.md +35 -0
  3. package/dist/cli.js +22542 -0
  4. package/dist/types/advisor/__tests__/advisor.test.d.ts +1 -0
  5. package/dist/types/advisor/__tests__/config.test.d.ts +1 -0
  6. package/dist/types/advisor/__tests__/emission-guard.test.d.ts +1 -0
  7. package/dist/types/advisor/advise-tool.d.ts +106 -0
  8. package/dist/types/advisor/config.d.ts +90 -0
  9. package/dist/types/advisor/emission-guard.d.ts +73 -0
  10. package/dist/types/advisor/index.d.ts +6 -0
  11. package/dist/types/advisor/runtime.d.ts +76 -0
  12. package/dist/types/advisor/transcript-recorder.d.ts +63 -0
  13. package/dist/types/advisor/watchdog.d.ts +38 -0
  14. package/dist/types/async/index.d.ts +1 -0
  15. package/dist/types/async/job-manager.d.ts +121 -0
  16. package/dist/types/auto-thinking/classifier.d.ts +37 -0
  17. package/dist/types/autolearn/controller.d.ts +25 -0
  18. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  19. package/dist/types/autoresearch/dashboard.d.ts +4 -0
  20. package/dist/types/autoresearch/git.d.ts +36 -0
  21. package/dist/types/autoresearch/helpers.d.ts +24 -0
  22. package/dist/types/autoresearch/index.d.ts +2 -0
  23. package/dist/types/autoresearch/state.d.ts +17 -0
  24. package/dist/types/autoresearch/storage.d.ts +142 -0
  25. package/dist/types/autoresearch/tools/init-experiment.d.ts +27 -0
  26. package/dist/types/autoresearch/tools/log-experiment.d.ts +21 -0
  27. package/dist/types/autoresearch/tools/run-experiment.d.ts +7 -0
  28. package/dist/types/autoresearch/tools/update-notes.d.ts +11 -0
  29. package/dist/types/autoresearch/types.d.ts +154 -0
  30. package/dist/types/capability/context-file.d.ts +17 -0
  31. package/dist/types/capability/extension-module.d.ts +15 -0
  32. package/dist/types/capability/extension.d.ts +28 -0
  33. package/dist/types/capability/fs.d.ts +20 -0
  34. package/dist/types/capability/hook.d.ts +19 -0
  35. package/dist/types/capability/index.d.ts +80 -0
  36. package/dist/types/capability/instruction.d.ts +17 -0
  37. package/dist/types/capability/mcp.d.ts +47 -0
  38. package/dist/types/capability/prompt.d.ts +15 -0
  39. package/dist/types/capability/rule-buckets.d.ts +30 -0
  40. package/dist/types/capability/rule.d.ts +73 -0
  41. package/dist/types/capability/settings.d.ts +15 -0
  42. package/dist/types/capability/skill.d.ts +43 -0
  43. package/dist/types/capability/slash-command.d.ts +17 -0
  44. package/dist/types/capability/ssh.d.ts +23 -0
  45. package/dist/types/capability/system-prompt.d.ts +15 -0
  46. package/dist/types/capability/tool.d.ts +19 -0
  47. package/dist/types/capability/types.d.ts +154 -0
  48. package/dist/types/cli/agents-cli.d.ts +12 -0
  49. package/dist/types/cli/args.d.ts +77 -0
  50. package/dist/types/cli/auth-broker-cli.d.ts +25 -0
  51. package/dist/types/cli/auth-gateway-cli.d.ts +26 -0
  52. package/dist/types/cli/bench-cli.d.ts +85 -0
  53. package/dist/types/cli/classify-install-target.d.ts +12 -0
  54. package/dist/types/cli/claude-trace-cli.d.ts +54 -0
  55. package/dist/types/cli/commands/init-xdg.d.ts +1 -0
  56. package/dist/types/cli/completion-gen.d.ts +80 -0
  57. package/dist/types/cli/config-cli.d.ts +22 -0
  58. package/dist/types/cli/dry-balance-cli.d.ts +113 -0
  59. package/dist/types/cli/extension-flags.d.ts +36 -0
  60. package/dist/types/cli/file-processor.d.ts +11 -0
  61. package/dist/types/cli/flag-tables.d.ts +144 -0
  62. package/dist/types/cli/gallery-cli.d.ts +49 -0
  63. package/dist/types/cli/gallery-fixtures/agentic.d.ts +2 -0
  64. package/dist/types/cli/gallery-fixtures/codeintel.d.ts +3 -0
  65. package/dist/types/cli/gallery-fixtures/edit.d.ts +3 -0
  66. package/dist/types/cli/gallery-fixtures/fs.d.ts +2 -0
  67. package/dist/types/cli/gallery-fixtures/index.d.ts +4 -0
  68. package/dist/types/cli/gallery-fixtures/interaction.d.ts +3 -0
  69. package/dist/types/cli/gallery-fixtures/memory.d.ts +2 -0
  70. package/dist/types/cli/gallery-fixtures/misc.d.ts +3 -0
  71. package/dist/types/cli/gallery-fixtures/search.d.ts +3 -0
  72. package/dist/types/cli/gallery-fixtures/shell.d.ts +3 -0
  73. package/dist/types/cli/gallery-fixtures/types.d.ts +55 -0
  74. package/dist/types/cli/gallery-fixtures/web.d.ts +2 -0
  75. package/dist/types/cli/gallery-screenshot.d.ts +35 -0
  76. package/dist/types/cli/gc-cli.d.ts +58 -0
  77. package/dist/types/cli/grep-cli.d.ts +17 -0
  78. package/dist/types/cli/grievances-cli.d.ts +37 -0
  79. package/dist/types/cli/initial-message.d.ts +17 -0
  80. package/dist/types/cli/models-cli.d.ts +49 -0
  81. package/dist/types/cli/plugin-cli.d.ts +32 -0
  82. package/dist/types/cli/profile-alias.d.ts +29 -0
  83. package/dist/types/cli/profile-bootstrap.d.ts +55 -0
  84. package/dist/types/cli/read-cli.d.ts +4 -0
  85. package/dist/types/cli/session-picker.d.ts +11 -0
  86. package/dist/types/cli/setup-cli.d.ts +24 -0
  87. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  88. package/dist/types/cli/shell-cli.d.ts +8 -0
  89. package/dist/types/cli/ssh-cli.d.ts +21 -0
  90. package/dist/types/cli/startup-cwd.d.ts +2 -0
  91. package/dist/types/cli/stats-cli.d.ts +17 -0
  92. package/dist/types/cli/tiny-models-cli.d.ts +11 -0
  93. package/dist/types/cli/ttsr-cli.d.ts +39 -0
  94. package/dist/types/cli/update-cli.d.ts +106 -0
  95. package/dist/types/cli/update-cli.test.d.ts +1 -0
  96. package/dist/types/cli/usage-cli.d.ts +95 -0
  97. package/dist/types/cli/web-search-cli.d.ts +20 -0
  98. package/dist/types/cli/worktree-cli.d.ts +26 -0
  99. package/dist/types/cli-commands.d.ts +33 -0
  100. package/dist/types/cli.d.ts +3 -0
  101. package/dist/types/collab/crypto.d.ts +7 -0
  102. package/dist/types/collab/display-name.d.ts +3 -0
  103. package/dist/types/collab/guest.d.ts +52 -0
  104. package/dist/types/collab/host.d.ts +43 -0
  105. package/dist/types/collab/protocol.d.ts +143 -0
  106. package/dist/types/collab/relay-client.d.ts +22 -0
  107. package/dist/types/collab/replication-shrink.d.ts +39 -0
  108. package/dist/types/commands/acp.d.ts +12 -0
  109. package/dist/types/commands/agents.d.ts +34 -0
  110. package/dist/types/commands/auth-broker.d.ts +54 -0
  111. package/dist/types/commands/auth-gateway.d.ts +35 -0
  112. package/dist/types/commands/bench.d.ts +37 -0
  113. package/dist/types/commands/commit.d.ts +27 -0
  114. package/dist/types/commands/complete.d.ts +6 -0
  115. package/dist/types/commands/completions.d.ts +13 -0
  116. package/dist/types/commands/config.d.ts +30 -0
  117. package/dist/types/commands/dry-balance.d.ts +31 -0
  118. package/dist/types/commands/gallery.d.ts +47 -0
  119. package/dist/types/commands/gc.d.ts +37 -0
  120. package/dist/types/commands/grep.d.ts +42 -0
  121. package/dist/types/commands/grievances.d.ts +40 -0
  122. package/dist/types/commands/install.d.ts +51 -0
  123. package/dist/types/commands/join.d.ts +12 -0
  124. package/dist/types/commands/launch.d.ts +148 -0
  125. package/dist/types/commands/models.d.ts +33 -0
  126. package/dist/types/commands/plugin.d.ts +52 -0
  127. package/dist/types/commands/read.d.ts +15 -0
  128. package/dist/types/commands/say.d.ts +24 -0
  129. package/dist/types/commands/setup.d.ts +34 -0
  130. package/dist/types/commands/shell.d.ts +21 -0
  131. package/dist/types/commands/ssh.d.ts +48 -0
  132. package/dist/types/commands/stats.d.ts +25 -0
  133. package/dist/types/commands/tiny-models.d.ts +22 -0
  134. package/dist/types/commands/token.d.ts +34 -0
  135. package/dist/types/commands/ttsr.d.ts +57 -0
  136. package/dist/types/commands/update.d.ts +25 -0
  137. package/dist/types/commands/usage.d.ts +34 -0
  138. package/dist/types/commands/web-search.d.ts +33 -0
  139. package/dist/types/commands/worktree.d.ts +31 -0
  140. package/dist/types/commit/agentic/agent.d.ts +31 -0
  141. package/dist/types/commit/agentic/fallback.d.ts +5 -0
  142. package/dist/types/commit/agentic/index.d.ts +2 -0
  143. package/dist/types/commit/agentic/state.d.ts +58 -0
  144. package/dist/types/commit/agentic/tools/analyze-file.d.ts +18 -0
  145. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +9 -0
  146. package/dist/types/commit/agentic/tools/git-hunk.d.ts +8 -0
  147. package/dist/types/commit/agentic/tools/git-overview.d.ts +8 -0
  148. package/dist/types/commit/agentic/tools/index.d.ts +16 -0
  149. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +27 -0
  150. package/dist/types/commit/agentic/tools/propose-commit.d.ts +15 -0
  151. package/dist/types/commit/agentic/tools/recent-commits.d.ts +6 -0
  152. package/dist/types/commit/agentic/tools/schemas.d.ts +6 -0
  153. package/dist/types/commit/agentic/tools/split-commit.d.ts +32 -0
  154. package/dist/types/commit/agentic/topo-sort.d.ts +4 -0
  155. package/dist/types/commit/agentic/trivial.d.ts +7 -0
  156. package/dist/types/commit/agentic/validation.d.ts +20 -0
  157. package/dist/types/commit/analysis/conventional.d.ts +22 -0
  158. package/dist/types/commit/analysis/index.d.ts +4 -0
  159. package/dist/types/commit/analysis/scope.d.ts +6 -0
  160. package/dist/types/commit/analysis/summary.d.ts +19 -0
  161. package/dist/types/commit/analysis/validation.d.ts +8 -0
  162. package/dist/types/commit/changelog/detect.d.ts +2 -0
  163. package/dist/types/commit/changelog/generate.d.ts +29 -0
  164. package/dist/types/commit/changelog/index.d.ts +30 -0
  165. package/dist/types/commit/changelog/parse.d.ts +2 -0
  166. package/dist/types/commit/cli.d.ts +3 -0
  167. package/dist/types/commit/git/diff.d.ts +5 -0
  168. package/dist/types/commit/index.d.ts +4 -0
  169. package/dist/types/commit/map-reduce/index.d.ts +28 -0
  170. package/dist/types/commit/map-reduce/map-phase.d.ts +17 -0
  171. package/dist/types/commit/map-reduce/reduce-phase.d.ts +13 -0
  172. package/dist/types/commit/map-reduce/utils.d.ts +2 -0
  173. package/dist/types/commit/message.d.ts +2 -0
  174. package/dist/types/commit/model-selection.d.ts +26 -0
  175. package/dist/types/commit/pipeline.d.ts +5 -0
  176. package/dist/types/commit/shared-llm.d.ts +27 -0
  177. package/dist/types/commit/types.d.ts +78 -0
  178. package/dist/types/commit/utils/exclusions.d.ts +4 -0
  179. package/dist/types/commit/utils.d.ts +20 -0
  180. package/dist/types/config/api-key-resolver.d.ts +43 -0
  181. package/dist/types/config/append-only-context-mode.d.ts +9 -0
  182. package/dist/types/config/config-file.d.ts +62 -0
  183. package/dist/types/config/file-lock.d.ts +29 -0
  184. package/dist/types/config/inline-tool-descriptors-mode.d.ts +12 -0
  185. package/dist/types/config/keybindings.d.ts +362 -0
  186. package/dist/types/config/model-discovery.d.ts +68 -0
  187. package/dist/types/config/model-registry.d.ts +251 -0
  188. package/dist/types/config/model-resolver.d.ts +300 -0
  189. package/dist/types/config/model-roles.d.ts +29 -0
  190. package/dist/types/config/models-config-schema.d.ts +697 -0
  191. package/dist/types/config/models-config.d.ts +436 -0
  192. package/dist/types/config/prompt-templates.d.ts +32 -0
  193. package/dist/types/config/provider-globals.d.ts +7 -0
  194. package/dist/types/config/resolve-config-value.d.ts +17 -0
  195. package/dist/types/config/service-tier.d.ts +49 -0
  196. package/dist/types/config/settings-schema.d.ts +5668 -0
  197. package/dist/types/config/settings.d.ts +181 -0
  198. package/dist/types/config.d.ts +92 -0
  199. package/dist/types/cursor.d.ts +22 -0
  200. package/dist/types/dap/client.d.ts +46 -0
  201. package/dist/types/dap/config.d.ts +19 -0
  202. package/dist/types/dap/index.d.ts +4 -0
  203. package/dist/types/dap/session.d.ts +108 -0
  204. package/dist/types/dap/types.d.ts +534 -0
  205. package/dist/types/debug/index.d.ts +15 -0
  206. package/dist/types/debug/log-formatting.d.ts +4 -0
  207. package/dist/types/debug/log-viewer.d.ts +69 -0
  208. package/dist/types/debug/profiler.d.ts +24 -0
  209. package/dist/types/debug/protocol-probe.d.ts +38 -0
  210. package/dist/types/debug/raw-sse-buffer.d.ts +44 -0
  211. package/dist/types/debug/raw-sse.d.ts +19 -0
  212. package/dist/types/debug/remote-debugger.d.ts +45 -0
  213. package/dist/types/debug/report-bundle.d.ts +58 -0
  214. package/dist/types/debug/system-info.d.ts +26 -0
  215. package/dist/types/debug/terminal-info.d.ts +33 -0
  216. package/dist/types/discovery/agents-md.d.ts +1 -0
  217. package/dist/types/discovery/agents.d.ts +12 -0
  218. package/dist/types/discovery/at-imports.d.ts +15 -0
  219. package/dist/types/discovery/builtin-defaults.d.ts +1 -0
  220. package/dist/types/discovery/builtin-rules/index.d.ts +7 -0
  221. package/dist/types/discovery/builtin.d.ts +1 -0
  222. package/dist/types/discovery/claude-plugins.d.ts +1 -0
  223. package/dist/types/discovery/claude.d.ts +1 -0
  224. package/dist/types/discovery/cline.d.ts +1 -0
  225. package/dist/types/discovery/codex.d.ts +1 -0
  226. package/dist/types/discovery/cursor.d.ts +16 -0
  227. package/dist/types/discovery/gemini.d.ts +1 -0
  228. package/dist/types/discovery/github.d.ts +1 -0
  229. package/dist/types/discovery/helpers.d.ts +278 -0
  230. package/dist/types/discovery/index.d.ts +53 -0
  231. package/dist/types/discovery/mcp-json.d.ts +1 -0
  232. package/dist/types/discovery/omp-extension-roots.d.ts +43 -0
  233. package/dist/types/discovery/omp-plugins.d.ts +1 -0
  234. package/dist/types/discovery/opencode.d.ts +1 -0
  235. package/dist/types/discovery/plugin-dir-roots.d.ts +15 -0
  236. package/dist/types/discovery/ssh.d.ts +1 -0
  237. package/dist/types/discovery/substitute-plugin-root.d.ts +1 -0
  238. package/dist/types/discovery/vscode.d.ts +1 -0
  239. package/dist/types/discovery/windsurf.d.ts +13 -0
  240. package/dist/types/edit/apply-patch/index.d.ts +35 -0
  241. package/dist/types/edit/apply-patch/parser.d.ts +34 -0
  242. package/dist/types/edit/diff.d.ts +60 -0
  243. package/dist/types/edit/file-snapshot-store.d.ts +74 -0
  244. package/dist/types/edit/hashline/block-resolver.d.ts +9 -0
  245. package/dist/types/edit/hashline/diff.d.ts +29 -0
  246. package/dist/types/edit/hashline/execute.d.ts +28 -0
  247. package/dist/types/edit/hashline/filesystem.d.ts +43 -0
  248. package/dist/types/edit/hashline/index.d.ts +5 -0
  249. package/dist/types/edit/hashline/noop-loop-guard.d.ts +72 -0
  250. package/dist/types/edit/hashline/params.d.ts +4 -0
  251. package/dist/types/edit/index.d.ts +83 -0
  252. package/dist/types/edit/modes/apply-patch.d.ts +23 -0
  253. package/dist/types/edit/modes/patch.d.ts +101 -0
  254. package/dist/types/edit/modes/replace.d.ts +141 -0
  255. package/dist/types/edit/normalize.d.ts +31 -0
  256. package/dist/types/edit/notebook.d.ts +23 -0
  257. package/dist/types/edit/read-file.d.ts +2 -0
  258. package/dist/types/edit/renderer.d.ts +118 -0
  259. package/dist/types/edit/snapshot-details.d.ts +33 -0
  260. package/dist/types/edit/streaming.d.ts +105 -0
  261. package/dist/types/eval/__tests__/agent-bridge.test.d.ts +1 -0
  262. package/dist/types/eval/__tests__/bridge-timeout.test.d.ts +1 -0
  263. package/dist/types/eval/__tests__/budget-bridge.test.d.ts +1 -0
  264. package/dist/types/eval/__tests__/completion-bridge.test.d.ts +1 -0
  265. package/dist/types/eval/__tests__/helpers-local-roots.test.d.ts +1 -0
  266. package/dist/types/eval/__tests__/idle-timeout.test.d.ts +1 -0
  267. package/dist/types/eval/__tests__/js-context-manager.test.d.ts +1 -0
  268. package/dist/types/eval/__tests__/julia-prelude.test.d.ts +1 -0
  269. package/dist/types/eval/__tests__/kernel-spawn.test.d.ts +1 -0
  270. package/dist/types/eval/__tests__/prelude-agent.test.d.ts +1 -0
  271. package/dist/types/eval/agent-bridge.d.ts +48 -0
  272. package/dist/types/eval/backend-helpers.d.ts +23 -0
  273. package/dist/types/eval/backend.d.ts +60 -0
  274. package/dist/types/eval/bridge-timeout.d.ts +27 -0
  275. package/dist/types/eval/budget-bridge.d.ts +29 -0
  276. package/dist/types/eval/completion-bridge.d.ts +25 -0
  277. package/dist/types/eval/concurrency-bridge.d.ts +26 -0
  278. package/dist/types/eval/executor-base.d.ts +118 -0
  279. package/dist/types/eval/idle-timeout.d.ts +26 -0
  280. package/dist/types/eval/index.d.ts +6 -0
  281. package/dist/types/eval/jl/executor.d.ts +44 -0
  282. package/dist/types/eval/jl/index.d.ts +11 -0
  283. package/dist/types/eval/jl/kernel.d.ts +28 -0
  284. package/dist/types/eval/jl/prelude.d.ts +1 -0
  285. package/dist/types/eval/jl/runtime.d.ts +22 -0
  286. package/dist/types/eval/js/context-manager.d.ts +40 -0
  287. package/dist/types/eval/js/executor.d.ts +38 -0
  288. package/dist/types/eval/js/index.d.ts +11 -0
  289. package/dist/types/eval/js/shared/helpers.d.ts +32 -0
  290. package/dist/types/eval/js/shared/indirect-eval.d.ts +14 -0
  291. package/dist/types/eval/js/shared/local-module-loader.d.ts +16 -0
  292. package/dist/types/eval/js/shared/prelude.d.ts +1 -0
  293. package/dist/types/eval/js/shared/rewrite-imports.d.ts +25 -0
  294. package/dist/types/eval/js/shared/runtime.d.ts +59 -0
  295. package/dist/types/eval/js/shared/types.d.ts +24 -0
  296. package/dist/types/eval/js/tool-bridge.d.ts +20 -0
  297. package/dist/types/eval/js/worker-core.d.ts +6 -0
  298. package/dist/types/eval/js/worker-entry.d.ts +1 -0
  299. package/dist/types/eval/js/worker-protocol.d.ts +83 -0
  300. package/dist/types/eval/kernel-base.d.ts +105 -0
  301. package/dist/types/eval/py/__tests__/prelude.test.d.ts +1 -0
  302. package/dist/types/eval/py/__tests__/runner-shell-output.test.d.ts +1 -0
  303. package/dist/types/eval/py/display.d.ts +25 -0
  304. package/dist/types/eval/py/executor.d.ts +107 -0
  305. package/dist/types/eval/py/index.d.ts +11 -0
  306. package/dist/types/eval/py/kernel.d.ts +17 -0
  307. package/dist/types/eval/py/prelude.d.ts +1 -0
  308. package/dist/types/eval/py/runtime.d.ts +40 -0
  309. package/dist/types/eval/py/spawn-options.d.ts +58 -0
  310. package/dist/types/eval/py/tool-bridge.d.ts +16 -0
  311. package/dist/types/eval/rb/executor.d.ts +77 -0
  312. package/dist/types/eval/rb/index.d.ts +11 -0
  313. package/dist/types/eval/rb/kernel.d.ts +31 -0
  314. package/dist/types/eval/rb/prelude.d.ts +1 -0
  315. package/dist/types/eval/rb/runtime.d.ts +23 -0
  316. package/dist/types/eval/runtime-env.d.ts +24 -0
  317. package/dist/types/eval/session-id.d.ts +3 -0
  318. package/dist/types/eval/types.d.ts +52 -0
  319. package/dist/types/exa/index.d.ts +2 -0
  320. package/dist/types/exa/mcp-client.d.ts +53 -0
  321. package/dist/types/exa/types.d.ts +72 -0
  322. package/dist/types/exec/bash-executor.d.ts +45 -0
  323. package/dist/types/exec/exec.d.ts +25 -0
  324. package/dist/types/exec/non-interactive-env.d.ts +3 -0
  325. package/dist/types/export/custom-share.d.ts +19 -0
  326. package/dist/types/export/html/index.d.ts +78 -0
  327. package/dist/types/export/html/web-palette.d.ts +117 -0
  328. package/dist/types/export/share.d.ts +55 -0
  329. package/dist/types/export/ttsr.d.ts +67 -0
  330. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +9 -0
  331. package/dist/types/extensibility/custom-commands/bundled/review/index.d.ts +10 -0
  332. package/dist/types/extensibility/custom-commands/index.d.ts +2 -0
  333. package/dist/types/extensibility/custom-commands/loader.d.ts +29 -0
  334. package/dist/types/extensibility/custom-commands/types.d.ts +112 -0
  335. package/dist/types/extensibility/custom-tools/index.d.ts +6 -0
  336. package/dist/types/extensibility/custom-tools/loader.d.ts +89 -0
  337. package/dist/types/extensibility/custom-tools/types.d.ts +244 -0
  338. package/dist/types/extensibility/custom-tools/wrapper.d.ts +23 -0
  339. package/dist/types/extensibility/extensions/compact-handler.d.ts +26 -0
  340. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +29 -0
  341. package/dist/types/extensibility/extensions/index.d.ts +8 -0
  342. package/dist/types/extensibility/extensions/loader.d.ts +59 -0
  343. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  344. package/dist/types/extensibility/extensions/runner.d.ts +161 -0
  345. package/dist/types/extensibility/extensions/types.d.ts +962 -0
  346. package/dist/types/extensibility/extensions/wrapper.d.ts +54 -0
  347. package/dist/types/extensibility/hooks/index.d.ts +6 -0
  348. package/dist/types/extensibility/hooks/loader.d.ts +65 -0
  349. package/dist/types/extensibility/hooks/runner.d.ts +126 -0
  350. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +25 -0
  351. package/dist/types/extensibility/hooks/types.d.ts +442 -0
  352. package/dist/types/extensibility/legacy-pi-ai-shim.d.ts +35 -0
  353. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +115 -0
  354. package/dist/types/extensibility/plugins/doctor.d.ts +3 -0
  355. package/dist/types/extensibility/plugins/git-url.d.ts +44 -0
  356. package/dist/types/extensibility/plugins/index.d.ts +7 -0
  357. package/dist/types/extensibility/plugins/installer.d.ts +5 -0
  358. package/dist/types/extensibility/plugins/legacy-pi-bundled-keys.d.ts +10 -0
  359. package/dist/types/extensibility/plugins/legacy-pi-bundled-registry.d.ts +10 -0
  360. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +79 -0
  361. package/dist/types/extensibility/plugins/loader.d.ts +59 -0
  362. package/dist/types/extensibility/plugins/manager.d.ts +76 -0
  363. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +41 -0
  364. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +48 -0
  365. package/dist/types/extensibility/plugins/marketplace/index.d.ts +6 -0
  366. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +57 -0
  367. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +34 -0
  368. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +28 -0
  369. package/dist/types/extensibility/plugins/marketplace/types.d.ts +131 -0
  370. package/dist/types/extensibility/plugins/marketplace-auto-update.d.ts +8 -0
  371. package/dist/types/extensibility/plugins/parser.d.ts +53 -0
  372. package/dist/types/extensibility/plugins/runtime-config.d.ts +3 -0
  373. package/dist/types/extensibility/plugins/types.d.ts +149 -0
  374. package/dist/types/extensibility/session-handler-types.d.ts +23 -0
  375. package/dist/types/extensibility/shared-events.d.ts +308 -0
  376. package/dist/types/extensibility/skills.d.ts +97 -0
  377. package/dist/types/extensibility/slash-commands.d.ts +38 -0
  378. package/dist/types/extensibility/tool-event-input.d.ts +9 -0
  379. package/dist/types/extensibility/tool-proxy.d.ts +4 -0
  380. package/dist/types/extensibility/typebox.d.ts +177 -0
  381. package/dist/types/extensibility/utils.d.ts +24 -0
  382. package/dist/types/goals/guided-setup.d.ts +18 -0
  383. package/dist/types/goals/index.d.ts +3 -0
  384. package/dist/types/goals/runtime.d.ts +69 -0
  385. package/dist/types/goals/state.d.ts +35 -0
  386. package/dist/types/goals/tools/goal-tool.d.ts +53 -0
  387. package/dist/types/hindsight/backend.d.ts +13 -0
  388. package/dist/types/hindsight/bank.d.ts +62 -0
  389. package/dist/types/hindsight/client.d.ts +228 -0
  390. package/dist/types/hindsight/client.test.d.ts +1 -0
  391. package/dist/types/hindsight/config.d.ts +51 -0
  392. package/dist/types/hindsight/content.d.ts +73 -0
  393. package/dist/types/hindsight/index.d.ts +8 -0
  394. package/dist/types/hindsight/mental-models.d.ts +134 -0
  395. package/dist/types/hindsight/state.d.ts +105 -0
  396. package/dist/types/hindsight/transcript.d.ts +28 -0
  397. package/dist/types/index.d.ts +43 -0
  398. package/dist/types/internal-urls/__tests__/ssh-protocol.test.d.ts +1 -0
  399. package/dist/types/internal-urls/agent-protocol.d.ts +13 -0
  400. package/dist/types/internal-urls/artifact-protocol.d.ts +15 -0
  401. package/dist/types/internal-urls/docs-index.d.ts +19 -0
  402. package/dist/types/internal-urls/filesystem-resource.d.ts +9 -0
  403. package/dist/types/internal-urls/history-protocol.d.ts +14 -0
  404. package/dist/types/internal-urls/index.d.ts +25 -0
  405. package/dist/types/internal-urls/issue-pr-protocol.d.ts +17 -0
  406. package/dist/types/internal-urls/json-query.d.ts +30 -0
  407. package/dist/types/internal-urls/local-protocol.d.ts +79 -0
  408. package/dist/types/internal-urls/mcp-protocol.d.ts +12 -0
  409. package/dist/types/internal-urls/memory-protocol.d.ts +24 -0
  410. package/dist/types/internal-urls/omp-protocol.d.ts +13 -0
  411. package/dist/types/internal-urls/parse.d.ts +19 -0
  412. package/dist/types/internal-urls/registry-helpers.d.ts +12 -0
  413. package/dist/types/internal-urls/router.d.ts +21 -0
  414. package/dist/types/internal-urls/rule-protocol.d.ts +7 -0
  415. package/dist/types/internal-urls/skill-protocol.d.ts +14 -0
  416. package/dist/types/internal-urls/ssh-protocol.d.ts +10 -0
  417. package/dist/types/internal-urls/types.d.ts +175 -0
  418. package/dist/types/internal-urls/vault-protocol.d.ts +93 -0
  419. package/dist/types/irc/bus.d.ts +86 -0
  420. package/dist/types/jsonrpc/message-framing.d.ts +35 -0
  421. package/dist/types/lib/xai-http.d.ts +40 -0
  422. package/dist/types/lsp/client.d.ts +84 -0
  423. package/dist/types/lsp/clients/biome-client.d.ts +16 -0
  424. package/dist/types/lsp/clients/index.d.ts +19 -0
  425. package/dist/types/lsp/clients/lsp-linter-client.d.ts +16 -0
  426. package/dist/types/lsp/clients/swiftlint-client.d.ts +20 -0
  427. package/dist/types/lsp/config.d.ts +69 -0
  428. package/dist/types/lsp/diagnostics-ledger.d.ts +10 -0
  429. package/dist/types/lsp/edits.d.ts +34 -0
  430. package/dist/types/lsp/format-options.d.ts +32 -0
  431. package/dist/types/lsp/index.d.ts +120 -0
  432. package/dist/types/lsp/lspmux.d.ts +58 -0
  433. package/dist/types/lsp/render.d.ts +32 -0
  434. package/dist/types/lsp/startup-events.d.ts +11 -0
  435. package/dist/types/lsp/types.d.ts +300 -0
  436. package/dist/types/lsp/utils.d.ts +116 -0
  437. package/dist/types/main.d.ts +70 -0
  438. package/dist/types/markit/converters/docx.d.ts +6 -0
  439. package/dist/types/markit/converters/epub.d.ts +15 -0
  440. package/dist/types/markit/converters/pdf/columns.d.ts +35 -0
  441. package/dist/types/markit/converters/pdf/extract.d.ts +10 -0
  442. package/dist/types/markit/converters/pdf/grid.d.ts +25 -0
  443. package/dist/types/markit/converters/pdf/headers.d.ts +24 -0
  444. package/dist/types/markit/converters/pdf/index.d.ts +6 -0
  445. package/dist/types/markit/converters/pdf/render.d.ts +24 -0
  446. package/dist/types/markit/converters/pdf/types.d.ts +75 -0
  447. package/dist/types/markit/converters/pptx.d.ts +57 -0
  448. package/dist/types/markit/converters/xlsx.d.ts +25 -0
  449. package/dist/types/markit/index.d.ts +2 -0
  450. package/dist/types/markit/registry.d.ts +16 -0
  451. package/dist/types/markit/types.d.ts +30 -0
  452. package/dist/types/mcp/client.d.ts +83 -0
  453. package/dist/types/mcp/config-writer.d.ts +101 -0
  454. package/dist/types/mcp/config.d.ts +75 -0
  455. package/dist/types/mcp/index.d.ts +18 -0
  456. package/dist/types/mcp/json-rpc.d.ts +32 -0
  457. package/dist/types/mcp/loader.d.ts +44 -0
  458. package/dist/types/mcp/manager.d.ts +215 -0
  459. package/dist/types/mcp/oauth-credentials.d.ts +17 -0
  460. package/dist/types/mcp/oauth-discovery.d.ts +65 -0
  461. package/dist/types/mcp/oauth-flow.d.ts +145 -0
  462. package/dist/types/mcp/render.d.ts +25 -0
  463. package/dist/types/mcp/smithery-auth.d.ts +16 -0
  464. package/dist/types/mcp/smithery-connect.d.ts +38 -0
  465. package/dist/types/mcp/smithery-registry.d.ts +52 -0
  466. package/dist/types/mcp/smithery-registry.test.d.ts +1 -0
  467. package/dist/types/mcp/startup-events.d.ts +28 -0
  468. package/dist/types/mcp/timeout.d.ts +9 -0
  469. package/dist/types/mcp/tool-bridge.d.ts +95 -0
  470. package/dist/types/mcp/tool-cache.d.ts +8 -0
  471. package/dist/types/mcp/transports/http.d.ts +45 -0
  472. package/dist/types/mcp/transports/index.d.ts +6 -0
  473. package/dist/types/mcp/transports/sse.d.ts +20 -0
  474. package/dist/types/mcp/transports/stdio.d.ts +108 -0
  475. package/dist/types/mcp/transports/stdio.test.d.ts +1 -0
  476. package/dist/types/mcp/types.d.ts +340 -0
  477. package/dist/types/memories/index.d.ts +54 -0
  478. package/dist/types/memories/storage.d.ts +110 -0
  479. package/dist/types/memory-backend/index.d.ts +7 -0
  480. package/dist/types/memory-backend/local-backend.d.ts +10 -0
  481. package/dist/types/memory-backend/off-backend.d.ts +7 -0
  482. package/dist/types/memory-backend/resolve.d.ts +16 -0
  483. package/dist/types/memory-backend/runtime.d.ts +4 -0
  484. package/dist/types/memory-backend/types.d.ts +132 -0
  485. package/dist/types/mnemopi/backend.d.ts +4 -0
  486. package/dist/types/mnemopi/config.d.ts +60 -0
  487. package/dist/types/mnemopi/embed-client.d.ts +53 -0
  488. package/dist/types/mnemopi/embed-protocol.d.ts +52 -0
  489. package/dist/types/mnemopi/embed-worker.d.ts +12 -0
  490. package/dist/types/mnemopi/index.d.ts +3 -0
  491. package/dist/types/mnemopi/state.d.ts +130 -0
  492. package/dist/types/modes/acp/acp-agent.d.ts +60 -0
  493. package/dist/types/modes/acp/acp-client-bridge.d.ts +9 -0
  494. package/dist/types/modes/acp/acp-event-mapper.d.ts +33 -0
  495. package/dist/types/modes/acp/acp-mode.d.ts +5 -0
  496. package/dist/types/modes/acp/index.d.ts +2 -0
  497. package/dist/types/modes/acp/terminal-auth.d.ts +6 -0
  498. package/dist/types/modes/components/__tests__/move-overlay.test.d.ts +1 -0
  499. package/dist/types/modes/components/__tests__/skill-message.test.d.ts +1 -0
  500. package/dist/types/modes/components/advisor-config.d.ts +59 -0
  501. package/dist/types/modes/components/advisor-message.d.ts +11 -0
  502. package/dist/types/modes/components/agent-dashboard.d.ts +22 -0
  503. package/dist/types/modes/components/agent-hub.d.ts +77 -0
  504. package/dist/types/modes/components/agent-transcript-viewer.d.ts +40 -0
  505. package/dist/types/modes/components/assistant-message.d.ts +58 -0
  506. package/dist/types/modes/components/background-tan-message.d.ts +9 -0
  507. package/dist/types/modes/components/bash-execution.d.ts +35 -0
  508. package/dist/types/modes/components/bordered-loader.d.ts +11 -0
  509. package/dist/types/modes/components/btw-panel.d.ts +19 -0
  510. package/dist/types/modes/components/cache-invalidation-marker.d.ts +52 -0
  511. package/dist/types/modes/components/chat-block.d.ts +64 -0
  512. package/dist/types/modes/components/chat-transcript-builder.d.ts +45 -0
  513. package/dist/types/modes/components/collab-prompt-message.d.ts +10 -0
  514. package/dist/types/modes/components/compaction-summary-message.d.ts +46 -0
  515. package/dist/types/modes/components/copy-selector.d.ts +22 -0
  516. package/dist/types/modes/components/countdown-timer.d.ts +14 -0
  517. package/dist/types/modes/components/custom-editor.d.ts +163 -0
  518. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  519. package/dist/types/modes/components/custom-message.d.ts +15 -0
  520. package/dist/types/modes/components/diff.d.ts +11 -0
  521. package/dist/types/modes/components/dynamic-border.d.ts +14 -0
  522. package/dist/types/modes/components/error-banner.d.ts +11 -0
  523. package/dist/types/modes/components/eval-execution.d.ts +29 -0
  524. package/dist/types/modes/components/execution-shared.d.ts +46 -0
  525. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +43 -0
  526. package/dist/types/modes/components/extensions/extension-list.d.ts +52 -0
  527. package/dist/types/modes/components/extensions/index.d.ts +8 -0
  528. package/dist/types/modes/components/extensions/inspector-panel.d.ts +8 -0
  529. package/dist/types/modes/components/extensions/state-manager.d.ts +50 -0
  530. package/dist/types/modes/components/extensions/types.d.ts +147 -0
  531. package/dist/types/modes/components/footer.d.ts +30 -0
  532. package/dist/types/modes/components/history-search.d.ts +7 -0
  533. package/dist/types/modes/components/hook-editor.d.ts +24 -0
  534. package/dist/types/modes/components/hook-input.d.ts +19 -0
  535. package/dist/types/modes/components/hook-message.d.ts +15 -0
  536. package/dist/types/modes/components/hook-selector.d.ts +68 -0
  537. package/dist/types/modes/components/index.d.ts +38 -0
  538. package/dist/types/modes/components/keybinding-hints.d.ts +40 -0
  539. package/dist/types/modes/components/late-diagnostics-message.d.ts +20 -0
  540. package/dist/types/modes/components/login-dialog.d.ts +40 -0
  541. package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
  542. package/dist/types/modes/components/mcp-add-wizard.d.ts +38 -0
  543. package/dist/types/modes/components/message-frame.d.ts +44 -0
  544. package/dist/types/modes/components/model-selector.d.ts +36 -0
  545. package/dist/types/modes/components/move-overlay.d.ts +23 -0
  546. package/dist/types/modes/components/oauth-selector.d.ts +23 -0
  547. package/dist/types/modes/components/omfg-panel.d.ts +19 -0
  548. package/dist/types/modes/components/overlay-box.d.ts +17 -0
  549. package/dist/types/modes/components/plan-review-overlay.d.ts +61 -0
  550. package/dist/types/modes/components/plan-toc.d.ts +41 -0
  551. package/dist/types/modes/components/plugin-selector.d.ts +27 -0
  552. package/dist/types/modes/components/plugin-settings.d.ts +103 -0
  553. package/dist/types/modes/components/queue-mode-selector.d.ts +10 -0
  554. package/dist/types/modes/components/read-tool-group.d.ts +38 -0
  555. package/dist/types/modes/components/reset-usage-selector.d.ts +12 -0
  556. package/dist/types/modes/components/segment-track.d.ts +27 -0
  557. package/dist/types/modes/components/select-list-mouse-routing.d.ts +2 -0
  558. package/dist/types/modes/components/selector-helpers.d.ts +53 -0
  559. package/dist/types/modes/components/session-selector.d.ts +94 -0
  560. package/dist/types/modes/components/settings-defs.d.ts +60 -0
  561. package/dist/types/modes/components/settings-selector.d.ts +70 -0
  562. package/dist/types/modes/components/show-images-selector.d.ts +10 -0
  563. package/dist/types/modes/components/skill-message.d.ts +9 -0
  564. package/dist/types/modes/components/snapcompact-shape-preview.d.ts +31 -0
  565. package/dist/types/modes/components/status-line/component.d.ts +94 -0
  566. package/dist/types/modes/components/status-line/component.test.d.ts +1 -0
  567. package/dist/types/modes/components/status-line/context-thresholds.d.ts +10 -0
  568. package/dist/types/modes/components/status-line/git-utils.d.ts +22 -0
  569. package/dist/types/modes/components/status-line/index.d.ts +5 -0
  570. package/dist/types/modes/components/status-line/presets.d.ts +3 -0
  571. package/dist/types/modes/components/status-line/segments.d.ts +5 -0
  572. package/dist/types/modes/components/status-line/separators.d.ts +3 -0
  573. package/dist/types/modes/components/status-line/token-rate.d.ts +10 -0
  574. package/dist/types/modes/components/status-line/types.d.ts +150 -0
  575. package/dist/types/modes/components/theme-selector.d.ts +11 -0
  576. package/dist/types/modes/components/thinking-selector.d.ts +11 -0
  577. package/dist/types/modes/components/tiny-title-download-progress.d.ts +11 -0
  578. package/dist/types/modes/components/todo-reminder.d.ts +15 -0
  579. package/dist/types/modes/components/tool-execution.d.ts +117 -0
  580. package/dist/types/modes/components/transcript-container.d.ts +86 -0
  581. package/dist/types/modes/components/tree-selector.d.ts +31 -0
  582. package/dist/types/modes/components/ttsr-notification.d.ts +17 -0
  583. package/dist/types/modes/components/usage-row.d.ts +3 -0
  584. package/dist/types/modes/components/user-message-selector.d.ts +28 -0
  585. package/dist/types/modes/components/user-message.d.ts +9 -0
  586. package/dist/types/modes/components/visual-truncate.d.ts +19 -0
  587. package/dist/types/modes/components/welcome.d.ts +66 -0
  588. package/dist/types/modes/controllers/btw-controller.d.ts +14 -0
  589. package/dist/types/modes/controllers/command-controller-shared.d.ts +47 -0
  590. package/dist/types/modes/controllers/command-controller.d.ts +55 -0
  591. package/dist/types/modes/controllers/event-controller.d.ts +28 -0
  592. package/dist/types/modes/controllers/extension-ui-controller.d.ts +88 -0
  593. package/dist/types/modes/controllers/input-controller.d.ts +71 -0
  594. package/dist/types/modes/controllers/mcp-command-controller.d.ts +44 -0
  595. package/dist/types/modes/controllers/omfg-controller.d.ts +10 -0
  596. package/dist/types/modes/controllers/omfg-rule.d.ts +26 -0
  597. package/dist/types/modes/controllers/selector-controller.d.ts +61 -0
  598. package/dist/types/modes/controllers/session-focus-controller.d.ts +31 -0
  599. package/dist/types/modes/controllers/ssh-command-controller.d.ts +10 -0
  600. package/dist/types/modes/controllers/streaming-reveal.d.ts +45 -0
  601. package/dist/types/modes/controllers/tan-command-controller.d.ts +6 -0
  602. package/dist/types/modes/controllers/todo-command-controller.d.ts +7 -0
  603. package/dist/types/modes/controllers/tool-args-reveal.d.ts +77 -0
  604. package/dist/types/modes/emoji-autocomplete.d.ts +16 -0
  605. package/dist/types/modes/gradient-highlight.d.ts +32 -0
  606. package/dist/types/modes/image-references.d.ts +28 -0
  607. package/dist/types/modes/index.d.ts +10 -0
  608. package/dist/types/modes/interactive-mode.d.ts +401 -0
  609. package/dist/types/modes/internal-url-autocomplete.d.ts +43 -0
  610. package/dist/types/modes/loop-limit.d.ts +35 -0
  611. package/dist/types/modes/magic-keywords.d.ts +26 -0
  612. package/dist/types/modes/markdown-prose.d.ts +27 -0
  613. package/dist/types/modes/oauth-manual-input.d.ts +15 -0
  614. package/dist/types/modes/orchestrate.d.ts +15 -0
  615. package/dist/types/modes/print-mode.d.ts +29 -0
  616. package/dist/types/modes/prompt-action-autocomplete.d.ts +46 -0
  617. package/dist/types/modes/rpc/host-tools.d.ts +16 -0
  618. package/dist/types/modes/rpc/host-uris.d.ts +38 -0
  619. package/dist/types/modes/rpc/rpc-client.d.ts +304 -0
  620. package/dist/types/modes/rpc/rpc-mode.d.ts +145 -0
  621. package/dist/types/modes/rpc/rpc-subagents.d.ts +24 -0
  622. package/dist/types/modes/rpc/rpc-types.d.ts +705 -0
  623. package/dist/types/modes/running-subagent-badge.d.ts +6 -0
  624. package/dist/types/modes/runtime-init.d.ts +25 -0
  625. package/dist/types/modes/session-observer-registry.d.ts +35 -0
  626. package/dist/types/modes/session-teardown.d.ts +63 -0
  627. package/dist/types/modes/session-teardown.test.d.ts +1 -0
  628. package/dist/types/modes/setup-version.d.ts +11 -0
  629. package/dist/types/modes/setup-wizard/index.d.ts +22 -0
  630. package/dist/types/modes/setup-wizard/lazy.d.ts +2 -0
  631. package/dist/types/modes/setup-wizard/scenes/glyph.d.ts +2 -0
  632. package/dist/types/modes/setup-wizard/scenes/outro.d.ts +2 -0
  633. package/dist/types/modes/setup-wizard/scenes/providers.d.ts +2 -0
  634. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +22 -0
  635. package/dist/types/modes/setup-wizard/scenes/splash.d.ts +11 -0
  636. package/dist/types/modes/setup-wizard/scenes/theme.d.ts +2 -0
  637. package/dist/types/modes/setup-wizard/scenes/types.d.ts +52 -0
  638. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +23 -0
  639. package/dist/types/modes/setup-wizard/startup-splash.d.ts +7 -0
  640. package/dist/types/modes/setup-wizard/wizard-overlay.d.ts +15 -0
  641. package/dist/types/modes/shared.d.ts +15 -0
  642. package/dist/types/modes/skill-command.d.ts +32 -0
  643. package/dist/types/modes/theme/defaults/index.d.ts +9436 -0
  644. package/dist/types/modes/theme/mermaid-cache.d.ts +26 -0
  645. package/dist/types/modes/theme/mermaid-rendering.test.d.ts +1 -0
  646. package/dist/types/modes/theme/shimmer.d.ts +40 -0
  647. package/dist/types/modes/theme/theme.d.ts +360 -0
  648. package/dist/types/modes/turn-budget.d.ts +18 -0
  649. package/dist/types/modes/types.d.ts +399 -0
  650. package/dist/types/modes/ultrathink.d.ts +15 -0
  651. package/dist/types/modes/utils/context-usage.d.ts +64 -0
  652. package/dist/types/modes/utils/copy-targets.d.ts +75 -0
  653. package/dist/types/modes/utils/hotkeys-markdown.d.ts +5 -0
  654. package/dist/types/modes/utils/interactive-context-helpers.d.ts +14 -0
  655. package/dist/types/modes/utils/keybinding-matchers.d.ts +32 -0
  656. package/dist/types/modes/utils/tools-markdown.d.ts +5 -0
  657. package/dist/types/modes/utils/transcript-render-helpers.d.ts +63 -0
  658. package/dist/types/modes/utils/ui-helpers.d.ts +55 -0
  659. package/dist/types/modes/workflow.d.ts +15 -0
  660. package/dist/types/plan-mode/approved-plan-prompt.test.d.ts +1 -0
  661. package/dist/types/plan-mode/approved-plan.d.ts +68 -0
  662. package/dist/types/plan-mode/plan-handoff.d.ts +20 -0
  663. package/dist/types/plan-mode/plan-protection.d.ts +12 -0
  664. package/dist/types/plan-mode/state.d.ts +6 -0
  665. package/dist/types/registry/agent-lifecycle.d.ts +66 -0
  666. package/dist/types/registry/agent-registry.d.ts +97 -0
  667. package/dist/types/sdk.d.ts +370 -0
  668. package/dist/types/secrets/index.d.ts +9 -0
  669. package/dist/types/secrets/obfuscator.d.ts +63 -0
  670. package/dist/types/secrets/regex.d.ts +2 -0
  671. package/dist/types/session/agent-session.d.ts +1419 -0
  672. package/dist/types/session/agent-storage.d.ts +97 -0
  673. package/dist/types/session/artifacts.d.ts +61 -0
  674. package/dist/types/session/auth-broker-config.d.ts +45 -0
  675. package/dist/types/session/auth-storage.d.ts +7 -0
  676. package/dist/types/session/blob-store.d.ts +68 -0
  677. package/dist/types/session/client-bridge.d.ts +88 -0
  678. package/dist/types/session/codex-auto-reset.d.ts +111 -0
  679. package/dist/types/session/compact-modes.d.ts +60 -0
  680. package/dist/types/session/exit-diagnostics.d.ts +48 -0
  681. package/dist/types/session/history-storage.d.ts +30 -0
  682. package/dist/types/session/indexed-session-storage.d.ts +65 -0
  683. package/dist/types/session/messages.d.ts +220 -0
  684. package/dist/types/session/messages.test.d.ts +1 -0
  685. package/dist/types/session/provider-image-budget.d.ts +3 -0
  686. package/dist/types/session/redis-session-storage.d.ts +51 -0
  687. package/dist/types/session/session-context.d.ts +44 -0
  688. package/dist/types/session/session-dump-format.d.ts +30 -0
  689. package/dist/types/session/session-entries.d.ts +197 -0
  690. package/dist/types/session/session-history-format.d.ts +49 -0
  691. package/dist/types/session/session-listing.d.ts +78 -0
  692. package/dist/types/session/session-loader.d.ts +29 -0
  693. package/dist/types/session/session-manager.d.ts +306 -0
  694. package/dist/types/session/session-migrations.d.ts +12 -0
  695. package/dist/types/session/session-paths.d.ts +25 -0
  696. package/dist/types/session/session-persistence.d.ts +12 -0
  697. package/dist/types/session/session-storage.d.ts +129 -0
  698. package/dist/types/session/session-title-slot.d.ts +19 -0
  699. package/dist/types/session/settings-stream-fn.d.ts +21 -0
  700. package/dist/types/session/shake-types.d.ts +24 -0
  701. package/dist/types/session/snapcompact-inline.d.ts +145 -0
  702. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  703. package/dist/types/session/sql-session-storage.d.ts +72 -0
  704. package/dist/types/session/streaming-output.d.ts +229 -0
  705. package/dist/types/session/tool-choice-queue.d.ts +94 -0
  706. package/dist/types/session/turn-persistence.d.ts +88 -0
  707. package/dist/types/session/unexpected-stop-classifier.d.ts +13 -0
  708. package/dist/types/session/yield-queue.d.ts +37 -0
  709. package/dist/types/slash-commands/acp-builtins.d.ts +34 -0
  710. package/dist/types/slash-commands/available-commands.d.ts +34 -0
  711. package/dist/types/slash-commands/builtin-registry.d.ts +36 -0
  712. package/dist/types/slash-commands/helpers/active-oauth-account.d.ts +14 -0
  713. package/dist/types/slash-commands/helpers/collab-qrcode.d.ts +13 -0
  714. package/dist/types/slash-commands/helpers/context-report.d.ts +7 -0
  715. package/dist/types/slash-commands/helpers/format.d.ts +10 -0
  716. package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
  717. package/dist/types/slash-commands/helpers/marketplace-manager.d.ts +8 -0
  718. package/dist/types/slash-commands/helpers/mcp.d.ts +3 -0
  719. package/dist/types/slash-commands/helpers/parse.d.ts +33 -0
  720. package/dist/types/slash-commands/helpers/reset-usage.d.ts +27 -0
  721. package/dist/types/slash-commands/helpers/ssh.d.ts +3 -0
  722. package/dist/types/slash-commands/helpers/stats-dashboard.d.ts +13 -0
  723. package/dist/types/slash-commands/helpers/todo.d.ts +3 -0
  724. package/dist/types/slash-commands/helpers/usage-report.d.ts +7 -0
  725. package/dist/types/slash-commands/marketplace-install-parser.d.ts +33 -0
  726. package/dist/types/slash-commands/types.d.ts +127 -0
  727. package/dist/types/ssh/__tests__/connection-manager-args.test.d.ts +1 -0
  728. package/dist/types/ssh/__tests__/connection-manager-timeout.test.d.ts +1 -0
  729. package/dist/types/ssh/__tests__/file-transfer-posix-guard.test.d.ts +1 -0
  730. package/dist/types/ssh/__tests__/sshfs-mount.test.d.ts +1 -0
  731. package/dist/types/ssh/config-writer.d.ts +49 -0
  732. package/dist/types/ssh/connection-manager.d.ts +109 -0
  733. package/dist/types/ssh/file-transfer.d.ts +79 -0
  734. package/dist/types/ssh/ssh-executor.d.ts +37 -0
  735. package/dist/types/ssh/sshfs-mount.d.ts +15 -0
  736. package/dist/types/ssh/utils.d.ts +24 -0
  737. package/dist/types/startup-splash.d.ts +12 -0
  738. package/dist/types/stt/asr-client.d.ts +68 -0
  739. package/dist/types/stt/asr-protocol.d.ts +97 -0
  740. package/dist/types/stt/asr-worker.d.ts +2 -0
  741. package/dist/types/stt/downloader.d.ts +47 -0
  742. package/dist/types/stt/endpointer.d.ts +59 -0
  743. package/dist/types/stt/index.d.ts +8 -0
  744. package/dist/types/stt/models.d.ts +120 -0
  745. package/dist/types/stt/recorder.d.ts +30 -0
  746. package/dist/types/stt/stt-controller.d.ts +24 -0
  747. package/dist/types/stt/submit-trigger.d.ts +30 -0
  748. package/dist/types/stt/transcriber.d.ts +14 -0
  749. package/dist/types/stt/wav.d.ts +29 -0
  750. package/dist/types/subprocess/worker-client.d.ts +163 -0
  751. package/dist/types/subprocess/worker-runtime.d.ts +118 -0
  752. package/dist/types/system-prompt.d.ts +128 -0
  753. package/dist/types/system-prompt.test.d.ts +1 -0
  754. package/dist/types/task/agents.d.ts +28 -0
  755. package/dist/types/task/commands.d.ts +35 -0
  756. package/dist/types/task/discovery.d.ts +20 -0
  757. package/dist/types/task/executor.d.ts +214 -0
  758. package/dist/types/task/index.d.ts +79 -0
  759. package/dist/types/task/isolation-runner.d.ts +128 -0
  760. package/dist/types/task/name-generator.d.ts +16 -0
  761. package/dist/types/task/omp-command.d.ts +7 -0
  762. package/dist/types/task/output-manager.d.ts +20 -0
  763. package/dist/types/task/parallel.d.ts +55 -0
  764. package/dist/types/task/persisted-revive.d.ts +36 -0
  765. package/dist/types/task/provider-concurrency.d.ts +40 -0
  766. package/dist/types/task/render.d.ts +34 -0
  767. package/dist/types/task/render.test.d.ts +1 -0
  768. package/dist/types/task/renderer.d.ts +14 -0
  769. package/dist/types/task/repair-args.d.ts +53 -0
  770. package/dist/types/task/spawn-policy.d.ts +17 -0
  771. package/dist/types/task/spawn-policy.test.d.ts +1 -0
  772. package/dist/types/task/subprocess-tool-registry.d.ts +72 -0
  773. package/dist/types/task/types.d.ts +384 -0
  774. package/dist/types/task/worktree.d.ts +135 -0
  775. package/dist/types/task/yield-assembly.d.ts +28 -0
  776. package/dist/types/telemetry-export.d.ts +19 -0
  777. package/dist/types/thinking.d.ts +96 -0
  778. package/dist/types/tiny/device.d.ts +78 -0
  779. package/dist/types/tiny/dtype.d.ts +85 -0
  780. package/dist/types/tiny/models.d.ts +230 -0
  781. package/dist/types/tiny/text.d.ts +44 -0
  782. package/dist/types/tiny/title-client.d.ts +68 -0
  783. package/dist/types/tiny/title-protocol.d.ts +78 -0
  784. package/dist/types/tiny/worker.d.ts +2 -0
  785. package/dist/types/tool-discovery/mode.d.ts +8 -0
  786. package/dist/types/tool-discovery/tool-index.d.ts +57 -0
  787. package/dist/types/tools/__tests__/eval-description.test.d.ts +1 -0
  788. package/dist/types/tools/__tests__/json-tree.test.d.ts +1 -0
  789. package/dist/types/tools/acp-bridge.d.ts +29 -0
  790. package/dist/types/tools/approval.d.ts +46 -0
  791. package/dist/types/tools/ask.d.ts +119 -0
  792. package/dist/types/tools/ast-edit.d.ts +84 -0
  793. package/dist/types/tools/ast-grep.d.ts +76 -0
  794. package/dist/types/tools/auto-generated-guard.d.ts +17 -0
  795. package/dist/types/tools/bash-command-fixup.d.ts +11 -0
  796. package/dist/types/tools/bash-interactive.d.ts +16 -0
  797. package/dist/types/tools/bash-interceptor.d.ts +24 -0
  798. package/dist/types/tools/bash-pty-selection.d.ts +7 -0
  799. package/dist/types/tools/bash-skill-urls.d.ts +31 -0
  800. package/dist/types/tools/bash.d.ts +173 -0
  801. package/dist/types/tools/browser/aria/aria-snapshot.d.ts +39 -0
  802. package/dist/types/tools/browser/attach.d.ts +34 -0
  803. package/dist/types/tools/browser/cmux/cmux-tab.d.ts +212 -0
  804. package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
  805. package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
  806. package/dist/types/tools/browser/launch.d.ts +67 -0
  807. package/dist/types/tools/browser/readable.d.ts +17 -0
  808. package/dist/types/tools/browser/registry.d.ts +58 -0
  809. package/dist/types/tools/browser/render.d.ts +54 -0
  810. package/dist/types/tools/browser/run-cancellation.d.ts +4 -0
  811. package/dist/types/tools/browser/tab-protocol.d.ts +146 -0
  812. package/dist/types/tools/browser/tab-supervisor.d.ts +114 -0
  813. package/dist/types/tools/browser/tab-worker-entry.d.ts +1 -0
  814. package/dist/types/tools/browser/tab-worker.d.ts +56 -0
  815. package/dist/types/tools/browser.d.ts +96 -0
  816. package/dist/types/tools/builtin-names.d.ts +6 -0
  817. package/dist/types/tools/checkpoint.d.ts +72 -0
  818. package/dist/types/tools/conflict-detect.d.ts +221 -0
  819. package/dist/types/tools/context.d.ts +19 -0
  820. package/dist/types/tools/debug.d.ts +157 -0
  821. package/dist/types/tools/eval-backends.d.ts +15 -0
  822. package/dist/types/tools/eval-render.d.ts +58 -0
  823. package/dist/types/tools/eval.d.ts +66 -0
  824. package/dist/types/tools/fetch.d.ts +99 -0
  825. package/dist/types/tools/file-recorder.d.ts +13 -0
  826. package/dist/types/tools/fs-cache-invalidation.d.ts +15 -0
  827. package/dist/types/tools/gh-cache-invalidation.d.ts +6 -0
  828. package/dist/types/tools/gh-format.d.ts +6 -0
  829. package/dist/types/tools/gh-renderer.d.ts +25 -0
  830. package/dist/types/tools/gh.d.ts +331 -0
  831. package/dist/types/tools/github-cache.d.ts +123 -0
  832. package/dist/types/tools/glob.d.ts +96 -0
  833. package/dist/types/tools/grep.d.ts +99 -0
  834. package/dist/types/tools/grouped-file-output.d.ts +70 -0
  835. package/dist/types/tools/image-gen.d.ts +66 -0
  836. package/dist/types/tools/index.d.ts +368 -0
  837. package/dist/types/tools/inspect-image-renderer.d.ts +26 -0
  838. package/dist/types/tools/inspect-image.d.ts +32 -0
  839. package/dist/types/tools/irc.d.ts +112 -0
  840. package/dist/types/tools/job.d.ts +73 -0
  841. package/dist/types/tools/json-tree.d.ts +23 -0
  842. package/dist/types/tools/jtd-to-json-schema.d.ts +29 -0
  843. package/dist/types/tools/jtd-to-typescript.d.ts +26 -0
  844. package/dist/types/tools/jtd-utils.d.ts +42 -0
  845. package/dist/types/tools/learn.d.ts +44 -0
  846. package/dist/types/tools/list-limit.d.ts +12 -0
  847. package/dist/types/tools/manage-skill.d.ts +31 -0
  848. package/dist/types/tools/match-line-format.d.ts +11 -0
  849. package/dist/types/tools/memory-edit.d.ts +31 -0
  850. package/dist/types/tools/memory-recall.d.ts +23 -0
  851. package/dist/types/tools/memory-reflect.d.ts +25 -0
  852. package/dist/types/tools/memory-render.d.ts +63 -0
  853. package/dist/types/tools/memory-retain.d.ts +29 -0
  854. package/dist/types/tools/output-meta.d.ts +211 -0
  855. package/dist/types/tools/output-schema-validator.d.ts +77 -0
  856. package/dist/types/tools/path-utils.d.ts +267 -0
  857. package/dist/types/tools/plan-mode-guard.d.ts +33 -0
  858. package/dist/types/tools/read.d.ts +87 -0
  859. package/dist/types/tools/render-utils.d.ts +218 -0
  860. package/dist/types/tools/renderers.d.ts +49 -0
  861. package/dist/types/tools/report-tool-issue.d.ts +127 -0
  862. package/dist/types/tools/resolve.d.ts +94 -0
  863. package/dist/types/tools/review.d.ts +59 -0
  864. package/dist/types/tools/search-tool-bm25.d.ts +65 -0
  865. package/dist/types/tools/sqlite-reader.d.ts +114 -0
  866. package/dist/types/tools/ssh.d.ts +74 -0
  867. package/dist/types/tools/todo.d.ts +126 -0
  868. package/dist/types/tools/tool-errors.d.ts +33 -0
  869. package/dist/types/tools/tool-result.d.ts +34 -0
  870. package/dist/types/tools/tool-timeouts.d.ts +51 -0
  871. package/dist/types/tools/tts.d.ts +42 -0
  872. package/dist/types/tools/write.d.ts +66 -0
  873. package/dist/types/tools/yield.d.ts +39 -0
  874. package/dist/types/tts/downloader.d.ts +20 -0
  875. package/dist/types/tts/index.d.ts +10 -0
  876. package/dist/types/tts/models.d.ts +82 -0
  877. package/dist/types/tts/player.d.ts +32 -0
  878. package/dist/types/tts/runtime.d.ts +6 -0
  879. package/dist/types/tts/speakable.d.ts +47 -0
  880. package/dist/types/tts/speech-enhancer.d.ts +46 -0
  881. package/dist/types/tts/streaming-player.d.ts +40 -0
  882. package/dist/types/tts/tts-client.d.ts +69 -0
  883. package/dist/types/tts/tts-protocol.d.ts +102 -0
  884. package/dist/types/tts/tts-worker.d.ts +2 -0
  885. package/dist/types/tts/vocalizer.d.ts +48 -0
  886. package/dist/types/tts/wav.d.ts +8 -0
  887. package/dist/types/tui/code-cell.d.ts +47 -0
  888. package/dist/types/tui/file-list.d.ts +22 -0
  889. package/dist/types/tui/hyperlink.d.ts +61 -0
  890. package/dist/types/tui/index.d.ts +12 -0
  891. package/dist/types/tui/output-block.d.ts +59 -0
  892. package/dist/types/tui/status-line.d.ts +21 -0
  893. package/dist/types/tui/tree-list.d.ts +20 -0
  894. package/dist/types/tui/types.d.ts +13 -0
  895. package/dist/types/tui/utils.d.ts +36 -0
  896. package/dist/types/tui/width-aware-text.d.ts +23 -0
  897. package/dist/types/utils/active-repo-context.d.ts +8 -0
  898. package/dist/types/utils/block-context.d.ts +35 -0
  899. package/dist/types/utils/changelog.d.ts +33 -0
  900. package/dist/types/utils/clipboard.d.ts +37 -0
  901. package/dist/types/utils/command-args.d.ts +9 -0
  902. package/dist/types/utils/commit-message-generator.d.ts +7 -0
  903. package/dist/types/utils/edit-mode.d.ts +13 -0
  904. package/dist/types/utils/enhanced-paste.d.ts +20 -0
  905. package/dist/types/utils/event-bus.d.ts +6 -0
  906. package/dist/types/utils/external-editor.d.ts +27 -0
  907. package/dist/types/utils/fetch-timeout.d.ts +4 -0
  908. package/dist/types/utils/file-display-mode.d.ts +27 -0
  909. package/dist/types/utils/file-mentions.d.ts +13 -0
  910. package/dist/types/utils/git.d.ts +471 -0
  911. package/dist/types/utils/image-loading.d.ts +67 -0
  912. package/dist/types/utils/image-resize.d.ts +42 -0
  913. package/dist/types/utils/image-vision-fallback.d.ts +28 -0
  914. package/dist/types/utils/ipc.d.ts +22 -0
  915. package/dist/types/utils/jj.d.ts +74 -0
  916. package/dist/types/utils/lang-from-path.d.ts +8 -0
  917. package/dist/types/utils/markit-cache.d.ts +23 -0
  918. package/dist/types/utils/markit.d.ts +20 -0
  919. package/dist/types/utils/mupdf-wasm-embed.d.ts +1 -0
  920. package/dist/types/utils/open.d.ts +2 -0
  921. package/dist/types/utils/prompt-path.d.ts +1 -0
  922. package/dist/types/utils/qrcode.d.ts +48 -0
  923. package/dist/types/utils/session-color.d.ts +27 -0
  924. package/dist/types/utils/shell-snapshot.d.ts +15 -0
  925. package/dist/types/utils/sixel.d.ts +21 -0
  926. package/dist/types/utils/thinking-display.d.ts +7 -0
  927. package/dist/types/utils/title-generator.d.ts +33 -0
  928. package/dist/types/utils/tool-choice.d.ts +15 -0
  929. package/dist/types/utils/tools-manager.d.ts +12 -0
  930. package/dist/types/utils/turndown.d.ts +15 -0
  931. package/dist/types/utils/zip.d.ts +119 -0
  932. package/dist/types/web/kagi.d.ts +99 -0
  933. package/dist/types/web/parallel.d.ts +67 -0
  934. package/dist/types/web/scrapers/artifacthub.d.ts +6 -0
  935. package/dist/types/web/scrapers/arxiv.d.ts +5 -0
  936. package/dist/types/web/scrapers/aur.d.ts +5 -0
  937. package/dist/types/web/scrapers/biorxiv.d.ts +5 -0
  938. package/dist/types/web/scrapers/bluesky.d.ts +5 -0
  939. package/dist/types/web/scrapers/brew.d.ts +5 -0
  940. package/dist/types/web/scrapers/cheatsh.d.ts +8 -0
  941. package/dist/types/web/scrapers/chocolatey.d.ts +5 -0
  942. package/dist/types/web/scrapers/choosealicense.d.ts +2 -0
  943. package/dist/types/web/scrapers/cisa-kev.d.ts +5 -0
  944. package/dist/types/web/scrapers/clojars.d.ts +5 -0
  945. package/dist/types/web/scrapers/coingecko.d.ts +5 -0
  946. package/dist/types/web/scrapers/crates-io.d.ts +5 -0
  947. package/dist/types/web/scrapers/crossref.d.ts +2 -0
  948. package/dist/types/web/scrapers/devto.d.ts +5 -0
  949. package/dist/types/web/scrapers/discogs.d.ts +8 -0
  950. package/dist/types/web/scrapers/discourse.d.ts +5 -0
  951. package/dist/types/web/scrapers/dockerhub.d.ts +5 -0
  952. package/dist/types/web/scrapers/docs-rs.d.ts +2 -0
  953. package/dist/types/web/scrapers/fdroid.d.ts +5 -0
  954. package/dist/types/web/scrapers/firefox-addons.d.ts +2 -0
  955. package/dist/types/web/scrapers/flathub.d.ts +2 -0
  956. package/dist/types/web/scrapers/github-gist.d.ts +5 -0
  957. package/dist/types/web/scrapers/github.d.ts +34 -0
  958. package/dist/types/web/scrapers/gitlab.d.ts +5 -0
  959. package/dist/types/web/scrapers/go-pkg.d.ts +5 -0
  960. package/dist/types/web/scrapers/hackage.d.ts +5 -0
  961. package/dist/types/web/scrapers/hackernews.d.ts +2 -0
  962. package/dist/types/web/scrapers/hex.d.ts +5 -0
  963. package/dist/types/web/scrapers/huggingface.d.ts +2 -0
  964. package/dist/types/web/scrapers/iacr.d.ts +5 -0
  965. package/dist/types/web/scrapers/index.d.ts +84 -0
  966. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +2 -0
  967. package/dist/types/web/scrapers/lemmy.d.ts +2 -0
  968. package/dist/types/web/scrapers/lobsters.d.ts +5 -0
  969. package/dist/types/web/scrapers/mastodon.d.ts +5 -0
  970. package/dist/types/web/scrapers/maven.d.ts +6 -0
  971. package/dist/types/web/scrapers/mdn.d.ts +2 -0
  972. package/dist/types/web/scrapers/metacpan.d.ts +5 -0
  973. package/dist/types/web/scrapers/musicbrainz.d.ts +5 -0
  974. package/dist/types/web/scrapers/npm.d.ts +5 -0
  975. package/dist/types/web/scrapers/nuget.d.ts +5 -0
  976. package/dist/types/web/scrapers/nvd.d.ts +5 -0
  977. package/dist/types/web/scrapers/ollama.d.ts +2 -0
  978. package/dist/types/web/scrapers/open-vsx.d.ts +5 -0
  979. package/dist/types/web/scrapers/opencorporates.d.ts +5 -0
  980. package/dist/types/web/scrapers/openlibrary.d.ts +5 -0
  981. package/dist/types/web/scrapers/orcid.d.ts +5 -0
  982. package/dist/types/web/scrapers/osv.d.ts +5 -0
  983. package/dist/types/web/scrapers/packagist.d.ts +5 -0
  984. package/dist/types/web/scrapers/pub-dev.d.ts +5 -0
  985. package/dist/types/web/scrapers/pubmed.d.ts +5 -0
  986. package/dist/types/web/scrapers/pypi.d.ts +5 -0
  987. package/dist/types/web/scrapers/rawg.d.ts +2 -0
  988. package/dist/types/web/scrapers/readthedocs.d.ts +5 -0
  989. package/dist/types/web/scrapers/reddit.d.ts +5 -0
  990. package/dist/types/web/scrapers/repology.d.ts +5 -0
  991. package/dist/types/web/scrapers/rfc.d.ts +5 -0
  992. package/dist/types/web/scrapers/rubygems.d.ts +5 -0
  993. package/dist/types/web/scrapers/searchcode.d.ts +2 -0
  994. package/dist/types/web/scrapers/sec-edgar.d.ts +5 -0
  995. package/dist/types/web/scrapers/semantic-scholar.d.ts +2 -0
  996. package/dist/types/web/scrapers/snapcraft.d.ts +2 -0
  997. package/dist/types/web/scrapers/sourcegraph.d.ts +2 -0
  998. package/dist/types/web/scrapers/spdx.d.ts +5 -0
  999. package/dist/types/web/scrapers/spotify.d.ts +8 -0
  1000. package/dist/types/web/scrapers/stackoverflow.d.ts +6 -0
  1001. package/dist/types/web/scrapers/terraform.d.ts +5 -0
  1002. package/dist/types/web/scrapers/tldr.d.ts +7 -0
  1003. package/dist/types/web/scrapers/twitter.d.ts +5 -0
  1004. package/dist/types/web/scrapers/types.d.ts +90 -0
  1005. package/dist/types/web/scrapers/utils.d.ts +26 -0
  1006. package/dist/types/web/scrapers/vimeo.d.ts +5 -0
  1007. package/dist/types/web/scrapers/vscode-marketplace.d.ts +5 -0
  1008. package/dist/types/web/scrapers/w3c.d.ts +2 -0
  1009. package/dist/types/web/scrapers/wikidata.d.ts +5 -0
  1010. package/dist/types/web/scrapers/wikipedia.d.ts +5 -0
  1011. package/dist/types/web/scrapers/youtube.d.ts +5 -0
  1012. package/dist/types/web/search/index.d.ts +74 -0
  1013. package/dist/types/web/search/provider.d.ts +30 -0
  1014. package/dist/types/web/search/providers/anthropic.d.ts +33 -0
  1015. package/dist/types/web/search/providers/base.d.ts +84 -0
  1016. package/dist/types/web/search/providers/brave.d.ts +28 -0
  1017. package/dist/types/web/search/providers/codex.d.ts +36 -0
  1018. package/dist/types/web/search/providers/duckduckgo.d.ts +14 -0
  1019. package/dist/types/web/search/providers/exa.d.ts +70 -0
  1020. package/dist/types/web/search/providers/firecrawl.d.ts +28 -0
  1021. package/dist/types/web/search/providers/gemini.d.ts +63 -0
  1022. package/dist/types/web/search/providers/jina.d.ts +31 -0
  1023. package/dist/types/web/search/providers/kagi.d.ts +30 -0
  1024. package/dist/types/web/search/providers/kimi.d.ts +32 -0
  1025. package/dist/types/web/search/providers/parallel.d.ts +16 -0
  1026. package/dist/types/web/search/providers/perplexity-auth.d.ts +37 -0
  1027. package/dist/types/web/search/providers/perplexity.d.ts +58 -0
  1028. package/dist/types/web/search/providers/searxng.d.ts +45 -0
  1029. package/dist/types/web/search/providers/synthetic.d.ts +25 -0
  1030. package/dist/types/web/search/providers/tavily.d.ts +30 -0
  1031. package/dist/types/web/search/providers/tinyfish.d.ts +29 -0
  1032. package/dist/types/web/search/providers/utils.d.ts +52 -0
  1033. package/dist/types/web/search/providers/xai.d.ts +13 -0
  1034. package/dist/types/web/search/providers/zai.d.ts +29 -0
  1035. package/dist/types/web/search/render.d.ts +34 -0
  1036. package/dist/types/web/search/types.d.ts +431 -0
  1037. package/dist/types/web/search/utils.d.ts +4 -0
  1038. package/dist/types/workspace-tree.d.ts +42 -0
  1039. package/examples/README.md +21 -0
  1040. package/examples/custom-tools/README.md +104 -0
  1041. package/examples/custom-tools/hello/index.ts +20 -0
  1042. package/examples/extensions/README.md +142 -0
  1043. package/examples/extensions/api-demo.ts +79 -0
  1044. package/examples/extensions/chalk-logger.ts +25 -0
  1045. package/examples/extensions/hello.ts +31 -0
  1046. package/examples/extensions/pirate.ts +43 -0
  1047. package/examples/extensions/plan-mode.ts +549 -0
  1048. package/examples/extensions/reload-runtime.ts +38 -0
  1049. package/examples/extensions/thinking-note.ts +13 -0
  1050. package/examples/extensions/tools.ts +145 -0
  1051. package/examples/extensions/with-deps/index.ts +36 -0
  1052. package/examples/extensions/with-deps/package-lock.json +31 -0
  1053. package/examples/extensions/with-deps/package.json +17 -0
  1054. package/examples/hooks/README.md +56 -0
  1055. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  1056. package/examples/hooks/confirm-destructive.ts +58 -0
  1057. package/examples/hooks/custom-compaction.ts +115 -0
  1058. package/examples/hooks/dirty-repo-guard.ts +51 -0
  1059. package/examples/hooks/file-trigger.ts +40 -0
  1060. package/examples/hooks/git-checkpoint.ts +52 -0
  1061. package/examples/hooks/handoff.ts +149 -0
  1062. package/examples/hooks/permission-gate.ts +33 -0
  1063. package/examples/hooks/protected-paths.ts +29 -0
  1064. package/examples/hooks/qna.ts +118 -0
  1065. package/examples/hooks/status-line.ts +39 -0
  1066. package/examples/sdk/01-minimal.ts +21 -0
  1067. package/examples/sdk/02-custom-model.ts +49 -0
  1068. package/examples/sdk/03-custom-prompt.ts +46 -0
  1069. package/examples/sdk/04-skills.ts +43 -0
  1070. package/examples/sdk/06-extensions.ts +82 -0
  1071. package/examples/sdk/06-hooks.ts +61 -0
  1072. package/examples/sdk/07-context-files.ts +35 -0
  1073. package/examples/sdk/08-prompt-templates.ts +41 -0
  1074. package/examples/sdk/08-slash-commands.ts +46 -0
  1075. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  1076. package/examples/sdk/11-sessions.ts +47 -0
  1077. package/examples/sdk/12-redis-sessions.ts +54 -0
  1078. package/examples/sdk/13-sql-sessions.ts +61 -0
  1079. package/examples/sdk/README.md +172 -0
  1080. package/package.json +594 -0
  1081. package/scripts/bench-guard.ts +71 -0
  1082. package/scripts/build-binary.ts +135 -0
  1083. package/scripts/bundle-dist.ts +129 -0
  1084. package/scripts/embed-mupdf-wasm.ts +67 -0
  1085. package/scripts/format-prompts.ts +68 -0
  1086. package/scripts/generate-aria-snapshot.ts +134 -0
  1087. package/scripts/generate-docs-index.ts +148 -0
  1088. package/scripts/generate-legacy-pi-bundled-registry.ts +420 -0
  1089. package/scripts/generate-share-viewer.ts +36 -0
  1090. package/scripts/measure-prompt-tokens.ts +63 -0
  1091. package/scripts/omp +42 -0
  1092. package/scripts/omp.ts +19 -0
  1093. package/src/advisor/__tests__/advisor.test.ts +1662 -0
  1094. package/src/advisor/__tests__/config.test.ts +173 -0
  1095. package/src/advisor/__tests__/emission-guard.test.ts +147 -0
  1096. package/src/advisor/advise-tool.ts +203 -0
  1097. package/src/advisor/config.ts +258 -0
  1098. package/src/advisor/emission-guard.ts +172 -0
  1099. package/src/advisor/index.ts +6 -0
  1100. package/src/advisor/runtime.ts +518 -0
  1101. package/src/advisor/transcript-recorder.ts +159 -0
  1102. package/src/advisor/watchdog.ts +135 -0
  1103. package/src/async/index.ts +1 -0
  1104. package/src/async/job-manager.ts +698 -0
  1105. package/src/auto-thinking/classifier.ts +195 -0
  1106. package/src/autolearn/controller.ts +145 -0
  1107. package/src/autolearn/managed-skills.ts +255 -0
  1108. package/src/autoresearch/command-resume.md +14 -0
  1109. package/src/autoresearch/dashboard.ts +436 -0
  1110. package/src/autoresearch/git.ts +331 -0
  1111. package/src/autoresearch/helpers.ts +218 -0
  1112. package/src/autoresearch/index.ts +541 -0
  1113. package/src/autoresearch/prompt-setup.md +43 -0
  1114. package/src/autoresearch/prompt.md +103 -0
  1115. package/src/autoresearch/resume-message.md +10 -0
  1116. package/src/autoresearch/state.ts +273 -0
  1117. package/src/autoresearch/storage.ts +700 -0
  1118. package/src/autoresearch/tools/init-experiment.ts +269 -0
  1119. package/src/autoresearch/tools/log-experiment.ts +521 -0
  1120. package/src/autoresearch/tools/run-experiment.ts +407 -0
  1121. package/src/autoresearch/tools/update-notes.ts +109 -0
  1122. package/src/autoresearch/types.ts +168 -0
  1123. package/src/capability/context-file.ts +44 -0
  1124. package/src/capability/extension-module.ts +34 -0
  1125. package/src/capability/extension.ts +47 -0
  1126. package/src/capability/fs.ts +117 -0
  1127. package/src/capability/hook.ts +40 -0
  1128. package/src/capability/index.ts +436 -0
  1129. package/src/capability/instruction.ts +37 -0
  1130. package/src/capability/mcp.ts +76 -0
  1131. package/src/capability/prompt.ts +35 -0
  1132. package/src/capability/rule-buckets.ts +66 -0
  1133. package/src/capability/rule.ts +261 -0
  1134. package/src/capability/settings.ts +34 -0
  1135. package/src/capability/skill.ts +63 -0
  1136. package/src/capability/slash-command.ts +40 -0
  1137. package/src/capability/ssh.ts +41 -0
  1138. package/src/capability/system-prompt.ts +34 -0
  1139. package/src/capability/tool.ts +38 -0
  1140. package/src/capability/types.ts +168 -0
  1141. package/src/cli/agents-cli.ts +138 -0
  1142. package/src/cli/args.ts +393 -0
  1143. package/src/cli/auth-broker-cli.ts +921 -0
  1144. package/src/cli/auth-gateway-cli.ts +608 -0
  1145. package/src/cli/bench-cli.ts +623 -0
  1146. package/src/cli/classify-install-target.ts +76 -0
  1147. package/src/cli/claude-trace-cli.ts +795 -0
  1148. package/src/cli/commands/init-xdg.ts +27 -0
  1149. package/src/cli/completion-gen.ts +550 -0
  1150. package/src/cli/config-cli.ts +422 -0
  1151. package/src/cli/dry-balance-cli.ts +853 -0
  1152. package/src/cli/extension-flags.ts +48 -0
  1153. package/src/cli/file-processor.ts +133 -0
  1154. package/src/cli/flag-tables.ts +325 -0
  1155. package/src/cli/gallery-cli.ts +272 -0
  1156. package/src/cli/gallery-fixtures/agentic.ts +416 -0
  1157. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  1158. package/src/cli/gallery-fixtures/edit.ts +254 -0
  1159. package/src/cli/gallery-fixtures/fs.ts +220 -0
  1160. package/src/cli/gallery-fixtures/index.ts +40 -0
  1161. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  1162. package/src/cli/gallery-fixtures/memory.ts +81 -0
  1163. package/src/cli/gallery-fixtures/misc.ts +250 -0
  1164. package/src/cli/gallery-fixtures/search.ts +213 -0
  1165. package/src/cli/gallery-fixtures/shell.ts +159 -0
  1166. package/src/cli/gallery-fixtures/types.ts +57 -0
  1167. package/src/cli/gallery-fixtures/web.ts +158 -0
  1168. package/src/cli/gallery-screenshot.ts +279 -0
  1169. package/src/cli/gc-cli.ts +946 -0
  1170. package/src/cli/grep-cli.ts +160 -0
  1171. package/src/cli/grievances-cli.ts +256 -0
  1172. package/src/cli/initial-message.ts +58 -0
  1173. package/src/cli/models-cli.ts +368 -0
  1174. package/src/cli/plugin-cli.ts +996 -0
  1175. package/src/cli/profile-alias.ts +369 -0
  1176. package/src/cli/profile-bootstrap.ts +233 -0
  1177. package/src/cli/read-cli.ts +57 -0
  1178. package/src/cli/session-picker.ts +93 -0
  1179. package/src/cli/setup-cli.ts +332 -0
  1180. package/src/cli/setup-model-picker.ts +43 -0
  1181. package/src/cli/shell-cli.ts +176 -0
  1182. package/src/cli/ssh-cli.ts +179 -0
  1183. package/src/cli/startup-cwd.ts +58 -0
  1184. package/src/cli/stats-cli.ts +229 -0
  1185. package/src/cli/tiny-models-cli.ts +153 -0
  1186. package/src/cli/ttsr-cli.ts +995 -0
  1187. package/src/cli/update-cli.test.ts +28 -0
  1188. package/src/cli/update-cli.ts +944 -0
  1189. package/src/cli/usage-cli.ts +857 -0
  1190. package/src/cli/web-search-cli.ts +137 -0
  1191. package/src/cli/worktree-cli.ts +294 -0
  1192. package/src/cli-commands.ts +131 -0
  1193. package/src/cli.ts +348 -0
  1194. package/src/collab/crypto.ts +63 -0
  1195. package/src/collab/display-name.ts +13 -0
  1196. package/src/collab/guest.ts +731 -0
  1197. package/src/collab/host.ts +690 -0
  1198. package/src/collab/protocol.ts +296 -0
  1199. package/src/collab/relay-client.ts +216 -0
  1200. package/src/collab/replication-shrink.ts +111 -0
  1201. package/src/commands/acp.ts +24 -0
  1202. package/src/commands/agents.ts +57 -0
  1203. package/src/commands/auth-broker.ts +99 -0
  1204. package/src/commands/auth-gateway.ts +69 -0
  1205. package/src/commands/bench.ts +51 -0
  1206. package/src/commands/commit.ts +46 -0
  1207. package/src/commands/complete.ts +66 -0
  1208. package/src/commands/completions.ts +60 -0
  1209. package/src/commands/config.ts +51 -0
  1210. package/src/commands/dry-balance.ts +43 -0
  1211. package/src/commands/gallery.ts +60 -0
  1212. package/src/commands/gc.ts +46 -0
  1213. package/src/commands/grep.ts +48 -0
  1214. package/src/commands/grievances.ts +51 -0
  1215. package/src/commands/install.ts +107 -0
  1216. package/src/commands/join.ts +39 -0
  1217. package/src/commands/launch.ts +182 -0
  1218. package/src/commands/models.ts +60 -0
  1219. package/src/commands/plugin.ts +78 -0
  1220. package/src/commands/read.ts +38 -0
  1221. package/src/commands/say.ts +102 -0
  1222. package/src/commands/setup.ts +67 -0
  1223. package/src/commands/shell.ts +29 -0
  1224. package/src/commands/ssh.ts +60 -0
  1225. package/src/commands/stats.ts +29 -0
  1226. package/src/commands/tiny-models.ts +36 -0
  1227. package/src/commands/token.ts +162 -0
  1228. package/src/commands/ttsr.ts +125 -0
  1229. package/src/commands/update.ts +27 -0
  1230. package/src/commands/usage.ts +43 -0
  1231. package/src/commands/web-search.ts +42 -0
  1232. package/src/commands/worktree.ts +62 -0
  1233. package/src/commit/agentic/agent.ts +318 -0
  1234. package/src/commit/agentic/fallback.ts +96 -0
  1235. package/src/commit/agentic/index.ts +355 -0
  1236. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  1237. package/src/commit/agentic/prompts/session-user.md +25 -0
  1238. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  1239. package/src/commit/agentic/prompts/system.md +38 -0
  1240. package/src/commit/agentic/state.ts +60 -0
  1241. package/src/commit/agentic/tools/analyze-file.ts +149 -0
  1242. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  1243. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  1244. package/src/commit/agentic/tools/git-overview.ts +81 -0
  1245. package/src/commit/agentic/tools/index.ts +54 -0
  1246. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  1247. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  1248. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  1249. package/src/commit/agentic/tools/schemas.ts +11 -0
  1250. package/src/commit/agentic/tools/split-commit.ts +241 -0
  1251. package/src/commit/agentic/topo-sort.ts +44 -0
  1252. package/src/commit/agentic/trivial.ts +51 -0
  1253. package/src/commit/agentic/validation.ts +183 -0
  1254. package/src/commit/analysis/conventional.ts +64 -0
  1255. package/src/commit/analysis/index.ts +4 -0
  1256. package/src/commit/analysis/scope.ts +242 -0
  1257. package/src/commit/analysis/summary.ts +107 -0
  1258. package/src/commit/analysis/validation.ts +66 -0
  1259. package/src/commit/changelog/detect.ts +40 -0
  1260. package/src/commit/changelog/generate.ts +101 -0
  1261. package/src/commit/changelog/index.ts +234 -0
  1262. package/src/commit/changelog/parse.ts +44 -0
  1263. package/src/commit/cli.ts +85 -0
  1264. package/src/commit/git/diff.ts +148 -0
  1265. package/src/commit/index.ts +5 -0
  1266. package/src/commit/map-reduce/index.ts +69 -0
  1267. package/src/commit/map-reduce/map-phase.ts +193 -0
  1268. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  1269. package/src/commit/map-reduce/utils.ts +9 -0
  1270. package/src/commit/message.ts +11 -0
  1271. package/src/commit/model-selection.ts +95 -0
  1272. package/src/commit/pipeline.ts +243 -0
  1273. package/src/commit/prompts/analysis-system.md +148 -0
  1274. package/src/commit/prompts/analysis-user.md +38 -0
  1275. package/src/commit/prompts/changelog-system.md +50 -0
  1276. package/src/commit/prompts/changelog-user.md +18 -0
  1277. package/src/commit/prompts/file-observer-system.md +24 -0
  1278. package/src/commit/prompts/file-observer-user.md +8 -0
  1279. package/src/commit/prompts/reduce-system.md +50 -0
  1280. package/src/commit/prompts/reduce-user.md +17 -0
  1281. package/src/commit/prompts/summary-retry.md +3 -0
  1282. package/src/commit/prompts/summary-system.md +38 -0
  1283. package/src/commit/prompts/summary-user.md +13 -0
  1284. package/src/commit/prompts/types-description.md +2 -0
  1285. package/src/commit/shared-llm.ts +70 -0
  1286. package/src/commit/types.ts +118 -0
  1287. package/src/commit/utils/exclusions.ts +42 -0
  1288. package/src/commit/utils.ts +58 -0
  1289. package/src/config/api-key-resolver.ts +67 -0
  1290. package/src/config/append-only-context-mode.ts +76 -0
  1291. package/src/config/config-file.ts +315 -0
  1292. package/src/config/file-lock.ts +164 -0
  1293. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  1294. package/src/config/keybindings.ts +636 -0
  1295. package/src/config/mcp-schema.json +247 -0
  1296. package/src/config/model-discovery.ts +919 -0
  1297. package/src/config/model-registry.ts +2275 -0
  1298. package/src/config/model-resolver.ts +1798 -0
  1299. package/src/config/model-roles.ts +99 -0
  1300. package/src/config/models-config-schema.ts +293 -0
  1301. package/src/config/models-config.ts +134 -0
  1302. package/src/config/prompt-templates.ts +205 -0
  1303. package/src/config/provider-globals.ts +25 -0
  1304. package/src/config/resolve-config-value.ts +94 -0
  1305. package/src/config/service-tier.ts +116 -0
  1306. package/src/config/settings-schema.ts +5247 -0
  1307. package/src/config/settings.ts +1540 -0
  1308. package/src/config.ts +242 -0
  1309. package/src/cursor.ts +340 -0
  1310. package/src/dap/client.ts +764 -0
  1311. package/src/dap/config.ts +333 -0
  1312. package/src/dap/defaults.json +212 -0
  1313. package/src/dap/index.ts +4 -0
  1314. package/src/dap/session.ts +1441 -0
  1315. package/src/dap/types.ts +610 -0
  1316. package/src/debug/index.ts +584 -0
  1317. package/src/debug/log-formatting.ts +58 -0
  1318. package/src/debug/log-viewer.ts +966 -0
  1319. package/src/debug/profiler.ts +168 -0
  1320. package/src/debug/protocol-probe.ts +267 -0
  1321. package/src/debug/raw-sse-buffer.ts +294 -0
  1322. package/src/debug/raw-sse.ts +312 -0
  1323. package/src/debug/remote-debugger.ts +151 -0
  1324. package/src/debug/report-bundle.ts +375 -0
  1325. package/src/debug/system-info.ts +111 -0
  1326. package/src/debug/terminal-info.ts +124 -0
  1327. package/src/discovery/agents-md.ts +67 -0
  1328. package/src/discovery/agents.ts +230 -0
  1329. package/src/discovery/at-imports.ts +273 -0
  1330. package/src/discovery/builtin-defaults.ts +39 -0
  1331. package/src/discovery/builtin-rules/go-add-cleanup.md +32 -0
  1332. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  1333. package/src/discovery/builtin-rules/go-exp-promoted.md +39 -0
  1334. package/src/discovery/builtin-rules/go-ioutil.md +36 -0
  1335. package/src/discovery/builtin-rules/go-join-hostport.md +29 -0
  1336. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  1337. package/src/discovery/builtin-rules/go-rand-v2.md +40 -0
  1338. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  1339. package/src/discovery/builtin-rules/index.ts +72 -0
  1340. package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
  1341. package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
  1342. package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
  1343. package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
  1344. package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
  1345. package/src/discovery/builtin-rules/rs-result-type.md +19 -0
  1346. package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
  1347. package/src/discovery/builtin-rules/ts-import-type.md +42 -0
  1348. package/src/discovery/builtin-rules/ts-no-any.md +65 -0
  1349. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
  1350. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
  1351. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  1352. package/src/discovery/builtin-rules/ts-no-return-type.md +44 -0
  1353. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  1354. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  1355. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +65 -0
  1356. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  1357. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  1358. package/src/discovery/builtin.ts +934 -0
  1359. package/src/discovery/claude-plugins.ts +387 -0
  1360. package/src/discovery/claude.ts +584 -0
  1361. package/src/discovery/cline.ts +83 -0
  1362. package/src/discovery/codex.ts +530 -0
  1363. package/src/discovery/cursor.ts +220 -0
  1364. package/src/discovery/gemini.ts +383 -0
  1365. package/src/discovery/github.ts +337 -0
  1366. package/src/discovery/helpers.ts +1102 -0
  1367. package/src/discovery/index.ts +81 -0
  1368. package/src/discovery/mcp-json.ts +172 -0
  1369. package/src/discovery/omp-extension-roots.ts +213 -0
  1370. package/src/discovery/omp-plugins.ts +383 -0
  1371. package/src/discovery/opencode.ts +441 -0
  1372. package/src/discovery/plugin-dir-roots.ts +28 -0
  1373. package/src/discovery/ssh.ts +153 -0
  1374. package/src/discovery/substitute-plugin-root.ts +29 -0
  1375. package/src/discovery/vscode.ts +105 -0
  1376. package/src/discovery/windsurf.ts +147 -0
  1377. package/src/edit/apply-patch/index.ts +87 -0
  1378. package/src/edit/apply-patch/parser.ts +174 -0
  1379. package/src/edit/diff.ts +999 -0
  1380. package/src/edit/file-snapshot-store.ts +157 -0
  1381. package/src/edit/hashline/block-resolver.ts +33 -0
  1382. package/src/edit/hashline/diff.ts +356 -0
  1383. package/src/edit/hashline/execute.ts +279 -0
  1384. package/src/edit/hashline/filesystem.ts +205 -0
  1385. package/src/edit/hashline/index.ts +5 -0
  1386. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  1387. package/src/edit/hashline/params.ts +12 -0
  1388. package/src/edit/index.ts +705 -0
  1389. package/src/edit/modes/apply-patch.lark +19 -0
  1390. package/src/edit/modes/apply-patch.ts +53 -0
  1391. package/src/edit/modes/patch.ts +1950 -0
  1392. package/src/edit/modes/replace.ts +1137 -0
  1393. package/src/edit/normalize.ts +345 -0
  1394. package/src/edit/notebook.ts +242 -0
  1395. package/src/edit/read-file.ts +25 -0
  1396. package/src/edit/renderer.ts +969 -0
  1397. package/src/edit/snapshot-details.ts +77 -0
  1398. package/src/edit/streaming.ts +698 -0
  1399. package/src/eval/__tests__/agent-bridge.test.ts +1399 -0
  1400. package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
  1401. package/src/eval/__tests__/budget-bridge.test.ts +69 -0
  1402. package/src/eval/__tests__/completion-bridge.test.ts +412 -0
  1403. package/src/eval/__tests__/helpers-local-roots.test.ts +55 -0
  1404. package/src/eval/__tests__/idle-timeout.test.ts +80 -0
  1405. package/src/eval/__tests__/js-context-manager.test.ts +291 -0
  1406. package/src/eval/__tests__/julia-prelude.test.ts +66 -0
  1407. package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
  1408. package/src/eval/__tests__/prelude-agent.test.ts +107 -0
  1409. package/src/eval/agent-bridge.ts +584 -0
  1410. package/src/eval/backend-helpers.ts +48 -0
  1411. package/src/eval/backend.ts +71 -0
  1412. package/src/eval/bridge-timeout.ts +44 -0
  1413. package/src/eval/budget-bridge.ts +48 -0
  1414. package/src/eval/completion-bridge.ts +211 -0
  1415. package/src/eval/concurrency-bridge.ts +34 -0
  1416. package/src/eval/executor-base.ts +425 -0
  1417. package/src/eval/idle-timeout.ts +91 -0
  1418. package/src/eval/index.ts +6 -0
  1419. package/src/eval/jl/executor.ts +540 -0
  1420. package/src/eval/jl/index.ts +54 -0
  1421. package/src/eval/jl/kernel.ts +235 -0
  1422. package/src/eval/jl/prelude.jl +735 -0
  1423. package/src/eval/jl/prelude.ts +3 -0
  1424. package/src/eval/jl/runner.jl +666 -0
  1425. package/src/eval/jl/runtime.ts +118 -0
  1426. package/src/eval/js/context-manager.ts +621 -0
  1427. package/src/eval/js/executor.ts +173 -0
  1428. package/src/eval/js/index.ts +40 -0
  1429. package/src/eval/js/shared/helpers.ts +170 -0
  1430. package/src/eval/js/shared/indirect-eval.ts +30 -0
  1431. package/src/eval/js/shared/local-module-loader.ts +364 -0
  1432. package/src/eval/js/shared/prelude.ts +2 -0
  1433. package/src/eval/js/shared/prelude.txt +293 -0
  1434. package/src/eval/js/shared/rewrite-imports.ts +532 -0
  1435. package/src/eval/js/shared/runtime.ts +574 -0
  1436. package/src/eval/js/shared/types.ts +18 -0
  1437. package/src/eval/js/tool-bridge.ts +163 -0
  1438. package/src/eval/js/worker-core.ts +151 -0
  1439. package/src/eval/js/worker-entry.ts +37 -0
  1440. package/src/eval/js/worker-protocol.ts +47 -0
  1441. package/src/eval/kernel-base.ts +569 -0
  1442. package/src/eval/py/__tests__/prelude.test.ts +32 -0
  1443. package/src/eval/py/__tests__/runner-shell-output.test.ts +157 -0
  1444. package/src/eval/py/display.ts +71 -0
  1445. package/src/eval/py/executor.ts +533 -0
  1446. package/src/eval/py/index.ts +57 -0
  1447. package/src/eval/py/kernel.ts +233 -0
  1448. package/src/eval/py/prelude.py +625 -0
  1449. package/src/eval/py/prelude.ts +3 -0
  1450. package/src/eval/py/runner.py +1322 -0
  1451. package/src/eval/py/runtime.ts +276 -0
  1452. package/src/eval/py/spawn-options.ts +126 -0
  1453. package/src/eval/py/tool-bridge.ts +182 -0
  1454. package/src/eval/rb/executor.ts +504 -0
  1455. package/src/eval/rb/index.ts +54 -0
  1456. package/src/eval/rb/kernel.ts +230 -0
  1457. package/src/eval/rb/prelude.rb +553 -0
  1458. package/src/eval/rb/prelude.ts +3 -0
  1459. package/src/eval/rb/runner.rb +581 -0
  1460. package/src/eval/rb/runtime.ts +132 -0
  1461. package/src/eval/runtime-env.ts +104 -0
  1462. package/src/eval/session-id.ts +8 -0
  1463. package/src/eval/types.ts +48 -0
  1464. package/src/exa/index.ts +2 -0
  1465. package/src/exa/mcp-client.ts +370 -0
  1466. package/src/exa/types.ts +69 -0
  1467. package/src/exec/bash-executor.ts +473 -0
  1468. package/src/exec/exec.ts +53 -0
  1469. package/src/exec/non-interactive-env.ts +119 -0
  1470. package/src/export/custom-share.ts +65 -0
  1471. package/src/export/html/index.ts +308 -0
  1472. package/src/export/html/share-loader.js +102 -0
  1473. package/src/export/html/template.css +1337 -0
  1474. package/src/export/html/template.html +49 -0
  1475. package/src/export/html/template.js +1634 -0
  1476. package/src/export/html/tool-views.generated.js +37 -0
  1477. package/src/export/html/vendor/highlight.min.js +1213 -0
  1478. package/src/export/html/vendor/marked.min.js +6 -0
  1479. package/src/export/html/web-palette.ts +142 -0
  1480. package/src/export/share.ts +481 -0
  1481. package/src/export/ttsr.ts +583 -0
  1482. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  1483. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  1484. package/src/extensibility/custom-commands/index.ts +2 -0
  1485. package/src/extensibility/custom-commands/loader.ts +242 -0
  1486. package/src/extensibility/custom-commands/types.ts +119 -0
  1487. package/src/extensibility/custom-tools/index.ts +7 -0
  1488. package/src/extensibility/custom-tools/loader.ts +268 -0
  1489. package/src/extensibility/custom-tools/types.ts +280 -0
  1490. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  1491. package/src/extensibility/extensions/compact-handler.ts +40 -0
  1492. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  1493. package/src/extensibility/extensions/index.ts +16 -0
  1494. package/src/extensibility/extensions/loader.ts +596 -0
  1495. package/src/extensibility/extensions/model-api.ts +39 -0
  1496. package/src/extensibility/extensions/runner.ts +1039 -0
  1497. package/src/extensibility/extensions/types.ts +1394 -0
  1498. package/src/extensibility/extensions/wrapper.ts +266 -0
  1499. package/src/extensibility/hooks/index.ts +6 -0
  1500. package/src/extensibility/hooks/loader.ts +244 -0
  1501. package/src/extensibility/hooks/runner.ts +425 -0
  1502. package/src/extensibility/hooks/tool-wrapper.ts +117 -0
  1503. package/src/extensibility/hooks/types.ts +613 -0
  1504. package/src/extensibility/legacy-pi-ai-shim.ts +73 -0
  1505. package/src/extensibility/legacy-pi-coding-agent-shim.ts +646 -0
  1506. package/src/extensibility/plugins/doctor.ts +65 -0
  1507. package/src/extensibility/plugins/git-url.ts +367 -0
  1508. package/src/extensibility/plugins/index.ts +9 -0
  1509. package/src/extensibility/plugins/installer.ts +201 -0
  1510. package/src/extensibility/plugins/legacy-pi-bundled-keys.ts +1011 -0
  1511. package/src/extensibility/plugins/legacy-pi-bundled-registry.ts +3430 -0
  1512. package/src/extensibility/plugins/legacy-pi-compat.ts +1141 -0
  1513. package/src/extensibility/plugins/loader.ts +535 -0
  1514. package/src/extensibility/plugins/manager.ts +1121 -0
  1515. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  1516. package/src/extensibility/plugins/marketplace/fetcher.ts +315 -0
  1517. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  1518. package/src/extensibility/plugins/marketplace/manager.ts +926 -0
  1519. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  1520. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  1521. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  1522. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  1523. package/src/extensibility/plugins/parser.ts +107 -0
  1524. package/src/extensibility/plugins/runtime-config.ts +9 -0
  1525. package/src/extensibility/plugins/types.ts +194 -0
  1526. package/src/extensibility/session-handler-types.ts +21 -0
  1527. package/src/extensibility/shared-events.ts +376 -0
  1528. package/src/extensibility/skills.ts +508 -0
  1529. package/src/extensibility/slash-commands.ts +131 -0
  1530. package/src/extensibility/tool-event-input.ts +80 -0
  1531. package/src/extensibility/tool-proxy.ts +28 -0
  1532. package/src/extensibility/typebox.ts +945 -0
  1533. package/src/extensibility/utils.ts +118 -0
  1534. package/src/goals/guided-setup.ts +143 -0
  1535. package/src/goals/index.ts +3 -0
  1536. package/src/goals/runtime.ts +521 -0
  1537. package/src/goals/state.ts +37 -0
  1538. package/src/goals/tools/goal-tool.ts +251 -0
  1539. package/src/hindsight/backend.ts +354 -0
  1540. package/src/hindsight/bank.ts +156 -0
  1541. package/src/hindsight/client.test.ts +33 -0
  1542. package/src/hindsight/client.ts +643 -0
  1543. package/src/hindsight/config.ts +175 -0
  1544. package/src/hindsight/content.ts +266 -0
  1545. package/src/hindsight/index.ts +8 -0
  1546. package/src/hindsight/mental-models.ts +429 -0
  1547. package/src/hindsight/seeds.json +32 -0
  1548. package/src/hindsight/state.ts +492 -0
  1549. package/src/hindsight/transcript.ts +71 -0
  1550. package/src/index.ts +66 -0
  1551. package/src/internal-urls/__tests__/ssh-protocol.test.ts +331 -0
  1552. package/src/internal-urls/agent-protocol.ts +146 -0
  1553. package/src/internal-urls/artifact-protocol.ts +151 -0
  1554. package/src/internal-urls/docs-index.generated.txt +2 -0
  1555. package/src/internal-urls/docs-index.ts +101 -0
  1556. package/src/internal-urls/filesystem-resource.ts +34 -0
  1557. package/src/internal-urls/history-protocol.ts +118 -0
  1558. package/src/internal-urls/index.ts +26 -0
  1559. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  1560. package/src/internal-urls/json-query.ts +126 -0
  1561. package/src/internal-urls/local-protocol.ts +469 -0
  1562. package/src/internal-urls/mcp-protocol.ts +151 -0
  1563. package/src/internal-urls/memory-protocol.ts +173 -0
  1564. package/src/internal-urls/omp-protocol.ts +94 -0
  1565. package/src/internal-urls/parse.ts +72 -0
  1566. package/src/internal-urls/registry-helpers.ts +40 -0
  1567. package/src/internal-urls/router.ts +107 -0
  1568. package/src/internal-urls/rule-protocol.ts +45 -0
  1569. package/src/internal-urls/skill-protocol.ts +112 -0
  1570. package/src/internal-urls/ssh-protocol.ts +367 -0
  1571. package/src/internal-urls/types.ts +182 -0
  1572. package/src/internal-urls/vault-protocol.ts +939 -0
  1573. package/src/irc/bus.ts +320 -0
  1574. package/src/jsonrpc/message-framing.ts +142 -0
  1575. package/src/lib/xai-http.ts +124 -0
  1576. package/src/lsp/client.ts +1249 -0
  1577. package/src/lsp/clients/biome-client.ts +264 -0
  1578. package/src/lsp/clients/index.ts +50 -0
  1579. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  1580. package/src/lsp/clients/swiftlint-client.ts +120 -0
  1581. package/src/lsp/config.ts +531 -0
  1582. package/src/lsp/defaults.json +499 -0
  1583. package/src/lsp/diagnostics-ledger.ts +51 -0
  1584. package/src/lsp/edits.ts +288 -0
  1585. package/src/lsp/format-options.ts +119 -0
  1586. package/src/lsp/index.ts +2539 -0
  1587. package/src/lsp/lspmux.ts +233 -0
  1588. package/src/lsp/render.ts +668 -0
  1589. package/src/lsp/startup-events.ts +13 -0
  1590. package/src/lsp/types.ts +444 -0
  1591. package/src/lsp/utils.ts +718 -0
  1592. package/src/main.ts +1474 -0
  1593. package/src/markit/NOTICE +32 -0
  1594. package/src/markit/converters/docx.ts +56 -0
  1595. package/src/markit/converters/epub.ts +136 -0
  1596. package/src/markit/converters/mammoth.d.ts +24 -0
  1597. package/src/markit/converters/pdf/columns.ts +103 -0
  1598. package/src/markit/converters/pdf/extract.ts +574 -0
  1599. package/src/markit/converters/pdf/grid.ts +780 -0
  1600. package/src/markit/converters/pdf/headers.ts +106 -0
  1601. package/src/markit/converters/pdf/index.ts +146 -0
  1602. package/src/markit/converters/pdf/render.ts +501 -0
  1603. package/src/markit/converters/pdf/types.ts +84 -0
  1604. package/src/markit/converters/pptx.ts +325 -0
  1605. package/src/markit/converters/xlsx.ts +173 -0
  1606. package/src/markit/index.ts +2 -0
  1607. package/src/markit/registry.ts +59 -0
  1608. package/src/markit/types.ts +35 -0
  1609. package/src/mcp/client.ts +511 -0
  1610. package/src/mcp/config-writer.ts +350 -0
  1611. package/src/mcp/config.ts +369 -0
  1612. package/src/mcp/index.ts +29 -0
  1613. package/src/mcp/json-rpc.ts +122 -0
  1614. package/src/mcp/loader.ts +125 -0
  1615. package/src/mcp/manager.ts +1362 -0
  1616. package/src/mcp/oauth-credentials.ts +104 -0
  1617. package/src/mcp/oauth-discovery.ts +560 -0
  1618. package/src/mcp/oauth-flow.ts +787 -0
  1619. package/src/mcp/render.ts +155 -0
  1620. package/src/mcp/smithery-auth.ts +107 -0
  1621. package/src/mcp/smithery-connect.ts +154 -0
  1622. package/src/mcp/smithery-registry.test.ts +51 -0
  1623. package/src/mcp/smithery-registry.ts +500 -0
  1624. package/src/mcp/startup-events.ts +116 -0
  1625. package/src/mcp/timeout.ts +59 -0
  1626. package/src/mcp/tool-bridge.ts +484 -0
  1627. package/src/mcp/tool-cache.ts +117 -0
  1628. package/src/mcp/transports/http.ts +523 -0
  1629. package/src/mcp/transports/index.ts +7 -0
  1630. package/src/mcp/transports/sse.ts +377 -0
  1631. package/src/mcp/transports/stdio.test.ts +95 -0
  1632. package/src/mcp/transports/stdio.ts +663 -0
  1633. package/src/mcp/types.ts +430 -0
  1634. package/src/memories/index.ts +1395 -0
  1635. package/src/memories/storage.ts +578 -0
  1636. package/src/memory-backend/index.ts +18 -0
  1637. package/src/memory-backend/local-backend.ts +47 -0
  1638. package/src/memory-backend/off-backend.ts +25 -0
  1639. package/src/memory-backend/resolve.ts +25 -0
  1640. package/src/memory-backend/runtime.ts +66 -0
  1641. package/src/memory-backend/types.ts +166 -0
  1642. package/src/mnemopi/backend.ts +612 -0
  1643. package/src/mnemopi/config.ts +267 -0
  1644. package/src/mnemopi/embed-client.ts +246 -0
  1645. package/src/mnemopi/embed-protocol.ts +35 -0
  1646. package/src/mnemopi/embed-worker.ts +113 -0
  1647. package/src/mnemopi/index.ts +3 -0
  1648. package/src/mnemopi/state.ts +722 -0
  1649. package/src/modes/acp/acp-agent.ts +2372 -0
  1650. package/src/modes/acp/acp-client-bridge.ts +154 -0
  1651. package/src/modes/acp/acp-event-mapper.ts +1002 -0
  1652. package/src/modes/acp/acp-mode.ts +23 -0
  1653. package/src/modes/acp/index.ts +2 -0
  1654. package/src/modes/acp/terminal-auth.ts +37 -0
  1655. package/src/modes/components/__tests__/move-overlay.test.ts +237 -0
  1656. package/src/modes/components/__tests__/skill-message.test.ts +92 -0
  1657. package/src/modes/components/advisor-config.ts +555 -0
  1658. package/src/modes/components/advisor-message.ts +109 -0
  1659. package/src/modes/components/agent-dashboard.ts +1183 -0
  1660. package/src/modes/components/agent-hub.ts +586 -0
  1661. package/src/modes/components/agent-transcript-viewer.ts +649 -0
  1662. package/src/modes/components/assistant-message.ts +869 -0
  1663. package/src/modes/components/background-tan-message.ts +36 -0
  1664. package/src/modes/components/bash-execution.ts +229 -0
  1665. package/src/modes/components/bordered-loader.ts +41 -0
  1666. package/src/modes/components/btw-panel.ts +124 -0
  1667. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  1668. package/src/modes/components/chat-block.ts +111 -0
  1669. package/src/modes/components/chat-transcript-builder.ts +449 -0
  1670. package/src/modes/components/collab-prompt-message.ts +32 -0
  1671. package/src/modes/components/compaction-summary-message.ts +215 -0
  1672. package/src/modes/components/copy-selector.ts +206 -0
  1673. package/src/modes/components/countdown-timer.ts +75 -0
  1674. package/src/modes/components/custom-editor.test.ts +283 -0
  1675. package/src/modes/components/custom-editor.ts +835 -0
  1676. package/src/modes/components/custom-message.ts +67 -0
  1677. package/src/modes/components/diff.ts +254 -0
  1678. package/src/modes/components/dynamic-border.ts +34 -0
  1679. package/src/modes/components/error-banner.ts +33 -0
  1680. package/src/modes/components/eval-execution.ts +167 -0
  1681. package/src/modes/components/execution-shared.ts +101 -0
  1682. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  1683. package/src/modes/components/extensions/extension-list.ts +507 -0
  1684. package/src/modes/components/extensions/index.ts +9 -0
  1685. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  1686. package/src/modes/components/extensions/state-manager.ts +648 -0
  1687. package/src/modes/components/extensions/types.ts +186 -0
  1688. package/src/modes/components/footer.ts +276 -0
  1689. package/src/modes/components/history-search.ts +268 -0
  1690. package/src/modes/components/hook-editor.ts +183 -0
  1691. package/src/modes/components/hook-input.ts +87 -0
  1692. package/src/modes/components/hook-message.ts +67 -0
  1693. package/src/modes/components/hook-selector.ts +678 -0
  1694. package/src/modes/components/index.ts +40 -0
  1695. package/src/modes/components/keybinding-hints.ts +65 -0
  1696. package/src/modes/components/late-diagnostics-message.ts +60 -0
  1697. package/src/modes/components/login-dialog.ts +178 -0
  1698. package/src/modes/components/logout-account-selector.ts +130 -0
  1699. package/src/modes/components/mcp-add-wizard.ts +1408 -0
  1700. package/src/modes/components/message-frame.ts +92 -0
  1701. package/src/modes/components/model-selector.ts +1267 -0
  1702. package/src/modes/components/move-overlay.ts +294 -0
  1703. package/src/modes/components/oauth-selector.ts +457 -0
  1704. package/src/modes/components/omfg-panel.ts +141 -0
  1705. package/src/modes/components/overlay-box.ts +109 -0
  1706. package/src/modes/components/plan-review-overlay.ts +847 -0
  1707. package/src/modes/components/plan-toc.ts +138 -0
  1708. package/src/modes/components/plugin-selector.ts +100 -0
  1709. package/src/modes/components/plugin-settings.ts +745 -0
  1710. package/src/modes/components/queue-mode-selector.ts +61 -0
  1711. package/src/modes/components/read-tool-group.ts +676 -0
  1712. package/src/modes/components/reset-usage-selector.ts +161 -0
  1713. package/src/modes/components/segment-track.ts +89 -0
  1714. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  1715. package/src/modes/components/selector-helpers.ts +129 -0
  1716. package/src/modes/components/session-selector.ts +744 -0
  1717. package/src/modes/components/settings-defs.ts +238 -0
  1718. package/src/modes/components/settings-selector.ts +1265 -0
  1719. package/src/modes/components/show-images-selector.ts +50 -0
  1720. package/src/modes/components/skill-message.ts +110 -0
  1721. package/src/modes/components/snapcompact-shape-preview-doc.md +18 -0
  1722. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  1723. package/src/modes/components/status-line/component.test.ts +44 -0
  1724. package/src/modes/components/status-line/component.ts +1308 -0
  1725. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  1726. package/src/modes/components/status-line/git-utils.ts +42 -0
  1727. package/src/modes/components/status-line/index.ts +5 -0
  1728. package/src/modes/components/status-line/presets.ts +106 -0
  1729. package/src/modes/components/status-line/segments.ts +663 -0
  1730. package/src/modes/components/status-line/separators.ts +55 -0
  1731. package/src/modes/components/status-line/token-rate.ts +66 -0
  1732. package/src/modes/components/status-line/types.ts +147 -0
  1733. package/src/modes/components/theme-selector.ts +68 -0
  1734. package/src/modes/components/thinking-selector.ts +57 -0
  1735. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  1736. package/src/modes/components/tips.txt +24 -0
  1737. package/src/modes/components/todo-reminder.ts +43 -0
  1738. package/src/modes/components/tool-execution.ts +1308 -0
  1739. package/src/modes/components/transcript-container.ts +456 -0
  1740. package/src/modes/components/tree-selector.ts +1002 -0
  1741. package/src/modes/components/ttsr-notification.ts +123 -0
  1742. package/src/modes/components/usage-row.ts +32 -0
  1743. package/src/modes/components/user-message-selector.ts +227 -0
  1744. package/src/modes/components/user-message.ts +68 -0
  1745. package/src/modes/components/visual-truncate.ts +63 -0
  1746. package/src/modes/components/welcome.ts +579 -0
  1747. package/src/modes/controllers/btw-controller.ts +198 -0
  1748. package/src/modes/controllers/command-controller-shared.ts +109 -0
  1749. package/src/modes/controllers/command-controller.ts +1751 -0
  1750. package/src/modes/controllers/event-controller.ts +1497 -0
  1751. package/src/modes/controllers/extension-ui-controller.ts +977 -0
  1752. package/src/modes/controllers/input-controller.ts +1851 -0
  1753. package/src/modes/controllers/mcp-command-controller.ts +2364 -0
  1754. package/src/modes/controllers/omfg-controller.ts +283 -0
  1755. package/src/modes/controllers/omfg-rule.ts +647 -0
  1756. package/src/modes/controllers/selector-controller.ts +1443 -0
  1757. package/src/modes/controllers/session-focus-controller.ts +112 -0
  1758. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  1759. package/src/modes/controllers/streaming-reveal.ts +392 -0
  1760. package/src/modes/controllers/tan-command-controller.ts +190 -0
  1761. package/src/modes/controllers/todo-command-controller.ts +484 -0
  1762. package/src/modes/controllers/tool-args-reveal.ts +582 -0
  1763. package/src/modes/data/emojis.json +1 -0
  1764. package/src/modes/emoji-autocomplete.ts +285 -0
  1765. package/src/modes/gradient-highlight.ts +99 -0
  1766. package/src/modes/image-references.ts +137 -0
  1767. package/src/modes/index.ts +17 -0
  1768. package/src/modes/interactive-mode.ts +4223 -0
  1769. package/src/modes/internal-url-autocomplete.ts +158 -0
  1770. package/src/modes/loop-limit.ts +192 -0
  1771. package/src/modes/magic-keywords.ts +42 -0
  1772. package/src/modes/markdown-prose.ts +247 -0
  1773. package/src/modes/oauth-manual-input.ts +69 -0
  1774. package/src/modes/orchestrate.ts +42 -0
  1775. package/src/modes/print-mode.ts +130 -0
  1776. package/src/modes/prompt-action-autocomplete.ts +262 -0
  1777. package/src/modes/rpc/host-tools.ts +186 -0
  1778. package/src/modes/rpc/host-uris.ts +235 -0
  1779. package/src/modes/rpc/rpc-client.ts +1033 -0
  1780. package/src/modes/rpc/rpc-mode.ts +1311 -0
  1781. package/src/modes/rpc/rpc-subagents.ts +265 -0
  1782. package/src/modes/rpc/rpc-types.ts +499 -0
  1783. package/src/modes/running-subagent-badge.ts +13 -0
  1784. package/src/modes/runtime-init.ts +142 -0
  1785. package/src/modes/session-observer-registry.ts +215 -0
  1786. package/src/modes/session-teardown.test.ts +219 -0
  1787. package/src/modes/session-teardown.ts +82 -0
  1788. package/src/modes/setup-version.ts +11 -0
  1789. package/src/modes/setup-wizard/index.ts +101 -0
  1790. package/src/modes/setup-wizard/lazy.ts +16 -0
  1791. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  1792. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  1793. package/src/modes/setup-wizard/scenes/providers.ts +104 -0
  1794. package/src/modes/setup-wizard/scenes/sign-in.ts +304 -0
  1795. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  1796. package/src/modes/setup-wizard/scenes/theme.ts +320 -0
  1797. package/src/modes/setup-wizard/scenes/types.ts +57 -0
  1798. package/src/modes/setup-wizard/scenes/web-search.ts +140 -0
  1799. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  1800. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  1801. package/src/modes/shared.ts +49 -0
  1802. package/src/modes/skill-command.ts +91 -0
  1803. package/src/modes/theme/dark.json +95 -0
  1804. package/src/modes/theme/defaults/alabaster.json +93 -0
  1805. package/src/modes/theme/defaults/amethyst.json +96 -0
  1806. package/src/modes/theme/defaults/anthracite.json +93 -0
  1807. package/src/modes/theme/defaults/basalt.json +91 -0
  1808. package/src/modes/theme/defaults/birch.json +95 -0
  1809. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  1810. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  1811. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  1812. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  1813. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  1814. package/src/modes/theme/defaults/dark-copper.json +95 -0
  1815. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  1816. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  1817. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  1818. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  1819. package/src/modes/theme/defaults/dark-ember.json +95 -0
  1820. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  1821. package/src/modes/theme/defaults/dark-forest.json +96 -0
  1822. package/src/modes/theme/defaults/dark-github.json +105 -0
  1823. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  1824. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  1825. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  1826. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  1827. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  1828. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  1829. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  1830. package/src/modes/theme/defaults/dark-nord.json +97 -0
  1831. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  1832. package/src/modes/theme/defaults/dark-one.json +100 -0
  1833. package/src/modes/theme/defaults/dark-poimandres.json +142 -0
  1834. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  1835. package/src/modes/theme/defaults/dark-reef.json +91 -0
  1836. package/src/modes/theme/defaults/dark-retro.json +92 -0
  1837. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  1838. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  1839. package/src/modes/theme/defaults/dark-slate.json +95 -0
  1840. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  1841. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  1842. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  1843. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  1844. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  1845. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  1846. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  1847. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  1848. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  1849. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  1850. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  1851. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  1852. package/src/modes/theme/defaults/graphite.json +92 -0
  1853. package/src/modes/theme/defaults/index.ts +199 -0
  1854. package/src/modes/theme/defaults/light-arctic.json +107 -0
  1855. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  1856. package/src/modes/theme/defaults/light-canyon.json +91 -0
  1857. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  1858. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  1859. package/src/modes/theme/defaults/light-coral.json +95 -0
  1860. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  1861. package/src/modes/theme/defaults/light-dawn.json +90 -0
  1862. package/src/modes/theme/defaults/light-dunes.json +91 -0
  1863. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  1864. package/src/modes/theme/defaults/light-forest.json +100 -0
  1865. package/src/modes/theme/defaults/light-frost.json +95 -0
  1866. package/src/modes/theme/defaults/light-github.json +115 -0
  1867. package/src/modes/theme/defaults/light-glacier.json +91 -0
  1868. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  1869. package/src/modes/theme/defaults/light-haze.json +90 -0
  1870. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  1871. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  1872. package/src/modes/theme/defaults/light-lavender.json +95 -0
  1873. package/src/modes/theme/defaults/light-meadow.json +91 -0
  1874. package/src/modes/theme/defaults/light-mint.json +95 -0
  1875. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  1876. package/src/modes/theme/defaults/light-ocean.json +99 -0
  1877. package/src/modes/theme/defaults/light-one.json +99 -0
  1878. package/src/modes/theme/defaults/light-opal.json +91 -0
  1879. package/src/modes/theme/defaults/light-orchard.json +91 -0
  1880. package/src/modes/theme/defaults/light-paper.json +95 -0
  1881. package/src/modes/theme/defaults/light-poimandres.json +142 -0
  1882. package/src/modes/theme/defaults/light-prism.json +90 -0
  1883. package/src/modes/theme/defaults/light-retro.json +98 -0
  1884. package/src/modes/theme/defaults/light-sand.json +95 -0
  1885. package/src/modes/theme/defaults/light-savanna.json +91 -0
  1886. package/src/modes/theme/defaults/light-solarized.json +102 -0
  1887. package/src/modes/theme/defaults/light-soleil.json +90 -0
  1888. package/src/modes/theme/defaults/light-sunset.json +99 -0
  1889. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  1890. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  1891. package/src/modes/theme/defaults/light-wetland.json +91 -0
  1892. package/src/modes/theme/defaults/light-zenith.json +89 -0
  1893. package/src/modes/theme/defaults/limestone.json +94 -0
  1894. package/src/modes/theme/defaults/mahogany.json +97 -0
  1895. package/src/modes/theme/defaults/marble.json +93 -0
  1896. package/src/modes/theme/defaults/obsidian.json +91 -0
  1897. package/src/modes/theme/defaults/onyx.json +91 -0
  1898. package/src/modes/theme/defaults/pearl.json +93 -0
  1899. package/src/modes/theme/defaults/porcelain.json +91 -0
  1900. package/src/modes/theme/defaults/quartz.json +96 -0
  1901. package/src/modes/theme/defaults/sandstone.json +95 -0
  1902. package/src/modes/theme/defaults/titanium.json +90 -0
  1903. package/src/modes/theme/light.json +93 -0
  1904. package/src/modes/theme/mermaid-cache.ts +92 -0
  1905. package/src/modes/theme/mermaid-rendering.test.ts +53 -0
  1906. package/src/modes/theme/shimmer.ts +269 -0
  1907. package/src/modes/theme/theme-schema.json +459 -0
  1908. package/src/modes/theme/theme.ts +3004 -0
  1909. package/src/modes/turn-budget.ts +31 -0
  1910. package/src/modes/types.ts +437 -0
  1911. package/src/modes/ultrathink.ts +41 -0
  1912. package/src/modes/utils/context-usage.ts +432 -0
  1913. package/src/modes/utils/copy-targets.ts +378 -0
  1914. package/src/modes/utils/hotkeys-markdown.ts +62 -0
  1915. package/src/modes/utils/interactive-context-helpers.ts +27 -0
  1916. package/src/modes/utils/keybinding-matchers.ts +86 -0
  1917. package/src/modes/utils/tools-markdown.ts +27 -0
  1918. package/src/modes/utils/transcript-render-helpers.ts +184 -0
  1919. package/src/modes/utils/ui-helpers.ts +864 -0
  1920. package/src/modes/workflow.ts +42 -0
  1921. package/src/plan-mode/approved-plan-prompt.test.ts +36 -0
  1922. package/src/plan-mode/approved-plan.ts +186 -0
  1923. package/src/plan-mode/plan-handoff.ts +37 -0
  1924. package/src/plan-mode/plan-protection.ts +31 -0
  1925. package/src/plan-mode/state.ts +6 -0
  1926. package/src/priority.json +60 -0
  1927. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  1928. package/src/prompts/advisor/advise-tool.md +3 -0
  1929. package/src/prompts/advisor/context-files.md +8 -0
  1930. package/src/prompts/advisor/system.md +89 -0
  1931. package/src/prompts/agents/designer.md +74 -0
  1932. package/src/prompts/agents/explore.md +58 -0
  1933. package/src/prompts/agents/frontmatter.md +11 -0
  1934. package/src/prompts/agents/init.md +33 -0
  1935. package/src/prompts/agents/librarian.md +119 -0
  1936. package/src/prompts/agents/plan.md +48 -0
  1937. package/src/prompts/agents/reviewer.md +140 -0
  1938. package/src/prompts/agents/task.md +17 -0
  1939. package/src/prompts/agents/tester.md +111 -0
  1940. package/src/prompts/bench.md +6 -0
  1941. package/src/prompts/ci-green-request.md +36 -0
  1942. package/src/prompts/dry-balance-bench.md +8 -0
  1943. package/src/prompts/goals/goal-budget-limit.md +16 -0
  1944. package/src/prompts/goals/goal-continuation.md +28 -0
  1945. package/src/prompts/goals/goal-mode-active.md +23 -0
  1946. package/src/prompts/goals/goal-mode-context.md +4 -0
  1947. package/src/prompts/goals/goal-todo-context.md +20 -0
  1948. package/src/prompts/goals/guided-goal-interview.md +8 -0
  1949. package/src/prompts/goals/guided-goal-system.md +12 -0
  1950. package/src/prompts/memories/consolidation.md +30 -0
  1951. package/src/prompts/memories/consolidation_system.md +4 -0
  1952. package/src/prompts/memories/read-path.md +17 -0
  1953. package/src/prompts/memories/stage_one_input.md +6 -0
  1954. package/src/prompts/memories/stage_one_system.md +21 -0
  1955. package/src/prompts/review-custom-request.md +21 -0
  1956. package/src/prompts/review-headless-request.md +16 -0
  1957. package/src/prompts/review-request.md +68 -0
  1958. package/src/prompts/skills/autoload.md +8 -0
  1959. package/src/prompts/skills/user-invocation.md +11 -0
  1960. package/src/prompts/steering/parent-irc.md +5 -0
  1961. package/src/prompts/steering/user-interjection.md +9 -0
  1962. package/src/prompts/system/active-repo-context.md +4 -0
  1963. package/src/prompts/system/agent-creation-architect.md +50 -0
  1964. package/src/prompts/system/agent-creation-user.md +6 -0
  1965. package/src/prompts/system/auto-continue.md +1 -0
  1966. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  1967. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  1968. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  1969. package/src/prompts/system/autolearn-guidance.md +7 -0
  1970. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  1971. package/src/prompts/system/background-tan-dispatch.md +8 -0
  1972. package/src/prompts/system/btw-user.md +8 -0
  1973. package/src/prompts/system/commit-message-system.md +14 -0
  1974. package/src/prompts/system/custom-system-prompt.md +64 -0
  1975. package/src/prompts/system/eager-task.md +7 -0
  1976. package/src/prompts/system/eager-todo.md +18 -0
  1977. package/src/prompts/system/empty-stop-retry.md +4 -0
  1978. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  1979. package/src/prompts/system/interrupted-thinking.md +7 -0
  1980. package/src/prompts/system/irc-autoreply.md +6 -0
  1981. package/src/prompts/system/irc-incoming.md +9 -0
  1982. package/src/prompts/system/manual-continue.md +7 -0
  1983. package/src/prompts/system/memory-consolidation-system.md +8 -0
  1984. package/src/prompts/system/memory-extraction-system.md +26 -0
  1985. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  1986. package/src/prompts/system/omfg-user.md +50 -0
  1987. package/src/prompts/system/orchestrate-notice.md +40 -0
  1988. package/src/prompts/system/personalities/default.md +18 -0
  1989. package/src/prompts/system/personalities/friendly.md +17 -0
  1990. package/src/prompts/system/personalities/pragmatic.md +15 -0
  1991. package/src/prompts/system/plan-mode-active.md +118 -0
  1992. package/src/prompts/system/plan-mode-approved.md +22 -0
  1993. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  1994. package/src/prompts/system/plan-mode-reference.md +10 -0
  1995. package/src/prompts/system/plan-mode-subagent.md +33 -0
  1996. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  1997. package/src/prompts/system/project-prompt.md +54 -0
  1998. package/src/prompts/system/recap-user.md +9 -0
  1999. package/src/prompts/system/rewind-report.md +6 -0
  2000. package/src/prompts/system/side-channel-no-tools.md +3 -0
  2001. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  2002. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  2003. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  2004. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  2005. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  2006. package/src/prompts/system/speech-rewrite.md +15 -0
  2007. package/src/prompts/system/subagent-system-prompt.md +77 -0
  2008. package/src/prompts/system/subagent-user-prompt.md +3 -0
  2009. package/src/prompts/system/subagent-yield-reminder.md +13 -0
  2010. package/src/prompts/system/system-prompt.md +248 -0
  2011. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  2012. package/src/prompts/system/tiny-title-system.md +8 -0
  2013. package/src/prompts/system/title-marker-instruction.md +1 -0
  2014. package/src/prompts/system/title-system-marker.md +17 -0
  2015. package/src/prompts/system/title-system.md +17 -0
  2016. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  2017. package/src/prompts/system/ttsr-interrupt.md +7 -0
  2018. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  2019. package/src/prompts/system/ultrathink-notice.md +3 -0
  2020. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  2021. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  2022. package/src/prompts/system/web-search.md +25 -0
  2023. package/src/prompts/system/workflow-notice.md +70 -0
  2024. package/src/prompts/tools/apply-patch.md +65 -0
  2025. package/src/prompts/tools/ask.md +22 -0
  2026. package/src/prompts/tools/ast-edit.md +22 -0
  2027. package/src/prompts/tools/ast-grep.md +25 -0
  2028. package/src/prompts/tools/async-result.md +8 -0
  2029. package/src/prompts/tools/bash.md +57 -0
  2030. package/src/prompts/tools/browser.md +45 -0
  2031. package/src/prompts/tools/checkpoint.md +15 -0
  2032. package/src/prompts/tools/debug.md +17 -0
  2033. package/src/prompts/tools/eval.md +72 -0
  2034. package/src/prompts/tools/github.md +17 -0
  2035. package/src/prompts/tools/glob.md +15 -0
  2036. package/src/prompts/tools/goal.md +11 -0
  2037. package/src/prompts/tools/grep.md +22 -0
  2038. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  2039. package/src/prompts/tools/image-attachment-describe.md +10 -0
  2040. package/src/prompts/tools/image-gen.md +7 -0
  2041. package/src/prompts/tools/inspect-image-system.md +20 -0
  2042. package/src/prompts/tools/inspect-image.md +22 -0
  2043. package/src/prompts/tools/irc.md +24 -0
  2044. package/src/prompts/tools/job.md +11 -0
  2045. package/src/prompts/tools/learn.md +7 -0
  2046. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  2047. package/src/prompts/tools/lsp.md +28 -0
  2048. package/src/prompts/tools/manage-skill.md +9 -0
  2049. package/src/prompts/tools/memory-edit.md +8 -0
  2050. package/src/prompts/tools/patch.md +57 -0
  2051. package/src/prompts/tools/read.md +77 -0
  2052. package/src/prompts/tools/recall.md +5 -0
  2053. package/src/prompts/tools/reflect.md +5 -0
  2054. package/src/prompts/tools/replace.md +29 -0
  2055. package/src/prompts/tools/resolve.md +4 -0
  2056. package/src/prompts/tools/retain.md +6 -0
  2057. package/src/prompts/tools/rewind.md +14 -0
  2058. package/src/prompts/tools/search-tool-bm25.md +32 -0
  2059. package/src/prompts/tools/ssh.md +23 -0
  2060. package/src/prompts/tools/task-summary.md +17 -0
  2061. package/src/prompts/tools/task.md +68 -0
  2062. package/src/prompts/tools/todo.md +39 -0
  2063. package/src/prompts/tools/web-search.md +6 -0
  2064. package/src/prompts/tools/write.md +14 -0
  2065. package/src/registry/agent-lifecycle.ts +270 -0
  2066. package/src/registry/agent-registry.ts +190 -0
  2067. package/src/sdk.ts +3037 -0
  2068. package/src/secrets/index.ts +123 -0
  2069. package/src/secrets/obfuscator.ts +441 -0
  2070. package/src/secrets/regex.ts +21 -0
  2071. package/src/session/agent-session.ts +15855 -0
  2072. package/src/session/agent-storage.ts +478 -0
  2073. package/src/session/artifacts.ts +153 -0
  2074. package/src/session/auth-broker-config.ts +92 -0
  2075. package/src/session/auth-storage.ts +24 -0
  2076. package/src/session/blob-store.ts +279 -0
  2077. package/src/session/client-bridge.ts +85 -0
  2078. package/src/session/codex-auto-reset.ts +202 -0
  2079. package/src/session/compact-modes.ts +105 -0
  2080. package/src/session/exit-diagnostics.ts +202 -0
  2081. package/src/session/history-storage.ts +360 -0
  2082. package/src/session/indexed-session-storage.ts +537 -0
  2083. package/src/session/messages.test.ts +125 -0
  2084. package/src/session/messages.ts +740 -0
  2085. package/src/session/provider-image-budget.ts +86 -0
  2086. package/src/session/redis-session-storage.ts +217 -0
  2087. package/src/session/session-context.ts +442 -0
  2088. package/src/session/session-dump-format.ts +216 -0
  2089. package/src/session/session-entries.ts +241 -0
  2090. package/src/session/session-history-format.ts +396 -0
  2091. package/src/session/session-listing.ts +652 -0
  2092. package/src/session/session-loader.ts +284 -0
  2093. package/src/session/session-manager.ts +1995 -0
  2094. package/src/session/session-migrations.ts +78 -0
  2095. package/src/session/session-paths.ts +193 -0
  2096. package/src/session/session-persistence.ts +266 -0
  2097. package/src/session/session-storage.ts +734 -0
  2098. package/src/session/session-title-slot.ts +141 -0
  2099. package/src/session/settings-stream-fn.ts +73 -0
  2100. package/src/session/shake-types.ts +43 -0
  2101. package/src/session/snapcompact-inline.ts +561 -0
  2102. package/src/session/snapcompact-savings-journal.ts +113 -0
  2103. package/src/session/sql-session-storage.ts +374 -0
  2104. package/src/session/streaming-output.ts +1330 -0
  2105. package/src/session/tool-choice-queue.ts +290 -0
  2106. package/src/session/turn-persistence.ts +142 -0
  2107. package/src/session/unexpected-stop-classifier.ts +129 -0
  2108. package/src/session/yield-queue.ts +183 -0
  2109. package/src/slash-commands/acp-builtins.ts +70 -0
  2110. package/src/slash-commands/available-commands.ts +105 -0
  2111. package/src/slash-commands/builtin-registry.ts +2554 -0
  2112. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  2113. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  2114. package/src/slash-commands/helpers/context-report.ts +66 -0
  2115. package/src/slash-commands/helpers/format.ts +46 -0
  2116. package/src/slash-commands/helpers/logout.ts +88 -0
  2117. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  2118. package/src/slash-commands/helpers/mcp.ts +533 -0
  2119. package/src/slash-commands/helpers/parse.ts +85 -0
  2120. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  2121. package/src/slash-commands/helpers/ssh.ts +195 -0
  2122. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  2123. package/src/slash-commands/helpers/todo.ts +285 -0
  2124. package/src/slash-commands/helpers/usage-report.ts +162 -0
  2125. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  2126. package/src/slash-commands/types.ts +137 -0
  2127. package/src/ssh/__tests__/connection-manager-args.test.ts +191 -0
  2128. package/src/ssh/__tests__/connection-manager-timeout.test.ts +61 -0
  2129. package/src/ssh/__tests__/file-transfer-posix-guard.test.ts +105 -0
  2130. package/src/ssh/__tests__/sshfs-mount.test.ts +13 -0
  2131. package/src/ssh/config-writer.ts +183 -0
  2132. package/src/ssh/connection-manager.ts +667 -0
  2133. package/src/ssh/file-transfer.ts +214 -0
  2134. package/src/ssh/ssh-executor.ts +178 -0
  2135. package/src/ssh/sshfs-mount.ts +163 -0
  2136. package/src/ssh/utils.ts +51 -0
  2137. package/src/startup-splash.ts +19 -0
  2138. package/src/stt/asr-client.ts +401 -0
  2139. package/src/stt/asr-protocol.ts +65 -0
  2140. package/src/stt/asr-worker.ts +638 -0
  2141. package/src/stt/downloader.ts +144 -0
  2142. package/src/stt/endpointer.ts +259 -0
  2143. package/src/stt/index.ts +8 -0
  2144. package/src/stt/models.ts +150 -0
  2145. package/src/stt/recorder.ts +538 -0
  2146. package/src/stt/stt-controller.ts +409 -0
  2147. package/src/stt/submit-trigger.ts +74 -0
  2148. package/src/stt/transcriber.ts +60 -0
  2149. package/src/stt/wav.ts +173 -0
  2150. package/src/subprocess/worker-client.ts +456 -0
  2151. package/src/subprocess/worker-runtime.ts +494 -0
  2152. package/src/system-prompt.test.ts +158 -0
  2153. package/src/system-prompt.ts +787 -0
  2154. package/src/task/agents.ts +166 -0
  2155. package/src/task/commands.ts +132 -0
  2156. package/src/task/discovery.ts +145 -0
  2157. package/src/task/executor.ts +2481 -0
  2158. package/src/task/index.ts +1481 -0
  2159. package/src/task/isolation-runner.ts +384 -0
  2160. package/src/task/name-generator.ts +1577 -0
  2161. package/src/task/omp-command.ts +26 -0
  2162. package/src/task/output-manager.ts +93 -0
  2163. package/src/task/parallel.ts +178 -0
  2164. package/src/task/persisted-revive.ts +128 -0
  2165. package/src/task/provider-concurrency.ts +100 -0
  2166. package/src/task/render.test.ts +121 -0
  2167. package/src/task/render.ts +1761 -0
  2168. package/src/task/renderer.ts +15 -0
  2169. package/src/task/repair-args.ts +129 -0
  2170. package/src/task/spawn-policy.test.ts +63 -0
  2171. package/src/task/spawn-policy.ts +58 -0
  2172. package/src/task/subprocess-tool-registry.ts +88 -0
  2173. package/src/task/types.ts +495 -0
  2174. package/src/task/worktree.ts +935 -0
  2175. package/src/task/yield-assembly.ts +198 -0
  2176. package/src/telemetry-export.ts +144 -0
  2177. package/src/thinking.ts +219 -0
  2178. package/src/tiny/device.ts +111 -0
  2179. package/src/tiny/dtype.ts +101 -0
  2180. package/src/tiny/models.ts +268 -0
  2181. package/src/tiny/text.ts +336 -0
  2182. package/src/tiny/title-client.ts +438 -0
  2183. package/src/tiny/title-protocol.ts +56 -0
  2184. package/src/tiny/worker.ts +351 -0
  2185. package/src/tool-discovery/mode.ts +24 -0
  2186. package/src/tool-discovery/tool-index.ts +271 -0
  2187. package/src/tools/__tests__/eval-description.test.ts +19 -0
  2188. package/src/tools/__tests__/json-tree.test.ts +35 -0
  2189. package/src/tools/acp-bridge.ts +71 -0
  2190. package/src/tools/approval.ts +189 -0
  2191. package/src/tools/ask.ts +1213 -0
  2192. package/src/tools/ast-edit.ts +708 -0
  2193. package/src/tools/ast-grep.ts +520 -0
  2194. package/src/tools/auto-generated-guard.ts +322 -0
  2195. package/src/tools/bash-command-fixup.ts +37 -0
  2196. package/src/tools/bash-interactive.ts +408 -0
  2197. package/src/tools/bash-interceptor.ts +67 -0
  2198. package/src/tools/bash-pty-selection.ts +14 -0
  2199. package/src/tools/bash-skill-urls.ts +248 -0
  2200. package/src/tools/bash.ts +1421 -0
  2201. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  2202. package/src/tools/browser/aria/aria-snapshot.ts +103 -0
  2203. package/src/tools/browser/attach.ts +194 -0
  2204. package/src/tools/browser/cmux/cmux-tab.ts +1378 -0
  2205. package/src/tools/browser/cmux/rpc.ts +156 -0
  2206. package/src/tools/browser/cmux/socket-client.ts +309 -0
  2207. package/src/tools/browser/launch.ts +749 -0
  2208. package/src/tools/browser/readable.ts +112 -0
  2209. package/src/tools/browser/registry.ts +266 -0
  2210. package/src/tools/browser/render.ts +223 -0
  2211. package/src/tools/browser/run-cancellation.ts +47 -0
  2212. package/src/tools/browser/tab-protocol.ts +107 -0
  2213. package/src/tools/browser/tab-supervisor.ts +956 -0
  2214. package/src/tools/browser/tab-worker-entry.ts +29 -0
  2215. package/src/tools/browser/tab-worker.ts +1433 -0
  2216. package/src/tools/browser.ts +409 -0
  2217. package/src/tools/builtin-names.ts +58 -0
  2218. package/src/tools/checkpoint.ts +150 -0
  2219. package/src/tools/conflict-detect.ts +718 -0
  2220. package/src/tools/context.ts +39 -0
  2221. package/src/tools/debug.ts +1088 -0
  2222. package/src/tools/eval-backends.ts +34 -0
  2223. package/src/tools/eval-render.ts +776 -0
  2224. package/src/tools/eval.ts +767 -0
  2225. package/src/tools/fetch.ts +1966 -0
  2226. package/src/tools/file-recorder.ts +35 -0
  2227. package/src/tools/fs-cache-invalidation.ts +28 -0
  2228. package/src/tools/gh-cache-invalidation.ts +255 -0
  2229. package/src/tools/gh-format.ts +12 -0
  2230. package/src/tools/gh-renderer.ts +484 -0
  2231. package/src/tools/gh.ts +3752 -0
  2232. package/src/tools/github-cache.ts +663 -0
  2233. package/src/tools/glob.ts +639 -0
  2234. package/src/tools/grep.ts +1836 -0
  2235. package/src/tools/grouped-file-output.ts +210 -0
  2236. package/src/tools/image-gen.ts +1587 -0
  2237. package/src/tools/index.ts +682 -0
  2238. package/src/tools/inspect-image-renderer.ts +132 -0
  2239. package/src/tools/inspect-image.ts +260 -0
  2240. package/src/tools/irc.ts +827 -0
  2241. package/src/tools/job.ts +612 -0
  2242. package/src/tools/json-tree.ts +260 -0
  2243. package/src/tools/jtd-to-json-schema.ts +219 -0
  2244. package/src/tools/jtd-to-typescript.ts +136 -0
  2245. package/src/tools/jtd-utils.ts +102 -0
  2246. package/src/tools/learn.ts +141 -0
  2247. package/src/tools/list-limit.ts +40 -0
  2248. package/src/tools/manage-skill.ts +100 -0
  2249. package/src/tools/match-line-format.ts +20 -0
  2250. package/src/tools/memory-edit.ts +59 -0
  2251. package/src/tools/memory-recall.ts +102 -0
  2252. package/src/tools/memory-reflect.ts +88 -0
  2253. package/src/tools/memory-render.ts +202 -0
  2254. package/src/tools/memory-retain.ts +89 -0
  2255. package/src/tools/output-meta.ts +818 -0
  2256. package/src/tools/output-schema-validator.ts +307 -0
  2257. package/src/tools/path-utils.ts +1279 -0
  2258. package/src/tools/plan-mode-guard.ts +155 -0
  2259. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  2260. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  2261. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  2262. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  2263. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  2264. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  2265. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  2266. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  2267. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  2268. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  2269. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  2270. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  2271. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  2272. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  2273. package/src/tools/read.ts +3522 -0
  2274. package/src/tools/render-utils.ts +913 -0
  2275. package/src/tools/renderers.ts +107 -0
  2276. package/src/tools/report-tool-issue.ts +530 -0
  2277. package/src/tools/resolve.ts +302 -0
  2278. package/src/tools/review.ts +261 -0
  2279. package/src/tools/search-tool-bm25.ts +351 -0
  2280. package/src/tools/sqlite-reader.ts +884 -0
  2281. package/src/tools/ssh.ts +397 -0
  2282. package/src/tools/todo.ts +944 -0
  2283. package/src/tools/tool-errors.ts +62 -0
  2284. package/src/tools/tool-result.ts +102 -0
  2285. package/src/tools/tool-timeouts.ts +30 -0
  2286. package/src/tools/tts.ts +266 -0
  2287. package/src/tools/write.ts +1219 -0
  2288. package/src/tools/yield.ts +455 -0
  2289. package/src/tts/downloader.ts +64 -0
  2290. package/src/tts/index.ts +10 -0
  2291. package/src/tts/models.ts +137 -0
  2292. package/src/tts/player.ts +137 -0
  2293. package/src/tts/runtime.ts +21 -0
  2294. package/src/tts/speakable.ts +382 -0
  2295. package/src/tts/speech-enhancer.ts +204 -0
  2296. package/src/tts/streaming-player.ts +321 -0
  2297. package/src/tts/tts-client.ts +475 -0
  2298. package/src/tts/tts-protocol.ts +69 -0
  2299. package/src/tts/tts-worker.ts +434 -0
  2300. package/src/tts/vocalizer.ts +393 -0
  2301. package/src/tts/wav.ts +58 -0
  2302. package/src/tui/code-cell.ts +268 -0
  2303. package/src/tui/file-list.ts +55 -0
  2304. package/src/tui/hyperlink.ts +178 -0
  2305. package/src/tui/index.ts +13 -0
  2306. package/src/tui/output-block.ts +251 -0
  2307. package/src/tui/status-line.ts +54 -0
  2308. package/src/tui/tree-list.ts +133 -0
  2309. package/src/tui/types.ts +15 -0
  2310. package/src/tui/utils.ts +103 -0
  2311. package/src/tui/width-aware-text.ts +58 -0
  2312. package/src/utils/active-repo-context.ts +143 -0
  2313. package/src/utils/block-context.ts +312 -0
  2314. package/src/utils/changelog.ts +132 -0
  2315. package/src/utils/clipboard.ts +356 -0
  2316. package/src/utils/command-args.ts +76 -0
  2317. package/src/utils/commit-message-generator.ts +146 -0
  2318. package/src/utils/edit-mode.ts +58 -0
  2319. package/src/utils/enhanced-paste.ts +230 -0
  2320. package/src/utils/event-bus.ts +33 -0
  2321. package/src/utils/external-editor.ts +78 -0
  2322. package/src/utils/fetch-timeout.ts +10 -0
  2323. package/src/utils/file-display-mode.ts +44 -0
  2324. package/src/utils/file-mentions.ts +293 -0
  2325. package/src/utils/git.ts +2181 -0
  2326. package/src/utils/image-loading.ts +231 -0
  2327. package/src/utils/image-resize.ts +420 -0
  2328. package/src/utils/image-vision-fallback.ts +196 -0
  2329. package/src/utils/ipc.ts +38 -0
  2330. package/src/utils/jj.ts +295 -0
  2331. package/src/utils/lang-from-path.ts +244 -0
  2332. package/src/utils/markit-cache.ts +166 -0
  2333. package/src/utils/markit.ts +211 -0
  2334. package/src/utils/mupdf-wasm-embed.ts +12 -0
  2335. package/src/utils/open.ts +100 -0
  2336. package/src/utils/prompt-path.ts +3 -0
  2337. package/src/utils/qrcode.ts +535 -0
  2338. package/src/utils/session-color.ts +142 -0
  2339. package/src/utils/shell-snapshot-fn-env.sh +60 -0
  2340. package/src/utils/shell-snapshot.ts +306 -0
  2341. package/src/utils/sixel.ts +69 -0
  2342. package/src/utils/thinking-display.ts +117 -0
  2343. package/src/utils/title-generator.ts +348 -0
  2344. package/src/utils/tool-choice.ts +49 -0
  2345. package/src/utils/tools-manager.ts +429 -0
  2346. package/src/utils/turndown.ts +83 -0
  2347. package/src/utils/zip.ts +1091 -0
  2348. package/src/web/kagi.ts +304 -0
  2349. package/src/web/parallel.ts +354 -0
  2350. package/src/web/scrapers/artifacthub.ts +207 -0
  2351. package/src/web/scrapers/arxiv.ts +83 -0
  2352. package/src/web/scrapers/aur.ts +162 -0
  2353. package/src/web/scrapers/biorxiv.ts +133 -0
  2354. package/src/web/scrapers/bluesky.ts +262 -0
  2355. package/src/web/scrapers/brew.ts +172 -0
  2356. package/src/web/scrapers/cheatsh.ts +68 -0
  2357. package/src/web/scrapers/chocolatey.ts +196 -0
  2358. package/src/web/scrapers/choosealicense.ts +95 -0
  2359. package/src/web/scrapers/cisa-kev.ts +87 -0
  2360. package/src/web/scrapers/clojars.ts +154 -0
  2361. package/src/web/scrapers/coingecko.ts +177 -0
  2362. package/src/web/scrapers/crates-io.ts +97 -0
  2363. package/src/web/scrapers/crossref.ts +136 -0
  2364. package/src/web/scrapers/devto.ts +147 -0
  2365. package/src/web/scrapers/discogs.ts +306 -0
  2366. package/src/web/scrapers/discourse.ts +197 -0
  2367. package/src/web/scrapers/dockerhub.ts +138 -0
  2368. package/src/web/scrapers/docs-rs.ts +652 -0
  2369. package/src/web/scrapers/fdroid.ts +134 -0
  2370. package/src/web/scrapers/firefox-addons.ts +191 -0
  2371. package/src/web/scrapers/flathub.ts +223 -0
  2372. package/src/web/scrapers/github-gist.ts +58 -0
  2373. package/src/web/scrapers/github.ts +800 -0
  2374. package/src/web/scrapers/gitlab.ts +401 -0
  2375. package/src/web/scrapers/go-pkg.ts +266 -0
  2376. package/src/web/scrapers/hackage.ts +140 -0
  2377. package/src/web/scrapers/hackernews.ts +189 -0
  2378. package/src/web/scrapers/hex.ts +105 -0
  2379. package/src/web/scrapers/huggingface.ts +321 -0
  2380. package/src/web/scrapers/iacr.ts +89 -0
  2381. package/src/web/scrapers/index.ts +252 -0
  2382. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  2383. package/src/web/scrapers/lemmy.ts +203 -0
  2384. package/src/web/scrapers/lobsters.ts +175 -0
  2385. package/src/web/scrapers/mastodon.ts +292 -0
  2386. package/src/web/scrapers/maven.ts +138 -0
  2387. package/src/web/scrapers/mdn.ts +173 -0
  2388. package/src/web/scrapers/metacpan.ts +222 -0
  2389. package/src/web/scrapers/musicbrainz.ts +250 -0
  2390. package/src/web/scrapers/npm.ts +98 -0
  2391. package/src/web/scrapers/nuget.ts +183 -0
  2392. package/src/web/scrapers/nvd.ts +222 -0
  2393. package/src/web/scrapers/ollama.ts +239 -0
  2394. package/src/web/scrapers/open-vsx.ts +106 -0
  2395. package/src/web/scrapers/opencorporates.ts +292 -0
  2396. package/src/web/scrapers/openlibrary.ts +336 -0
  2397. package/src/web/scrapers/orcid.ts +286 -0
  2398. package/src/web/scrapers/osv.ts +176 -0
  2399. package/src/web/scrapers/packagist.ts +160 -0
  2400. package/src/web/scrapers/pub-dev.ts +143 -0
  2401. package/src/web/scrapers/pubmed.ts +211 -0
  2402. package/src/web/scrapers/pypi.ts +112 -0
  2403. package/src/web/scrapers/rawg.ts +110 -0
  2404. package/src/web/scrapers/readthedocs.ts +120 -0
  2405. package/src/web/scrapers/reddit.ts +95 -0
  2406. package/src/web/scrapers/repology.ts +251 -0
  2407. package/src/web/scrapers/rfc.ts +201 -0
  2408. package/src/web/scrapers/rubygems.ts +103 -0
  2409. package/src/web/scrapers/searchcode.ts +189 -0
  2410. package/src/web/scrapers/sec-edgar.ts +261 -0
  2411. package/src/web/scrapers/semantic-scholar.ts +171 -0
  2412. package/src/web/scrapers/snapcraft.ts +187 -0
  2413. package/src/web/scrapers/sourcegraph.ts +336 -0
  2414. package/src/web/scrapers/spdx.ts +108 -0
  2415. package/src/web/scrapers/spotify.ts +198 -0
  2416. package/src/web/scrapers/stackoverflow.ts +120 -0
  2417. package/src/web/scrapers/terraform.ts +277 -0
  2418. package/src/web/scrapers/tldr.ts +47 -0
  2419. package/src/web/scrapers/twitter.ts +94 -0
  2420. package/src/web/scrapers/types.ts +354 -0
  2421. package/src/web/scrapers/utils.ts +109 -0
  2422. package/src/web/scrapers/vimeo.ts +133 -0
  2423. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  2424. package/src/web/scrapers/w3c.ts +156 -0
  2425. package/src/web/scrapers/wikidata.ts +344 -0
  2426. package/src/web/scrapers/wikipedia.ts +84 -0
  2427. package/src/web/scrapers/youtube.ts +325 -0
  2428. package/src/web/search/index.ts +312 -0
  2429. package/src/web/search/provider.ts +214 -0
  2430. package/src/web/search/providers/anthropic.ts +343 -0
  2431. package/src/web/search/providers/base.ts +91 -0
  2432. package/src/web/search/providers/brave.ts +152 -0
  2433. package/src/web/search/providers/codex.ts +593 -0
  2434. package/src/web/search/providers/duckduckgo.ts +212 -0
  2435. package/src/web/search/providers/exa.ts +484 -0
  2436. package/src/web/search/providers/firecrawl.ts +144 -0
  2437. package/src/web/search/providers/gemini.ts +618 -0
  2438. package/src/web/search/providers/jina.ts +111 -0
  2439. package/src/web/search/providers/kagi.ts +86 -0
  2440. package/src/web/search/providers/kimi.ts +196 -0
  2441. package/src/web/search/providers/parallel.ts +136 -0
  2442. package/src/web/search/providers/perplexity-auth.ts +133 -0
  2443. package/src/web/search/providers/perplexity.ts +878 -0
  2444. package/src/web/search/providers/searxng.ts +325 -0
  2445. package/src/web/search/providers/synthetic.ts +114 -0
  2446. package/src/web/search/providers/tavily.ts +193 -0
  2447. package/src/web/search/providers/tinyfish.ts +159 -0
  2448. package/src/web/search/providers/utils.ts +128 -0
  2449. package/src/web/search/providers/xai.ts +292 -0
  2450. package/src/web/search/providers/zai.ts +419 -0
  2451. package/src/web/search/render.ts +262 -0
  2452. package/src/web/search/types.ts +470 -0
  2453. package/src/web/search/utils.ts +17 -0
  2454. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,2364 @@
1
+ /**
2
+ * MCP Command Controller
3
+ *
4
+ * Handles /mcp subcommands for managing MCP servers.
5
+ */
6
+ import * as path from "node:path";
7
+ import { type Component, replaceTabs, Spacer, Text } from "@oh-my-pi-zen/pi-tui";
8
+ import { getMCPConfigPath, getProjectDir } from "@oh-my-pi-zen/pi-utils";
9
+ import type { SourceMeta } from "../../capability/types";
10
+ import { expandEnvVarsDeep } from "../../discovery/helpers";
11
+ import {
12
+ analyzeAuthError,
13
+ discoverOAuthEndpoints,
14
+ fetchResourceMetadataScopes,
15
+ loadAllMCPConfigs,
16
+ MCPManager,
17
+ } from "../../mcp";
18
+ import { connectToServer, disconnectServer, listTools } from "../../mcp/client";
19
+ import {
20
+ addMCPServer,
21
+ readDisabledServers,
22
+ readMCPConfigFile,
23
+ removeMCPServer,
24
+ setServerDisabled,
25
+ updateMCPServer,
26
+ } from "../../mcp/config-writer";
27
+ import {
28
+ lookupMcpOAuthCredentialForServer,
29
+ mcpOAuthCredentialIdsForServerUrl,
30
+ removeManagedMcpOAuthCredential,
31
+ removeManagedMcpOAuthCredentials,
32
+ } from "../../mcp/oauth-credentials";
33
+ import { MCPOAuthFlow, type MCPStoredOAuthCredential, mcpOAuthCredentialId } from "../../mcp/oauth-flow";
34
+ import {
35
+ clearSmitheryApiKey,
36
+ createSmitheryCliAuthSession,
37
+ getSmitheryApiKey,
38
+ getSmitheryLoginUrl,
39
+ pollSmitheryCliAuthSession,
40
+ saveSmitheryApiKey,
41
+ } from "../../mcp/smithery-auth";
42
+ import { SmitheryConnectError } from "../../mcp/smithery-connect";
43
+ import {
44
+ SmitheryRegistryError,
45
+ type SmitherySearchResult,
46
+ searchSmitheryRegistry,
47
+ toConfigName,
48
+ } from "../../mcp/smithery-registry";
49
+ import type { MCPAuthConfig, MCPServerConfig, MCPServerConnection } from "../../mcp/types";
50
+ import { shortenPath } from "../../tools/render-utils";
51
+ import { urlHyperlinkAlways } from "../../tui";
52
+ import { copyToClipboard } from "../../utils/clipboard";
53
+ import { openPath } from "../../utils/open";
54
+ import { ChatBlock } from "../components/chat-block";
55
+ import { MCPAddWizard } from "../components/mcp-add-wizard";
56
+ import { TranscriptBlock } from "../components/transcript-container";
57
+ import { parseCommandArgs } from "../shared";
58
+ import { theme } from "../theme/theme";
59
+ import type { InteractiveModeContext } from "../types";
60
+ import { groupBySource, parseRemoveArgs, readScopeFlag, showCommandMessage } from "./command-controller-shared";
61
+
62
+ const MCP_MANUAL_INPUT_PROVIDER_ID = "mcp";
63
+ const MCP_MANUAL_LOGIN_TIP = "Headless? Paste the redirect URL or code with /login <value>.";
64
+ function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string, onTimeout?: () => void): Promise<T> {
65
+ const { promise: timeoutPromise, reject } = Promise.withResolvers<T>();
66
+ const timer = setTimeout(() => {
67
+ onTimeout?.();
68
+ reject(new Error(message));
69
+ }, timeoutMs);
70
+ return Promise.race([promise, timeoutPromise]).finally(() => clearTimeout(timer));
71
+ }
72
+ function raceAbortSignal<T>(promise: Promise<T>, signal: AbortSignal, createError: () => Error): Promise<T> {
73
+ if (signal.aborted) return Promise.reject(createError());
74
+
75
+ const aborted = Promise.withResolvers<never>();
76
+ const onAbort = (): void => aborted.reject(createError());
77
+ signal.addEventListener("abort", onAbort, { once: true });
78
+ return Promise.race([promise, aborted.promise]).finally(() => {
79
+ signal.removeEventListener("abort", onAbort);
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Minimum column budget for URL wrapping. Below this the terminal is
85
+ * effectively unusable, but we still emit chunks so no character is silently
86
+ * dropped and the user can widen and reflow.
87
+ */
88
+ const MCP_AUTH_MIN_WRAP_WIDTH = 16;
89
+
90
+ /**
91
+ * Wrap `url` into rows that each fit inside `width`, prefixed by a shared
92
+ * single-column indent so nested composition doesn't touch column 0. When the
93
+ * label + URL fit on one line, returns a single row; otherwise puts the label
94
+ * on its own row and slices the URL into fixed-width chunks. URL chunks are
95
+ * plain code points — browsers strip whitespace when pasted into the address
96
+ * bar, so a multi-row selection copies back to the intact URL.
97
+ */
98
+ function wrapUrlRows(label: string, url: string, width: number): string[] {
99
+ const indent = " ";
100
+ const sanitized = replaceTabs(url);
101
+ const effective = Math.max(MCP_AUTH_MIN_WRAP_WIDTH, Math.trunc(width));
102
+ const inlineWidth = indent.length + label.length + 1 + sanitized.length;
103
+ if (inlineWidth <= effective) {
104
+ return [`${indent}${theme.fg("muted", `${label} ${sanitized}`)}`];
105
+ }
106
+ const chunkWidth = Math.max(1, effective - indent.length);
107
+ const rows: string[] = [`${indent}${theme.fg("muted", label)}`];
108
+ for (let i = 0; i < sanitized.length; i += chunkWidth) {
109
+ rows.push(`${indent}${theme.fg("muted", sanitized.slice(i, i + chunkWidth))}`);
110
+ }
111
+ return rows;
112
+ }
113
+
114
+ /**
115
+ * Renders the MCP OAuth fallback URL. Always shows the full authorization URL
116
+ * as the primary `Copy URL:` target — that works from any machine, including
117
+ * SSH/WSL/headless sessions where the OMP-hosted `/launch` loopback URL would
118
+ * resolve against the user's local browser and fail.
119
+ *
120
+ * The render is `width`-aware: on any viewport narrower than the composed row
121
+ * ({@link TUI#prepareLine} truncates anything wider with `Ellipsis.Omit`, no
122
+ * marker), the URL is hard-wrapped into width-fitted rows so the primary copy
123
+ * target can never silently lose trailing OAuth parameters — the failure mode
124
+ * that motivated #4418 in the first place. Browsers strip whitespace when a
125
+ * multi-row selection is pasted into the address bar, so the reassembled URL
126
+ * is byte-identical to what we rendered.
127
+ *
128
+ * When the flow's callback server hosts a short `launchUrl`, it is offered
129
+ * as an additional local shortcut for wide-terminal local users. The OSC 8
130
+ * hyperlink continues to carry the full URL for terminals that support it.
131
+ */
132
+ export class MCPAuthorizationLinkPrompt implements Component {
133
+ readonly #fullUrl: string;
134
+ readonly #launchUrl: string | undefined;
135
+
136
+ constructor(url: string, launchUrl?: string) {
137
+ this.#fullUrl = url;
138
+ this.#launchUrl = launchUrl && launchUrl !== url ? launchUrl : undefined;
139
+ }
140
+
141
+ invalidate(): void {}
142
+
143
+ render(width: number): readonly string[] {
144
+ const link = urlHyperlinkAlways(this.#fullUrl, "Click here to authorize");
145
+ const lines: string[] = [
146
+ ` ${theme.fg("success", "Open authorization URL:")}`,
147
+ ` ${theme.fg("accent", link)}`,
148
+ ...wrapUrlRows("Copy URL:", this.#fullUrl, width),
149
+ ];
150
+ if (this.#launchUrl) {
151
+ lines.push(...wrapUrlRows("Local shortcut (this machine only):", this.#launchUrl, width));
152
+ }
153
+ return lines;
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Animated "Connecting to …" transcript block. Owns its spinner interval: it
159
+ * starts on mount and is cleared on {@link ChatBlock.finish}/dispose, so callers
160
+ * never juggle `setInterval`/`clearInterval` or `requestRender` by hand.
161
+ */
162
+ class McpConnectingBlock extends ChatBlock {
163
+ readonly #text: Text;
164
+
165
+ constructor(private readonly serverName: string) {
166
+ super();
167
+ this.addChild(new Spacer(1));
168
+ const frame = theme.spinnerFrames[0] ?? "|";
169
+ this.#text = new Text(theme.fg("muted", `${frame} Connecting to "${serverName}"...`), 1, 0);
170
+ this.addChild(this.#text);
171
+ }
172
+
173
+ protected override onMount(): void {
174
+ const frames = theme.spinnerFrames;
175
+ let frame = 0;
176
+ const interval = setInterval(() => {
177
+ frame++;
178
+ this.#text.setText(
179
+ theme.fg("muted", `${frames[frame % frames.length] ?? "|"} Connecting to "${this.serverName}"...`),
180
+ );
181
+ this.requestRender();
182
+ }, 80);
183
+ this.onCleanup(() => clearInterval(interval));
184
+ }
185
+
186
+ /** Replace the spinner line with a terminal status; pair with {@link finish}. */
187
+ setStatus(text: string): void {
188
+ this.#text.setText(text);
189
+ this.requestRender();
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Outcome of {@link MCPCommandController}'s OAuth handler.
195
+ *
196
+ * `credentialId` is deterministic per server URL when the URL was supplied, so
197
+ * every profile resolves its own credential row under the same id. Refresh
198
+ * material (token URL, client id/secret) is embedded in the stored credential;
199
+ * the returned `clientId` may be folded into `mcp.json` for pre-auth reuse.
200
+ * DCR-issued client secrets stay embedded in the stored credential and are
201
+ * deliberately not surfaced here, so they cannot leak into config files.
202
+ */
203
+ interface OAuthFlowResult {
204
+ credentialId: string;
205
+ clientId?: string;
206
+ resource?: string;
207
+ }
208
+
209
+ /**
210
+ * Thrown by {@link MCPCommandController}'s OAuth handler when the user (or a
211
+ * caller-supplied {@link AbortSignal}) cancels the in-flight flow. Distinct
212
+ * from network/timeout failures so callers can surface a neutral
213
+ * "cancelled" status instead of an error banner.
214
+ */
215
+ export class MCPOAuthCancelledError extends Error {
216
+ constructor(message = "OAuth flow cancelled") {
217
+ super(message);
218
+ this.name = "MCPOAuthCancelledError";
219
+ }
220
+ }
221
+
222
+ /** Reason recorded on the OAuth flow's AbortController when the user hits Esc. */
223
+ const MCP_OAUTH_USER_CANCEL_REASON = "MCP OAuth flow cancelled by user";
224
+
225
+ type MCPAddScope = "user" | "project";
226
+ type MCPAddTransport = "http" | "sse";
227
+
228
+ type MCPAddParsed = {
229
+ initialName?: string;
230
+ scope: MCPAddScope;
231
+ quickConfig?: MCPServerConfig;
232
+ isCommandQuickAdd?: boolean;
233
+ hasAuthToken?: boolean;
234
+ error?: string;
235
+ };
236
+
237
+ type MCPSearchParsed = {
238
+ keyword: string;
239
+ scope: MCPAddScope;
240
+ limit: number;
241
+ semantic: boolean;
242
+ error?: string;
243
+ };
244
+
245
+ export class MCPCommandController {
246
+ constructor(private ctx: InteractiveModeContext) {}
247
+
248
+ /**
249
+ * Handle /mcp command and route to subcommands
250
+ */
251
+ async handle(text: string): Promise<void> {
252
+ const parts = text.trim().split(/\s+/);
253
+ const subcommand = parts[1]?.toLowerCase();
254
+
255
+ if (!subcommand || subcommand === "help") {
256
+ this.#showHelp();
257
+ return;
258
+ }
259
+
260
+ switch (subcommand) {
261
+ case "add":
262
+ await this.#handleAdd(text);
263
+ break;
264
+ case "list":
265
+ await this.#handleList();
266
+ break;
267
+ case "remove":
268
+ case "rm":
269
+ await this.#handleRemove(text);
270
+ break;
271
+ case "test":
272
+ await this.#handleTest(parts[2]);
273
+ break;
274
+ case "reauth":
275
+ await this.#handleReauth(parts[2]);
276
+ break;
277
+ case "unauth":
278
+ await this.#handleUnauth(parts[2]);
279
+ break;
280
+ case "enable":
281
+ await this.#handleSetEnabled(parts[2], true);
282
+ break;
283
+ case "disable":
284
+ await this.#handleSetEnabled(parts[2], false);
285
+ break;
286
+ case "resources":
287
+ await this.#handleResources();
288
+ break;
289
+ case "prompts":
290
+ await this.#handlePrompts();
291
+ break;
292
+ case "notifications":
293
+ await this.#handleNotifications();
294
+ break;
295
+ case "smithery-search":
296
+ await this.#handleSearch(text);
297
+ break;
298
+ case "smithery-login":
299
+ await this.#handleSmitheryLogin();
300
+ break;
301
+ case "smithery-logout":
302
+ await this.#handleSmitheryLogout();
303
+ break;
304
+ case "reconnect":
305
+ await this.#handleReconnect(parts[2]);
306
+ break;
307
+ case "reload":
308
+ await this.#handleReload();
309
+ break;
310
+ default:
311
+ this.ctx.showError(`Unknown subcommand: ${subcommand}. Type /mcp help for usage.`);
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Show help text
317
+ */
318
+ #showHelp(): void {
319
+ const helpText = [
320
+ "",
321
+ theme.bold("MCP Server Management"),
322
+ "",
323
+ "Manage Model Context Protocol (MCP) servers for external tool integrations.",
324
+ "",
325
+ theme.fg("accent", "Commands:"),
326
+ " /mcp add Add a new MCP server (interactive wizard)",
327
+ " /mcp add <name> [--scope project|user] [--url <url> --transport http|sse] [--token <token>] [-- <command...>]",
328
+ " /mcp list List all configured MCP servers",
329
+ " /mcp remove <name> [--scope project|user] Remove an MCP server (default: project)",
330
+ " /mcp test <name> Test connection to an MCP server",
331
+ " /mcp reauth <name> Reauthorize OAuth for an MCP server",
332
+ " /mcp unauth <name> Remove OAuth auth from an MCP server",
333
+ " /mcp enable <name> Enable an MCP server",
334
+ " /mcp disable <name> Disable an MCP server",
335
+ " /mcp smithery-search <keyword> [--scope project|user] [--limit <1-100>] [--semantic]",
336
+ " Search Smithery registry and deploy from picker",
337
+ " /mcp smithery-login Login to Smithery and cache API key",
338
+ " /mcp smithery-logout Remove cached Smithery API key",
339
+ " /mcp reconnect <name> Reconnect to a specific MCP server",
340
+ " /mcp reload Force reload and rediscover MCP runtime tools",
341
+ " /mcp resources List available resources from connected servers",
342
+ " /mcp prompts List available prompts from connected servers",
343
+ " /mcp notifications Show notification capabilities and subscription state",
344
+ " /mcp help Show this help message",
345
+ "",
346
+ ].join("\n");
347
+
348
+ this.#showMessage(helpText);
349
+ }
350
+
351
+ #parseAddCommand(text: string): MCPAddParsed {
352
+ const prefixMatch = text.match(/^\/mcp\s+add\b\s*(.*)$/i);
353
+ const rest = prefixMatch?.[1]?.trim() ?? "";
354
+ if (!rest) {
355
+ return { scope: "project" };
356
+ }
357
+
358
+ const tokens = parseCommandArgs(rest);
359
+ if (tokens.length === 0) {
360
+ return { scope: "project" };
361
+ }
362
+
363
+ let name: string | undefined;
364
+ let scope: MCPAddScope = "project";
365
+ let url: string | undefined;
366
+ let transport: MCPAddTransport = "http";
367
+ let authToken: string | undefined;
368
+ let commandTokens: string[] | undefined;
369
+
370
+ let i = 0;
371
+ if (!tokens[0].startsWith("-")) {
372
+ name = tokens[0];
373
+ i = 1;
374
+ }
375
+
376
+ while (i < tokens.length) {
377
+ const argToken = tokens[i];
378
+ if (argToken === "--") {
379
+ commandTokens = tokens.slice(i + 1);
380
+ break;
381
+ }
382
+ if (argToken === "--scope") {
383
+ const r = readScopeFlag(tokens[i + 1]);
384
+ if (!r.ok) {
385
+ return { scope, error: r.error };
386
+ }
387
+ scope = r.scope;
388
+ i += 2;
389
+ continue;
390
+ }
391
+ if (argToken === "--url") {
392
+ const value = tokens[i + 1];
393
+ if (!value) {
394
+ return { scope, error: "Missing value for --url." };
395
+ }
396
+ url = value;
397
+ i += 2;
398
+ continue;
399
+ }
400
+ if (argToken === "--transport") {
401
+ const value = tokens[i + 1];
402
+ if (!value || (value !== "http" && value !== "sse")) {
403
+ return { scope, error: "Invalid --transport value. Use http or sse." };
404
+ }
405
+ transport = value;
406
+ i += 2;
407
+ continue;
408
+ }
409
+ if (argToken === "--token") {
410
+ const value = tokens[i + 1];
411
+ if (!value) {
412
+ return { scope, error: "Missing value for --token." };
413
+ }
414
+ authToken = value;
415
+ i += 2;
416
+ continue;
417
+ }
418
+ return { scope, error: `Unknown option: ${argToken}` };
419
+ }
420
+
421
+ const hasQuick = Boolean(url) || Boolean(commandTokens && commandTokens.length > 0);
422
+ if (!hasQuick) {
423
+ return { scope, initialName: name };
424
+ }
425
+ if (!name) {
426
+ return { scope, error: "Server name required for quick add. Usage: /mcp add <name> ..." };
427
+ }
428
+ if (url && commandTokens && commandTokens.length > 0) {
429
+ return { scope, error: "Use either --url or -- <command...>, not both." };
430
+ }
431
+ if (authToken && !url) {
432
+ return { scope, error: "--token requires --url (HTTP/SSE transport)." };
433
+ }
434
+
435
+ if (commandTokens && commandTokens.length > 0) {
436
+ const [command, ...args] = commandTokens;
437
+ const config: MCPServerConfig = {
438
+ type: "stdio",
439
+ command,
440
+ args: args.length > 0 ? args : undefined,
441
+ };
442
+ return { scope, initialName: name, quickConfig: config, isCommandQuickAdd: true };
443
+ }
444
+
445
+ const useHttpTransport = transport === "http";
446
+ let normalizedUrl = url!;
447
+ if (!/^https?:\/\//i.test(normalizedUrl)) {
448
+ normalizedUrl = `https://${normalizedUrl}`;
449
+ }
450
+ const config: MCPServerConfig = {
451
+ type: useHttpTransport ? "http" : "sse",
452
+ url: normalizedUrl,
453
+ headers: authToken ? { Authorization: `Bearer ${authToken}` } : undefined,
454
+ };
455
+ return {
456
+ scope,
457
+ initialName: name,
458
+ quickConfig: config,
459
+ isCommandQuickAdd: false,
460
+ hasAuthToken: Boolean(authToken),
461
+ };
462
+ }
463
+
464
+ #parseSearchCommand(text: string): MCPSearchParsed {
465
+ const prefixMatch = text.match(/^\/mcp\s+smithery-search\b\s*(.*)$/i);
466
+ const rest = prefixMatch?.[1]?.trim() ?? "";
467
+ const tokens = parseCommandArgs(rest);
468
+ if (tokens.length === 0) {
469
+ return {
470
+ keyword: "",
471
+ scope: "project",
472
+ limit: 20,
473
+ semantic: false,
474
+ error: "Keyword required. Usage: /mcp smithery-search <keyword> [--scope project|user] [--limit <1-100>] [--semantic]",
475
+ };
476
+ }
477
+
478
+ const keywordParts: string[] = [];
479
+ let scope: MCPAddScope = "project";
480
+ let limit = 20;
481
+ let semantic = false;
482
+
483
+ for (let i = 0; i < tokens.length; i++) {
484
+ const token = tokens[i];
485
+ if (token === "--scope") {
486
+ const value = tokens[i + 1];
487
+ if (!value || (value !== "project" && value !== "user")) {
488
+ return { keyword: "", scope, limit, semantic, error: "Invalid --scope value. Use project or user." };
489
+ }
490
+ scope = value;
491
+ i++;
492
+ continue;
493
+ }
494
+ if (token === "--limit") {
495
+ const value = tokens[i + 1];
496
+ if (!value) {
497
+ return { keyword: "", scope, limit, semantic, error: "Missing value for --limit." };
498
+ }
499
+ const parsed = Number(value);
500
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {
501
+ return {
502
+ keyword: "",
503
+ scope,
504
+ limit,
505
+ semantic,
506
+ error: "Invalid --limit value. Use an integer between 1 and 100.",
507
+ };
508
+ }
509
+ limit = parsed;
510
+ i++;
511
+ continue;
512
+ }
513
+ if (token === "--semantic") {
514
+ semantic = true;
515
+ continue;
516
+ }
517
+ if (token.startsWith("--")) {
518
+ return { keyword: "", scope, limit, semantic, error: `Unknown option: ${token}` };
519
+ }
520
+ keywordParts.push(token);
521
+ }
522
+
523
+ const keyword = keywordParts.join(" ").trim();
524
+ if (!keyword) {
525
+ return {
526
+ keyword: "",
527
+ scope,
528
+ limit,
529
+ semantic,
530
+ error: "Keyword required. Usage: /mcp smithery-search <keyword> [--scope project|user] [--limit <1-100>] [--semantic]",
531
+ };
532
+ }
533
+
534
+ return { keyword, scope, limit, semantic };
535
+ }
536
+
537
+ /**
538
+ * Handle /mcp add - Launch interactive wizard or quick-add from args
539
+ */
540
+ async #handleAdd(text: string): Promise<void> {
541
+ const parsed = this.#parseAddCommand(text);
542
+ if (parsed.error) {
543
+ this.ctx.showError(parsed.error);
544
+ return;
545
+ }
546
+ if (parsed.quickConfig && parsed.initialName) {
547
+ let finalConfig = parsed.quickConfig;
548
+
549
+ // Quick-add with URL should still perform auth detection and OAuth flow,
550
+ // matching wizard behavior. Command quick-add intentionally skips this.
551
+ if (!parsed.isCommandQuickAdd && (finalConfig.type === "http" || finalConfig.type === "sse")) {
552
+ try {
553
+ await this.#handleTestConnection(finalConfig);
554
+ } catch (error) {
555
+ if (parsed.hasAuthToken) {
556
+ this.ctx.showError(
557
+ `Authentication failed for "${parsed.initialName}": ${error instanceof Error ? error.message : String(error)}`,
558
+ );
559
+ return;
560
+ }
561
+ const authResult = analyzeAuthError(error as Error, finalConfig.url);
562
+ if (authResult.requiresAuth) {
563
+ let oauth = authResult.authType === "oauth" ? (authResult.oauth ?? null) : null;
564
+ if (!oauth && finalConfig.url) {
565
+ try {
566
+ oauth = await discoverOAuthEndpoints(
567
+ finalConfig.url,
568
+ authResult.authServerUrl,
569
+ authResult.resourceMetadataUrl,
570
+ { protectedScopes: authResult.scopes },
571
+ );
572
+ } catch {
573
+ // Ignore discovery error and handle below.
574
+ }
575
+ }
576
+ if (oauth && !oauth.scopes && authResult.resourceMetadataUrl) {
577
+ // JSON-error-body path skips `discoverOAuthEndpoints`; fetch the
578
+ // advertised protected-resource metadata for the required scopes.
579
+ const scopes = await fetchResourceMetadataScopes(authResult.resourceMetadataUrl);
580
+ if (scopes) oauth = { ...oauth, scopes };
581
+ }
582
+
583
+ if (!oauth) {
584
+ this.ctx.showError(
585
+ `Authentication required for "${parsed.initialName}", but OAuth endpoints could not be discovered. ` +
586
+ `Use /mcp add ${parsed.initialName} (wizard) or configure auth manually.`,
587
+ );
588
+ return;
589
+ }
590
+
591
+ try {
592
+ const oauthResource = oauth.resource ?? finalConfig.url;
593
+ const oauthResourceIsFallback = !oauth.resource;
594
+ const oauthResult = await this.#handleOAuthFlow(
595
+ oauth.authorizationUrl,
596
+ oauth.tokenUrl,
597
+ oauth.clientId ?? finalConfig.oauth?.clientId ?? "",
598
+ finalConfig.oauth?.clientSecret ?? "",
599
+ oauth.scopes ?? "",
600
+ {
601
+ callbackPort: finalConfig.oauth?.callbackPort,
602
+ callbackPath: finalConfig.oauth?.callbackPath,
603
+ redirectUri: finalConfig.oauth?.redirectUri,
604
+ prompt: finalConfig.oauth?.prompt,
605
+ serverUrl: finalConfig.url,
606
+ resource: oauthResource,
607
+ stripSameOriginResource: oauthResourceIsFallback,
608
+ },
609
+ );
610
+ finalConfig = this.#persistOAuthResult(finalConfig, oauthResult, {
611
+ tokenUrl: oauth.tokenUrl,
612
+ resource: oauthResource,
613
+ stripSameOriginResource: oauthResourceIsFallback,
614
+ clientId: oauth.clientId,
615
+ userClientSecret: finalConfig.oauth?.clientSecret,
616
+ });
617
+ } catch (oauthError) {
618
+ if (oauthError instanceof MCPOAuthCancelledError) {
619
+ this.ctx.showStatus(`Add cancelled for "${parsed.initialName}"`);
620
+ return;
621
+ }
622
+ this.ctx.showError(
623
+ `OAuth flow failed for "${parsed.initialName}": ${oauthError instanceof Error ? oauthError.message : String(oauthError)}`,
624
+ );
625
+ return;
626
+ }
627
+ }
628
+ }
629
+ }
630
+
631
+ await this.#handleWizardComplete(parsed.initialName, finalConfig, parsed.scope);
632
+ return;
633
+ }
634
+
635
+ // Save current editor state
636
+ const done = () => {
637
+ this.ctx.editorContainer.clear();
638
+ this.ctx.editorContainer.addChild(this.ctx.editor);
639
+ this.ctx.ui.setFocus(this.ctx.editor);
640
+ };
641
+
642
+ // Create wizard with OAuth handler and connection test
643
+ const wizard = new MCPAddWizard(
644
+ async (name: string, config: MCPServerConfig, scope: "user" | "project") => {
645
+ done();
646
+ await this.#handleWizardComplete(name, config, scope);
647
+ },
648
+ () => {
649
+ done();
650
+ this.#handleWizardCancel();
651
+ },
652
+ async (authUrl: string, tokenUrl: string, clientId: string, clientSecret: string, scopes: string, options) => {
653
+ return await this.#handleOAuthFlow(authUrl, tokenUrl, clientId, clientSecret, scopes, options);
654
+ },
655
+ async (config: MCPServerConfig) => {
656
+ return await this.#handleTestConnection(config);
657
+ },
658
+ () => {
659
+ this.ctx.ui.requestRender();
660
+ },
661
+ parsed.initialName,
662
+ );
663
+
664
+ // Replace editor with wizard
665
+ this.ctx.editorContainer.clear();
666
+ this.ctx.editorContainer.addChild(wizard);
667
+ this.ctx.ui.setFocus(wizard);
668
+ this.ctx.ui.requestRender();
669
+ }
670
+
671
+ /**
672
+ * Handle OAuth authentication flow for MCP server
673
+ */
674
+ async #handleOAuthFlow(
675
+ authUrl: string,
676
+ tokenUrl: string,
677
+ clientId: string,
678
+ clientSecret: string,
679
+ scopes: string,
680
+ opts?: {
681
+ callbackPort?: number;
682
+ callbackPath?: string;
683
+ redirectUri?: string;
684
+ prompt?: string;
685
+ serverUrl?: string;
686
+ resource?: string;
687
+ stripSameOriginResource?: boolean;
688
+ /**
689
+ * External cancellation source: when this signal aborts, the in-flight
690
+ * OAuth flow is torn down and {@link MCPOAuthCancelledError} is thrown.
691
+ * Wizards (which own focus and absorb Esc themselves) pass their own
692
+ * controller here; editor-focused callers rely on the Esc hook
693
+ * installed below instead.
694
+ */
695
+ abortSignal?: AbortSignal;
696
+ },
697
+ ): Promise<OAuthFlowResult> {
698
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
699
+ let parsedAuthUrl: URL;
700
+
701
+ // Validate OAuth URLs
702
+ try {
703
+ parsedAuthUrl = new URL(authUrl);
704
+ new URL(tokenUrl);
705
+ } catch (_error) {
706
+ throw new Error(
707
+ `Invalid OAuth URLs. Please check:\n Authorization URL: ${authUrl}\n Token URL: ${tokenUrl}`,
708
+ );
709
+ }
710
+
711
+ const resolvedClientId = clientId.trim() || parsedAuthUrl.searchParams.get("client_id") || undefined;
712
+ const resolvedClientSecret = clientSecret.trim() || undefined;
713
+
714
+ const manualInput = this.ctx.oauthManualInput;
715
+ if (manualInput.hasPending()) {
716
+ const pendingProvider = manualInput.pendingProviderId ?? "another provider";
717
+ throw new Error(
718
+ `OAuth login already in progress for ${pendingProvider}. Complete or cancel it before starting MCP OAuth.`,
719
+ );
720
+ }
721
+ let manualInputClaim: { promise: Promise<string>; clear: (reason?: string) => void } | undefined;
722
+ const oauthTimeout = new AbortController();
723
+ // User Esc and external aborts route through here; the timeout path sets
724
+ // its own reason and leaves this flag false so the catch can distinguish
725
+ // "user cancelled" (status) from "deadline elapsed" (error).
726
+ let userCancelled = false;
727
+ const requestUserCancel = (reason: string): void => {
728
+ userCancelled = true;
729
+ if (!oauthTimeout.signal.aborted) oauthTimeout.abort(reason);
730
+ };
731
+ const originalOnEscape = this.ctx.editor.onEscape;
732
+ this.ctx.editor.onEscape = () => requestUserCancel(MCP_OAUTH_USER_CANCEL_REASON);
733
+ const externalSignal = opts?.abortSignal;
734
+ const onExternalAbort = (): void => {
735
+ const reason = externalSignal?.reason;
736
+ requestUserCancel(typeof reason === "string" ? reason : MCP_OAUTH_USER_CANCEL_REASON);
737
+ };
738
+ if (externalSignal?.aborted) {
739
+ onExternalAbort();
740
+ } else {
741
+ externalSignal?.addEventListener("abort", onExternalAbort, { once: true });
742
+ }
743
+ try {
744
+ // Create OAuth flow
745
+ const flow = new MCPOAuthFlow(
746
+ {
747
+ authorizationUrl: authUrl,
748
+ tokenUrl: tokenUrl,
749
+ clientId: resolvedClientId,
750
+ clientSecret: resolvedClientSecret,
751
+ scopes: scopes || undefined,
752
+ prompt: opts?.prompt,
753
+ redirectUri: opts?.redirectUri,
754
+ callbackPort: opts?.callbackPort,
755
+ callbackPath: opts?.callbackPath,
756
+ resource: opts?.resource,
757
+ stripSameOriginResource: opts?.stripSameOriginResource,
758
+ },
759
+ {
760
+ onAuth: (info: { url: string; launchUrl?: string; instructions?: string }) => {
761
+ // Show auth URL prominently in chat as one block
762
+ const block = new TranscriptBlock();
763
+ this.ctx.present(block);
764
+ block.addChild(new Text(theme.fg("accent", "━━━ OAuth Authorization Required ━━━"), 1, 0));
765
+ block.addChild(new Spacer(1));
766
+ block.addChild(new Text(theme.fg("muted", "Preparing browser authorization..."), 1, 0));
767
+ block.addChild(new Spacer(1));
768
+ block.addChild(
769
+ new Text(
770
+ theme.fg("muted", "Waiting for authorization... (Press Esc to cancel, 5 minute timeout)"),
771
+ 1,
772
+ 0,
773
+ ),
774
+ );
775
+ block.addChild(new Text(theme.fg("muted", MCP_MANUAL_LOGIN_TIP), 1, 0));
776
+ block.addChild(new Spacer(1));
777
+ block.addChild(new Text(theme.fg("accent", "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"), 1, 0));
778
+ // `openPath` is best-effort — it logs spawn failures but never
779
+ // throws, so we always render the copy-URL fallback beneath the
780
+ // "attempting to open browser" line and no earlier try/catch is
781
+ // worth keeping.
782
+ openPath(info.url);
783
+ // Stage the FULL authorization URL on the clipboard via OSC 52.
784
+ // The full URL works from any machine (unlike `launchUrl`, which
785
+ // only resolves against the OMP host), and OSC 52 is a
786
+ // wire-level protocol — the terminal writes it to the user's
787
+ // LOCAL clipboard even when OMP is on a remote SSH box.
788
+ // Best-effort: falls back to the visible copy-URL rows below
789
+ // whether or not the terminal honors OSC 52.
790
+ void copyToClipboard(info.url).catch(() => {});
791
+ block.addChild(new Spacer(1));
792
+ block.addChild(new Text(theme.fg("success", "→ Attempting to open browser..."), 1, 0));
793
+ block.addChild(new Spacer(1));
794
+ block.addChild(new Text(theme.fg("muted", "Alternative if browser did not open:"), 1, 0));
795
+ block.addChild(new MCPAuthorizationLinkPrompt(info.url, info.launchUrl));
796
+ this.ctx.ui.requestRender();
797
+ },
798
+ onProgress: (message: string) => {
799
+ this.ctx.present([new Spacer(1), new Text(theme.fg("muted", message), 1, 0)]);
800
+ },
801
+ onManualCodeInput: () => {
802
+ if (manualInputClaim) return manualInputClaim.promise;
803
+ const pendingInput = manualInput.tryClaimInput(MCP_MANUAL_INPUT_PROVIDER_ID);
804
+ if (!pendingInput) {
805
+ const pendingProvider = manualInput.pendingProviderId ?? "another provider";
806
+ throw new Error(
807
+ `OAuth login already in progress for ${pendingProvider}. Complete or cancel it before starting MCP OAuth.`,
808
+ );
809
+ }
810
+ manualInputClaim = pendingInput;
811
+ return pendingInput.promise;
812
+ },
813
+ signal: oauthTimeout.signal,
814
+ },
815
+ );
816
+
817
+ const createAbortError = (): Error => {
818
+ const reason = String(oauthTimeout.signal.reason ?? "MCP OAuth flow aborted");
819
+ return userCancelled ? new MCPOAuthCancelledError() : new Error(reason);
820
+ };
821
+ if (oauthTimeout.signal.aborted) throw createAbortError();
822
+
823
+ // Execute OAuth flow with 5 minute timeout. Race the login itself
824
+ // against the abort signal because Esc/external abort may fire before
825
+ // MCPOAuthFlow reaches OAuthCallbackFlow.#waitForCallback, where the
826
+ // underlying callback server normally observes the signal.
827
+ const credentials = await withTimeout(
828
+ raceAbortSignal(flow.login(), oauthTimeout.signal, createAbortError),
829
+ 5 * 60 * 1000,
830
+ "OAuth flow timed out after 5 minutes",
831
+ () => oauthTimeout.abort("MCP OAuth flow timed out"),
832
+ );
833
+
834
+ this.ctx.present([
835
+ new Spacer(1),
836
+ new Text(theme.fg("success", "✓ Authorization completed in browser."), 1, 0),
837
+ ]);
838
+
839
+ // Deterministic per-URL id: every profile resolves its own credential row
840
+ // under the same key, so shared project configs stay profile-isolated.
841
+ // Random fallback only for flows that never knew the server URL.
842
+ const credentialId = opts?.serverUrl
843
+ ? mcpOAuthCredentialId(opts.serverUrl)
844
+ : `mcp_oauth_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
845
+
846
+ // Embed refresh material so the credential is self-contained: token
847
+ // refresh must work for configs that carry no auth block at all.
848
+ const oauthCredential: MCPStoredOAuthCredential = {
849
+ type: "oauth",
850
+ ...credentials,
851
+ tokenUrl,
852
+ clientId: flow.resolvedClientId ?? resolvedClientId,
853
+ clientSecret: flow.registeredClientSecret ?? resolvedClientSecret,
854
+ resource: flow.resource,
855
+ authorizationUrl: flow.authorizationUrl,
856
+ };
857
+
858
+ await authStorage.set(credentialId, oauthCredential);
859
+
860
+ return {
861
+ credentialId,
862
+ clientId: flow.resolvedClientId,
863
+ resource: flow.resource,
864
+ };
865
+ } catch (error) {
866
+ // User-initiated cancel (Esc or external signal) → neutral status, not
867
+ // a failure. Check the flag we set in `requestUserCancel`, not the
868
+ // abort reason: the timeout path also aborts but with a different
869
+ // reason, and we want it to surface as a timeout error below.
870
+ if (userCancelled) {
871
+ throw new MCPOAuthCancelledError();
872
+ }
873
+
874
+ const errorMsg = error instanceof Error ? error.message : String(error);
875
+
876
+ // Provide helpful error messages based on failure type
877
+ if (errorMsg.includes("timeout") || errorMsg.includes("timed out")) {
878
+ throw new Error("OAuth flow timed out. Please try again.");
879
+ } else if (errorMsg.includes("403") || errorMsg.includes("unauthorized")) {
880
+ throw new Error("OAuth authorization failed. Please check your client credentials.");
881
+ } else if (errorMsg.includes("invalid_grant")) {
882
+ throw new Error("OAuth authorization code is invalid or expired. Please try again.");
883
+ } else if (errorMsg.includes("ECONNREFUSED") || errorMsg.includes("fetch failed")) {
884
+ throw new Error("Could not connect to OAuth server. Please check the URLs and your network connection.");
885
+ } else {
886
+ throw new Error(`OAuth authentication failed: ${errorMsg}`);
887
+ }
888
+ } finally {
889
+ this.ctx.editor.onEscape = originalOnEscape;
890
+ externalSignal?.removeEventListener("abort", onExternalAbort);
891
+ manualInputClaim?.clear("Manual MCP OAuth input cleared");
892
+ }
893
+ }
894
+
895
+ /**
896
+ * Fold a completed OAuth flow back into a server config. Owns the
897
+ * persistence policy in one place: the auth block records the credential
898
+ * pointer plus refresh material, the oauth block echoes the client id for
899
+ * pre-auth reuse, and only a user-supplied client secret is ever written —
900
+ * DCR-issued secrets stay embedded in the stored credential so they cannot
901
+ * leak into (possibly shared/committed) config files.
902
+ */
903
+ #persistOAuthResult(
904
+ config: MCPServerConfig,
905
+ result: OAuthFlowResult,
906
+ opts: {
907
+ tokenUrl: string;
908
+ resource?: string;
909
+ stripSameOriginResource?: boolean;
910
+ clientId?: string;
911
+ userClientSecret?: string;
912
+ },
913
+ ): MCPServerConfig {
914
+ const clientId = result.clientId ?? opts.clientId ?? config.oauth?.clientId;
915
+ const resource =
916
+ result.resource ?? (opts.stripSameOriginResource ? undefined : opts.resource) ?? config.auth?.resource;
917
+ return {
918
+ ...config,
919
+ auth: {
920
+ type: "oauth",
921
+ credentialId: result.credentialId,
922
+ tokenUrl: opts.tokenUrl,
923
+ clientId,
924
+ clientSecret: opts.userClientSecret,
925
+ resource,
926
+ },
927
+ oauth: {
928
+ ...config.oauth,
929
+ clientId,
930
+ },
931
+ };
932
+ }
933
+
934
+ /**
935
+ * Test connection to an MCP server.
936
+ * Throws an error if connection fails (used for auto-detection).
937
+ */
938
+ async #handleTestConnection(config: MCPServerConfig, options?: { oauth?: boolean }): Promise<void> {
939
+ // Create temporary connection using a test name
940
+ const testName = `test_${Date.now()}`;
941
+ let resolvedConfig: MCPServerConfig;
942
+ if (this.ctx.mcpManager) {
943
+ resolvedConfig = await this.ctx.mcpManager.prepareConfig(config, options);
944
+ } else {
945
+ const tempManager = new MCPManager(getProjectDir());
946
+ tempManager.setAuthStorage(this.ctx.session.modelRegistry.authStorage);
947
+ resolvedConfig = await tempManager.prepareConfig(config, options);
948
+ }
949
+
950
+ const connection = await connectToServer(testName, resolvedConfig);
951
+ await disconnectServer(connection);
952
+ }
953
+
954
+ async #findConfiguredServer(
955
+ name: string,
956
+ ): Promise<{ filePath: string; scope: "user" | "project"; config: MCPServerConfig } | null> {
957
+ const cwd = getProjectDir();
958
+ const userPath = getMCPConfigPath("user", cwd);
959
+ const projectPath = getMCPConfigPath("project", cwd);
960
+
961
+ const [userConfig, projectConfig] = await Promise.all([
962
+ readMCPConfigFile(userPath),
963
+ readMCPConfigFile(projectPath),
964
+ ]);
965
+
966
+ if (userConfig.mcpServers?.[name]) {
967
+ return { filePath: userPath, scope: "user", config: userConfig.mcpServers[name] };
968
+ }
969
+ if (projectConfig.mcpServers?.[name]) {
970
+ return { filePath: projectPath, scope: "project", config: projectConfig.mcpServers[name] };
971
+ }
972
+
973
+ // Check standalone fallback files (mcp.json, .mcp.json) in the project root —
974
+ // these match the discovery paths used by the mcp-json provider. Reads run in
975
+ // parallel (mirroring user/project above) but precedence is preserved by the
976
+ // for-loop's iteration order: mcp.json wins over .mcp.json on a same-name hit.
977
+ const standalonePaths = [path.join(cwd, "mcp.json"), path.join(cwd, ".mcp.json")];
978
+ const fallbackConfigs = await Promise.all(
979
+ standalonePaths.map(async fallbackPath => {
980
+ try {
981
+ return await readMCPConfigFile(fallbackPath);
982
+ } catch {
983
+ // Malformed JSON in a standalone file — skip and continue lookup.
984
+ return null;
985
+ }
986
+ }),
987
+ );
988
+ for (const [index, fallbackConfig] of fallbackConfigs.entries()) {
989
+ const config = fallbackConfig?.mcpServers?.[name];
990
+ if (config) {
991
+ return { filePath: standalonePaths[index]!, scope: "project", config };
992
+ }
993
+ }
994
+ return null;
995
+ }
996
+
997
+ /**
998
+ * Resolve a server for an auth/test operation.
999
+ *
1000
+ * Unlike {@link #findConfiguredServer} (which only reads writable OMP config
1001
+ * files), this also recognizes runtime-discovered servers that `/mcp list`
1002
+ * surfaces but that live in no writable config — e.g. servers from a Claude
1003
+ * Code marketplace plugin (`cloudflare:cloudflare-api`), `.cursor/mcp.json`,
1004
+ * etc. Without this, `/mcp reauth|test|unauth` reports "not found" for a
1005
+ * server the list just showed.
1006
+ *
1007
+ * For a discovered server, any persisted change is written into the *user*
1008
+ * config under the same (namespaced) name; the native provider (priority 100)
1009
+ * shadows the discovered entry on the next reload, so an OAuth `auth` block
1010
+ * persisted by `/mcp reauth` takes effect. `discovered` lets callers tailor
1011
+ * messaging and skip pointless writes when there is nothing to persist.
1012
+ */
1013
+ async #resolveServerForAuth(name: string): Promise<{
1014
+ filePath: string;
1015
+ scope: "user" | "project";
1016
+ config: MCPServerConfig;
1017
+ discovered: boolean;
1018
+ } | null> {
1019
+ const found = await this.#findConfiguredServer(name);
1020
+ if (found) return { ...found, discovered: false };
1021
+
1022
+ const config = this.ctx.mcpManager?.getServerConfig(name);
1023
+ const source = this.ctx.mcpManager?.getSource(name);
1024
+ if (!config || !source) return null;
1025
+
1026
+ return {
1027
+ filePath: getMCPConfigPath("user", getProjectDir()),
1028
+ scope: "user",
1029
+ config,
1030
+ discovered: true,
1031
+ };
1032
+ }
1033
+
1034
+ #stripOAuthAuth(config: MCPServerConfig): MCPServerConfig {
1035
+ const next = { ...config } as MCPServerConfig & { auth?: MCPAuthConfig };
1036
+ delete next.auth;
1037
+ return next;
1038
+ }
1039
+
1040
+ async #resolveOAuthEndpointsFromServer(config: MCPServerConfig): Promise<{
1041
+ authorizationUrl: string;
1042
+ tokenUrl: string;
1043
+ clientId?: string;
1044
+ scopes?: string;
1045
+ resource?: string;
1046
+ }> {
1047
+ // Stdio servers manage credentials inside the child process; OMP's OAuth
1048
+ // flow only applies to http/sse transports. Without this guard the
1049
+ // unauthenticated preflight below spawns the child, which happily reuses
1050
+ // its own cached tokens (e.g. mcp-remote's machine-wide ~/.mcp-auth) and
1051
+ // produces the misleading "reauthorization is not required".
1052
+ if (config.type !== "http" && config.type !== "sse") {
1053
+ const remoteUrl = config.args?.find(arg => /^https?:\/\//.test(arg));
1054
+ const httpHint = `{ "type": "http", "url": ${JSON.stringify(remoteUrl ?? "<remote url>")} }`;
1055
+ const usesMcpRemote = [config.command, ...(config.args ?? [])].some(part => part?.includes("mcp-remote"));
1056
+ throw new Error(
1057
+ usesMcpRemote
1058
+ ? `this server proxies OAuth through mcp-remote, which caches tokens machine-wide in ~/.mcp-auth (shared across every OMP profile). Clear ~/.mcp-auth to force a fresh login, or replace the proxy with ${httpHint} so OMP manages OAuth per profile.`
1059
+ : `stdio servers manage their own credentials, so OMP has no OAuth to reauthorize. If the service supports OAuth over HTTP, configure it as ${httpHint} instead.`,
1060
+ );
1061
+ }
1062
+ // First test if server actually needs auth by connecting without OAuth
1063
+ let connectionSucceeded = false;
1064
+ let connectionError: Error | undefined;
1065
+ try {
1066
+ await this.#handleTestConnection(this.#stripOAuthAuth(config), { oauth: false });
1067
+ connectionSucceeded = true;
1068
+ } catch (error) {
1069
+ connectionError = error as Error;
1070
+ }
1071
+
1072
+ // Server connected fine without auth — reauth is not needed
1073
+ if (connectionSucceeded) {
1074
+ throw new Error("Server connection succeeded without OAuth; reauthorization is not required.");
1075
+ }
1076
+
1077
+ // Analyze the connection error to extract OAuth endpoints
1078
+ const authResult = analyzeAuthError(connectionError!, "url" in config ? config.url : undefined);
1079
+ let oauth = authResult.authType === "oauth" ? (authResult.oauth ?? null) : null;
1080
+
1081
+ if (!oauth && (config.type === "http" || config.type === "sse") && config.url) {
1082
+ oauth = await discoverOAuthEndpoints(config.url, authResult.authServerUrl, authResult.resourceMetadataUrl, {
1083
+ protectedScopes: authResult.scopes,
1084
+ });
1085
+ }
1086
+ if (oauth && !oauth.scopes && authResult.resourceMetadataUrl) {
1087
+ // JSON-error-body path skips `discoverOAuthEndpoints`; fetch the
1088
+ // advertised protected-resource metadata for the required scopes.
1089
+ const scopes = await fetchResourceMetadataScopes(authResult.resourceMetadataUrl);
1090
+ if (scopes) oauth = { ...oauth, scopes };
1091
+ }
1092
+
1093
+ if (!oauth) {
1094
+ throw new Error("Could not discover OAuth endpoints from server response.");
1095
+ }
1096
+
1097
+ return oauth;
1098
+ }
1099
+
1100
+ async #waitForServerConnectionWithAnimation(
1101
+ name: string,
1102
+ options?: { suppressDisconnectedWarning?: boolean },
1103
+ ): Promise<"connected" | "connecting" | "disconnected"> {
1104
+ if (!this.ctx.mcpManager) return "disconnected";
1105
+
1106
+ const block = new McpConnectingBlock(name);
1107
+ this.ctx.present(block);
1108
+
1109
+ try {
1110
+ try {
1111
+ await withTimeout(this.ctx.mcpManager.waitForConnection(name), 10_000, "Connection still pending");
1112
+ } catch {
1113
+ // Ignore timeout/errors here and use status check below.
1114
+ }
1115
+ const state = this.ctx.mcpManager.getConnectionStatus(name);
1116
+ if (state === "connected") {
1117
+ // Connection may complete after initial reload; rebind runtime MCP tools now.
1118
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1119
+ }
1120
+ if (state === "connected") {
1121
+ block.setStatus(theme.fg("success", `${theme.status.enabled} Connected to "${name}"`));
1122
+ } else if (state === "connecting") {
1123
+ block.setStatus(theme.fg("muted", `◌ "${name}" is still connecting...`));
1124
+ } else {
1125
+ block.setStatus(
1126
+ options?.suppressDisconnectedWarning
1127
+ ? theme.fg("muted", `◌ Connection check complete for "${name}"`)
1128
+ : theme.fg("warning", `⚠ Could not connect to "${name}" yet`),
1129
+ );
1130
+ }
1131
+ return state;
1132
+ } finally {
1133
+ block.finish();
1134
+ }
1135
+ }
1136
+
1137
+ async #syncManagerConnection(name: string, config: MCPServerConfig): Promise<void> {
1138
+ if (!this.ctx.mcpManager) return;
1139
+ if (this.ctx.mcpManager.getConnectionStatus(name) !== "disconnected") return;
1140
+ await this.ctx.mcpManager.connectServers({ [name]: config }, {});
1141
+ if (this.ctx.mcpManager.getConnectionStatus(name) === "connected") {
1142
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1143
+ }
1144
+ }
1145
+
1146
+ async #handleWizardComplete(name: string, config: MCPServerConfig, scope: "user" | "project"): Promise<void> {
1147
+ try {
1148
+ // Determine file path
1149
+ const cwd = getProjectDir();
1150
+ const filePath = getMCPConfigPath(scope, cwd);
1151
+
1152
+ // Add server to config
1153
+ await addMCPServer(filePath, name, config);
1154
+
1155
+ // Reload MCP manager
1156
+ await this.#reloadMCP();
1157
+ const state =
1158
+ config.enabled === false
1159
+ ? "disconnected"
1160
+ : await this.#waitForServerConnectionWithAnimation(name, { suppressDisconnectedWarning: true });
1161
+ let isConnected = state === "connected";
1162
+ const isConnecting = state === "connecting";
1163
+
1164
+ // Fallback: if manager state is still disconnected but direct test works,
1165
+ // report as connected to avoid false-negative messaging.
1166
+ if (!isConnected && !isConnecting && config.enabled !== false) {
1167
+ try {
1168
+ await this.#handleTestConnection(config);
1169
+ isConnected = true;
1170
+ await this.#syncManagerConnection(name, config);
1171
+ } catch {
1172
+ // Keep disconnected status
1173
+ }
1174
+ }
1175
+
1176
+ // refreshMCPTools preserves the prior MCP tool selection, so tools from
1177
+ // brand-new servers are registered in the registry but never activated.
1178
+ // Explicitly activate the newly added server's tools now.
1179
+ if (isConnected && this.ctx.mcpManager) {
1180
+ const serverTools = this.ctx.mcpManager.getTools().filter(t => t.mcpServerName === name);
1181
+ if (serverTools.length > 0) {
1182
+ const currentActive = this.ctx.session.getActiveToolNames();
1183
+ const toActivate = serverTools.map(t => t.name).filter(n => this.ctx.session.getToolByName(n));
1184
+ if (toActivate.length > 0) {
1185
+ await this.ctx.session.setActiveToolsByName([...new Set([...currentActive, ...toActivate])]);
1186
+ }
1187
+ }
1188
+ }
1189
+
1190
+ // Show success message
1191
+ const scopeLabel = scope === "user" ? "user" : "project";
1192
+ const lines = ["", theme.fg("success", `+ Added server "${name}" to ${scopeLabel} config`), ""];
1193
+
1194
+ if (isConnected) {
1195
+ lines.push(theme.fg("success", `${theme.status.enabled} Successfully connected to server`));
1196
+ lines.push("");
1197
+ } else if (isConnecting) {
1198
+ lines.push(theme.fg("muted", `◌ Server is connecting in background...`));
1199
+ lines.push(theme.fg("muted", ` Run ${theme.fg("accent", `/mcp test ${name}`)} in a few seconds.`));
1200
+ lines.push("");
1201
+ } else {
1202
+ lines.push(theme.fg("warning", `⚠ Server added but not yet connected`));
1203
+ lines.push(theme.fg("muted", ` Run ${theme.fg("accent", `/mcp test ${name}`)} to test the connection.`));
1204
+ lines.push("");
1205
+ }
1206
+
1207
+ lines.push(theme.fg("muted", `Run ${theme.fg("accent", "/mcp list")} to see all configured servers.`));
1208
+ lines.push("");
1209
+
1210
+ this.#showMessage(lines.join("\n"));
1211
+ } catch (error) {
1212
+ const errorMsg = error instanceof Error ? error.message : String(error);
1213
+
1214
+ // Provide helpful error messages
1215
+ let helpText = "";
1216
+ if (errorMsg.includes("EACCES") || errorMsg.includes("permission denied")) {
1217
+ helpText = "\n\nTip: Check file permissions for the config directory.";
1218
+ } else if (errorMsg.includes("ENOSPC")) {
1219
+ helpText = "\n\nTip: Insufficient disk space.";
1220
+ } else if (errorMsg.includes("already exists")) {
1221
+ helpText = `\n\nTip: Use ${theme.fg("accent", "/mcp list")} to see existing servers.`;
1222
+ }
1223
+
1224
+ this.ctx.showError(`Failed to add server: ${errorMsg}${helpText}`);
1225
+ }
1226
+ }
1227
+
1228
+ #handleWizardCancel(): void {
1229
+ this.#showMessage(
1230
+ [
1231
+ "",
1232
+ theme.fg("muted", "Server creation cancelled."),
1233
+ "",
1234
+ theme.fg("dim", "Tip: Press Ctrl+C or Esc anytime to cancel"),
1235
+ "",
1236
+ ].join("\n"),
1237
+ );
1238
+ }
1239
+
1240
+ /**
1241
+ * Handle /mcp list - Show all configured servers
1242
+ */
1243
+ async #handleList(): Promise<void> {
1244
+ try {
1245
+ const cwd = getProjectDir();
1246
+
1247
+ // Load from both user and project configs
1248
+ const userPath = getMCPConfigPath("user", cwd);
1249
+ const projectPath = getMCPConfigPath("project", cwd);
1250
+
1251
+ const userPathLabel = shortenPath(userPath);
1252
+ const projectPathLabel = shortenPath(projectPath);
1253
+ const [userConfig, projectConfig] = await Promise.all([
1254
+ readMCPConfigFile(userPath),
1255
+ readMCPConfigFile(projectPath),
1256
+ ]);
1257
+
1258
+ const userServers = Object.keys(userConfig.mcpServers ?? {});
1259
+ const projectServers = Object.keys(projectConfig.mcpServers ?? {});
1260
+
1261
+ // Collect runtime-discovered servers not in config files
1262
+ const configServerNames = new Set([...userServers, ...projectServers]);
1263
+ const disabledServerNames = new Set(await readDisabledServers(userPath));
1264
+ const discoveredServers: { name: string; source: SourceMeta }[] = [];
1265
+ if (this.ctx.mcpManager) {
1266
+ for (const name of this.ctx.mcpManager.getAllServerNames()) {
1267
+ if (configServerNames.has(name)) continue;
1268
+ if (disabledServerNames.has(name)) continue;
1269
+ const source = this.ctx.mcpManager.getSource(name);
1270
+ if (source) {
1271
+ discoveredServers.push({ name, source });
1272
+ }
1273
+ }
1274
+ }
1275
+
1276
+ if (
1277
+ userServers.length === 0 &&
1278
+ projectServers.length === 0 &&
1279
+ discoveredServers.length === 0 &&
1280
+ disabledServerNames.size === 0
1281
+ ) {
1282
+ this.#showMessage(
1283
+ [
1284
+ "",
1285
+ theme.fg("muted", "No MCP servers configured."),
1286
+ "",
1287
+ `Use ${theme.fg("accent", "/mcp add")} to add a server.`,
1288
+ "",
1289
+ ].join("\n"),
1290
+ );
1291
+ return;
1292
+ }
1293
+
1294
+ const lines: string[] = ["", theme.bold("Configured MCP Servers"), ""];
1295
+
1296
+ // Show user-level servers
1297
+ if (userServers.length > 0) {
1298
+ lines.push(theme.fg("accent", "User level") + theme.fg("muted", ` (${userPathLabel}):`));
1299
+ for (const name of userServers) {
1300
+ const config = userConfig.mcpServers![name];
1301
+ const type = config.type ?? "stdio";
1302
+ const state =
1303
+ config.enabled === false
1304
+ ? "inactive"
1305
+ : (this.ctx.mcpManager?.getConnectionStatus(name) ?? "disconnected");
1306
+ const status =
1307
+ state === "inactive"
1308
+ ? theme.fg("warning", " ◌ inactive")
1309
+ : state === "connected"
1310
+ ? theme.fg("success", " ● connected")
1311
+ : state === "connecting"
1312
+ ? theme.fg("muted", " ◌ connecting")
1313
+ : theme.fg("muted", " ○ not connected");
1314
+ lines.push(` ${theme.fg("accent", name)}${status} ${theme.fg("dim", `[${type}]`)}`);
1315
+ }
1316
+ lines.push("");
1317
+ }
1318
+
1319
+ // Show project-level servers
1320
+ if (projectServers.length > 0) {
1321
+ lines.push(theme.fg("accent", "Project level") + theme.fg("muted", ` (${projectPathLabel}):`));
1322
+ for (const name of projectServers) {
1323
+ const config = projectConfig.mcpServers![name];
1324
+ const type = config.type ?? "stdio";
1325
+ const state =
1326
+ config.enabled === false
1327
+ ? "inactive"
1328
+ : (this.ctx.mcpManager?.getConnectionStatus(name) ?? "disconnected");
1329
+ const status =
1330
+ state === "inactive"
1331
+ ? theme.fg("warning", " ◌ inactive")
1332
+ : state === "connected"
1333
+ ? theme.fg("success", " ● connected")
1334
+ : state === "connecting"
1335
+ ? theme.fg("muted", " ◌ connecting")
1336
+ : theme.fg("muted", " ○ not connected");
1337
+ lines.push(` ${theme.fg("accent", name)}${status} ${theme.fg("dim", `[${type}]`)}`);
1338
+ }
1339
+ lines.push("");
1340
+ }
1341
+
1342
+ // Show discovered servers (from .claude.json, .cursor/mcp.json, .vscode/mcp.json, etc.)
1343
+ if (discoveredServers.length > 0) {
1344
+ for (const { providerName, shortPath, items: entries } of groupBySource(discoveredServers, e => e.source)) {
1345
+ lines.push(theme.fg("accent", providerName) + theme.fg("muted", ` (${shortPath}):`));
1346
+ for (const { name } of entries) {
1347
+ const state = this.ctx.mcpManager!.getConnectionStatus(name);
1348
+ const status =
1349
+ state === "connected"
1350
+ ? theme.fg("success", " ● connected")
1351
+ : state === "connecting"
1352
+ ? theme.fg("muted", " ◌ connecting")
1353
+ : theme.fg("muted", " ○ not connected");
1354
+ lines.push(` ${theme.fg("accent", name)}${status}`);
1355
+ }
1356
+ lines.push("");
1357
+ }
1358
+ }
1359
+
1360
+ // Show servers disabled via /mcp disable (from third-party configs)
1361
+ const relevantDisabled = [...disabledServerNames].filter(n => !configServerNames.has(n));
1362
+ if (relevantDisabled.length > 0) {
1363
+ lines.push(theme.fg("accent", "Disabled") + theme.fg("muted", " (discovered servers):"));
1364
+ for (const name of relevantDisabled) {
1365
+ lines.push(` ${theme.fg("accent", name)}${theme.fg("warning", " ◌ disabled")}`);
1366
+ }
1367
+ lines.push("");
1368
+ }
1369
+ this.#showMessage(lines.join("\n"));
1370
+ } catch (error) {
1371
+ this.ctx.showError(`Failed to list servers: ${error instanceof Error ? error.message : String(error)}`);
1372
+ }
1373
+ }
1374
+
1375
+ /**
1376
+ * Handle /mcp remove <name> - Remove a server
1377
+ */
1378
+ async #handleRemove(text: string): Promise<void> {
1379
+ const match = text.match(/^\/mcp\s+(?:remove|rm)\b\s*(.*)$/i);
1380
+ const rest = match?.[1]?.trim() ?? "";
1381
+ const parsed = parseRemoveArgs(rest);
1382
+ if (!parsed.ok) {
1383
+ this.ctx.showError(parsed.error);
1384
+ return;
1385
+ }
1386
+ const { name, scope } = parsed.value;
1387
+
1388
+ if (!name) {
1389
+ this.ctx.showError("Server name required. Usage: /mcp remove <name> [--scope project|user]");
1390
+ return;
1391
+ }
1392
+
1393
+ try {
1394
+ const cwd = getProjectDir();
1395
+ const userPath = getMCPConfigPath("user", cwd);
1396
+ const projectPath = getMCPConfigPath("project", cwd);
1397
+ const filePath = scope === "user" ? userPath : projectPath;
1398
+ const config = await readMCPConfigFile(filePath);
1399
+ if (!config.mcpServers?.[name]) {
1400
+ this.ctx.showError(`Server "${name}" not found in ${scope} config.`);
1401
+ return;
1402
+ }
1403
+
1404
+ // Disconnect if connected
1405
+ if (this.ctx.mcpManager?.getConnection(name)) {
1406
+ await this.ctx.mcpManager.disconnectServer(name);
1407
+ }
1408
+
1409
+ // Remove from config
1410
+ await removeMCPServer(filePath, name);
1411
+
1412
+ // Reload MCP manager
1413
+ await this.#reloadMCP();
1414
+
1415
+ this.#showMessage(["", theme.fg("success", `- Removed server "${name}" from ${scope} config`), ""].join("\n"));
1416
+ } catch (error) {
1417
+ this.ctx.showError(`Failed to remove server: ${error instanceof Error ? error.message : String(error)}`);
1418
+ }
1419
+ }
1420
+
1421
+ /**
1422
+ * Handle /mcp test <name> - Test connection to a server
1423
+ */
1424
+ async #handleTest(name: string | undefined): Promise<void> {
1425
+ if (!name) {
1426
+ this.ctx.showError("Server name required. Usage: /mcp test <name>");
1427
+ return;
1428
+ }
1429
+
1430
+ const originalOnEscape = this.ctx.editor.onEscape;
1431
+ const abortController = new AbortController();
1432
+ this.ctx.editor.onEscape = () => {
1433
+ abortController.abort();
1434
+ };
1435
+
1436
+ let connection: MCPServerConnection | undefined;
1437
+ try {
1438
+ const found = await this.#resolveServerForAuth(name);
1439
+
1440
+ if (!found) {
1441
+ this.ctx.showError(
1442
+ `Server "${name}" not found.\n\nTip: Run ${theme.fg("accent", "/mcp list")} to see available servers.`,
1443
+ );
1444
+ return;
1445
+ }
1446
+
1447
+ const { config } = found;
1448
+ if (config.enabled === false) {
1449
+ this.ctx.showError(`Server "${name}" is disabled. Run /mcp enable ${name} first.`);
1450
+ return;
1451
+ }
1452
+
1453
+ this.#showMessage(
1454
+ ["", theme.fg("muted", `Testing connection to "${name}"... (esc to cancel)`), ""].join("\n"),
1455
+ );
1456
+
1457
+ // Resolve auth config if needed
1458
+ let resolvedConfig: MCPServerConfig;
1459
+ if (this.ctx.mcpManager) {
1460
+ resolvedConfig = await this.ctx.mcpManager.prepareConfig(config);
1461
+ } else {
1462
+ const tempManager = new MCPManager(getProjectDir());
1463
+ tempManager.setAuthStorage(this.ctx.session.modelRegistry.authStorage);
1464
+ resolvedConfig = await tempManager.prepareConfig(config);
1465
+ }
1466
+
1467
+ // Create temporary connection
1468
+ connection = await connectToServer(name, resolvedConfig, { signal: abortController.signal });
1469
+
1470
+ // List tools to verify connection
1471
+ const tools = await listTools(connection, { signal: abortController.signal });
1472
+
1473
+ const lines = [
1474
+ "",
1475
+ theme.fg("success", `${theme.status.enabled} Successfully connected to "${name}"`),
1476
+ "",
1477
+ ` Server: ${connection.serverInfo.name} v${connection.serverInfo.version}`,
1478
+ ` Tools: ${tools.length}`,
1479
+ ];
1480
+
1481
+ // Show tool names if there are any
1482
+ if (tools.length > 0 && tools.length <= 10) {
1483
+ lines.push("");
1484
+ lines.push(" Available tools:");
1485
+ for (const tool of tools) {
1486
+ lines.push(` • ${tool.name}`);
1487
+ }
1488
+ }
1489
+
1490
+ lines.push("");
1491
+ await this.#syncManagerConnection(name, config);
1492
+ this.#showMessage(lines.join("\n"));
1493
+ } catch (error) {
1494
+ if (abortController.signal.aborted || (error instanceof Error && error.name === "AbortError")) {
1495
+ this.ctx.showStatus(`Cancelled MCP test for "${name}"`);
1496
+ return;
1497
+ }
1498
+
1499
+ const errorMsg = error instanceof Error ? error.message : String(error);
1500
+
1501
+ // Provide helpful error messages
1502
+ let helpText = "";
1503
+ if (errorMsg.includes("ENOENT") || errorMsg.includes("not found")) {
1504
+ helpText = "\n\nTip: Check that the command or URL is correct.";
1505
+ } else if (errorMsg.includes("EACCES")) {
1506
+ helpText = "\n\nTip: Check file/command permissions.";
1507
+ } else if (errorMsg.includes("ECONNREFUSED")) {
1508
+ helpText = "\n\nTip: Check that the server is running and the URL/port is correct.";
1509
+ } else if (errorMsg.includes("timeout")) {
1510
+ helpText = "\n\nTip: The server may be slow or unresponsive. Try increasing the timeout.";
1511
+ } else if (errorMsg.includes("401") || errorMsg.includes("403")) {
1512
+ helpText = "\n\nTip: Check your authentication credentials.";
1513
+ }
1514
+
1515
+ this.ctx.showError(`Failed to connect to "${name}": ${errorMsg}${helpText}`);
1516
+ } finally {
1517
+ this.ctx.editor.onEscape = originalOnEscape;
1518
+ if (connection) {
1519
+ // Best-effort: don't block UI on cleanup.
1520
+ void disconnectServer(connection);
1521
+ }
1522
+ }
1523
+ }
1524
+
1525
+ async #handleSetEnabled(name: string | undefined, enabled: boolean): Promise<void> {
1526
+ if (!name) {
1527
+ this.ctx.showError(`Server name required. Usage: /mcp ${enabled ? "enable" : "disable"} <name>`);
1528
+ return;
1529
+ }
1530
+
1531
+ try {
1532
+ const found = await this.#findConfiguredServer(name);
1533
+ if (!found) {
1534
+ // Check if this is a discovered server from a third-party config
1535
+ const userConfigPath = getMCPConfigPath("user", getProjectDir());
1536
+ const disabledServers = new Set(await readDisabledServers(userConfigPath));
1537
+ const isDiscovered = this.ctx.mcpManager?.getSource(name);
1538
+ const isCurrentlyDisabled = disabledServers.has(name);
1539
+ if (!isDiscovered && !isCurrentlyDisabled) {
1540
+ this.ctx.showError(`Server "${name}" not found.`);
1541
+ return;
1542
+ }
1543
+ if (isCurrentlyDisabled === !enabled) {
1544
+ this.#showMessage(
1545
+ ["", theme.fg("muted", `Server "${name}" is already ${enabled ? "enabled" : "disabled"}.`), ""].join(
1546
+ "\n",
1547
+ ),
1548
+ );
1549
+ return;
1550
+ }
1551
+ await setServerDisabled(userConfigPath, name, !enabled);
1552
+ if (enabled) {
1553
+ await this.#connectEnabledMCPServer(name);
1554
+ const state = await this.#waitForServerConnectionWithAnimation(name);
1555
+ const status =
1556
+ state === "connected"
1557
+ ? theme.fg("success", "Connected")
1558
+ : state === "connecting"
1559
+ ? theme.fg("muted", "Connecting")
1560
+ : theme.fg("warning", "Not connected yet");
1561
+ this.#showMessage(
1562
+ [
1563
+ "",
1564
+ theme.fg("success", `${theme.status.enabled} Enabled "${name}"`),
1565
+ "",
1566
+ ` Status: ${status}`,
1567
+ "",
1568
+ ].join("\n"),
1569
+ );
1570
+ } else {
1571
+ await this.ctx.mcpManager?.disconnectServer(name);
1572
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager?.getTools() ?? []);
1573
+ this.#showMessage(["", theme.fg("muted", `${theme.status.disabled} Disabled "${name}"`), ""].join("\n"));
1574
+ }
1575
+ return;
1576
+ }
1577
+
1578
+ if ((found.config.enabled ?? true) === enabled) {
1579
+ this.#showMessage(
1580
+ ["", theme.fg("muted", `Server "${name}" is already ${enabled ? "enabled" : "disabled"}.`), ""].join(
1581
+ "\n",
1582
+ ),
1583
+ );
1584
+ return;
1585
+ }
1586
+
1587
+ const updated: MCPServerConfig = { ...found.config, enabled };
1588
+ await updateMCPServer(found.filePath, name, updated);
1589
+ if (enabled) {
1590
+ await this.#connectEnabledMCPServer(name);
1591
+ } else {
1592
+ await this.ctx.mcpManager?.disconnectServer(name);
1593
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager?.getTools() ?? []);
1594
+ }
1595
+
1596
+ let status = "";
1597
+ if (enabled) {
1598
+ const state = await this.#waitForServerConnectionWithAnimation(name);
1599
+ status =
1600
+ state === "connected"
1601
+ ? theme.fg("success", "Connected")
1602
+ : state === "connecting"
1603
+ ? theme.fg("muted", "Connecting")
1604
+ : theme.fg("warning", "Not connected yet");
1605
+ }
1606
+
1607
+ const lines = [
1608
+ "",
1609
+ enabled
1610
+ ? theme.fg("success", `${theme.status.enabled} Enabled "${name}" (${found.scope} config)`)
1611
+ : theme.fg("muted", `${theme.status.disabled} Disabled "${name}" (${found.scope} config)`),
1612
+ ];
1613
+ if (status) {
1614
+ lines.push("");
1615
+ lines.push(` Status: ${status}`);
1616
+ }
1617
+ lines.push("");
1618
+ this.#showMessage(lines.join("\n"));
1619
+ } catch (error) {
1620
+ this.ctx.showError(
1621
+ `Failed to ${enabled ? "enable" : "disable"} server: ${error instanceof Error ? error.message : String(error)}`,
1622
+ );
1623
+ }
1624
+ }
1625
+
1626
+ async #handleUnauth(name: string | undefined): Promise<void> {
1627
+ if (!name) {
1628
+ this.ctx.showError("Server name required. Usage: /mcp unauth <name>");
1629
+ return;
1630
+ }
1631
+
1632
+ try {
1633
+ const found = await this.#resolveServerForAuth(name);
1634
+ if (!found) {
1635
+ this.ctx.showError(`Server "${name}" not found.`);
1636
+ return;
1637
+ }
1638
+
1639
+ const currentAuth = (found.config as MCPServerConfig & { auth?: MCPAuthConfig }).auth;
1640
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
1641
+ if (currentAuth?.type === "oauth") {
1642
+ await removeManagedMcpOAuthCredential(authStorage, currentAuth.credentialId);
1643
+ }
1644
+ // Also drop this profile's url-keyed binding so the server is truly
1645
+ // signed out even when the config carries no auth block. Runtime
1646
+ // discovery expands `${...}` URL values before MCPManager looks up the
1647
+ // deterministic credential row, so unauth must clear that same key.
1648
+ let removedUrlKeyedCredential = false;
1649
+ if ((found.config.type === "http" || found.config.type === "sse") && found.config.url) {
1650
+ removedUrlKeyedCredential = await removeManagedMcpOAuthCredentials(
1651
+ authStorage,
1652
+ mcpOAuthCredentialIdsForServerUrl(found.config.url),
1653
+ );
1654
+ }
1655
+
1656
+ if (found.discovered && currentAuth?.type !== "oauth") {
1657
+ if (!removedUrlKeyedCredential) {
1658
+ this.#showMessage(
1659
+ ["", theme.fg("muted", `No stored OAuth auth to remove for "${name}".`), ""].join("\n"),
1660
+ );
1661
+ return;
1662
+ }
1663
+ await this.#reloadMCP();
1664
+ this.#showMessage(
1665
+ ["", theme.fg("success", `- Cleared auth for "${name}" (${found.scope} config)`), ""].join("\n"),
1666
+ );
1667
+ return;
1668
+ }
1669
+
1670
+ const updated = this.#stripOAuthAuth(found.config);
1671
+ await updateMCPServer(found.filePath, name, updated);
1672
+ await this.#reloadMCP();
1673
+
1674
+ this.#showMessage(
1675
+ ["", theme.fg("success", `- Cleared auth for "${name}" (${found.scope} config)`), ""].join("\n"),
1676
+ );
1677
+ } catch (error) {
1678
+ this.ctx.showError(`Failed to clear auth: ${error instanceof Error ? error.message : String(error)}`);
1679
+ }
1680
+ }
1681
+
1682
+ async #handleReauth(name: string | undefined): Promise<void> {
1683
+ if (!name) {
1684
+ this.ctx.showError("Server name required. Usage: /mcp reauth <name>");
1685
+ return;
1686
+ }
1687
+
1688
+ try {
1689
+ const found = await this.#resolveServerForAuth(name);
1690
+ if (!found) {
1691
+ this.ctx.showError(`Server "${name}" not found.`);
1692
+ return;
1693
+ }
1694
+
1695
+ if (found.config.enabled === false) {
1696
+ this.ctx.showError(`Server "${name}" is disabled. Run /mcp enable ${name} first.`);
1697
+ return;
1698
+ }
1699
+
1700
+ const currentAuth = (found.config as MCPServerConfig & { auth?: MCPAuthConfig }).auth;
1701
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
1702
+ const baseConfig = this.#stripOAuthAuth(found.config);
1703
+ const runtimeBaseConfig = expandEnvVarsDeep(baseConfig);
1704
+ // Resolve endpoints first: this fails fast for stdio transports and
1705
+ // probes http/sse with { oauth: false }, so nothing destructive has
1706
+ // happened yet if the server turns out not to need (or support) OAuth.
1707
+ // Use the same env-expanded config shape runtime discovery passes to
1708
+ // MCPManager; the raw file value may contain `${...}` placeholders.
1709
+ const oauth = await this.#resolveOAuthEndpointsFromServer(runtimeBaseConfig);
1710
+ const serverUrl =
1711
+ runtimeBaseConfig.type === "http" || runtimeBaseConfig.type === "sse" ? runtimeBaseConfig.url : undefined;
1712
+ // A user-supplied client secret may live in either block (the wizard
1713
+ // writes it to auth.clientSecret); DCR secrets are embedded in the
1714
+ // stored credential and never echoed back into config files.
1715
+ const configuredClientId = found.config.oauth?.clientId ?? currentAuth?.clientId;
1716
+ const existingCredential = lookupMcpOAuthCredentialForServer(authStorage, currentAuth, serverUrl)?.credential;
1717
+ const flowClientId = oauth.clientId ?? configuredClientId ?? existingCredential?.clientId ?? "";
1718
+ const storedClientSecret =
1719
+ existingCredential?.clientId === flowClientId ? existingCredential.clientSecret : undefined;
1720
+ const userClientSecret = found.config.oauth?.clientSecret ?? currentAuth?.clientSecret;
1721
+ const flowClientSecret = userClientSecret ?? storedClientSecret ?? "";
1722
+
1723
+ this.#showMessage(["", theme.fg("muted", `Reauthorizing "${name}"...`), ""].join("\n"));
1724
+
1725
+ const currentAuthResource = currentAuth?.resource ? expandEnvVarsDeep(currentAuth.resource) : undefined;
1726
+ const oauthResource =
1727
+ oauth.resource ?? currentAuthResource ?? ("url" in runtimeBaseConfig ? runtimeBaseConfig.url : undefined);
1728
+ const oauthResourceIsFallback = !oauth.resource && !currentAuthResource;
1729
+
1730
+ const oauthResult = await this.#handleOAuthFlow(
1731
+ oauth.authorizationUrl,
1732
+ oauth.tokenUrl,
1733
+ flowClientId,
1734
+ flowClientSecret,
1735
+ oauth.scopes ?? "",
1736
+ {
1737
+ callbackPort: found.config.oauth?.callbackPort,
1738
+ callbackPath: found.config.oauth?.callbackPath,
1739
+ redirectUri: found.config.oauth?.redirectUri,
1740
+ prompt: found.config.oauth?.prompt,
1741
+ serverUrl,
1742
+ resource: oauthResource,
1743
+ stripSameOriginResource: oauthResourceIsFallback,
1744
+ },
1745
+ );
1746
+
1747
+ // The flow overwrote (or minted) this profile's row; a superseded
1748
+ // pointer row from the legacy random-id era is now orphaned. GC only
1749
+ // after success so cancelling the browser step leaves the previous
1750
+ // session signed in.
1751
+ if (currentAuth?.type === "oauth" && currentAuth.credentialId !== oauthResult.credentialId) {
1752
+ await removeManagedMcpOAuthCredential(authStorage, currentAuth.credentialId);
1753
+ }
1754
+
1755
+ // Definition-only entries resolve through the url-keyed binding alone;
1756
+ // skip the write-back so a committed project mcp.json stays clean.
1757
+ const urlKeyedId = serverUrl ? mcpOAuthCredentialId(serverUrl) : undefined;
1758
+ if (currentAuth || oauthResult.credentialId !== urlKeyedId) {
1759
+ const updated = this.#persistOAuthResult(baseConfig, oauthResult, {
1760
+ tokenUrl: oauth.tokenUrl,
1761
+ clientId: oauth.clientId,
1762
+ userClientSecret,
1763
+ resource: oauthResource,
1764
+ stripSameOriginResource: oauthResourceIsFallback,
1765
+ });
1766
+ await updateMCPServer(found.filePath, name, updated);
1767
+ }
1768
+ await this.#reloadMCP();
1769
+ const state = await this.#waitForServerConnectionWithAnimation(name);
1770
+
1771
+ const lines = [
1772
+ "",
1773
+ theme.fg("success", `✓ Reauthorized "${name}" (${found.scope} config)`),
1774
+ "",
1775
+ ` Status: ${
1776
+ state === "connected"
1777
+ ? theme.fg("success", "connected")
1778
+ : state === "connecting"
1779
+ ? theme.fg("muted", "connecting")
1780
+ : theme.fg("warning", "not connected")
1781
+ }`,
1782
+ "",
1783
+ ];
1784
+ this.#showMessage(lines.join("\n"));
1785
+ } catch (error) {
1786
+ if (error instanceof MCPOAuthCancelledError) {
1787
+ this.ctx.showStatus(`Reauthorization cancelled for "${name}"`);
1788
+ return;
1789
+ }
1790
+ this.ctx.showError(`Failed to reauthorize server: ${error instanceof Error ? error.message : String(error)}`);
1791
+ }
1792
+ }
1793
+
1794
+ async #handleReload(): Promise<void> {
1795
+ try {
1796
+ this.#showMessage(["", theme.fg("muted", "Reloading MCP servers and runtime tools..."), ""].join("\n"));
1797
+ await this.#reloadMCP();
1798
+ const connectedCount = this.ctx.mcpManager?.getConnectedServers().length ?? 0;
1799
+ this.#showMessage(
1800
+ [
1801
+ "",
1802
+ theme.fg("success", `${theme.icon.loop} MCP reload complete`),
1803
+ ` Connected servers: ${connectedCount}`,
1804
+ "",
1805
+ ].join("\n"),
1806
+ );
1807
+ } catch (error) {
1808
+ this.ctx.showError(`Failed to reload MCP: ${error instanceof Error ? error.message : String(error)}`);
1809
+ }
1810
+ }
1811
+
1812
+ /**
1813
+ * Handle /mcp reconnect <name> - Reconnect to a specific server.
1814
+ */
1815
+ async #handleReconnect(name: string | undefined): Promise<void> {
1816
+ if (!name) {
1817
+ this.ctx.showError("Server name required. Usage: /mcp reconnect <name>");
1818
+ return;
1819
+ }
1820
+ if (!this.ctx.mcpManager) {
1821
+ this.ctx.showError("MCP manager not available.");
1822
+ return;
1823
+ }
1824
+
1825
+ this.#showMessage(["", theme.fg("muted", `Reconnecting to "${name}"...`), ""].join("\n"));
1826
+
1827
+ try {
1828
+ const connection = await this.ctx.mcpManager.reconnectServer(name, { manual: true });
1829
+ if (connection) {
1830
+ // refreshMCPTools re-registers tools and preserves the user's prior
1831
+ // MCP tool selection. No need to call activateDiscoveredMCPTools —
1832
+ // that would broaden the selection to all server tools.
1833
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1834
+ const serverTools = this.ctx.mcpManager.getTools().filter(t => t.mcpServerName === name);
1835
+ this.#showMessage(
1836
+ [
1837
+ "\n",
1838
+ theme.fg("success", `${theme.status.enabled} Reconnected to "${name}"`),
1839
+ ` Tools: ${serverTools.length}`,
1840
+ "\n",
1841
+ ].join("\n"),
1842
+ );
1843
+ } else {
1844
+ this.ctx.showError(`Failed to reconnect to "${name}". Check server status and logs.`);
1845
+ }
1846
+ } catch (error) {
1847
+ this.ctx.showError(
1848
+ `Failed to reconnect to "${name}": ${error instanceof Error ? error.message : String(error)}`,
1849
+ );
1850
+ }
1851
+ }
1852
+
1853
+ async #connectEnabledMCPServer(name: string): Promise<void> {
1854
+ if (!this.ctx.mcpManager) {
1855
+ return;
1856
+ }
1857
+
1858
+ const { configs, sources } = await loadAllMCPConfigs(getProjectDir());
1859
+ const config = configs[name];
1860
+ if (!config) {
1861
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1862
+ return;
1863
+ }
1864
+
1865
+ const source = sources[name];
1866
+ const result = await this.ctx.mcpManager.connectServers({ [name]: config }, source ? { [name]: source } : {});
1867
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1868
+ this.#showMCPConnectionErrors(result.errors);
1869
+ }
1870
+
1871
+ #showMCPConnectionErrors(errors: Map<string, string>): void {
1872
+ if (errors.size === 0) {
1873
+ return;
1874
+ }
1875
+
1876
+ const errorLines = ["", theme.fg("warning", "Some servers failed to connect:"), ""];
1877
+ for (const [serverName, error] of errors.entries()) {
1878
+ errorLines.push(` ${serverName}: ${error}`);
1879
+ }
1880
+ errorLines.push("");
1881
+ this.#showMessage(errorLines.join("\n"));
1882
+ }
1883
+
1884
+ /**
1885
+ * Reload MCP manager with new configs
1886
+ */
1887
+ async #reloadMCP(): Promise<void> {
1888
+ if (!this.ctx.mcpManager) {
1889
+ return;
1890
+ }
1891
+
1892
+ // Disconnect all existing servers
1893
+ await this.ctx.mcpManager.disconnectAll();
1894
+
1895
+ // Rediscover and connect
1896
+ const result = await this.ctx.mcpManager.discoverAndConnect();
1897
+ await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1898
+
1899
+ this.#showMCPConnectionErrors(result.errors);
1900
+ }
1901
+
1902
+ /**
1903
+ * Handle /mcp resources - Show available resources from connected servers
1904
+ */
1905
+ async #handleResources(): Promise<void> {
1906
+ if (!this.ctx.mcpManager) {
1907
+ this.ctx.showError("No MCP manager available.");
1908
+ return;
1909
+ }
1910
+
1911
+ const servers = this.ctx.mcpManager.getConnectedServers();
1912
+ const lines: string[] = ["", theme.bold("MCP Resources"), ""];
1913
+ let hasAny = false;
1914
+
1915
+ for (const name of servers) {
1916
+ const data = this.ctx.mcpManager.getServerResources(name);
1917
+ if (!data) continue;
1918
+ const { resources, templates } = data;
1919
+ if (resources.length === 0 && templates.length === 0) continue;
1920
+ hasAny = true;
1921
+
1922
+ lines.push(`${theme.fg("accent", name)}:`);
1923
+ for (const r of resources) {
1924
+ const desc = r.description ? ` ${theme.fg("dim", r.description)}` : "";
1925
+ const mime = r.mimeType ? ` ${theme.fg("dim", `[${r.mimeType}]`)}` : "";
1926
+ lines.push(` ${theme.fg("success", r.uri)}${mime}${desc}`);
1927
+ }
1928
+ if (templates.length > 0) {
1929
+ lines.push(` ${theme.fg("muted", "Templates:")}`);
1930
+ for (const t of templates) {
1931
+ const desc = t.description ? ` ${theme.fg("dim", t.description)}` : "";
1932
+ lines.push(` ${theme.fg("accent", t.uriTemplate)}${desc}`);
1933
+ }
1934
+ }
1935
+ lines.push("");
1936
+ }
1937
+
1938
+ if (!hasAny) {
1939
+ lines.push(theme.fg("muted", "No resources available on connected servers."));
1940
+ lines.push("");
1941
+ }
1942
+ this.#showMessage(lines.join("\n"));
1943
+ }
1944
+
1945
+ /**
1946
+ * Handle /mcp prompts - Show available prompts from connected servers
1947
+ */
1948
+ async #handlePrompts(): Promise<void> {
1949
+ if (!this.ctx.mcpManager) {
1950
+ this.ctx.showError("No MCP manager available.");
1951
+ return;
1952
+ }
1953
+
1954
+ const servers = this.ctx.mcpManager.getConnectedServers();
1955
+ const lines: string[] = ["", theme.bold("MCP Prompts"), ""];
1956
+ let hasAny = false;
1957
+
1958
+ for (const name of servers) {
1959
+ const prompts = this.ctx.mcpManager.getServerPrompts(name);
1960
+ if (!prompts?.length) continue;
1961
+ hasAny = true;
1962
+
1963
+ lines.push(`${theme.fg("accent", name)}:`);
1964
+ for (const p of prompts) {
1965
+ const commandName = `${name}:${p.name}`;
1966
+ const desc = p.description ? ` ${theme.fg("dim", p.description)}` : "";
1967
+ lines.push(` ${theme.fg("success", `/${commandName}`)}${desc}`);
1968
+ if (p.arguments?.length) {
1969
+ for (const arg of p.arguments) {
1970
+ const required = arg.required ? theme.fg("warning", " *") : "";
1971
+ const argDesc = arg.description ? ` - ${arg.description}` : "";
1972
+ lines.push(` ${arg.name}=${required}${theme.fg("dim", argDesc)}`);
1973
+ }
1974
+ }
1975
+ }
1976
+ lines.push("");
1977
+ }
1978
+
1979
+ if (!hasAny) {
1980
+ lines.push(theme.fg("muted", "No prompts available on connected servers."));
1981
+ lines.push("");
1982
+ }
1983
+ this.#showMessage(lines.join("\n"));
1984
+ }
1985
+
1986
+ /**
1987
+ * Handle /mcp notifications - Show notification and subscription state
1988
+ */
1989
+ async #handleNotifications(): Promise<void> {
1990
+ if (!this.ctx.mcpManager) {
1991
+ this.ctx.showError("No MCP manager available.");
1992
+ return;
1993
+ }
1994
+
1995
+ const { enabled, subscriptions } = this.ctx.mcpManager.getNotificationState();
1996
+ const servers = this.ctx.mcpManager.getConnectedServers();
1997
+ const statusIcon = enabled ? theme.fg("success", "enabled") : theme.fg("warning", "disabled");
1998
+ const lines: string[] = ["", theme.bold("MCP Notifications"), ""];
1999
+ lines.push(` Status: ${statusIcon} ${theme.fg("dim", "(mcp.notifications setting)")}`);
2000
+ lines.push("");
2001
+
2002
+ let hasAny = false;
2003
+ for (const name of servers) {
2004
+ const connection = this.ctx.mcpManager.getConnection(name);
2005
+ if (!connection) continue;
2006
+ const caps = connection.capabilities;
2007
+ const supportsResources = caps.resources !== undefined;
2008
+ const supportsSubscribe = caps.resources?.subscribe === true;
2009
+ const supportsToolsChanged = caps.tools?.listChanged === true;
2010
+ const supportsPromptsChanged = caps.prompts?.listChanged === true;
2011
+ const supportsResourcesChanged = caps.resources?.listChanged === true;
2012
+
2013
+ const hasNotifications =
2014
+ supportsToolsChanged || supportsPromptsChanged || supportsResourcesChanged || supportsSubscribe;
2015
+ if (!hasNotifications) continue;
2016
+ hasAny = true;
2017
+
2018
+ lines.push(`${theme.fg("accent", name)}:`);
2019
+ const check = theme.fg("success", "✓");
2020
+ const cross = theme.fg("dim", "✗");
2021
+ if (supportsToolsChanged) lines.push(` ${check} tools/list_changed`);
2022
+ if (supportsResourcesChanged) lines.push(` ${check} resources/list_changed`);
2023
+ if (supportsPromptsChanged) lines.push(` ${check} prompts/list_changed`);
2024
+
2025
+ if (supportsSubscribe) {
2026
+ const subscribedUris = subscriptions.get(name);
2027
+ const subCount = subscribedUris?.size ?? 0;
2028
+ const subStatus =
2029
+ enabled && subCount > 0
2030
+ ? theme.fg("success", `subscribed (${subCount} URI${subCount !== 1 ? "s" : ""})`)
2031
+ : enabled
2032
+ ? theme.fg("muted", "no active subscriptions")
2033
+ : theme.fg("dim", "inactive (notifications disabled)");
2034
+ lines.push(` ${check} resources/subscribe ${subStatus}`);
2035
+ if (enabled && subscribedUris && subscribedUris.size > 0) {
2036
+ for (const uri of subscribedUris) {
2037
+ lines.push(` ${theme.fg("success", "✓")} ${theme.fg("dim", uri)}`);
2038
+ }
2039
+ }
2040
+ } else if (supportsResources) {
2041
+ lines.push(` ${cross} resources/subscribe ${theme.fg("dim", "not supported")}`);
2042
+ }
2043
+ lines.push("");
2044
+ }
2045
+
2046
+ if (!hasAny) {
2047
+ lines.push(theme.fg("muted", "No servers support notifications."));
2048
+ lines.push("");
2049
+ }
2050
+ this.#showMessage(lines.join("\n"));
2051
+ }
2052
+
2053
+ async #validateSmitheryApiKey(apiKey: string): Promise<void> {
2054
+ await searchSmitheryRegistry("mcp", { limit: 1, apiKey });
2055
+ }
2056
+
2057
+ async #promptSmitheryApiKey(promptLabel: string): Promise<string | null> {
2058
+ for (;;) {
2059
+ const input = await this.ctx.showHookInput(promptLabel);
2060
+ if (input === undefined) return null;
2061
+ const apiKey = input.trim();
2062
+ if (!apiKey) {
2063
+ this.ctx.showError("Smithery API key cannot be empty.");
2064
+ continue;
2065
+ }
2066
+ try {
2067
+ await this.#validateSmitheryApiKey(apiKey);
2068
+ return apiKey;
2069
+ } catch (error) {
2070
+ this.ctx.showError(
2071
+ `Smithery API key validation failed: ${error instanceof Error ? error.message : String(error)}`,
2072
+ );
2073
+ }
2074
+ }
2075
+ }
2076
+
2077
+ async #handleSmitheryLoginWithApiKey(): Promise<boolean> {
2078
+ const apiKey = await this.#promptSmitheryApiKey("Smithery API key (Esc to cancel)");
2079
+ if (!apiKey) return false;
2080
+ await saveSmitheryApiKey(apiKey);
2081
+ this.ctx.showStatus("Smithery API key saved.");
2082
+ return true;
2083
+ }
2084
+
2085
+ async #waitForSmitheryCliApiKey(sessionId: string, signal: AbortSignal): Promise<string> {
2086
+ const pollIntervalMs = 2_000;
2087
+ const timeoutMs = 300_000;
2088
+ const startedAt = Date.now();
2089
+
2090
+ while (!signal.aborted) {
2091
+ if (Date.now() - startedAt >= timeoutMs) {
2092
+ throw new Error("Smithery authorization timed out after 5 minutes.");
2093
+ }
2094
+ const response = await pollSmitheryCliAuthSession(sessionId, signal);
2095
+ if (response.status === "success" && response.apiKey) {
2096
+ return response.apiKey;
2097
+ }
2098
+ if (response.status === "error") {
2099
+ throw new Error(response.message ?? "Smithery authorization failed.");
2100
+ }
2101
+ await Bun.sleep(pollIntervalMs);
2102
+ }
2103
+
2104
+ throw new Error("Smithery authorization cancelled.");
2105
+ }
2106
+
2107
+ async #handleSmitheryBrowserLogin(): Promise<boolean> {
2108
+ const session = await createSmitheryCliAuthSession();
2109
+ const fallbackLoginUrl = getSmitheryLoginUrl();
2110
+ this.#showMessage(
2111
+ [
2112
+ "",
2113
+ theme.bold("Smithery Login"),
2114
+ theme.fg("muted", "Browser authorization started. Complete auth in your browser."),
2115
+ theme.fg("dim", "Authorize URL:"),
2116
+ theme.fg("accent", session.authUrl),
2117
+ theme.fg("dim", `Fallback: ${fallbackLoginUrl}`),
2118
+ "",
2119
+ ].join("\n"),
2120
+ );
2121
+ try {
2122
+ openPath(session.authUrl);
2123
+ } catch {
2124
+ // URL is already shown above.
2125
+ }
2126
+
2127
+ const apiKey = await this.#waitForSmitheryCliApiKey(session.sessionId, new AbortController().signal);
2128
+ await this.#validateSmitheryApiKey(apiKey);
2129
+ await saveSmitheryApiKey(apiKey);
2130
+ this.ctx.showStatus("Smithery API key saved.");
2131
+ return true;
2132
+ }
2133
+
2134
+ async #promptSmitheryLogin(reason: string): Promise<boolean> {
2135
+ this.#showMessage(
2136
+ [
2137
+ "",
2138
+ theme.fg("muted", `Smithery authentication required (${reason}).`),
2139
+ theme.fg("muted", "If browser auth fails, you can paste an API key."),
2140
+ "",
2141
+ ].join("\n"),
2142
+ );
2143
+ try {
2144
+ return await this.#handleSmitheryBrowserLogin();
2145
+ } catch (error) {
2146
+ this.ctx.showWarning(
2147
+ `Browser authorization failed: ${error instanceof Error ? error.message : String(error)}. Falling back to API key.`,
2148
+ );
2149
+ return await this.#handleSmitheryLoginWithApiKey();
2150
+ }
2151
+ }
2152
+
2153
+ #getSmitheryErrorStatus(error: unknown): number | undefined {
2154
+ if (error instanceof SmitheryRegistryError || error instanceof SmitheryConnectError) {
2155
+ return error.status;
2156
+ }
2157
+ return undefined;
2158
+ }
2159
+
2160
+ #toSmitheryAuthReason(status: number): string {
2161
+ return status === 429 ? "rate limited by Smithery" : "forbidden/unauthorized with Smithery";
2162
+ }
2163
+
2164
+ async #requireSmitheryApiKey(reason: string): Promise<string> {
2165
+ let apiKey = await getSmitheryApiKey();
2166
+ if (apiKey) return apiKey;
2167
+
2168
+ const loggedIn = await this.#promptSmitheryLogin(reason);
2169
+ if (!loggedIn) {
2170
+ throw new Error("Smithery login cancelled. Run /mcp smithery-login, then retry /mcp smithery-search.");
2171
+ }
2172
+
2173
+ apiKey = await getSmitheryApiKey();
2174
+ if (!apiKey) {
2175
+ throw new Error("Smithery API key not found after login.");
2176
+ }
2177
+ return apiKey;
2178
+ }
2179
+
2180
+ async #runSmitheryOperationWithAuthRetry<T>(operation: (apiKey: string) => Promise<T>, reason: string): Promise<T> {
2181
+ const apiKey = await this.#requireSmitheryApiKey(reason);
2182
+ try {
2183
+ return await operation(apiKey);
2184
+ } catch (error) {
2185
+ const status = this.#getSmitheryErrorStatus(error);
2186
+ if (status === undefined || ![401, 403, 429].includes(status)) {
2187
+ throw error;
2188
+ }
2189
+ const loggedIn = await this.#promptSmitheryLogin(this.#toSmitheryAuthReason(status));
2190
+ if (!loggedIn) {
2191
+ throw error;
2192
+ }
2193
+ const retryApiKey = await this.#requireSmitheryApiKey(reason);
2194
+ return await operation(retryApiKey);
2195
+ }
2196
+ }
2197
+
2198
+ async #handleSmitheryLogin(): Promise<void> {
2199
+ const ok = await this.#promptSmitheryLogin("login");
2200
+ if (!ok) {
2201
+ this.ctx.showStatus("Smithery login cancelled.");
2202
+ }
2203
+ }
2204
+
2205
+ async #handleSmitheryLogout(): Promise<void> {
2206
+ const removed = await clearSmitheryApiKey();
2207
+ this.ctx.showStatus(removed ? "Smithery API key removed." : "No cached Smithery API key found.");
2208
+ }
2209
+
2210
+ async #nextAvailableServerName(scope: MCPAddScope, baseName: string): Promise<string> {
2211
+ const filePath = getMCPConfigPath(scope, getProjectDir());
2212
+ const config = await readMCPConfigFile(filePath);
2213
+ const existingNames = new Set(Object.keys(config.mcpServers ?? {}));
2214
+ if (!existingNames.has(baseName)) return baseName;
2215
+ for (let i = 2; i <= 999; i++) {
2216
+ const candidate = `${baseName}-${i}`;
2217
+ if (!existingNames.has(candidate)) return candidate;
2218
+ }
2219
+ return `${baseName}-${Date.now()}`;
2220
+ }
2221
+
2222
+ async #promptDeploymentServerName(scope: MCPAddScope, defaultName: string): Promise<string | null> {
2223
+ for (;;) {
2224
+ const input = await this.ctx.showHookInput(`Server name for deploy (default: ${defaultName})`, defaultName);
2225
+ if (input === undefined) return null;
2226
+ const proposed = input.trim() || defaultName;
2227
+ if (!proposed) {
2228
+ this.ctx.showError("Server name cannot be empty.");
2229
+ continue;
2230
+ }
2231
+ const filePath = getMCPConfigPath(scope, getProjectDir());
2232
+ const config = await readMCPConfigFile(filePath);
2233
+ if (config.mcpServers?.[proposed]) {
2234
+ this.ctx.showError(`Server "${proposed}" already exists in ${scope} config.`);
2235
+ continue;
2236
+ }
2237
+ return proposed;
2238
+ }
2239
+ }
2240
+
2241
+ async #promptRequiredRegistryInputs(result: SmitherySearchResult): Promise<Record<string, string> | null> {
2242
+ const values: Record<string, string> = {};
2243
+ for (const input of result.requiredInputs) {
2244
+ const label = input.required ? `${input.key} (required)` : `${input.key} (optional)`;
2245
+ const prompt = `${label}${input.description ? ` - ${input.description}` : ""}`;
2246
+ const userInput = await this.ctx.showHookInput(prompt, input.defaultValue);
2247
+ if (userInput === undefined) {
2248
+ if (input.required) return null;
2249
+ continue;
2250
+ }
2251
+ const value = userInput.trim();
2252
+ if (!value) {
2253
+ if (input.required) {
2254
+ this.ctx.showError(`Missing required value for "${input.key}".`);
2255
+ return null;
2256
+ }
2257
+ continue;
2258
+ }
2259
+ values[input.key] = value;
2260
+ }
2261
+ return values;
2262
+ }
2263
+
2264
+ #applyRegistryInputOverrides(config: MCPServerConfig, values: Record<string, string>): MCPServerConfig {
2265
+ if (Object.keys(values).length === 0) return config;
2266
+ if (config.type !== "stdio") {
2267
+ return config;
2268
+ }
2269
+ const args = [...(config.args ?? [])];
2270
+ const configJson = JSON.stringify(values);
2271
+ const index = args.indexOf("--config");
2272
+ if (index >= 0) {
2273
+ if (index + 1 < args.length) {
2274
+ args[index + 1] = configJson;
2275
+ } else {
2276
+ args.push(configJson);
2277
+ }
2278
+ } else {
2279
+ args.push("--config", configJson);
2280
+ }
2281
+ return { ...config, args };
2282
+ }
2283
+
2284
+ async #pickRegistryResult(results: SmitherySearchResult[], keyword: string): Promise<SmitherySearchResult | null> {
2285
+ const options = results.map((result, index) => {
2286
+ const label = `${index + 1}. ${result.display.displayName} (${result.display.transport}, uses ${result.display.useCount})`;
2287
+ return label.length > 120 ? `${label.slice(0, 117)}...` : label;
2288
+ });
2289
+ const selected = await this.ctx.showHookSelector(`Registry results for "${keyword}"`, options);
2290
+ if (!selected) return null;
2291
+ const prefix = selected.split(".", 1)[0];
2292
+ const index = Number(prefix) - 1;
2293
+ if (!Number.isInteger(index) || index < 0 || index >= results.length) return null;
2294
+ return results[index] ?? null;
2295
+ }
2296
+
2297
+ async #deployRegistryResult(result: SmitherySearchResult, scope: MCPAddScope): Promise<void> {
2298
+ const baseName = toConfigName(result.name);
2299
+ const defaultName = await this.#nextAvailableServerName(scope, baseName);
2300
+ const serverName = await this.#promptDeploymentServerName(scope, defaultName);
2301
+ if (!serverName) {
2302
+ this.ctx.showStatus("MCP deploy cancelled.");
2303
+ return;
2304
+ }
2305
+ const inputValues = await this.#promptRequiredRegistryInputs(result);
2306
+ if (inputValues === null) {
2307
+ this.ctx.showStatus("MCP deploy cancelled.");
2308
+ return;
2309
+ }
2310
+ const config = this.#applyRegistryInputOverrides(result.config, inputValues);
2311
+ await this.#handleWizardComplete(serverName, config, scope);
2312
+ }
2313
+
2314
+ async #handleSearch(text: string): Promise<void> {
2315
+ const parsed = this.#parseSearchCommand(text);
2316
+ if (parsed.error) {
2317
+ this.ctx.showError(parsed.error);
2318
+ return;
2319
+ }
2320
+
2321
+ try {
2322
+ this.#showMessage(
2323
+ ["", theme.fg("muted", `Searching Smithery registry for "${parsed.keyword}"...`), ""].join("\n"),
2324
+ );
2325
+ const results = await this.#runSmitheryOperationWithAuthRetry(
2326
+ apiKey =>
2327
+ searchSmitheryRegistry(parsed.keyword, {
2328
+ limit: parsed.limit,
2329
+ apiKey,
2330
+ includeSemantic: parsed.semantic,
2331
+ }),
2332
+ "required for smithery-search",
2333
+ );
2334
+ if (results.length === 0) {
2335
+ this.#showMessage(
2336
+ ["", theme.fg("warning", `No Smithery results found for "${parsed.keyword}".`), ""].join("\n"),
2337
+ );
2338
+ return;
2339
+ }
2340
+
2341
+ const selected = await this.#pickRegistryResult(results, parsed.keyword);
2342
+ if (!selected) {
2343
+ this.ctx.showStatus("MCP Smithery selection cancelled.");
2344
+ return;
2345
+ }
2346
+
2347
+ await this.#deployRegistryResult(selected, parsed.scope);
2348
+ } catch (error) {
2349
+ const message = error instanceof Error ? error.message : String(error);
2350
+ if (/authentication was cancelled|login cancelled/i.test(message)) {
2351
+ this.ctx.showError(`${message} Run /mcp smithery-login to authenticate first.`);
2352
+ return;
2353
+ }
2354
+ this.ctx.showError(`Smithery search failed: ${message}`);
2355
+ }
2356
+ }
2357
+
2358
+ /**
2359
+ * Show a message in the chat
2360
+ */
2361
+ #showMessage(text: string): void {
2362
+ showCommandMessage(this.ctx, text);
2363
+ }
2364
+ }