@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,2539 @@
1
+ import * as fs from "node:fs";
2
+ import path from "node:path";
3
+ import type {
4
+ AgentTool,
5
+ AgentToolContext,
6
+ AgentToolResult,
7
+ AgentToolUpdateCallback,
8
+ ToolApprovalDecision,
9
+ } from "@oh-my-pi-zen/pi-agent-core";
10
+ import { logger, once, prompt, untilAborted } from "@oh-my-pi-zen/pi-utils";
11
+ import type { BunFile } from "bun";
12
+ import { type Theme, theme } from "../modes/theme/theme";
13
+ import lspDescription from "../prompts/tools/lsp.md" with { type: "text" };
14
+ import type { ToolSession } from "../tools";
15
+ import { truncateForPrompt } from "../tools/approval";
16
+ import { formatPathRelativeToCwd, resolveToCwd } from "../tools/path-utils";
17
+ import { ToolAbortError, ToolError, throwIfAborted } from "../tools/tool-errors";
18
+ import { clampTimeout } from "../tools/tool-timeouts";
19
+ import {
20
+ ensureFileOpen,
21
+ getActiveClients,
22
+ getOrCreateClient,
23
+ type LspServerStatus,
24
+ notifySaved,
25
+ refreshFile,
26
+ sendNotification,
27
+ sendRequest,
28
+ setIdleTimeout,
29
+ syncContent,
30
+ WARMUP_TIMEOUT_MS,
31
+ waitForProjectLoaded,
32
+ } from "./client";
33
+ import { getLinterClient } from "./clients";
34
+ import { getServersForFile, hasRootMarkerAncestor, type LspConfig, loadConfig } from "./config";
35
+ import {
36
+ applyTextEdits,
37
+ applyTextEditsToString,
38
+ applyWorkspaceEdit,
39
+ flattenWorkspaceTextEdits,
40
+ rangesOverlap,
41
+ } from "./edits";
42
+ import { resolveFormatOptions } from "./format-options";
43
+ import { detectLspmux } from "./lspmux";
44
+ import {
45
+ type CodeAction,
46
+ type CodeActionContext,
47
+ type Command,
48
+ type Diagnostic,
49
+ type DocumentSymbol,
50
+ type Hover,
51
+ type Location,
52
+ type LocationLink,
53
+ type LspClient,
54
+ type LspParams,
55
+ type LspToolDetails,
56
+ lspSchema,
57
+ type Position,
58
+ type PublishedDiagnostics,
59
+ type ServerConfig,
60
+ type SymbolInformation,
61
+ type TextEdit,
62
+ type WorkspaceEdit,
63
+ } from "./types";
64
+ import {
65
+ applyCodeAction,
66
+ dedupeWorkspaceSymbols,
67
+ extractHoverText,
68
+ fileToUri,
69
+ filterWorkspaceSymbols,
70
+ formatCodeAction,
71
+ formatDiagnostic,
72
+ formatDiagnosticsSummary,
73
+ formatDocumentSymbol,
74
+ formatGroupedDiagnosticMessages,
75
+ formatLocation,
76
+ formatSymbolInformation,
77
+ formatWorkspaceEdit,
78
+ readLocationContext,
79
+ resolveDiagnosticTargets,
80
+ resolveSymbolColumn,
81
+ sortDiagnostics,
82
+ summarizeDiagnosticMessages,
83
+ symbolKindToIcon,
84
+ uriToFile,
85
+ } from "./utils";
86
+
87
+ export type { LspServerStatus } from "./client";
88
+ export type { LspToolDetails } from "./types";
89
+
90
+ /**
91
+ * LSP actions that do not mutate the workspace or language-server state.
92
+ * Anything not in this set (rename, code_actions with apply, rename_file,
93
+ * reload, raw request, etc.) is classified as write-tier.
94
+ */
95
+ export const LSP_READONLY_ACTIONS: ReadonlySet<string> = new Set([
96
+ "diagnostics",
97
+ "definition",
98
+ "type_definition",
99
+ "implementation",
100
+ "references",
101
+ "hover",
102
+ "symbols",
103
+ "status",
104
+ "capabilities",
105
+ ]);
106
+
107
+ export interface LspStartupServerInfo {
108
+ name: string;
109
+ status: "connecting" | "ready" | "error" | "available";
110
+ fileTypes: string[];
111
+ error?: string;
112
+ }
113
+
114
+ /** Result from warming up LSP servers */
115
+ export interface LspWarmupResult {
116
+ servers: Array<LspStartupServerInfo & { status: "ready" | "error" }>;
117
+ }
118
+
119
+ /** Options for warming up LSP servers */
120
+ export interface LspWarmupOptions {
121
+ /** Called when starting to connect to servers */
122
+ onConnecting?: (serverNames: string[]) => void;
123
+ }
124
+
125
+ export function discoverStartupLspServers(
126
+ cwd: string,
127
+ status: LspStartupServerInfo["status"] = "connecting",
128
+ ): LspStartupServerInfo[] {
129
+ const config = loadConfig(cwd);
130
+ return getLspServers(config).map(([name, serverConfig]) => ({
131
+ name,
132
+ status,
133
+ fileTypes: serverConfig.fileTypes,
134
+ }));
135
+ }
136
+
137
+ /**
138
+ * Warm up LSP servers for a directory by connecting to all detected servers.
139
+ * This should be called at startup to avoid cold-start delays.
140
+ *
141
+ * @param cwd - Working directory to detect and start servers for
142
+ * @param options - Optional callbacks for progress reporting
143
+ * @returns Status of each server that was started
144
+ */
145
+ export async function warmupLspServers(cwd: string, options?: LspWarmupOptions): Promise<LspWarmupResult> {
146
+ const config = loadConfig(cwd);
147
+ setIdleTimeout(config.idleTimeoutMs);
148
+ const servers: LspWarmupResult["servers"] = [];
149
+ const lspServers = getLspServers(config);
150
+
151
+ // Notify caller which servers we're connecting to
152
+ if (lspServers.length > 0 && options?.onConnecting) {
153
+ options.onConnecting(lspServers.map(([name]) => name));
154
+ }
155
+
156
+ // Start all detected servers in parallel with a short timeout
157
+ // Servers that don't respond quickly will be initialized lazily on first use
158
+ const results = await Promise.allSettled(
159
+ lspServers.map(async ([name, serverConfig]) => {
160
+ const client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);
161
+ return { name, client, fileTypes: serverConfig.fileTypes };
162
+ }),
163
+ );
164
+
165
+ for (let i = 0; i < results.length; i++) {
166
+ const result = results[i];
167
+ const [name, serverConfig] = lspServers[i];
168
+ if (result.status === "fulfilled") {
169
+ servers.push({
170
+ name: result.value.name,
171
+ status: "ready",
172
+ fileTypes: result.value.fileTypes,
173
+ });
174
+ } else {
175
+ const errorMsg = result.reason?.message ?? String(result.reason);
176
+ logger.warn("LSP server failed to start", { server: name, error: errorMsg });
177
+ servers.push({
178
+ name,
179
+ status: "error",
180
+ fileTypes: serverConfig.fileTypes,
181
+ error: errorMsg,
182
+ });
183
+ }
184
+ }
185
+
186
+ return { servers };
187
+ }
188
+
189
+ /**
190
+ * Get status of currently active LSP servers.
191
+ */
192
+ export function getLspStatus(): LspServerStatus[] {
193
+ return getActiveClients();
194
+ }
195
+
196
+ /**
197
+ * Sync in-memory file content to all applicable LSP servers.
198
+ * Sends didOpen (if new) or didChange (if already open).
199
+ *
200
+ * @param absolutePath - Absolute path to the file
201
+ * @param content - The new file content
202
+ * @param cwd - Working directory for LSP config resolution
203
+ * @param servers - Servers to sync to
204
+ */
205
+ async function syncFileContent(
206
+ absolutePath: string,
207
+ content: string,
208
+ cwd: string,
209
+ servers: Array<[string, ServerConfig]>,
210
+ signal?: AbortSignal,
211
+ ): Promise<void> {
212
+ throwIfAborted(signal);
213
+ await Promise.allSettled(
214
+ servers.map(async ([_serverName, serverConfig]) => {
215
+ throwIfAborted(signal);
216
+ if (serverConfig.createClient) {
217
+ return;
218
+ }
219
+ const client = await getOrCreateClient(serverConfig, cwd, undefined, signal);
220
+ throwIfAborted(signal);
221
+ await syncContent(client, absolutePath, content, signal);
222
+ }),
223
+ );
224
+ }
225
+
226
+ /**
227
+ * Notify all LSP servers that a file was saved.
228
+ * Assumes content was already synced via syncFileContent.
229
+ *
230
+ * @param absolutePath - Absolute path to the file
231
+ * @param cwd - Working directory for LSP config resolution
232
+ * @param servers - Servers to notify
233
+ */
234
+ async function notifyFileSaved(
235
+ absolutePath: string,
236
+ cwd: string,
237
+ servers: Array<[string, ServerConfig]>,
238
+ signal?: AbortSignal,
239
+ ): Promise<void> {
240
+ throwIfAborted(signal);
241
+ await Promise.allSettled(
242
+ servers.map(async ([_serverName, serverConfig]) => {
243
+ throwIfAborted(signal);
244
+ if (serverConfig.createClient) {
245
+ return;
246
+ }
247
+ const client = await getOrCreateClient(serverConfig, cwd, undefined, signal);
248
+ await notifySaved(client, absolutePath, signal);
249
+ }),
250
+ );
251
+ }
252
+
253
+ // Cache config per cwd to avoid repeated file I/O
254
+ const configCache = new Map<string, LspConfig>();
255
+
256
+ function getConfig(cwd: string): LspConfig {
257
+ let config = configCache.get(cwd);
258
+ if (!config) {
259
+ config = loadConfig(cwd);
260
+ setIdleTimeout(config.idleTimeoutMs);
261
+ configCache.set(cwd, config);
262
+ }
263
+ return config;
264
+ }
265
+
266
+ function isCustomLinter(serverConfig: ServerConfig): boolean {
267
+ return Boolean(serverConfig.createClient);
268
+ }
269
+
270
+ function splitServers(servers: Array<[string, ServerConfig]>): {
271
+ lspServers: Array<[string, ServerConfig]>;
272
+ customLinterServers: Array<[string, ServerConfig]>;
273
+ } {
274
+ const lspServers: Array<[string, ServerConfig]> = [];
275
+ const customLinterServers: Array<[string, ServerConfig]> = [];
276
+ for (const entry of servers) {
277
+ if (isCustomLinter(entry[1])) {
278
+ customLinterServers.push(entry);
279
+ } else {
280
+ lspServers.push(entry);
281
+ }
282
+ }
283
+ return { lspServers, customLinterServers };
284
+ }
285
+
286
+ function getLspServers(config: LspConfig): Array<[string, ServerConfig]> {
287
+ return (Object.entries(config.servers) as Array<[string, ServerConfig]>).filter(
288
+ ([, serverConfig]) => !isCustomLinter(serverConfig),
289
+ );
290
+ }
291
+
292
+ function getLspServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {
293
+ return getServersForFile(config, filePath).filter(([, serverConfig]) => !isCustomLinter(serverConfig));
294
+ }
295
+
296
+ function getLspServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {
297
+ const servers = getLspServersForFile(config, filePath);
298
+ return servers.length > 0 ? servers[0] : null;
299
+ }
300
+
301
+ function isProjectAwareLspServer(serverConfig: ServerConfig): boolean {
302
+ return !serverConfig.createClient && !serverConfig.isLinter;
303
+ }
304
+
305
+ const DIAGNOSTIC_MESSAGE_LIMIT = 50;
306
+ const SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;
307
+ const BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;
308
+ const DIAGNOSTICS_POLL_MS = 100;
309
+ const DIAGNOSTICS_SETTLE_MS = 250;
310
+ /**
311
+ * How long the edit/write writethrough blocks inline waiting for fresh
312
+ * diagnostics before handing slow servers off to the deferred late-injection
313
+ * channel. Keeps the common fast-server case inline while letting an edit
314
+ * return promptly when a server (e.g. a large-monorepo tsserver) is slow to
315
+ * publish fresh diagnostics.
316
+ */
317
+ const INLINE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 500;
318
+ /**
319
+ * Inner per-server diagnostics wait budget for the background/deferred fetch.
320
+ * Longer than the inline cap (and the old 3s default) so a slow server still
321
+ * delivers late instead of giving up before it ever publishes.
322
+ */
323
+ const DEFERRED_DIAGNOSTICS_WAIT_TIMEOUT_MS = 12_000;
324
+ const MAX_GLOB_DIAGNOSTIC_TARGETS = 20;
325
+ const WORKSPACE_SYMBOL_LIMIT = 200;
326
+ const PROJECT_INDEXED_ACTIONS: ReadonlySet<string> = new Set([
327
+ "definition",
328
+ "type_definition",
329
+ "implementation",
330
+ "references",
331
+ "rename",
332
+ "hover",
333
+ ]);
334
+
335
+ const RUST_WORKSPACE_MARKERS = ["Cargo.toml", "rust-analyzer.toml"] as const;
336
+
337
+ function hasRustWorkspaceAncestor(filePath: string): boolean {
338
+ let dir = path.dirname(filePath);
339
+ while (true) {
340
+ for (const marker of RUST_WORKSPACE_MARKERS) {
341
+ if (fs.existsSync(path.join(dir, marker))) {
342
+ return true;
343
+ }
344
+ }
345
+ const parent = path.dirname(dir);
346
+ if (parent === dir) {
347
+ return false;
348
+ }
349
+ dir = parent;
350
+ }
351
+ }
352
+
353
+ function limitDiagnosticMessages(messages: string[]): string[] {
354
+ if (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {
355
+ return messages;
356
+ }
357
+ return messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);
358
+ }
359
+
360
+ const ORPHAN_TYPESCRIPT_PROJECT_DIAGNOSTIC_CODES: Record<number, true> = {
361
+ 1375: true,
362
+ 1378: true,
363
+ 2307: true,
364
+ 2580: true,
365
+ 2591: true,
366
+ 2792: true,
367
+ 2867: true,
368
+ };
369
+
370
+ function diagnosticCodeNumber(diagnostic: Diagnostic): number | null {
371
+ if (typeof diagnostic.code === "number") return diagnostic.code;
372
+ if (typeof diagnostic.code === "string" && /^\d+$/.test(diagnostic.code)) return Number(diagnostic.code);
373
+ return null;
374
+ }
375
+ function isTypeScriptProjectDiagnostic(serverName: string, diagnostic: Diagnostic): boolean {
376
+ if (diagnostic.source !== "typescript" && !serverName.toLowerCase().includes("typescript")) {
377
+ return false;
378
+ }
379
+ const code = diagnosticCodeNumber(diagnostic);
380
+ return code !== null && ORPHAN_TYPESCRIPT_PROJECT_DIAGNOSTIC_CODES[code] === true;
381
+ }
382
+
383
+ function filterOrphanProjectDiagnostics(
384
+ absolutePath: string,
385
+ serverName: string,
386
+ serverConfig: ServerConfig,
387
+ diagnostics: Diagnostic[],
388
+ ): Diagnostic[] {
389
+ if (!serverConfig.rootMarkers.length || hasRootMarkerAncestor(absolutePath, serverConfig.rootMarkers)) {
390
+ return diagnostics;
391
+ }
392
+ return diagnostics.filter(diagnostic => !isTypeScriptProjectDiagnostic(serverName, diagnostic));
393
+ }
394
+
395
+ const LOCATION_CONTEXT_LINES = 1;
396
+ const REFERENCE_CONTEXT_LIMIT = 50;
397
+
398
+ const REFERENCES_RETRY_COUNT = 2;
399
+ const REFERENCES_RETRY_DELAY_MS = 250;
400
+
401
+ function comparePosition(a: Position, b: Position): number {
402
+ return a.line === b.line ? a.character - b.character : a.line - b.line;
403
+ }
404
+
405
+ function rangeContainsPosition(range: Location["range"], position: Position): boolean {
406
+ return comparePosition(range.start, position) <= 0 && comparePosition(position, range.end) <= 0;
407
+ }
408
+
409
+ function isOnlyQueriedDeclaration(locations: Location[], uri: string, position: Position): boolean {
410
+ return locations.length === 1 && locations[0]?.uri === uri && rangeContainsPosition(locations[0].range, position);
411
+ }
412
+
413
+ function normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {
414
+ if (!result) return [];
415
+ const raw = Array.isArray(result) ? result : [result];
416
+ return raw.flatMap(loc => {
417
+ if ("uri" in loc) {
418
+ return [loc as Location];
419
+ }
420
+ if ("targetUri" in loc) {
421
+ const link = loc as LocationLink;
422
+ return [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];
423
+ }
424
+ return [];
425
+ });
426
+ }
427
+
428
+ async function formatLocationWithContext(location: Location, cwd: string): Promise<string> {
429
+ const header = ` ${formatLocation(location, cwd)}`;
430
+ const context = await readLocationContext(
431
+ uriToFile(location.uri),
432
+ location.range.start.line + 1,
433
+ LOCATION_CONTEXT_LINES,
434
+ );
435
+ if (context.length === 0) {
436
+ return header;
437
+ }
438
+ return `${header}\n${context.map(lineText => ` ${lineText}`).join("\n")}`;
439
+ }
440
+
441
+ const MAX_RENAME_PAIRS = 1000;
442
+
443
+ interface FileRenamePair {
444
+ oldUri: string;
445
+ newUri: string;
446
+ }
447
+
448
+ /**
449
+ * Enumerate the {oldUri, newUri} pairs needed for an LSP willRenameFiles/didRenameFiles request.
450
+ * For files this is a single pair. For directories this walks every regular file underneath
451
+ * and produces a parallel pair anchored at the new directory root.
452
+ */
453
+ async function enumerateRenamePairs(
454
+ source: string,
455
+ dest: string,
456
+ ): Promise<{ pairs: FileRenamePair[]; directory: boolean; exceeded: boolean }> {
457
+ const stat = await fs.promises.stat(source);
458
+ if (!stat.isDirectory()) {
459
+ return {
460
+ pairs: [{ oldUri: fileToUri(source), newUri: fileToUri(dest) }],
461
+ directory: false,
462
+ exceeded: false,
463
+ };
464
+ }
465
+ const entries = await fs.promises.readdir(source, { recursive: true, withFileTypes: true });
466
+ const pairs: FileRenamePair[] = [];
467
+ for (const entry of entries) {
468
+ if (!entry.isFile()) continue;
469
+ if (pairs.length >= MAX_RENAME_PAIRS) {
470
+ return { pairs, directory: true, exceeded: true };
471
+ }
472
+ const parent = entry.parentPath ?? source;
473
+ const absOld = path.join(parent, entry.name);
474
+ const rel = path.relative(source, absOld);
475
+ pairs.push({
476
+ oldUri: fileToUri(absOld),
477
+ newUri: fileToUri(path.join(dest, rel)),
478
+ });
479
+ }
480
+ return { pairs, directory: true, exceeded: false };
481
+ }
482
+
483
+ /** True when an LSP error indicates the server doesn't implement the requested method. */
484
+ function isMethodNotFoundError(err: unknown): boolean {
485
+ if (!(err instanceof Error)) return false;
486
+ const msg = err.message.toLowerCase();
487
+ return (
488
+ msg.includes("method not found") ||
489
+ msg.includes("unhandled method") ||
490
+ msg.includes("not supported") ||
491
+ msg.includes("-32601")
492
+ );
493
+ }
494
+
495
+ async function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {
496
+ // rust-analyzer exposes a real reload request.
497
+ try {
498
+ await sendRequest(client, "rust-analyzer/reloadWorkspace", null, signal);
499
+ return `Reloaded ${serverName}`;
500
+ } catch {
501
+ // Method not supported — fall through.
502
+ }
503
+ // workspace/didChangeConfiguration is a notification per spec; sending it
504
+ // as a request hangs until the tool deadline on servers that route it to
505
+ // the notification handler and never respond.
506
+ try {
507
+ await sendNotification(client, "workspace/didChangeConfiguration", { settings: {} }, signal);
508
+ return `Reloaded ${serverName}`;
509
+ } catch {
510
+ client.proc.kill();
511
+ return `Restarted ${serverName}`;
512
+ }
513
+ }
514
+
515
+ interface WaitForDiagnosticsOptions {
516
+ timeoutMs?: number;
517
+ signal?: AbortSignal;
518
+ minVersion?: number;
519
+ expectedDocumentVersion?: number;
520
+ /**
521
+ * Quiescence window (ms). typescript-language-server never echoes the document
522
+ * version (issue #983) and emits diagnostics from several sources at different
523
+ * times, so there is no single "complete, version-matched" publish to gate on.
524
+ * When the server does not exact-version-match, accept the latest publish only
525
+ * after no newer one has arrived for this long, letting an in-flight pre-edit
526
+ * publish be superseded by the fresh one.
527
+ */
528
+ settleMs?: number;
529
+ }
530
+
531
+ async function waitForDiagnostics(
532
+ client: LspClient,
533
+ uri: string,
534
+ options: WaitForDiagnosticsOptions = {},
535
+ ): Promise<Diagnostic[]> {
536
+ const { timeoutMs = 3000, signal, minVersion, expectedDocumentVersion, settleMs = DIAGNOSTICS_SETTLE_MS } = options;
537
+ const start = Date.now();
538
+ let settledRef: PublishedDiagnostics | undefined;
539
+ let settledAt = 0;
540
+ while (Date.now() - start < timeoutMs) {
541
+ throwIfAborted(signal);
542
+ const versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;
543
+ const published = client.diagnostics.get(uri);
544
+ if (published && versionOk) {
545
+ // Server honored our exact document version → authoritative, accept now.
546
+ if (expectedDocumentVersion !== undefined && published.version === expectedDocumentVersion) {
547
+ return published.diagnostics;
548
+ }
549
+ // Unversioned/mismatched publish: wait for the stream to go quiet so an
550
+ // in-flight publish for the pre-edit content is superseded by the fresh one.
551
+ if (published !== settledRef) {
552
+ settledRef = published;
553
+ settledAt = Date.now();
554
+ } else if (Date.now() - settledAt >= settleMs) {
555
+ return published.diagnostics;
556
+ }
557
+ }
558
+ await Bun.sleep(DIAGNOSTICS_POLL_MS);
559
+ }
560
+ const versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;
561
+ if (!versionOk) {
562
+ return [];
563
+ }
564
+ return client.diagnostics.get(uri)?.diagnostics ?? [];
565
+ }
566
+
567
+ /** Project type detection result */
568
+ interface ProjectType {
569
+ type: "rust" | "typescript" | "go" | "python" | "unknown";
570
+ command?: string[];
571
+ description: string;
572
+ }
573
+
574
+ /** Detect project type from root markers */
575
+ function detectProjectType(cwd: string): ProjectType {
576
+ // Check for Rust (Cargo.toml)
577
+ if (fs.existsSync(path.join(cwd, "Cargo.toml"))) {
578
+ return { type: "rust", command: ["cargo", "check", "--message-format=short"], description: "Rust (cargo check)" };
579
+ }
580
+
581
+ // Check for TypeScript (tsconfig.json)
582
+ if (fs.existsSync(path.join(cwd, "tsconfig.json"))) {
583
+ return { type: "typescript", command: ["npx", "tsc", "--noEmit"], description: "TypeScript (tsc --noEmit)" };
584
+ }
585
+
586
+ // Check for Go (go.mod)
587
+ if (fs.existsSync(path.join(cwd, "go.mod"))) {
588
+ return { type: "go", command: ["go", "build", "./..."], description: "Go (go build)" };
589
+ }
590
+
591
+ // Check for Python (pyproject.toml or pyrightconfig.json)
592
+ if (fs.existsSync(path.join(cwd, "pyproject.toml")) || fs.existsSync(path.join(cwd, "pyrightconfig.json"))) {
593
+ return { type: "python", command: ["pyright"], description: "Python (pyright)" };
594
+ }
595
+
596
+ return { type: "unknown", description: "Unknown project type" };
597
+ }
598
+
599
+ /** Run workspace diagnostics command and parse output */
600
+ async function runWorkspaceDiagnostics(
601
+ cwd: string,
602
+ signal?: AbortSignal,
603
+ ): Promise<{ output: string; projectType: ProjectType }> {
604
+ throwIfAborted(signal);
605
+ const projectType = detectProjectType(cwd);
606
+ if (!projectType.command) {
607
+ return {
608
+ output: `Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)`,
609
+ projectType,
610
+ };
611
+ }
612
+ const proc = Bun.spawn(projectType.command, {
613
+ cwd,
614
+ stdout: "pipe",
615
+ stderr: "pipe",
616
+ windowsHide: true,
617
+ });
618
+ const abortHandler = () => {
619
+ proc.kill();
620
+ };
621
+ if (signal) {
622
+ signal.addEventListener("abort", abortHandler, { once: true });
623
+ }
624
+
625
+ try {
626
+ const [stdout, stderr] = await Promise.all([new Response(proc.stdout).text(), new Response(proc.stderr).text()]);
627
+ await proc.exited;
628
+ throwIfAborted(signal);
629
+ const combined = (stdout + stderr).trim();
630
+ if (!combined) {
631
+ return { output: "No issues found", projectType };
632
+ }
633
+ // Limit output length
634
+ const lines = combined.split("\n");
635
+ if (lines.length > 50) {
636
+ return { output: `${lines.slice(0, 50).join("\n")}\n[…${lines.length - 50}ln elided…]`, projectType };
637
+ }
638
+ return { output: combined, projectType };
639
+ } catch (e) {
640
+ if (signal?.aborted) {
641
+ throw new ToolAbortError();
642
+ }
643
+ return { output: `Failed to run ${projectType.command.join(" ")}: ${e}`, projectType };
644
+ } finally {
645
+ signal?.removeEventListener("abort", abortHandler);
646
+ }
647
+ }
648
+
649
+ /** Result from getDiagnosticsForFile */
650
+ export interface FileDiagnosticsResult {
651
+ /** Name of the LSP server used (if available) */
652
+ server?: string;
653
+ /** Formatted diagnostic messages */
654
+ messages: string[];
655
+ /** Summary string (e.g., "2 error(s), 1 warning(s)") */
656
+ summary: string;
657
+ /** Whether there are any errors (severity 1) */
658
+ errored: boolean;
659
+ /** Whether the file was formatted */
660
+ formatter?: FileFormatResult;
661
+ }
662
+
663
+ type ServerVersionMap = Map<string, number>;
664
+
665
+ interface GetDiagnosticsForFileOptions {
666
+ signal?: AbortSignal;
667
+ minVersions?: ServerVersionMap;
668
+ expectedDocumentVersions?: ServerVersionMap;
669
+ /** Per-server wait budget (ms). Defaults to {@link SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS}. */
670
+ timeoutMs?: number;
671
+ }
672
+
673
+ /**
674
+ * Capture current diagnostic versions for all LSP servers.
675
+ * Call this BEFORE syncing content to detect stale diagnostics later.
676
+ */
677
+ async function captureDiagnosticVersions(
678
+ cwd: string,
679
+ servers: Array<[string, ServerConfig]>,
680
+ initTimeoutMs?: number,
681
+ signal?: AbortSignal,
682
+ ): Promise<ServerVersionMap> {
683
+ const versions = new Map<string, number>();
684
+ await Promise.allSettled(
685
+ servers.map(async ([serverName, serverConfig]) => {
686
+ if (serverConfig.createClient) return;
687
+ const client = await getOrCreateClient(serverConfig, cwd, initTimeoutMs, signal);
688
+ versions.set(serverName, client.diagnosticsVersion);
689
+ }),
690
+ );
691
+ return versions;
692
+ }
693
+
694
+ async function captureOpenFileVersions(
695
+ absolutePath: string,
696
+ cwd: string,
697
+ servers: Array<[string, ServerConfig]>,
698
+ signal?: AbortSignal,
699
+ ): Promise<ServerVersionMap> {
700
+ const uri = fileToUri(absolutePath);
701
+ const versions = new Map<string, number>();
702
+ await Promise.allSettled(
703
+ servers.map(async ([serverName, serverConfig]) => {
704
+ const client = await getOrCreateClient(serverConfig, cwd, undefined, signal);
705
+ const version = client.openFiles.get(uri)?.version;
706
+ if (version !== undefined) {
707
+ versions.set(serverName, version);
708
+ }
709
+ }),
710
+ );
711
+ return versions;
712
+ }
713
+
714
+ /**
715
+ * Get diagnostics for a file using LSP or custom linter client.
716
+ *
717
+ * @param absolutePath - Absolute path to the file
718
+ * @param cwd - Working directory for LSP config resolution
719
+ * @param servers - Servers to query diagnostics for
720
+ * @param minVersions - Minimum diagnostic versions per server (to detect stale results)
721
+ * @returns Diagnostic results or undefined if no servers
722
+ */
723
+ async function getDiagnosticsForFile(
724
+ absolutePath: string,
725
+ cwd: string,
726
+ servers: Array<[string, ServerConfig]>,
727
+ options: GetDiagnosticsForFileOptions = {},
728
+ ): Promise<FileDiagnosticsResult | undefined> {
729
+ const { signal, minVersions, expectedDocumentVersions, timeoutMs } = options;
730
+ if (servers.length === 0) {
731
+ return undefined;
732
+ }
733
+
734
+ const uri = fileToUri(absolutePath);
735
+ const relPath = formatPathRelativeToCwd(absolutePath, cwd);
736
+ const allDiagnostics: Diagnostic[] = [];
737
+ const serverNames: string[] = [];
738
+
739
+ // Wait for diagnostics from all servers in parallel
740
+ const results = await Promise.allSettled(
741
+ servers.map(async ([serverName, serverConfig]) => {
742
+ throwIfAborted(signal);
743
+ // Use custom linter client if configured
744
+ if (serverConfig.createClient) {
745
+ const linterClient = getLinterClient(serverName, serverConfig, cwd);
746
+ const diagnostics = await linterClient.lint(absolutePath);
747
+ return { serverName, serverConfig, diagnostics };
748
+ }
749
+
750
+ // Default: use LSP
751
+ const client = await getOrCreateClient(serverConfig, cwd, undefined, signal);
752
+ throwIfAborted(signal);
753
+ if (isProjectAwareLspServer(serverConfig)) {
754
+ await waitForProjectLoaded(client, signal);
755
+ throwIfAborted(signal);
756
+ }
757
+ // Content already synced + didSave sent, wait for fresh diagnostics
758
+ const minVersion = minVersions?.get(serverName);
759
+ const expectedDocumentVersion = expectedDocumentVersions?.get(serverName);
760
+ const diagnostics = await waitForDiagnostics(client, uri, {
761
+ timeoutMs: timeoutMs ?? SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS,
762
+ signal,
763
+ minVersion,
764
+ expectedDocumentVersion,
765
+ });
766
+ return { serverName, serverConfig, diagnostics };
767
+ }),
768
+ );
769
+
770
+ for (const result of results) {
771
+ if (result.status === "fulfilled") {
772
+ serverNames.push(result.value.serverName);
773
+ allDiagnostics.push(
774
+ ...filterOrphanProjectDiagnostics(
775
+ absolutePath,
776
+ result.value.serverName,
777
+ result.value.serverConfig,
778
+ result.value.diagnostics,
779
+ ),
780
+ );
781
+ }
782
+ }
783
+
784
+ if (serverNames.length === 0) {
785
+ return undefined;
786
+ }
787
+
788
+ if (allDiagnostics.length === 0) {
789
+ return {
790
+ server: serverNames.join(", "),
791
+ messages: [],
792
+ summary: "OK",
793
+ errored: false,
794
+ };
795
+ }
796
+
797
+ // Deduplicate diagnostics by range + message (different servers might report similar issues)
798
+ const seen = new Set<string>();
799
+ const uniqueDiagnostics: Diagnostic[] = [];
800
+ for (const d of allDiagnostics) {
801
+ const key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;
802
+ if (!seen.has(key)) {
803
+ seen.add(key);
804
+ uniqueDiagnostics.push(d);
805
+ }
806
+ }
807
+
808
+ sortDiagnostics(uniqueDiagnostics);
809
+ const formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));
810
+ const limited = limitDiagnosticMessages(formatted);
811
+ const summary = formatDiagnosticsSummary(uniqueDiagnostics);
812
+ const hasErrors = uniqueDiagnostics.some(d => d.severity === 1);
813
+
814
+ return {
815
+ server: serverNames.join(", "),
816
+ messages: limited,
817
+ summary,
818
+ errored: hasErrors,
819
+ };
820
+ }
821
+
822
+ export enum FileFormatResult {
823
+ UNCHANGED = "unchanged",
824
+ FORMATTED = "formatted",
825
+ }
826
+
827
+ /**
828
+ * Format content using LSP or custom linter client.
829
+ *
830
+ * @param absolutePath - Absolute path (for URI)
831
+ * @param content - Content to format
832
+ * @param cwd - Working directory for LSP config resolution
833
+ * @param servers - Servers to try formatting with
834
+ * @returns Formatted content, or original if no formatter available
835
+ */
836
+ async function formatContent(
837
+ absolutePath: string,
838
+ content: string,
839
+ cwd: string,
840
+ servers: Array<[string, ServerConfig]>,
841
+ signal?: AbortSignal,
842
+ ): Promise<string> {
843
+ if (servers.length === 0) {
844
+ return content;
845
+ }
846
+
847
+ const uri = fileToUri(absolutePath);
848
+
849
+ for (const [serverName, serverConfig] of servers) {
850
+ try {
851
+ throwIfAborted(signal);
852
+ // Use custom linter client if configured
853
+ if (serverConfig.createClient) {
854
+ const linterClient = getLinterClient(serverName, serverConfig, cwd);
855
+ return await linterClient.format(absolutePath, content);
856
+ }
857
+
858
+ // Default: use LSP
859
+ const client = await getOrCreateClient(serverConfig, cwd, undefined, signal);
860
+ throwIfAborted(signal);
861
+
862
+ const caps = client.serverCapabilities;
863
+ if (!caps?.documentFormattingProvider) {
864
+ continue;
865
+ }
866
+
867
+ // Request formatting (content already synced)
868
+ const edits = (await sendRequest(
869
+ client,
870
+ "textDocument/formatting",
871
+ {
872
+ textDocument: { uri },
873
+ options: resolveFormatOptions(absolutePath, content),
874
+ },
875
+ signal,
876
+ )) as TextEdit[] | null;
877
+
878
+ if (!edits || edits.length === 0) {
879
+ return content;
880
+ }
881
+
882
+ // Apply edits in-memory and return
883
+ return applyTextEditsToString(content, edits);
884
+ } catch {}
885
+ }
886
+
887
+ return content;
888
+ }
889
+
890
+ /** Options for creating the LSP writethrough callback */
891
+ export interface WritethroughOptions {
892
+ /** Whether to format the file using LSP after writing */
893
+ enableFormat?: boolean;
894
+ /** Whether to get LSP diagnostics after writing */
895
+ enableDiagnostics?: boolean;
896
+ /** Called when diagnostics arrive after the main timeout. */
897
+ onDeferredDiagnostics?: (diagnostics: FileDiagnosticsResult) => void;
898
+ /** Signal to cancel a pending deferred diagnostics fetch. */
899
+ deferredSignal?: AbortSignal;
900
+ /** Transform diagnostics before surfacing them after a successful fetch. */
901
+ transformDiagnostics?: (absPath: string, result: FileDiagnosticsResult) => FileDiagnosticsResult;
902
+ }
903
+
904
+ /** Internal resolved form of {@link WritethroughOptions} that the writethrough machinery operates on. */
905
+ type ResolvedWritethroughOptions = {
906
+ enableFormat: boolean;
907
+ enableDiagnostics: boolean;
908
+ transformDiagnostics?: (absPath: string, result: FileDiagnosticsResult) => FileDiagnosticsResult;
909
+ };
910
+
911
+ /** Per-file deferred LSP diagnostics wiring for {@link WritethroughCallback}. */
912
+ export type WritethroughDeferredHandle = {
913
+ onDeferredDiagnostics: (diagnostics: FileDiagnosticsResult) => void;
914
+ signal: AbortSignal;
915
+ finalize: (diagnostics: FileDiagnosticsResult | undefined) => void;
916
+ };
917
+
918
+ /** Callback type for the LSP writethrough */
919
+ export type WritethroughCallback = (
920
+ dst: string,
921
+ content: string,
922
+ signal?: AbortSignal,
923
+ file?: BunFile,
924
+ batch?: LspWritethroughBatchRequest,
925
+ getDeferred?: (dst: string) => WritethroughDeferredHandle | undefined,
926
+ ) => Promise<FileDiagnosticsResult | undefined>;
927
+
928
+ /** No-op writethrough callback */
929
+ export async function writethroughNoop(
930
+ dst: string,
931
+ content: string,
932
+ _signal?: AbortSignal,
933
+ file?: BunFile,
934
+ _batch?: LspWritethroughBatchRequest,
935
+ _getDeferred?: (dst: string) => WritethroughDeferredHandle | undefined,
936
+ ): Promise<FileDiagnosticsResult | undefined> {
937
+ if (file) {
938
+ await file.write(content);
939
+ } else {
940
+ await Bun.write(dst, content);
941
+ }
942
+ return undefined;
943
+ }
944
+
945
+ interface PendingWritethrough {
946
+ dst: string;
947
+ content: string;
948
+ file?: BunFile;
949
+ }
950
+
951
+ interface LspWritethroughBatchRequest {
952
+ id: string;
953
+ flush: boolean;
954
+ }
955
+
956
+ interface LspWritethroughBatchState {
957
+ entries: Map<string, PendingWritethrough>;
958
+ options: ResolvedWritethroughOptions;
959
+ }
960
+
961
+ const writethroughBatches = new Map<string, LspWritethroughBatchState>();
962
+
963
+ function getOrCreateWritethroughBatch(id: string, options: ResolvedWritethroughOptions): LspWritethroughBatchState {
964
+ const existing = writethroughBatches.get(id);
965
+ if (existing) {
966
+ existing.options.enableFormat ||= options.enableFormat;
967
+ existing.options.enableDiagnostics ||= options.enableDiagnostics;
968
+ existing.options.transformDiagnostics ??= options.transformDiagnostics;
969
+ return existing;
970
+ }
971
+ const batch: LspWritethroughBatchState = {
972
+ entries: new Map<string, PendingWritethrough>(),
973
+ options: { ...options },
974
+ };
975
+ writethroughBatches.set(id, batch);
976
+ return batch;
977
+ }
978
+
979
+ export async function flushLspWritethroughBatch(
980
+ id: string,
981
+ cwd: string,
982
+ signal?: AbortSignal,
983
+ ): Promise<FileDiagnosticsResult | undefined> {
984
+ const state = writethroughBatches.get(id);
985
+ if (!state) {
986
+ return undefined;
987
+ }
988
+ writethroughBatches.delete(id);
989
+ return flushWritethroughBatch(Array.from(state.entries.values()), cwd, state.options, signal);
990
+ }
991
+
992
+ function mergeDiagnostics(
993
+ results: Array<FileDiagnosticsResult | undefined>,
994
+ options: ResolvedWritethroughOptions,
995
+ ): FileDiagnosticsResult | undefined {
996
+ const messages: string[] = [];
997
+ const servers = new Set<string>();
998
+ let hasResults = false;
999
+ let hasFormatter = false;
1000
+ let formatted = false;
1001
+
1002
+ for (const result of results) {
1003
+ if (!result) continue;
1004
+ hasResults = true;
1005
+ if (result.server) {
1006
+ for (const server of result.server.split(",")) {
1007
+ const trimmed = server.trim();
1008
+ if (trimmed) {
1009
+ servers.add(trimmed);
1010
+ }
1011
+ }
1012
+ }
1013
+ if (result.messages.length > 0) {
1014
+ messages.push(...result.messages);
1015
+ }
1016
+ if (result.formatter !== undefined) {
1017
+ hasFormatter = true;
1018
+ if (result.formatter === FileFormatResult.FORMATTED) {
1019
+ formatted = true;
1020
+ }
1021
+ }
1022
+ }
1023
+
1024
+ if (!hasResults && !hasFormatter) {
1025
+ return undefined;
1026
+ }
1027
+
1028
+ let summary = options.enableDiagnostics ? "no issues" : "OK";
1029
+ let errored = false;
1030
+ let limitedMessages = messages;
1031
+ if (messages.length > 0) {
1032
+ const summaryInfo = summarizeDiagnosticMessages(messages);
1033
+ summary = summaryInfo.summary;
1034
+ errored = summaryInfo.errored;
1035
+ limitedMessages = limitDiagnosticMessages(messages);
1036
+ }
1037
+ const formatter = hasFormatter ? (formatted ? FileFormatResult.FORMATTED : FileFormatResult.UNCHANGED) : undefined;
1038
+
1039
+ return {
1040
+ server: servers.size > 0 ? Array.from(servers).join(", ") : undefined,
1041
+ messages: limitedMessages,
1042
+ summary,
1043
+ errored,
1044
+ formatter,
1045
+ };
1046
+ }
1047
+
1048
+ async function scheduleDeferredDiagnosticsFetch(args: {
1049
+ dst: string;
1050
+ cwd: string;
1051
+ servers: Array<[string, ServerConfig]>;
1052
+ minVersions: ServerVersionMap | undefined;
1053
+ expectedDocumentVersions: ServerVersionMap | undefined;
1054
+ signal: AbortSignal;
1055
+ callback: (diagnostics: FileDiagnosticsResult) => void;
1056
+ }): Promise<void> {
1057
+ try {
1058
+ const deferredTimeout = AbortSignal.timeout(25_000);
1059
+ const combined = AbortSignal.any([args.signal, deferredTimeout]);
1060
+ const diagnostics = await getDiagnosticsForFile(args.dst, args.cwd, args.servers, {
1061
+ signal: combined,
1062
+ minVersions: args.minVersions,
1063
+ expectedDocumentVersions: args.expectedDocumentVersions,
1064
+ timeoutMs: DEFERRED_DIAGNOSTICS_WAIT_TIMEOUT_MS,
1065
+ });
1066
+ if (args.signal.aborted || diagnostics === undefined) return;
1067
+ args.callback(diagnostics);
1068
+ } catch {
1069
+ // Cancelled or LSP gave up; silently discard.
1070
+ }
1071
+ }
1072
+
1073
+ /**
1074
+ * Fetch post-write diagnostics without making the edit/write block on a slow
1075
+ * language server.
1076
+ *
1077
+ * Blocks inline only briefly ({@link INLINE_DIAGNOSTICS_WAIT_TIMEOUT_MS}) for a
1078
+ * fresh result. Freshness is enforced by the pre-edit `minVersions` baseline:
1079
+ * exact document-version matches return immediately, and unversioned/mismatched
1080
+ * publishes must settle with no newer publish before inline acceptance. If
1081
+ * nothing fresh arrives in the inline window and a deferred
1082
+ * channel is available, the in-flight fetch is handed off to deliver late via
1083
+ * `onDeferredDiagnostics`, and this returns `undefined` so the tool result
1084
+ * lands immediately. Without a deferred channel (direct/CI callers) it blocks
1085
+ * for the standard budget so the result is still returned inline.
1086
+ */
1087
+ async function fetchDiagnosticsWithDeferral(args: {
1088
+ dst: string;
1089
+ cwd: string;
1090
+ servers: Array<[string, ServerConfig]>;
1091
+ minVersions: ServerVersionMap | undefined;
1092
+ expectedDocumentVersions: ServerVersionMap | undefined;
1093
+ transformDiagnostics?: ResolvedWritethroughOptions["transformDiagnostics"];
1094
+ deferred?: { onDeferredDiagnostics: (diagnostics: FileDiagnosticsResult) => void; signal: AbortSignal };
1095
+ signal?: AbortSignal;
1096
+ }): Promise<FileDiagnosticsResult | undefined> {
1097
+ const { dst, cwd, servers, minVersions, expectedDocumentVersions, transformDiagnostics, deferred, signal } = args;
1098
+ const apply = (d: FileDiagnosticsResult | undefined) =>
1099
+ d && transformDiagnostics ? transformDiagnostics(dst, d) : d;
1100
+
1101
+ if (!deferred) {
1102
+ // No late-injection channel: block for the standard budget and return inline.
1103
+ return apply(
1104
+ await getDiagnosticsForFile(dst, cwd, servers, {
1105
+ signal,
1106
+ minVersions,
1107
+ expectedDocumentVersions,
1108
+ }),
1109
+ );
1110
+ }
1111
+
1112
+ // One background fetch with a generous inner budget; await it only briefly inline.
1113
+ const fetchPromise = getDiagnosticsForFile(dst, cwd, servers, {
1114
+ signal: deferred.signal,
1115
+ minVersions,
1116
+ expectedDocumentVersions,
1117
+ timeoutMs: DEFERRED_DIAGNOSTICS_WAIT_TIMEOUT_MS,
1118
+ });
1119
+ const INLINE_TIMEOUT = Symbol("inline-diagnostics-timeout");
1120
+ const raced = await Promise.race([
1121
+ fetchPromise,
1122
+ Bun.sleep(INLINE_DIAGNOSTICS_WAIT_TIMEOUT_MS).then(() => INLINE_TIMEOUT),
1123
+ ]);
1124
+ if (raced !== INLINE_TIMEOUT) {
1125
+ return apply(raced as FileDiagnosticsResult | undefined);
1126
+ }
1127
+ // Slow server: deliver late via the deferred channel; nothing inline. The
1128
+ // deferred sink (edit tool) applies its own dedup, so pass the raw result.
1129
+ void fetchPromise
1130
+ .then(diagnostics => {
1131
+ if (diagnostics && !deferred.signal.aborted) deferred.onDeferredDiagnostics(diagnostics);
1132
+ })
1133
+ .catch(() => {});
1134
+ return undefined;
1135
+ }
1136
+
1137
+ async function runLspWritethrough(
1138
+ dst: string,
1139
+ content: string,
1140
+ cwd: string,
1141
+ options: ResolvedWritethroughOptions,
1142
+ signal?: AbortSignal,
1143
+ file?: BunFile,
1144
+ deferred?: {
1145
+ onDeferredDiagnostics: (diagnostics: FileDiagnosticsResult) => void;
1146
+ signal: AbortSignal;
1147
+ },
1148
+ ): Promise<FileDiagnosticsResult | undefined> {
1149
+ const { enableFormat, enableDiagnostics } = options;
1150
+ const config = getConfig(cwd);
1151
+ const servers = getServersForFile(config, dst);
1152
+ if (servers.length === 0) {
1153
+ return writethroughNoop(dst, content, signal, file);
1154
+ }
1155
+ const { lspServers, customLinterServers } = splitServers(servers);
1156
+
1157
+ let finalContent = content;
1158
+ const writeContent = async (value: string) => (file ? file.write(value) : Bun.write(dst, value));
1159
+ const getWritePromise = once(() => writeContent(finalContent));
1160
+ const useCustomFormatter = enableFormat && customLinterServers.length > 0;
1161
+
1162
+ // Capture diagnostic versions BEFORE syncing to detect stale diagnostics
1163
+ // Bound client creation by the writethrough budget: a hung/broken server
1164
+ // must not add its full init wait (30s default) to every edit.
1165
+ const minVersions = enableDiagnostics ? await captureDiagnosticVersions(cwd, servers, 5_000, signal) : undefined;
1166
+ let expectedDocumentVersions: ServerVersionMap | undefined;
1167
+
1168
+ let formatter: FileFormatResult | undefined;
1169
+ let diagnostics: FileDiagnosticsResult | undefined;
1170
+ let timedOut = false;
1171
+ let synced = false;
1172
+ try {
1173
+ const timeoutSignal = AbortSignal.timeout(5_000);
1174
+ timeoutSignal.addEventListener(
1175
+ "abort",
1176
+ () => {
1177
+ timedOut = true;
1178
+ },
1179
+ { once: true },
1180
+ );
1181
+ const operationSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
1182
+ await untilAborted(operationSignal, async () => {
1183
+ if (useCustomFormatter) {
1184
+ // Custom linters (e.g. Biome CLI) require on-disk input.
1185
+ await writeContent(content);
1186
+ finalContent = await formatContent(dst, content, cwd, customLinterServers, operationSignal);
1187
+ formatter = finalContent !== content ? FileFormatResult.FORMATTED : FileFormatResult.UNCHANGED;
1188
+ await writeContent(finalContent);
1189
+ await syncFileContent(dst, finalContent, cwd, lspServers, operationSignal);
1190
+ } else {
1191
+ // 1. Sync original content to LSP servers
1192
+ await syncFileContent(dst, content, cwd, lspServers, operationSignal);
1193
+
1194
+ // 2. Format in-memory via LSP
1195
+ if (enableFormat) {
1196
+ finalContent = await formatContent(dst, content, cwd, lspServers, operationSignal);
1197
+ formatter = finalContent !== content ? FileFormatResult.FORMATTED : FileFormatResult.UNCHANGED;
1198
+ }
1199
+
1200
+ // 3. If formatted, sync formatted content to LSP servers
1201
+ if (finalContent !== content) {
1202
+ await syncFileContent(dst, finalContent, cwd, lspServers, operationSignal);
1203
+ }
1204
+
1205
+ // 4. Write to disk
1206
+ await getWritePromise();
1207
+ }
1208
+
1209
+ if (enableDiagnostics) {
1210
+ expectedDocumentVersions = await captureOpenFileVersions(dst, cwd, lspServers, operationSignal);
1211
+ }
1212
+
1213
+ // 5. Notify saved to LSP servers
1214
+ await notifyFileSaved(dst, cwd, lspServers, operationSignal);
1215
+ });
1216
+ synced = true;
1217
+ } catch {
1218
+ if (timedOut) {
1219
+ formatter = undefined;
1220
+ diagnostics = undefined;
1221
+ // Schedule background diagnostic fetch if caller wants deferred results
1222
+ if (deferred && !deferred.signal.aborted && enableDiagnostics) {
1223
+ void scheduleDeferredDiagnosticsFetch({
1224
+ dst,
1225
+ cwd,
1226
+ servers,
1227
+ minVersions,
1228
+ expectedDocumentVersions,
1229
+ signal: deferred.signal,
1230
+ callback: deferred.onDeferredDiagnostics,
1231
+ });
1232
+ }
1233
+ }
1234
+ await getWritePromise();
1235
+ }
1236
+
1237
+ if (synced && enableDiagnostics) {
1238
+ diagnostics = await fetchDiagnosticsWithDeferral({
1239
+ dst,
1240
+ cwd,
1241
+ servers,
1242
+ minVersions,
1243
+ expectedDocumentVersions,
1244
+ transformDiagnostics: options.transformDiagnostics,
1245
+ deferred,
1246
+ signal,
1247
+ });
1248
+ }
1249
+
1250
+ if (formatter !== undefined) {
1251
+ diagnostics ??= {
1252
+ server: servers.map(([name]) => name).join(", "),
1253
+ messages: [],
1254
+ summary: "OK",
1255
+ errored: false,
1256
+ };
1257
+ diagnostics.formatter = formatter;
1258
+ }
1259
+
1260
+ return diagnostics;
1261
+ }
1262
+
1263
+ async function flushWritethroughBatch(
1264
+ batch: PendingWritethrough[],
1265
+ cwd: string,
1266
+ options: ResolvedWritethroughOptions,
1267
+ signal?: AbortSignal,
1268
+ getDeferred?: (dst: string) => WritethroughDeferredHandle | undefined,
1269
+ ): Promise<FileDiagnosticsResult | undefined> {
1270
+ if (batch.length === 0) {
1271
+ return undefined;
1272
+ }
1273
+ const results: Array<FileDiagnosticsResult | undefined> = [];
1274
+ for (const entry of batch) {
1275
+ const bundle = getDeferred?.(entry.dst);
1276
+ const deferredInner =
1277
+ bundle &&
1278
+ ({
1279
+ onDeferredDiagnostics: bundle.onDeferredDiagnostics,
1280
+ signal: bundle.signal,
1281
+ } as const);
1282
+ const diag = await runLspWritethrough(entry.dst, entry.content, cwd, options, signal, entry.file, deferredInner);
1283
+ bundle?.finalize(diag);
1284
+ results.push(diag);
1285
+ }
1286
+ return mergeDiagnostics(results, options);
1287
+ }
1288
+
1289
+ /** Create a writethrough callback for LSP aware write operations */
1290
+ export function createLspWritethrough(cwd: string, options?: WritethroughOptions): WritethroughCallback {
1291
+ const resolvedOptions: ResolvedWritethroughOptions = {
1292
+ enableFormat: options?.enableFormat ?? false,
1293
+ enableDiagnostics: options?.enableDiagnostics ?? false,
1294
+ transformDiagnostics: options?.transformDiagnostics,
1295
+ };
1296
+ if (!resolvedOptions.enableFormat && !resolvedOptions.enableDiagnostics) {
1297
+ return writethroughNoop;
1298
+ }
1299
+ return async (
1300
+ dst: string,
1301
+ content: string,
1302
+ signal?: AbortSignal,
1303
+ file?: BunFile,
1304
+ batch?: LspWritethroughBatchRequest,
1305
+ getDeferred?: (dst: string) => WritethroughDeferredHandle | undefined,
1306
+ ) => {
1307
+ if (!batch) {
1308
+ const bundle = getDeferred?.(dst);
1309
+ const deferredInner =
1310
+ bundle &&
1311
+ ({
1312
+ onDeferredDiagnostics: bundle.onDeferredDiagnostics,
1313
+ signal: bundle.signal,
1314
+ } as const);
1315
+ const diagnostics = await runLspWritethrough(dst, content, cwd, resolvedOptions, signal, file, deferredInner);
1316
+ bundle?.finalize(diagnostics);
1317
+ return diagnostics;
1318
+ }
1319
+
1320
+ const state = getOrCreateWritethroughBatch(batch.id, resolvedOptions);
1321
+ state.entries.set(dst, { dst, content, file });
1322
+
1323
+ if (!batch.flush) {
1324
+ await writethroughNoop(dst, content, signal, file);
1325
+ return undefined;
1326
+ }
1327
+
1328
+ writethroughBatches.delete(batch.id);
1329
+ return flushWritethroughBatch(Array.from(state.entries.values()), cwd, state.options, signal, getDeferred);
1330
+ };
1331
+ }
1332
+
1333
+ /**
1334
+ * LSP tool for language server protocol operations.
1335
+ */
1336
+ export class LspTool implements AgentTool<typeof lspSchema, LspToolDetails, Theme> {
1337
+ readonly name = "lsp";
1338
+ readonly approval = (args: unknown): ToolApprovalDecision => {
1339
+ const rawAction = (args as Partial<LspParams>).action;
1340
+ const action = typeof rawAction === "string" ? rawAction.toLowerCase() : "";
1341
+ return LSP_READONLY_ACTIONS.has(action) ? "read" : "write";
1342
+ };
1343
+ readonly formatApprovalDetails = (args: unknown): string[] => {
1344
+ const params = args as Partial<LspParams>;
1345
+ const lines = [`Action: ${typeof params.action === "string" ? params.action : "(missing)"}`];
1346
+ if (typeof params.file === "string" && params.file.length > 0) {
1347
+ lines.push(`File: ${truncateForPrompt(params.file)}`);
1348
+ }
1349
+ return lines;
1350
+ };
1351
+ readonly label = "LSP";
1352
+ readonly loadMode = "discoverable";
1353
+ readonly summary = "Query LSP (language server) for diagnostics, hover info, and references";
1354
+ readonly description: string;
1355
+ readonly parameters = lspSchema;
1356
+ readonly strict = true;
1357
+
1358
+ constructor(private readonly session: ToolSession) {
1359
+ this.description = prompt.render(lspDescription);
1360
+ }
1361
+
1362
+ static createIf(session: ToolSession): LspTool | null {
1363
+ return session.enableLsp === false ? null : new LspTool(session);
1364
+ }
1365
+
1366
+ async execute(
1367
+ _toolCallId: string,
1368
+ params: LspParams,
1369
+ signal?: AbortSignal,
1370
+ _onUpdate?: AgentToolUpdateCallback<LspToolDetails>,
1371
+ _context?: AgentToolContext,
1372
+ ): Promise<AgentToolResult<LspToolDetails>> {
1373
+ const { action, file, line, symbol, query, new_name, apply, timeout } = params;
1374
+ const timeoutSec = clampTimeout("lsp", timeout);
1375
+ const timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);
1376
+ const callerSignal = signal;
1377
+ signal = callerSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : timeoutSignal;
1378
+ throwIfAborted(signal);
1379
+
1380
+ const config = getConfig(this.session.cwd);
1381
+
1382
+ // Status action doesn't need a file
1383
+ if (action === "status") {
1384
+ const configuredNames = Object.keys(config.servers);
1385
+ const lspmuxState = await detectLspmux();
1386
+ const lspmuxStatus = lspmuxState.available
1387
+ ? lspmuxState.running
1388
+ ? "lspmux: active (multiplexing enabled)"
1389
+ : "lspmux: installed but server not running"
1390
+ : "";
1391
+
1392
+ // `Object.keys(config.servers)` reflects what is *configured & resolvable
1393
+ // on PATH* — it does NOT prove the server actually starts. A wrapper
1394
+ // binary that exits immediately (e.g. rustup without the rust-analyzer
1395
+ // component) still appears here. Distinguish "configured" from
1396
+ // "started" (have a live in-process client) so callers cannot mistake
1397
+ // presence-on-PATH for a working server.
1398
+ const startedClients = getActiveClients();
1399
+ const startedByConfigName = new Map<string, LspServerStatus>();
1400
+ // getActiveClients() reports `name = client.config.command` (the
1401
+ // unresolved binary name from defaults.json), so match against
1402
+ // `serverConfig.command`, not the resolved path.
1403
+ for (const [name, serverConfig] of Object.entries(config.servers)) {
1404
+ const matched = startedClients.find(c => c.name === serverConfig.command);
1405
+ if (matched) startedByConfigName.set(name, matched);
1406
+ }
1407
+
1408
+ const lines: string[] = [];
1409
+ if (configuredNames.length === 0) {
1410
+ lines.push("No language servers configured for this project");
1411
+ } else {
1412
+ const labelled = configuredNames.map(name => {
1413
+ const started = startedByConfigName.get(name);
1414
+ if (!started) return `${name} (configured, not started)`;
1415
+ return `${name} (${started.status})`;
1416
+ });
1417
+ lines.push(`Language servers: ${labelled.join(", ")}`);
1418
+ lines.push(
1419
+ " note: 'configured, not started' means the binary resolves on PATH but no request has spawned it yet; 'ready' means a client process is live for this cwd.",
1420
+ );
1421
+ }
1422
+ if (lspmuxStatus) lines.push(lspmuxStatus);
1423
+
1424
+ return {
1425
+ content: [{ type: "text", text: lines.join("\n") }],
1426
+ details: { action, success: true, request: params },
1427
+ };
1428
+ }
1429
+
1430
+ // Diagnostics can be batch or single-file - queries all applicable servers
1431
+ if (action === "diagnostics") {
1432
+ if (file === "*") {
1433
+ // `*` => run workspace diagnostics across all configured servers
1434
+ const result = await runWorkspaceDiagnostics(this.session.cwd, signal);
1435
+ return {
1436
+ content: [
1437
+ {
1438
+ type: "text",
1439
+ text: `Workspace diagnostics (${result.projectType.description}):\n${result.output}`,
1440
+ },
1441
+ ],
1442
+ details: { action, success: true, request: params },
1443
+ };
1444
+ }
1445
+
1446
+ if (!file) {
1447
+ return {
1448
+ content: [
1449
+ {
1450
+ type: "text",
1451
+ text: "Error: file parameter required. Use `*` for workspace-wide diagnostics or a path/glob for specific files.",
1452
+ },
1453
+ ],
1454
+ details: { action, success: false, request: params },
1455
+ };
1456
+ }
1457
+
1458
+ let targets: string[];
1459
+ let truncatedGlobTargets = false;
1460
+ const resolvedTargets = await resolveDiagnosticTargets(file, this.session.cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);
1461
+ targets = resolvedTargets.matches;
1462
+ truncatedGlobTargets = resolvedTargets.truncated;
1463
+
1464
+ if (targets.length === 0) {
1465
+ return {
1466
+ content: [{ type: "text", text: `No files matched pattern: ${file}` }],
1467
+ details: { action, success: true, request: params },
1468
+ };
1469
+ }
1470
+
1471
+ const detailed = targets.length > 1 || truncatedGlobTargets;
1472
+ const diagnosticsWaitTimeoutMs = detailed
1473
+ ? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)
1474
+ : Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);
1475
+ const results: string[] = [];
1476
+ const allServerNames = new Set<string>();
1477
+ if (truncatedGlobTargets) {
1478
+ results.push(
1479
+ `${theme.status.warning} Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,
1480
+ );
1481
+ }
1482
+
1483
+ for (const target of targets) {
1484
+ throwIfAborted(signal);
1485
+ const resolved = resolveToCwd(target, this.session.cwd);
1486
+ const servers = getServersForFile(config, resolved);
1487
+ if (servers.length === 0) {
1488
+ results.push(`${theme.status.error} ${target}: No language server found`);
1489
+ continue;
1490
+ }
1491
+
1492
+ const uri = fileToUri(resolved);
1493
+ const relPath = formatPathRelativeToCwd(resolved, this.session.cwd);
1494
+ const allDiagnostics: Diagnostic[] = [];
1495
+
1496
+ // Query all applicable servers for this file
1497
+ for (const [serverName, serverConfig] of servers) {
1498
+ allServerNames.add(serverName);
1499
+ try {
1500
+ throwIfAborted(signal);
1501
+ if (serverConfig.createClient) {
1502
+ const linterClient = getLinterClient(serverName, serverConfig, this.session.cwd);
1503
+ const diagnostics = await linterClient.lint(resolved);
1504
+ allDiagnostics.push(...diagnostics);
1505
+ continue;
1506
+ }
1507
+ const client = await getOrCreateClient(serverConfig, this.session.cwd, undefined, signal);
1508
+ if (isProjectAwareLspServer(serverConfig)) {
1509
+ await waitForProjectLoaded(client, signal);
1510
+ throwIfAborted(signal);
1511
+ }
1512
+ const minVersion = client.diagnosticsVersion;
1513
+ await refreshFile(client, resolved, signal);
1514
+ const expectedDocumentVersion = client.openFiles.get(uri)?.version;
1515
+ const diagnostics = await waitForDiagnostics(client, uri, {
1516
+ timeoutMs: diagnosticsWaitTimeoutMs,
1517
+ signal,
1518
+ minVersion,
1519
+ expectedDocumentVersion,
1520
+ });
1521
+ allDiagnostics.push(...diagnostics);
1522
+ } catch (err) {
1523
+ if (err instanceof ToolAbortError || signal?.aborted) {
1524
+ throw err;
1525
+ }
1526
+ // Server failed, continue with others
1527
+ }
1528
+ }
1529
+
1530
+ // Deduplicate diagnostics
1531
+ const seen = new Set<string>();
1532
+ const uniqueDiagnostics: Diagnostic[] = [];
1533
+ for (const d of allDiagnostics) {
1534
+ const key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;
1535
+ if (!seen.has(key)) {
1536
+ seen.add(key);
1537
+ uniqueDiagnostics.push(d);
1538
+ }
1539
+ }
1540
+
1541
+ sortDiagnostics(uniqueDiagnostics);
1542
+
1543
+ if (!detailed && targets.length === 1) {
1544
+ if (uniqueDiagnostics.length === 0) {
1545
+ return {
1546
+ content: [{ type: "text", text: "OK" }],
1547
+ details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1548
+ };
1549
+ }
1550
+
1551
+ const summary = formatDiagnosticsSummary(uniqueDiagnostics);
1552
+ const formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));
1553
+ const output = `${summary}:\n${formatGroupedDiagnosticMessages(formatted)}`;
1554
+ return {
1555
+ content: [{ type: "text", text: output }],
1556
+ details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1557
+ };
1558
+ }
1559
+
1560
+ if (uniqueDiagnostics.length === 0) {
1561
+ results.push(`${theme.status.success} ${relPath}: no issues`);
1562
+ } else {
1563
+ const summary = formatDiagnosticsSummary(uniqueDiagnostics);
1564
+ results.push(`${theme.status.error} ${relPath}: ${summary}`);
1565
+ const formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));
1566
+ results.push(formatGroupedDiagnosticMessages(formatted));
1567
+ }
1568
+ }
1569
+
1570
+ return {
1571
+ content: [{ type: "text", text: results.join("\n") }],
1572
+ details: { action, serverName: Array.from(allServerNames).join(", "), success: true },
1573
+ };
1574
+ }
1575
+
1576
+ if (action === "rename_file") {
1577
+ if (!file || !new_name) {
1578
+ return {
1579
+ content: [
1580
+ {
1581
+ type: "text",
1582
+ text: "Error: rename_file requires both `file` (source path) and `new_name` (destination path)",
1583
+ },
1584
+ ],
1585
+ details: { action, success: false, request: params },
1586
+ };
1587
+ }
1588
+
1589
+ const source = resolveToCwd(file, this.session.cwd);
1590
+ const dest = resolveToCwd(new_name, this.session.cwd);
1591
+
1592
+ if (source === dest) {
1593
+ return {
1594
+ content: [{ type: "text", text: "Error: source and destination paths are identical" }],
1595
+ details: { action, success: false, request: params },
1596
+ };
1597
+ }
1598
+
1599
+ let sourceStat: fs.Stats;
1600
+ try {
1601
+ sourceStat = await fs.promises.stat(source);
1602
+ } catch {
1603
+ return {
1604
+ content: [
1605
+ {
1606
+ type: "text",
1607
+ text: `Error: source path does not exist: ${formatPathRelativeToCwd(source, this.session.cwd)}`,
1608
+ },
1609
+ ],
1610
+ details: { action, success: false, request: params },
1611
+ };
1612
+ }
1613
+
1614
+ let destExists = false;
1615
+ try {
1616
+ await fs.promises.stat(dest);
1617
+ destExists = true;
1618
+ } catch {
1619
+ // expected: destination must not exist
1620
+ }
1621
+ if (destExists) {
1622
+ return {
1623
+ content: [
1624
+ {
1625
+ type: "text",
1626
+ text: `Error: destination already exists: ${formatPathRelativeToCwd(dest, this.session.cwd)}`,
1627
+ },
1628
+ ],
1629
+ details: { action, success: false, request: params },
1630
+ };
1631
+ }
1632
+
1633
+ const enumerated = await enumerateRenamePairs(source, dest);
1634
+ if (enumerated.exceeded) {
1635
+ return {
1636
+ content: [
1637
+ {
1638
+ type: "text",
1639
+ text: `Error: directory contains more than ${MAX_RENAME_PAIRS} files; rename in smaller batches to keep LSP edits accurate`,
1640
+ },
1641
+ ],
1642
+ details: { action, success: false, request: params },
1643
+ };
1644
+ }
1645
+ const { pairs } = enumerated;
1646
+ if (pairs.length === 0) {
1647
+ return {
1648
+ content: [{ type: "text", text: "Error: no files to rename" }],
1649
+ details: { action, success: false, request: params },
1650
+ };
1651
+ }
1652
+
1653
+ const lspParams = { files: pairs };
1654
+ // Filter to servers whose fileTypes match either the source or any
1655
+ // destination path. Asking every configured server about a .md/.sql/.txt
1656
+ // rename used to stack up willRenameFiles requests against irrelevant
1657
+ // language servers and hit the wall-clock timeout. A server only has
1658
+ // something useful to say about a rename if it understands one of the
1659
+ // affected file extensions.
1660
+ const allLspServers = getLspServers(config);
1661
+ const relevantNames = new Set<string>();
1662
+ const collectRelevant = (filePath: string) => {
1663
+ for (const [name] of getLspServersForFile(config, filePath)) {
1664
+ relevantNames.add(name);
1665
+ }
1666
+ };
1667
+ collectRelevant(source);
1668
+ collectRelevant(dest);
1669
+ for (const pair of pairs) {
1670
+ collectRelevant(uriToFile(pair.oldUri));
1671
+ collectRelevant(uriToFile(pair.newUri));
1672
+ }
1673
+ const servers = allLspServers.filter(([name]) => relevantNames.has(name));
1674
+ const respondingServers = new Set<string>();
1675
+ const perServerEdits: Array<{ serverName: string; edit: WorkspaceEdit }> = [];
1676
+ const serverNotes: string[] = [];
1677
+
1678
+ for (const [serverName, serverConfig] of servers) {
1679
+ throwIfAborted(signal);
1680
+ try {
1681
+ const client = await getOrCreateClient(serverConfig, this.session.cwd, undefined, signal);
1682
+ if (isProjectAwareLspServer(serverConfig)) {
1683
+ await waitForProjectLoaded(client, signal);
1684
+ }
1685
+ const result = (await sendRequest(
1686
+ client,
1687
+ "workspace/willRenameFiles",
1688
+ lspParams,
1689
+ signal,
1690
+ )) as WorkspaceEdit | null;
1691
+ respondingServers.add(serverName);
1692
+ if (result && (result.changes || result.documentChanges)) {
1693
+ perServerEdits.push({ serverName, edit: result });
1694
+ }
1695
+ } catch (err) {
1696
+ if (err instanceof ToolAbortError || signal?.aborted) {
1697
+ throw err;
1698
+ }
1699
+ if (!isMethodNotFoundError(err)) {
1700
+ const msg = err instanceof Error ? err.message : String(err);
1701
+ serverNotes.push(` ${serverName}: ${msg}`);
1702
+ }
1703
+ }
1704
+ }
1705
+
1706
+ const sourceLabel = formatPathRelativeToCwd(source, this.session.cwd);
1707
+ const destLabel = formatPathRelativeToCwd(dest, this.session.cwd);
1708
+ const fileCountLabel = sourceStat.isDirectory()
1709
+ ? `${pairs.length} file${pairs.length !== 1 ? "s" : ""} under ${sourceLabel}`
1710
+ : sourceLabel;
1711
+
1712
+ const shouldApply = apply !== false;
1713
+ if (!shouldApply) {
1714
+ const lines: string[] = [];
1715
+ lines.push(`Rename preview: ${fileCountLabel} → ${destLabel}`);
1716
+ if (perServerEdits.length === 0) {
1717
+ lines.push(" No LSP edits would be applied");
1718
+ } else {
1719
+ for (const { serverName, edit } of perServerEdits) {
1720
+ const edits = formatWorkspaceEdit(edit, this.session.cwd);
1721
+ if (edits.length === 0) continue;
1722
+ lines.push(` ${serverName}:`);
1723
+ for (const e of edits) {
1724
+ lines.push(` ${e}`);
1725
+ }
1726
+ }
1727
+ }
1728
+ if (serverNotes.length > 0) {
1729
+ lines.push(" Server notes:");
1730
+ lines.push(...serverNotes);
1731
+ }
1732
+ return {
1733
+ content: [{ type: "text", text: lines.join("\n") }],
1734
+ details: {
1735
+ action,
1736
+ serverName: Array.from(respondingServers).join(", "),
1737
+ success: true,
1738
+ request: params,
1739
+ },
1740
+ };
1741
+ }
1742
+
1743
+ const summary: string[] = [];
1744
+
1745
+ // Coalesce per-URI edits across servers before applying. Each server
1746
+ // computed positions against the pre-edit file content, so applying
1747
+ // server A then re-reading for server B yields stale positions and
1748
+ // produces malformed imports. Group all text edits by URI, prefer the
1749
+ // project-primary (project-aware) server on overlap, and apply once
1750
+ // per URI from a single snapshot.
1751
+ const serverConfigByName = new Map(servers);
1752
+ interface AcceptedBucket {
1753
+ primaryServer: string;
1754
+ edits: TextEdit[];
1755
+ discarded: number;
1756
+ conflictServers: Set<string>;
1757
+ }
1758
+ const acceptedByUri = new Map<string, AcceptedBucket>();
1759
+ for (const { serverName, edit } of perServerEdits) {
1760
+ const cfg = serverConfigByName.get(serverName);
1761
+ const incomingPrimary = cfg ? isProjectAwareLspServer(cfg) : false;
1762
+ const flat = flattenWorkspaceTextEdits(edit);
1763
+ for (const [uri, edits] of flat) {
1764
+ const existing = acceptedByUri.get(uri);
1765
+ if (!existing) {
1766
+ acceptedByUri.set(uri, {
1767
+ primaryServer: serverName,
1768
+ edits: [...edits],
1769
+ discarded: 0,
1770
+ conflictServers: new Set(),
1771
+ });
1772
+ continue;
1773
+ }
1774
+ const existingCfg = serverConfigByName.get(existing.primaryServer);
1775
+ const existingIsPrimary = existingCfg ? isProjectAwareLspServer(existingCfg) : false;
1776
+ if (incomingPrimary && !existingIsPrimary) {
1777
+ // Promote incoming to primary; keep existing edits that don't overlap.
1778
+ const keptOld: TextEdit[] = [];
1779
+ let discardedOld = 0;
1780
+ for (const oe of existing.edits) {
1781
+ if (edits.some(ne => rangesOverlap(ne.range, oe.range))) discardedOld++;
1782
+ else keptOld.push(oe);
1783
+ }
1784
+ if (discardedOld > 0) existing.conflictServers.add(existing.primaryServer);
1785
+ existing.discarded += discardedOld;
1786
+ existing.primaryServer = serverName;
1787
+ existing.edits = [...edits, ...keptOld];
1788
+ } else {
1789
+ // Existing wins; discard incoming edits that overlap any accepted edit.
1790
+ let discardedNew = 0;
1791
+ for (const ne of edits) {
1792
+ if (existing.edits.some(ae => rangesOverlap(ae.range, ne.range))) {
1793
+ discardedNew++;
1794
+ } else {
1795
+ existing.edits.push(ne);
1796
+ }
1797
+ }
1798
+ if (discardedNew > 0) {
1799
+ existing.conflictServers.add(serverName);
1800
+ existing.discarded += discardedNew;
1801
+ }
1802
+ }
1803
+ }
1804
+ }
1805
+
1806
+ for (const [uri, bucket] of acceptedByUri) {
1807
+ const filePath = uriToFile(uri);
1808
+ await applyTextEdits(filePath, bucket.edits);
1809
+ const rel = formatPathRelativeToCwd(filePath, this.session.cwd);
1810
+ summary.push(` ${bucket.primaryServer}: applied ${bucket.edits.length} edit(s) to ${rel}`);
1811
+ if (bucket.discarded > 0) {
1812
+ const others = Array.from(bucket.conflictServers).join(", ");
1813
+ summary.push(
1814
+ ` note: discarded ${bucket.discarded} overlapping edit(s) from ${others} (kept ${bucket.primaryServer})`,
1815
+ );
1816
+ logger.warn(
1817
+ `lsp rename_file: discarded ${bucket.discarded} overlapping edit(s) from ${others} on ${rel}; kept ${bucket.primaryServer}`,
1818
+ );
1819
+ }
1820
+ }
1821
+
1822
+ await fs.promises.mkdir(path.dirname(dest), { recursive: true });
1823
+ await fs.promises.rename(source, dest);
1824
+ summary.push(` Renamed ${sourceLabel} → ${destLabel}`);
1825
+
1826
+ for (const [serverName, serverConfig] of servers) {
1827
+ try {
1828
+ const client = await getOrCreateClient(serverConfig, this.session.cwd, undefined, signal);
1829
+ for (const { oldUri } of pairs) {
1830
+ if (client.openFiles.has(oldUri)) {
1831
+ await sendNotification(client, "textDocument/didClose", { textDocument: { uri: oldUri } }, signal);
1832
+ client.openFiles.delete(oldUri);
1833
+ }
1834
+ }
1835
+ await sendNotification(client, "workspace/didRenameFiles", lspParams, signal);
1836
+ } catch (err) {
1837
+ if (err instanceof ToolAbortError || signal?.aborted) {
1838
+ throw err;
1839
+ }
1840
+ const msg = err instanceof Error ? err.message : String(err);
1841
+ serverNotes.push(` ${serverName}: ${msg}`);
1842
+ }
1843
+ }
1844
+
1845
+ if (serverNotes.length > 0) {
1846
+ summary.push(" Server notes:");
1847
+ summary.push(...serverNotes);
1848
+ }
1849
+
1850
+ const header = `Renamed ${fileCountLabel} → ${destLabel}`;
1851
+ return {
1852
+ content: [{ type: "text", text: `${header}\n${summary.join("\n")}` }],
1853
+ details: {
1854
+ action,
1855
+ serverName: Array.from(respondingServers).join(", "),
1856
+ success: true,
1857
+ request: params,
1858
+ },
1859
+ };
1860
+ }
1861
+
1862
+ if (action === "capabilities") {
1863
+ let serverList: Array<[string, ServerConfig]>;
1864
+ if (file && file !== "*") {
1865
+ const resolved = resolveToCwd(file, this.session.cwd);
1866
+ serverList = getLspServersForFile(config, resolved);
1867
+ if (serverList.length === 0) {
1868
+ return {
1869
+ content: [{ type: "text", text: "No language server found for this file" }],
1870
+ details: { action, success: false, request: params },
1871
+ };
1872
+ }
1873
+ } else {
1874
+ serverList = getLspServers(config);
1875
+ }
1876
+
1877
+ if (serverList.length === 0) {
1878
+ return {
1879
+ content: [{ type: "text", text: "No language servers configured" }],
1880
+ details: { action, success: false, request: params },
1881
+ };
1882
+ }
1883
+
1884
+ const sections: string[] = [];
1885
+ const respondingServers = new Set<string>();
1886
+ for (const [serverName, serverConfig] of serverList) {
1887
+ throwIfAborted(signal);
1888
+ try {
1889
+ const client = await getOrCreateClient(serverConfig, this.session.cwd, undefined, signal);
1890
+ respondingServers.add(serverName);
1891
+ const caps = client.serverCapabilities ?? {};
1892
+ sections.push(`${serverName}:`);
1893
+ sections.push(` capabilities: ${JSON.stringify(caps, null, 2).split("\n").join("\n ")}`);
1894
+ } catch (err) {
1895
+ if (err instanceof ToolAbortError || signal?.aborted) {
1896
+ throw err;
1897
+ }
1898
+ const msg = err instanceof Error ? err.message : String(err);
1899
+ sections.push(`${serverName}: failed to start (${msg})`);
1900
+ }
1901
+ }
1902
+
1903
+ return {
1904
+ content: [{ type: "text", text: sections.join("\n") }],
1905
+ details: {
1906
+ action,
1907
+ serverName: Array.from(respondingServers).join(", "),
1908
+ success: true,
1909
+ request: params,
1910
+ },
1911
+ };
1912
+ }
1913
+
1914
+ if (action === "request") {
1915
+ const method = query?.trim();
1916
+ if (!method) {
1917
+ return {
1918
+ content: [
1919
+ {
1920
+ type: "text",
1921
+ text: "Error: action=request requires `query` to specify the LSP method name (e.g., 'rust-analyzer/expandMacro')",
1922
+ },
1923
+ ],
1924
+ details: { action, success: false, request: params },
1925
+ };
1926
+ }
1927
+
1928
+ let chosenServer: [string, ServerConfig] | null = null;
1929
+ let resolvedTarget: string | null = null;
1930
+ if (file && file !== "*") {
1931
+ resolvedTarget = resolveToCwd(file, this.session.cwd);
1932
+ chosenServer = getLspServerForFile(config, resolvedTarget);
1933
+ if (!chosenServer) {
1934
+ return {
1935
+ content: [{ type: "text", text: "No language server found for this file" }],
1936
+ details: { action, success: false, request: params },
1937
+ };
1938
+ }
1939
+ } else {
1940
+ const all = getLspServers(config);
1941
+ if (all.length === 0) {
1942
+ return {
1943
+ content: [{ type: "text", text: "No language servers configured" }],
1944
+ details: { action, success: false, request: params },
1945
+ };
1946
+ }
1947
+ chosenServer = all[0];
1948
+ }
1949
+
1950
+ const [chosenName, chosenConfig] = chosenServer;
1951
+ let requestParams: unknown;
1952
+ if (params.payload !== undefined) {
1953
+ try {
1954
+ requestParams = JSON.parse(params.payload);
1955
+ } catch (err) {
1956
+ const msg = err instanceof Error ? err.message : String(err);
1957
+ return {
1958
+ content: [{ type: "text", text: `Error: invalid JSON in payload: ${msg}` }],
1959
+ details: { action, serverName: chosenName, success: false, request: params },
1960
+ };
1961
+ }
1962
+ } else if (resolvedTarget) {
1963
+ const uri = fileToUri(resolvedTarget);
1964
+ if (line !== undefined) {
1965
+ const character = await resolveSymbolColumn(resolvedTarget, line, symbol);
1966
+ requestParams = { textDocument: { uri }, position: { line: line - 1, character } };
1967
+ } else {
1968
+ requestParams = { textDocument: { uri } };
1969
+ }
1970
+ } else {
1971
+ requestParams = {};
1972
+ }
1973
+
1974
+ try {
1975
+ const client = await getOrCreateClient(chosenConfig, this.session.cwd, undefined, signal);
1976
+ if (resolvedTarget) {
1977
+ await ensureFileOpen(client, resolvedTarget, signal);
1978
+ }
1979
+ const result = await sendRequest(client, method, requestParams, signal);
1980
+ const formatted =
1981
+ result === null || result === undefined
1982
+ ? "null"
1983
+ : typeof result === "string"
1984
+ ? result
1985
+ : JSON.stringify(result, null, 2);
1986
+ return {
1987
+ content: [{ type: "text", text: `${chosenName} ← ${method}:\n${formatted}` }],
1988
+ details: { action, serverName: chosenName, success: true, request: params },
1989
+ };
1990
+ } catch (err) {
1991
+ if (err instanceof ToolAbortError || signal?.aborted) {
1992
+ throw new ToolAbortError();
1993
+ }
1994
+ const msg = err instanceof Error ? err.message : String(err);
1995
+ // Echo a (truncated) preview of the params we sent so the caller can
1996
+ // tell parse / shape errors (e.g. nested args dropped, missing field)
1997
+ // apart from genuine server errors without spinning up another debug call.
1998
+ const previewRaw = JSON.stringify(requestParams ?? null);
1999
+ const preview = previewRaw.length > 400 ? `${previewRaw.slice(0, 397)}...` : previewRaw;
2000
+ return {
2001
+ content: [
2002
+ { type: "text", text: `LSP error from ${chosenName} on ${method}: ${msg}\n params: ${preview}` },
2003
+ ],
2004
+ details: { action, serverName: chosenName, success: false, request: params },
2005
+ };
2006
+ }
2007
+ }
2008
+
2009
+ // `*` means workspace scope for symbols/reload; other actions need a concrete file.
2010
+ const isWorkspace = file === "*";
2011
+ const requiresFile = !file && action !== "reload";
2012
+
2013
+ if (requiresFile) {
2014
+ return {
2015
+ content: [
2016
+ {
2017
+ type: "text",
2018
+ text: "Error: file parameter required. Use `*` for workspace scope where supported.",
2019
+ },
2020
+ ],
2021
+ details: { action, success: false },
2022
+ };
2023
+ }
2024
+
2025
+ const resolvedFile = file && !isWorkspace ? resolveToCwd(file, this.session.cwd) : null;
2026
+ if (action === "symbols" && (isWorkspace || !resolvedFile)) {
2027
+ const normalizedQuery = query?.trim();
2028
+ if (!normalizedQuery) {
2029
+ return {
2030
+ content: [{ type: "text", text: "Error: query parameter required for workspace symbol search" }],
2031
+ details: { action, success: false, request: params },
2032
+ };
2033
+ }
2034
+ const servers = getLspServers(config);
2035
+ if (servers.length === 0) {
2036
+ return {
2037
+ content: [{ type: "text", text: "No language server found for this action" }],
2038
+ details: { action, success: false, request: params },
2039
+ };
2040
+ }
2041
+ const aggregatedSymbols: SymbolInformation[] = [];
2042
+ const respondingServers = new Set<string>();
2043
+ for (const [workspaceServerName, workspaceServerConfig] of servers) {
2044
+ throwIfAborted(signal);
2045
+ try {
2046
+ const workspaceClient = await getOrCreateClient(
2047
+ workspaceServerConfig,
2048
+ this.session.cwd,
2049
+ undefined,
2050
+ signal,
2051
+ );
2052
+ const workspaceResult = (await sendRequest(
2053
+ workspaceClient,
2054
+ "workspace/symbol",
2055
+ { query: normalizedQuery },
2056
+ signal,
2057
+ )) as SymbolInformation[] | null;
2058
+ if (!workspaceResult || workspaceResult.length === 0) {
2059
+ continue;
2060
+ }
2061
+ respondingServers.add(workspaceServerName);
2062
+ aggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));
2063
+ } catch (err) {
2064
+ if (err instanceof ToolAbortError || signal?.aborted) {
2065
+ throw err;
2066
+ }
2067
+ }
2068
+ }
2069
+ const dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);
2070
+ if (dedupedSymbols.length === 0) {
2071
+ return {
2072
+ content: [{ type: "text", text: `No symbols matching "${normalizedQuery}"` }],
2073
+ details: {
2074
+ action,
2075
+ serverName: Array.from(respondingServers).join(", "),
2076
+ success: true,
2077
+ request: params,
2078
+ },
2079
+ };
2080
+ }
2081
+ const limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);
2082
+ const lines = limitedSymbols.map(s => formatSymbolInformation(s, this.session.cwd));
2083
+ const truncationLine =
2084
+ dedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT
2085
+ ? `\n[…${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} symbols elided…]`
2086
+ : "";
2087
+ return {
2088
+ content: [
2089
+ {
2090
+ type: "text",
2091
+ text: `Found ${dedupedSymbols.length} symbol(s) matching "${normalizedQuery}":\n${lines.map(l => ` ${l}`).join("\n")}${truncationLine}`,
2092
+ },
2093
+ ],
2094
+ details: {
2095
+ action,
2096
+ serverName: Array.from(respondingServers).join(", "),
2097
+ success: true,
2098
+ request: params,
2099
+ },
2100
+ };
2101
+ }
2102
+
2103
+ if (action === "reload" && (isWorkspace || !resolvedFile)) {
2104
+ // `reload *` is the user's explicit request to re-read config from
2105
+ // disk. Drop the per-cwd cache entry so `.omp/lsp.json`, root markers,
2106
+ // and plugin configs added after the first LSP call become visible —
2107
+ // otherwise `getConfig` returns the first observation for the rest of
2108
+ // the process lifetime (#3546).
2109
+ configCache.delete(this.session.cwd);
2110
+ const refreshedConfig = getConfig(this.session.cwd);
2111
+ const servers = getLspServers(refreshedConfig);
2112
+ if (servers.length === 0) {
2113
+ return {
2114
+ content: [{ type: "text", text: "No language server found for this action" }],
2115
+ details: { action, success: false, request: params },
2116
+ };
2117
+ }
2118
+ const outputs: string[] = [];
2119
+ for (const [workspaceServerName, workspaceServerConfig] of servers) {
2120
+ throwIfAborted(signal);
2121
+ try {
2122
+ const workspaceClient = await getOrCreateClient(
2123
+ workspaceServerConfig,
2124
+ this.session.cwd,
2125
+ undefined,
2126
+ signal,
2127
+ );
2128
+ outputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));
2129
+ } catch (err) {
2130
+ if (err instanceof ToolAbortError || signal?.aborted) {
2131
+ throw err;
2132
+ }
2133
+ const errorMessage = err instanceof Error ? err.message : String(err);
2134
+ outputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);
2135
+ }
2136
+ }
2137
+ return {
2138
+ content: [{ type: "text", text: outputs.join("\n") }],
2139
+ details: { action, serverName: servers.map(([name]) => name).join(", "), success: true, request: params },
2140
+ };
2141
+ }
2142
+
2143
+ const serverInfo = resolvedFile ? getLspServerForFile(config, resolvedFile) : null;
2144
+ if (!serverInfo) {
2145
+ return {
2146
+ content: [{ type: "text", text: "No language server found for this action" }],
2147
+ details: { action, success: false },
2148
+ };
2149
+ }
2150
+
2151
+ const [serverName, serverConfig] = serverInfo;
2152
+
2153
+ try {
2154
+ const client = await getOrCreateClient(serverConfig, this.session.cwd, undefined, signal);
2155
+ const targetFile = resolvedFile;
2156
+ const isRustAnalyzerServer =
2157
+ serverName === "rust-analyzer" ||
2158
+ path.basename(serverConfig.command) === "rust-analyzer" ||
2159
+ (serverConfig.resolvedCommand ? path.basename(serverConfig.resolvedCommand) === "rust-analyzer" : false);
2160
+ const needsProjectIndex =
2161
+ targetFile !== null && PROJECT_INDEXED_ACTIONS.has(action) && isProjectAwareLspServer(serverConfig);
2162
+ const rustWorkspaceWait =
2163
+ needsProjectIndex && isRustAnalyzerServer && targetFile !== null && hasRustWorkspaceAncestor(targetFile);
2164
+
2165
+ if (targetFile) {
2166
+ await ensureFileOpen(client, targetFile, signal);
2167
+ }
2168
+ if (rustWorkspaceWait) {
2169
+ await waitForProjectLoaded(client, signal);
2170
+ }
2171
+
2172
+ // For project-aware servers, references/rename/definition without a `symbol`
2173
+ // silently falls back to the first non-whitespace column on the line, which
2174
+ // frequently points at the wrong identifier (decorator, keyword, parameter)
2175
+ // and the server returns plausible-looking but unrelated results. Require
2176
+ // `symbol` explicitly so callers cannot accidentally trigger that fallback.
2177
+ if (
2178
+ targetFile &&
2179
+ line !== undefined &&
2180
+ !symbol &&
2181
+ (action === "references" || action === "rename" || action === "definition") &&
2182
+ isProjectAwareLspServer(serverConfig)
2183
+ ) {
2184
+ throw new ToolError(
2185
+ `symbol is required for project-aware ${action}; pass symbol=<name>, optionally symbol#N for repeated occurrences`,
2186
+ );
2187
+ }
2188
+ const uri = targetFile ? fileToUri(targetFile) : "";
2189
+ const resolvedLine = line ?? 1;
2190
+ const resolvedCharacter = targetFile ? await resolveSymbolColumn(targetFile, resolvedLine, symbol) : 0;
2191
+ const position = { line: resolvedLine - 1, character: resolvedCharacter };
2192
+
2193
+ let output: string;
2194
+ // Set on bare empty-lookup outcomes (no definition/references/…): the
2195
+ // result carries no information once consumed, so compaction may elide
2196
+ // it. Clean diagnostics runs are NOT useless — they are verification
2197
+ // evidence.
2198
+ let useless = false;
2199
+
2200
+ if (needsProjectIndex && !isRustAnalyzerServer) {
2201
+ await waitForProjectLoaded(client, signal);
2202
+ }
2203
+
2204
+ switch (action) {
2205
+ // =====================================================================
2206
+ // Standard LSP Operations
2207
+ // =====================================================================
2208
+
2209
+ case "definition": {
2210
+ const result = (await sendRequest(
2211
+ client,
2212
+ "textDocument/definition",
2213
+ {
2214
+ textDocument: { uri },
2215
+ position,
2216
+ },
2217
+ signal,
2218
+ )) as Location | Location[] | LocationLink | LocationLink[] | null;
2219
+
2220
+ const locations = normalizeLocationResult(result);
2221
+
2222
+ if (locations.length === 0) {
2223
+ output = "No definition found";
2224
+ useless = true;
2225
+ } else {
2226
+ const lines = await Promise.all(
2227
+ locations.map(location => formatLocationWithContext(location, this.session.cwd)),
2228
+ );
2229
+ output = `Found ${locations.length} definition(s):\n${lines.join("\n")}`;
2230
+ }
2231
+ break;
2232
+ }
2233
+
2234
+ case "type_definition": {
2235
+ const result = (await sendRequest(
2236
+ client,
2237
+ "textDocument/typeDefinition",
2238
+ {
2239
+ textDocument: { uri },
2240
+ position,
2241
+ },
2242
+ signal,
2243
+ )) as Location | Location[] | LocationLink | LocationLink[] | null;
2244
+
2245
+ const locations = normalizeLocationResult(result);
2246
+
2247
+ if (locations.length === 0) {
2248
+ output = "No type definition found";
2249
+ useless = true;
2250
+ } else {
2251
+ const lines = await Promise.all(
2252
+ locations.map(location => formatLocationWithContext(location, this.session.cwd)),
2253
+ );
2254
+ output = `Found ${locations.length} type definition(s):\n${lines.join("\n")}`;
2255
+ }
2256
+ break;
2257
+ }
2258
+
2259
+ case "implementation": {
2260
+ const result = (await sendRequest(
2261
+ client,
2262
+ "textDocument/implementation",
2263
+ {
2264
+ textDocument: { uri },
2265
+ position,
2266
+ },
2267
+ signal,
2268
+ )) as Location | Location[] | LocationLink | LocationLink[] | null;
2269
+
2270
+ const locations = normalizeLocationResult(result);
2271
+
2272
+ if (locations.length === 0) {
2273
+ output = "No implementation found";
2274
+ useless = true;
2275
+ } else {
2276
+ const lines = await Promise.all(
2277
+ locations.map(location => formatLocationWithContext(location, this.session.cwd)),
2278
+ );
2279
+ output = `Found ${locations.length} implementation(s):\n${lines.join("\n")}`;
2280
+ }
2281
+ break;
2282
+ }
2283
+ case "references": {
2284
+ let result: Location[] | null = null;
2285
+ for (let attempt = 0; attempt <= REFERENCES_RETRY_COUNT; attempt++) {
2286
+ result = (await sendRequest(
2287
+ client,
2288
+ "textDocument/references",
2289
+ {
2290
+ textDocument: { uri },
2291
+ position,
2292
+ context: { includeDeclaration: true },
2293
+ },
2294
+ signal,
2295
+ )) as Location[] | null;
2296
+
2297
+ const locations = result ?? [];
2298
+ if (!isProjectAwareLspServer(serverConfig) || attempt === REFERENCES_RETRY_COUNT) {
2299
+ break;
2300
+ }
2301
+ if (locations.length > 0 && !isOnlyQueriedDeclaration(locations, uri, position)) {
2302
+ break;
2303
+ }
2304
+
2305
+ await waitForProjectLoaded(client, signal);
2306
+ throwIfAborted(signal);
2307
+ await untilAborted(signal, () => Bun.sleep(REFERENCES_RETRY_DELAY_MS));
2308
+ }
2309
+
2310
+ if (!result || result.length === 0) {
2311
+ output = "No references found";
2312
+ useless = true;
2313
+ } else {
2314
+ const contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);
2315
+ const plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);
2316
+ const contextualLines = await Promise.all(
2317
+ contextualReferences.map(location => formatLocationWithContext(location, this.session.cwd)),
2318
+ );
2319
+ const plainLines = plainReferences.map(location => ` ${formatLocation(location, this.session.cwd)}`);
2320
+ const lines = plainLines.length
2321
+ ? [
2322
+ ...contextualLines,
2323
+ ` ... ${plainLines.length} additional reference(s) shown without context`,
2324
+ ...plainLines,
2325
+ ]
2326
+ : contextualLines;
2327
+ output = `Found ${result.length} reference(s):\n${lines.join("\n")}`;
2328
+ }
2329
+ break;
2330
+ }
2331
+
2332
+ case "hover": {
2333
+ const result = (await sendRequest(
2334
+ client,
2335
+ "textDocument/hover",
2336
+ {
2337
+ textDocument: { uri },
2338
+ position,
2339
+ },
2340
+ signal,
2341
+ )) as Hover | null;
2342
+
2343
+ if (!result?.contents) {
2344
+ output = "No hover information";
2345
+ } else {
2346
+ output = extractHoverText(result.contents);
2347
+ }
2348
+ break;
2349
+ }
2350
+
2351
+ case "code_actions": {
2352
+ const diagnostics = client.diagnostics.get(uri)?.diagnostics ?? [];
2353
+ const context: CodeActionContext = {
2354
+ diagnostics,
2355
+ only: !apply && query ? [query] : undefined,
2356
+ triggerKind: 1,
2357
+ };
2358
+
2359
+ const result = (await sendRequest(
2360
+ client,
2361
+ "textDocument/codeAction",
2362
+ {
2363
+ textDocument: { uri },
2364
+ range: { start: position, end: position },
2365
+ context,
2366
+ },
2367
+ signal,
2368
+ )) as (CodeAction | Command)[] | null;
2369
+
2370
+ if (!result || result.length === 0) {
2371
+ output = "No code actions available";
2372
+ break;
2373
+ }
2374
+
2375
+ if (apply === true && query) {
2376
+ const normalizedQuery = query.trim();
2377
+ if (normalizedQuery.length === 0) {
2378
+ output = "Error: query parameter required when apply=true for code_actions";
2379
+ break;
2380
+ }
2381
+ const parsedIndex = /^\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;
2382
+ const selectedAction =
2383
+ parsedIndex !== null
2384
+ ? result[parsedIndex]
2385
+ : result.find(actionItem =>
2386
+ actionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),
2387
+ );
2388
+
2389
+ if (!selectedAction) {
2390
+ const actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);
2391
+ output = `No code action matches "${normalizedQuery}". Available actions:\n${actionLines.join("\n")}`;
2392
+ break;
2393
+ }
2394
+
2395
+ const appliedAction = await applyCodeAction(selectedAction, {
2396
+ resolveCodeAction: async actionItem =>
2397
+ (await sendRequest(client, "codeAction/resolve", actionItem, signal)) as CodeAction,
2398
+ applyWorkspaceEdit: async edit => applyWorkspaceEdit(edit, this.session.cwd),
2399
+ executeCommand: async commandItem => {
2400
+ await sendRequest(
2401
+ client,
2402
+ "workspace/executeCommand",
2403
+ {
2404
+ command: commandItem.command,
2405
+ arguments: commandItem.arguments ?? [],
2406
+ },
2407
+ signal,
2408
+ );
2409
+ },
2410
+ });
2411
+
2412
+ if (!appliedAction) {
2413
+ output = `Action "${selectedAction.title}" has no workspace edit or command to apply`;
2414
+ break;
2415
+ }
2416
+
2417
+ const summaryLines: string[] = [];
2418
+ if (appliedAction.edits.length > 0) {
2419
+ summaryLines.push(" Workspace edit:");
2420
+ summaryLines.push(...appliedAction.edits.map(item => ` ${item}`));
2421
+ }
2422
+ if (appliedAction.executedCommands.length > 0) {
2423
+ summaryLines.push(" Executed command(s):");
2424
+ summaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));
2425
+ }
2426
+
2427
+ output = `Applied "${appliedAction.title}":\n${summaryLines.join("\n")}`;
2428
+ break;
2429
+ }
2430
+
2431
+ const actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);
2432
+ output = `${result.length} code action(s):\n${actionLines.join("\n")}`;
2433
+ break;
2434
+ }
2435
+ case "symbols": {
2436
+ if (!targetFile) {
2437
+ output = "Error: file parameter required for document symbols";
2438
+ break;
2439
+ }
2440
+ // File-based document symbols
2441
+ const result = (await sendRequest(
2442
+ client,
2443
+ "textDocument/documentSymbol",
2444
+ {
2445
+ textDocument: { uri },
2446
+ },
2447
+ signal,
2448
+ )) as (DocumentSymbol | SymbolInformation)[] | null;
2449
+
2450
+ if (!result || result.length === 0) {
2451
+ output = "No symbols found";
2452
+ useless = true;
2453
+ } else {
2454
+ const relPath = formatPathRelativeToCwd(targetFile, this.session.cwd);
2455
+ if ("selectionRange" in result[0]) {
2456
+ const lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));
2457
+ output = `Symbols in ${relPath}:\n${lines.join("\n")}`;
2458
+ } else {
2459
+ const lines = (result as SymbolInformation[]).map(s => {
2460
+ const line = s.location.range.start.line + 1;
2461
+ const icon = symbolKindToIcon(s.kind);
2462
+ return `${icon} ${s.name} @ line ${line}`;
2463
+ });
2464
+ output = `Symbols in ${relPath}:\n${lines.join("\n")}`;
2465
+ }
2466
+ }
2467
+ break;
2468
+ }
2469
+
2470
+ case "rename": {
2471
+ if (!new_name) {
2472
+ return {
2473
+ content: [{ type: "text", text: "Error: new_name parameter required for rename" }],
2474
+ details: { action, serverName, success: false },
2475
+ };
2476
+ }
2477
+
2478
+ const result = (await sendRequest(
2479
+ client,
2480
+ "textDocument/rename",
2481
+ {
2482
+ textDocument: { uri },
2483
+ position,
2484
+ newName: new_name,
2485
+ },
2486
+ signal,
2487
+ )) as WorkspaceEdit | null;
2488
+
2489
+ if (!result) {
2490
+ output = "Rename returned no edits";
2491
+ } else {
2492
+ const shouldApply = apply !== false;
2493
+ if (shouldApply) {
2494
+ const applied = await applyWorkspaceEdit(result, this.session.cwd);
2495
+ output = `Applied rename:\n${applied.map(a => ` ${a}`).join("\n")}`;
2496
+ } else {
2497
+ const preview = formatWorkspaceEdit(result, this.session.cwd);
2498
+ output = `Rename preview:\n${preview.map(p => ` ${p}`).join("\n")}`;
2499
+ }
2500
+ }
2501
+ break;
2502
+ }
2503
+
2504
+ case "reload": {
2505
+ output = await reloadServer(client, serverName, signal);
2506
+ break;
2507
+ }
2508
+
2509
+ default:
2510
+ output = `Unknown action: ${action}`;
2511
+ }
2512
+
2513
+ return {
2514
+ content: [{ type: "text", text: output }],
2515
+ details: { serverName, action, success: true, request: params },
2516
+ ...(useless ? { useless: true } : {}),
2517
+ };
2518
+ } catch (err) {
2519
+ if (err instanceof ToolError) throw err;
2520
+ if (err instanceof ToolAbortError || signal?.aborted) {
2521
+ // Distinguish a wall-clock timeout from a caller cancel:
2522
+ // callerSignal aborting → real cancel (re-throw ToolAbortError);
2523
+ // timeoutSignal aborting without callerSignal → emit a ToolError naming the
2524
+ // elapsed budget and server, instead of opaque "Operation aborted".
2525
+ if (timeoutSignal.aborted && !callerSignal?.aborted) {
2526
+ throw new ToolError(
2527
+ `LSP ${action} timed out after ${timeoutSec}s on ${serverName}. The server may still be indexing; try again or pass timeout=<larger>.`,
2528
+ );
2529
+ }
2530
+ throw new ToolAbortError();
2531
+ }
2532
+ const errorMessage = err instanceof Error ? err.message : String(err);
2533
+ return {
2534
+ content: [{ type: "text", text: `LSP error: ${errorMessage}` }],
2535
+ details: { serverName, action, success: false, request: params },
2536
+ };
2537
+ }
2538
+ }
2539
+ }