@oh-my-pi/pi-coding-agent 0.1.0

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 (337) hide show
  1. package/CHANGELOG.md +1629 -0
  2. package/README.md +1041 -0
  3. package/docs/compaction.md +403 -0
  4. package/docs/config-usage.md +113 -0
  5. package/docs/custom-tools.md +541 -0
  6. package/docs/extension-loading.md +1004 -0
  7. package/docs/hooks.md +867 -0
  8. package/docs/rpc.md +1040 -0
  9. package/docs/sdk.md +994 -0
  10. package/docs/session-tree-plan.md +441 -0
  11. package/docs/session.md +240 -0
  12. package/docs/skills.md +290 -0
  13. package/docs/theme.md +670 -0
  14. package/docs/tree.md +197 -0
  15. package/docs/tui.md +341 -0
  16. package/examples/README.md +21 -0
  17. package/examples/custom-tools/README.md +124 -0
  18. package/examples/custom-tools/hello/index.ts +20 -0
  19. package/examples/custom-tools/question/index.ts +84 -0
  20. package/examples/custom-tools/subagent/README.md +172 -0
  21. package/examples/custom-tools/subagent/agents/planner.md +37 -0
  22. package/examples/custom-tools/subagent/agents/scout.md +50 -0
  23. package/examples/custom-tools/subagent/agents/worker.md +24 -0
  24. package/examples/custom-tools/subagent/agents.ts +156 -0
  25. package/examples/custom-tools/subagent/commands/implement-and-review.md +10 -0
  26. package/examples/custom-tools/subagent/commands/implement.md +10 -0
  27. package/examples/custom-tools/subagent/commands/scout-and-plan.md +9 -0
  28. package/examples/custom-tools/subagent/index.ts +1002 -0
  29. package/examples/custom-tools/todo/index.ts +212 -0
  30. package/examples/hooks/README.md +56 -0
  31. package/examples/hooks/auto-commit-on-exit.ts +49 -0
  32. package/examples/hooks/confirm-destructive.ts +59 -0
  33. package/examples/hooks/custom-compaction.ts +116 -0
  34. package/examples/hooks/dirty-repo-guard.ts +52 -0
  35. package/examples/hooks/file-trigger.ts +41 -0
  36. package/examples/hooks/git-checkpoint.ts +53 -0
  37. package/examples/hooks/handoff.ts +150 -0
  38. package/examples/hooks/permission-gate.ts +34 -0
  39. package/examples/hooks/protected-paths.ts +30 -0
  40. package/examples/hooks/qna.ts +119 -0
  41. package/examples/hooks/snake.ts +343 -0
  42. package/examples/hooks/status-line.ts +40 -0
  43. package/examples/sdk/01-minimal.ts +22 -0
  44. package/examples/sdk/02-custom-model.ts +49 -0
  45. package/examples/sdk/03-custom-prompt.ts +44 -0
  46. package/examples/sdk/04-skills.ts +44 -0
  47. package/examples/sdk/05-tools.ts +90 -0
  48. package/examples/sdk/06-hooks.ts +61 -0
  49. package/examples/sdk/07-context-files.ts +36 -0
  50. package/examples/sdk/08-slash-commands.ts +42 -0
  51. package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
  52. package/examples/sdk/10-settings.ts +38 -0
  53. package/examples/sdk/11-sessions.ts +48 -0
  54. package/examples/sdk/12-full-control.ts +95 -0
  55. package/examples/sdk/README.md +154 -0
  56. package/package.json +89 -0
  57. package/src/bun-imports.d.ts +16 -0
  58. package/src/capability/context-file.ts +40 -0
  59. package/src/capability/extension.ts +48 -0
  60. package/src/capability/hook.ts +40 -0
  61. package/src/capability/index.ts +616 -0
  62. package/src/capability/instruction.ts +37 -0
  63. package/src/capability/mcp.ts +52 -0
  64. package/src/capability/prompt.ts +35 -0
  65. package/src/capability/rule.ts +56 -0
  66. package/src/capability/settings.ts +35 -0
  67. package/src/capability/skill.ts +49 -0
  68. package/src/capability/slash-command.ts +40 -0
  69. package/src/capability/system-prompt.ts +35 -0
  70. package/src/capability/tool.ts +38 -0
  71. package/src/capability/types.ts +166 -0
  72. package/src/cli/args.ts +259 -0
  73. package/src/cli/file-processor.ts +121 -0
  74. package/src/cli/list-models.ts +104 -0
  75. package/src/cli/plugin-cli.ts +661 -0
  76. package/src/cli/session-picker.ts +41 -0
  77. package/src/cli/update-cli.ts +274 -0
  78. package/src/cli.ts +10 -0
  79. package/src/config.ts +391 -0
  80. package/src/core/agent-session.ts +2178 -0
  81. package/src/core/auth-storage.ts +258 -0
  82. package/src/core/bash-executor.ts +197 -0
  83. package/src/core/compaction/branch-summarization.ts +315 -0
  84. package/src/core/compaction/compaction.ts +664 -0
  85. package/src/core/compaction/index.ts +7 -0
  86. package/src/core/compaction/utils.ts +153 -0
  87. package/src/core/custom-commands/bundled/review/index.ts +156 -0
  88. package/src/core/custom-commands/index.ts +15 -0
  89. package/src/core/custom-commands/loader.ts +226 -0
  90. package/src/core/custom-commands/types.ts +112 -0
  91. package/src/core/custom-tools/index.ts +22 -0
  92. package/src/core/custom-tools/loader.ts +248 -0
  93. package/src/core/custom-tools/types.ts +185 -0
  94. package/src/core/custom-tools/wrapper.ts +29 -0
  95. package/src/core/exec.ts +139 -0
  96. package/src/core/export-html/index.ts +159 -0
  97. package/src/core/export-html/template.css +774 -0
  98. package/src/core/export-html/template.generated.ts +2 -0
  99. package/src/core/export-html/template.html +45 -0
  100. package/src/core/export-html/template.js +1185 -0
  101. package/src/core/export-html/template.macro.ts +24 -0
  102. package/src/core/file-mentions.ts +54 -0
  103. package/src/core/hooks/index.ts +16 -0
  104. package/src/core/hooks/loader.ts +288 -0
  105. package/src/core/hooks/runner.ts +434 -0
  106. package/src/core/hooks/tool-wrapper.ts +98 -0
  107. package/src/core/hooks/types.ts +770 -0
  108. package/src/core/index.ts +53 -0
  109. package/src/core/logger.ts +112 -0
  110. package/src/core/mcp/client.ts +185 -0
  111. package/src/core/mcp/config.ts +248 -0
  112. package/src/core/mcp/index.ts +45 -0
  113. package/src/core/mcp/loader.ts +99 -0
  114. package/src/core/mcp/manager.ts +235 -0
  115. package/src/core/mcp/tool-bridge.ts +156 -0
  116. package/src/core/mcp/transports/http.ts +316 -0
  117. package/src/core/mcp/transports/index.ts +6 -0
  118. package/src/core/mcp/transports/stdio.ts +252 -0
  119. package/src/core/mcp/types.ts +228 -0
  120. package/src/core/messages.ts +211 -0
  121. package/src/core/model-registry.ts +334 -0
  122. package/src/core/model-resolver.ts +494 -0
  123. package/src/core/plugins/doctor.ts +67 -0
  124. package/src/core/plugins/index.ts +38 -0
  125. package/src/core/plugins/installer.ts +189 -0
  126. package/src/core/plugins/loader.ts +339 -0
  127. package/src/core/plugins/manager.ts +672 -0
  128. package/src/core/plugins/parser.ts +105 -0
  129. package/src/core/plugins/paths.ts +37 -0
  130. package/src/core/plugins/types.ts +190 -0
  131. package/src/core/sdk.ts +900 -0
  132. package/src/core/session-manager.ts +1837 -0
  133. package/src/core/settings-manager.ts +860 -0
  134. package/src/core/skills.ts +352 -0
  135. package/src/core/slash-commands.ts +132 -0
  136. package/src/core/system-prompt.ts +442 -0
  137. package/src/core/timings.ts +25 -0
  138. package/src/core/title-generator.ts +110 -0
  139. package/src/core/tools/ask.ts +193 -0
  140. package/src/core/tools/bash-interceptor.ts +120 -0
  141. package/src/core/tools/bash.ts +91 -0
  142. package/src/core/tools/context.ts +32 -0
  143. package/src/core/tools/edit-diff.ts +487 -0
  144. package/src/core/tools/edit.ts +140 -0
  145. package/src/core/tools/exa/company.ts +59 -0
  146. package/src/core/tools/exa/index.ts +63 -0
  147. package/src/core/tools/exa/linkedin.ts +59 -0
  148. package/src/core/tools/exa/mcp-client.ts +368 -0
  149. package/src/core/tools/exa/render.ts +200 -0
  150. package/src/core/tools/exa/researcher.ts +90 -0
  151. package/src/core/tools/exa/search.ts +338 -0
  152. package/src/core/tools/exa/types.ts +167 -0
  153. package/src/core/tools/exa/websets.ts +248 -0
  154. package/src/core/tools/find.ts +244 -0
  155. package/src/core/tools/grep.ts +584 -0
  156. package/src/core/tools/index.ts +283 -0
  157. package/src/core/tools/ls.ts +142 -0
  158. package/src/core/tools/lsp/client.ts +767 -0
  159. package/src/core/tools/lsp/clients/biome-client.ts +207 -0
  160. package/src/core/tools/lsp/clients/index.ts +49 -0
  161. package/src/core/tools/lsp/clients/lsp-linter-client.ts +98 -0
  162. package/src/core/tools/lsp/config.ts +845 -0
  163. package/src/core/tools/lsp/edits.ts +110 -0
  164. package/src/core/tools/lsp/index.ts +1364 -0
  165. package/src/core/tools/lsp/render.ts +560 -0
  166. package/src/core/tools/lsp/rust-analyzer.ts +145 -0
  167. package/src/core/tools/lsp/types.ts +495 -0
  168. package/src/core/tools/lsp/utils.ts +526 -0
  169. package/src/core/tools/notebook.ts +182 -0
  170. package/src/core/tools/output.ts +198 -0
  171. package/src/core/tools/path-utils.ts +61 -0
  172. package/src/core/tools/read.ts +507 -0
  173. package/src/core/tools/renderers.ts +820 -0
  174. package/src/core/tools/review.ts +275 -0
  175. package/src/core/tools/rulebook.ts +124 -0
  176. package/src/core/tools/task/agents.ts +158 -0
  177. package/src/core/tools/task/artifacts.ts +114 -0
  178. package/src/core/tools/task/commands.ts +157 -0
  179. package/src/core/tools/task/discovery.ts +217 -0
  180. package/src/core/tools/task/executor.ts +531 -0
  181. package/src/core/tools/task/index.ts +548 -0
  182. package/src/core/tools/task/model-resolver.ts +176 -0
  183. package/src/core/tools/task/parallel.ts +38 -0
  184. package/src/core/tools/task/render.ts +502 -0
  185. package/src/core/tools/task/subprocess-tool-registry.ts +89 -0
  186. package/src/core/tools/task/types.ts +142 -0
  187. package/src/core/tools/truncate.ts +265 -0
  188. package/src/core/tools/web-fetch.ts +2511 -0
  189. package/src/core/tools/web-search/auth.ts +199 -0
  190. package/src/core/tools/web-search/index.ts +583 -0
  191. package/src/core/tools/web-search/providers/anthropic.ts +198 -0
  192. package/src/core/tools/web-search/providers/exa.ts +196 -0
  193. package/src/core/tools/web-search/providers/perplexity.ts +195 -0
  194. package/src/core/tools/web-search/render.ts +372 -0
  195. package/src/core/tools/web-search/types.ts +180 -0
  196. package/src/core/tools/write.ts +63 -0
  197. package/src/core/ttsr.ts +211 -0
  198. package/src/core/utils.ts +187 -0
  199. package/src/discovery/agents-md.ts +75 -0
  200. package/src/discovery/builtin.ts +647 -0
  201. package/src/discovery/claude.ts +623 -0
  202. package/src/discovery/cline.ts +104 -0
  203. package/src/discovery/codex.ts +571 -0
  204. package/src/discovery/cursor.ts +266 -0
  205. package/src/discovery/gemini.ts +368 -0
  206. package/src/discovery/github.ts +120 -0
  207. package/src/discovery/helpers.test.ts +127 -0
  208. package/src/discovery/helpers.ts +249 -0
  209. package/src/discovery/index.ts +84 -0
  210. package/src/discovery/mcp-json.ts +127 -0
  211. package/src/discovery/vscode.ts +99 -0
  212. package/src/discovery/windsurf.ts +219 -0
  213. package/src/index.ts +192 -0
  214. package/src/main.ts +507 -0
  215. package/src/migrations.ts +156 -0
  216. package/src/modes/cleanup.ts +23 -0
  217. package/src/modes/index.ts +48 -0
  218. package/src/modes/interactive/components/armin.ts +382 -0
  219. package/src/modes/interactive/components/assistant-message.ts +86 -0
  220. package/src/modes/interactive/components/bash-execution.ts +199 -0
  221. package/src/modes/interactive/components/bordered-loader.ts +41 -0
  222. package/src/modes/interactive/components/branch-summary-message.ts +42 -0
  223. package/src/modes/interactive/components/compaction-summary-message.ts +45 -0
  224. package/src/modes/interactive/components/custom-editor.ts +122 -0
  225. package/src/modes/interactive/components/diff.ts +147 -0
  226. package/src/modes/interactive/components/dynamic-border.ts +25 -0
  227. package/src/modes/interactive/components/extensions/extension-dashboard.ts +296 -0
  228. package/src/modes/interactive/components/extensions/extension-list.ts +479 -0
  229. package/src/modes/interactive/components/extensions/index.ts +9 -0
  230. package/src/modes/interactive/components/extensions/inspector-panel.ts +313 -0
  231. package/src/modes/interactive/components/extensions/state-manager.ts +558 -0
  232. package/src/modes/interactive/components/extensions/types.ts +191 -0
  233. package/src/modes/interactive/components/hook-editor.ts +117 -0
  234. package/src/modes/interactive/components/hook-input.ts +64 -0
  235. package/src/modes/interactive/components/hook-message.ts +96 -0
  236. package/src/modes/interactive/components/hook-selector.ts +91 -0
  237. package/src/modes/interactive/components/model-selector.ts +560 -0
  238. package/src/modes/interactive/components/oauth-selector.ts +136 -0
  239. package/src/modes/interactive/components/plugin-settings.ts +481 -0
  240. package/src/modes/interactive/components/queue-mode-selector.ts +56 -0
  241. package/src/modes/interactive/components/session-selector.ts +220 -0
  242. package/src/modes/interactive/components/settings-defs.ts +597 -0
  243. package/src/modes/interactive/components/settings-selector.ts +545 -0
  244. package/src/modes/interactive/components/show-images-selector.ts +45 -0
  245. package/src/modes/interactive/components/status-line/index.ts +4 -0
  246. package/src/modes/interactive/components/status-line/presets.ts +94 -0
  247. package/src/modes/interactive/components/status-line/segments.ts +350 -0
  248. package/src/modes/interactive/components/status-line/separators.ts +55 -0
  249. package/src/modes/interactive/components/status-line/types.ts +81 -0
  250. package/src/modes/interactive/components/status-line-segment-editor.ts +357 -0
  251. package/src/modes/interactive/components/status-line.ts +384 -0
  252. package/src/modes/interactive/components/theme-selector.ts +62 -0
  253. package/src/modes/interactive/components/thinking-selector.ts +64 -0
  254. package/src/modes/interactive/components/tool-execution.ts +946 -0
  255. package/src/modes/interactive/components/tree-selector.ts +877 -0
  256. package/src/modes/interactive/components/ttsr-notification.ts +82 -0
  257. package/src/modes/interactive/components/user-message-selector.ts +159 -0
  258. package/src/modes/interactive/components/user-message.ts +18 -0
  259. package/src/modes/interactive/components/visual-truncate.ts +50 -0
  260. package/src/modes/interactive/components/welcome.ts +228 -0
  261. package/src/modes/interactive/interactive-mode.ts +2669 -0
  262. package/src/modes/interactive/theme/dark.json +102 -0
  263. package/src/modes/interactive/theme/defaults/dark-arctic.json +111 -0
  264. package/src/modes/interactive/theme/defaults/dark-catppuccin.json +106 -0
  265. package/src/modes/interactive/theme/defaults/dark-cyberpunk.json +109 -0
  266. package/src/modes/interactive/theme/defaults/dark-dracula.json +105 -0
  267. package/src/modes/interactive/theme/defaults/dark-forest.json +103 -0
  268. package/src/modes/interactive/theme/defaults/dark-github.json +112 -0
  269. package/src/modes/interactive/theme/defaults/dark-gruvbox.json +119 -0
  270. package/src/modes/interactive/theme/defaults/dark-monochrome.json +101 -0
  271. package/src/modes/interactive/theme/defaults/dark-monokai.json +105 -0
  272. package/src/modes/interactive/theme/defaults/dark-nord.json +104 -0
  273. package/src/modes/interactive/theme/defaults/dark-ocean.json +108 -0
  274. package/src/modes/interactive/theme/defaults/dark-one.json +107 -0
  275. package/src/modes/interactive/theme/defaults/dark-retro.json +99 -0
  276. package/src/modes/interactive/theme/defaults/dark-rose-pine.json +95 -0
  277. package/src/modes/interactive/theme/defaults/dark-solarized.json +96 -0
  278. package/src/modes/interactive/theme/defaults/dark-sunset.json +106 -0
  279. package/src/modes/interactive/theme/defaults/dark-synthwave.json +102 -0
  280. package/src/modes/interactive/theme/defaults/dark-tokyo-night.json +108 -0
  281. package/src/modes/interactive/theme/defaults/index.ts +67 -0
  282. package/src/modes/interactive/theme/defaults/light-arctic.json +106 -0
  283. package/src/modes/interactive/theme/defaults/light-catppuccin.json +105 -0
  284. package/src/modes/interactive/theme/defaults/light-cyberpunk.json +103 -0
  285. package/src/modes/interactive/theme/defaults/light-forest.json +107 -0
  286. package/src/modes/interactive/theme/defaults/light-github.json +114 -0
  287. package/src/modes/interactive/theme/defaults/light-gruvbox.json +115 -0
  288. package/src/modes/interactive/theme/defaults/light-monochrome.json +100 -0
  289. package/src/modes/interactive/theme/defaults/light-ocean.json +106 -0
  290. package/src/modes/interactive/theme/defaults/light-one.json +105 -0
  291. package/src/modes/interactive/theme/defaults/light-retro.json +105 -0
  292. package/src/modes/interactive/theme/defaults/light-solarized.json +101 -0
  293. package/src/modes/interactive/theme/defaults/light-sunset.json +106 -0
  294. package/src/modes/interactive/theme/defaults/light-synthwave.json +105 -0
  295. package/src/modes/interactive/theme/defaults/light-tokyo-night.json +118 -0
  296. package/src/modes/interactive/theme/light.json +99 -0
  297. package/src/modes/interactive/theme/theme-schema.json +424 -0
  298. package/src/modes/interactive/theme/theme.ts +2211 -0
  299. package/src/modes/print-mode.ts +163 -0
  300. package/src/modes/rpc/rpc-client.ts +527 -0
  301. package/src/modes/rpc/rpc-mode.ts +494 -0
  302. package/src/modes/rpc/rpc-types.ts +203 -0
  303. package/src/prompts/architect-plan.md +10 -0
  304. package/src/prompts/branch-summary-preamble.md +3 -0
  305. package/src/prompts/branch-summary.md +28 -0
  306. package/src/prompts/browser.md +71 -0
  307. package/src/prompts/compaction-summary.md +34 -0
  308. package/src/prompts/compaction-turn-prefix.md +16 -0
  309. package/src/prompts/compaction-update-summary.md +41 -0
  310. package/src/prompts/explore.md +82 -0
  311. package/src/prompts/implement-with-critic.md +11 -0
  312. package/src/prompts/implement.md +11 -0
  313. package/src/prompts/init.md +30 -0
  314. package/src/prompts/plan.md +54 -0
  315. package/src/prompts/reviewer.md +81 -0
  316. package/src/prompts/summarization-system.md +3 -0
  317. package/src/prompts/system-prompt.md +27 -0
  318. package/src/prompts/task.md +56 -0
  319. package/src/prompts/title-system.md +8 -0
  320. package/src/prompts/tools/ask.md +24 -0
  321. package/src/prompts/tools/bash.md +23 -0
  322. package/src/prompts/tools/edit.md +9 -0
  323. package/src/prompts/tools/find.md +6 -0
  324. package/src/prompts/tools/grep.md +12 -0
  325. package/src/prompts/tools/lsp.md +14 -0
  326. package/src/prompts/tools/output.md +23 -0
  327. package/src/prompts/tools/read.md +25 -0
  328. package/src/prompts/tools/web-fetch.md +8 -0
  329. package/src/prompts/tools/web-search.md +10 -0
  330. package/src/prompts/tools/write.md +10 -0
  331. package/src/utils/changelog.ts +99 -0
  332. package/src/utils/clipboard.ts +265 -0
  333. package/src/utils/fuzzy.ts +108 -0
  334. package/src/utils/mime.ts +30 -0
  335. package/src/utils/shell-snapshot.ts +218 -0
  336. package/src/utils/shell.ts +364 -0
  337. package/src/utils/tools-manager.ts +265 -0
@@ -0,0 +1,495 @@
1
+ import { type Static, Type } from "@sinclair/typebox";
2
+ import type { Subprocess } from "bun";
3
+
4
+ // =============================================================================
5
+ // Tool Schema
6
+ // =============================================================================
7
+
8
+ export const lspSchema = Type.Object({
9
+ action: Type.Union(
10
+ [
11
+ // Standard LSP operations
12
+ Type.Literal("diagnostics"),
13
+ Type.Literal("workspace_diagnostics"),
14
+ Type.Literal("references"),
15
+ Type.Literal("definition"),
16
+ Type.Literal("hover"),
17
+ Type.Literal("symbols"),
18
+ Type.Literal("workspace_symbols"),
19
+ Type.Literal("rename"),
20
+ Type.Literal("actions"),
21
+ Type.Literal("incoming_calls"),
22
+ Type.Literal("outgoing_calls"),
23
+ Type.Literal("status"),
24
+ // Rust-analyzer specific operations
25
+ Type.Literal("flycheck"),
26
+ Type.Literal("expand_macro"),
27
+ Type.Literal("ssr"),
28
+ Type.Literal("runnables"),
29
+ Type.Literal("related_tests"),
30
+ Type.Literal("reload_workspace"),
31
+ ],
32
+ { description: "LSP action to perform" },
33
+ ),
34
+ files: Type.Optional(Type.Array(Type.String({ description: "File paths for diagnostics" }))),
35
+ file: Type.Optional(Type.String({ description: "File path for file-specific actions" })),
36
+ line: Type.Optional(Type.Number({ description: "1-based line number" })),
37
+ column: Type.Optional(Type.Number({ description: "1-based column number" })),
38
+ end_line: Type.Optional(Type.Number({ description: "1-based end line number for ranges" })),
39
+ end_character: Type.Optional(Type.Number({ description: "1-based end column number for ranges" })),
40
+ query: Type.Optional(Type.String({ description: "Search query for symbols/SSR pattern" })),
41
+ new_name: Type.Optional(Type.String({ description: "New name for rename action" })),
42
+ replacement: Type.Optional(Type.String({ description: "Replacement for SSR action" })),
43
+ kind: Type.Optional(Type.String({ description: "Code action kind filter (quickfix, refactor, source)" })),
44
+ apply: Type.Optional(Type.Boolean({ description: "Apply edits instead of preview (default: true)" })),
45
+ action_index: Type.Optional(Type.Number({ description: "Index of code action to apply" })),
46
+ include_declaration: Type.Optional(
47
+ Type.Boolean({ description: "Include declaration in references (default: true)" }),
48
+ ),
49
+ });
50
+
51
+ export type LspParams = Static<typeof lspSchema>;
52
+
53
+ export interface LspToolDetails {
54
+ serverName?: string;
55
+ action: string;
56
+ success: boolean;
57
+ }
58
+
59
+ // =============================================================================
60
+ // Core LSP Protocol Types
61
+ // =============================================================================
62
+
63
+ export interface Position {
64
+ line: number;
65
+ character: number;
66
+ }
67
+
68
+ export interface Range {
69
+ start: Position;
70
+ end: Position;
71
+ }
72
+
73
+ export interface Location {
74
+ uri: string;
75
+ range: Range;
76
+ }
77
+
78
+ export interface LocationLink {
79
+ originSelectionRange?: Range;
80
+ targetUri: string;
81
+ targetRange: Range;
82
+ targetSelectionRange: Range;
83
+ }
84
+
85
+ // =============================================================================
86
+ // Diagnostics
87
+ // =============================================================================
88
+
89
+ export type DiagnosticSeverity = 1 | 2 | 3 | 4; // error, warning, info, hint
90
+
91
+ export interface DiagnosticRelatedInformation {
92
+ location: Location;
93
+ message: string;
94
+ }
95
+
96
+ export interface Diagnostic {
97
+ range: Range;
98
+ severity?: DiagnosticSeverity;
99
+ code?: string | number;
100
+ codeDescription?: { href: string };
101
+ source?: string;
102
+ message: string;
103
+ tags?: number[];
104
+ relatedInformation?: DiagnosticRelatedInformation[];
105
+ data?: unknown;
106
+ }
107
+
108
+ // =============================================================================
109
+ // Text Edits
110
+ // =============================================================================
111
+
112
+ export interface TextEdit {
113
+ range: Range;
114
+ newText: string;
115
+ }
116
+
117
+ export interface AnnotatedTextEdit extends TextEdit {
118
+ annotationId?: string;
119
+ }
120
+
121
+ export interface TextDocumentIdentifier {
122
+ uri: string;
123
+ }
124
+
125
+ export interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
126
+ version: number | null;
127
+ }
128
+
129
+ export interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier {
130
+ version?: number | null;
131
+ }
132
+
133
+ export interface TextDocumentEdit {
134
+ textDocument: OptionalVersionedTextDocumentIdentifier;
135
+ edits: (TextEdit | AnnotatedTextEdit)[];
136
+ }
137
+
138
+ // =============================================================================
139
+ // Resource Operations
140
+ // =============================================================================
141
+
142
+ export interface CreateFileOptions {
143
+ overwrite?: boolean;
144
+ ignoreIfExists?: boolean;
145
+ }
146
+
147
+ export interface CreateFile {
148
+ kind: "create";
149
+ uri: string;
150
+ options?: CreateFileOptions;
151
+ }
152
+
153
+ export interface RenameFileOptions {
154
+ overwrite?: boolean;
155
+ ignoreIfExists?: boolean;
156
+ }
157
+
158
+ export interface RenameFile {
159
+ kind: "rename";
160
+ oldUri: string;
161
+ newUri: string;
162
+ options?: RenameFileOptions;
163
+ }
164
+
165
+ export interface DeleteFileOptions {
166
+ recursive?: boolean;
167
+ ignoreIfNotExists?: boolean;
168
+ }
169
+
170
+ export interface DeleteFile {
171
+ kind: "delete";
172
+ uri: string;
173
+ options?: DeleteFileOptions;
174
+ }
175
+
176
+ export type DocumentChange = TextDocumentEdit | CreateFile | RenameFile | DeleteFile;
177
+
178
+ export interface WorkspaceEdit {
179
+ changes?: Record<string, TextEdit[]>;
180
+ documentChanges?: DocumentChange[];
181
+ changeAnnotations?: Record<string, { label: string; needsConfirmation?: boolean; description?: string }>;
182
+ }
183
+
184
+ // =============================================================================
185
+ // Code Actions
186
+ // =============================================================================
187
+
188
+ export type CodeActionKind =
189
+ | "quickfix"
190
+ | "refactor"
191
+ | "refactor.extract"
192
+ | "refactor.inline"
193
+ | "refactor.rewrite"
194
+ | "source"
195
+ | "source.organizeImports"
196
+ | "source.fixAll"
197
+ | string;
198
+
199
+ export interface Command {
200
+ title: string;
201
+ command: string;
202
+ arguments?: unknown[];
203
+ }
204
+
205
+ export interface CodeAction {
206
+ title: string;
207
+ kind?: CodeActionKind;
208
+ diagnostics?: Diagnostic[];
209
+ isPreferred?: boolean;
210
+ disabled?: { reason: string };
211
+ edit?: WorkspaceEdit;
212
+ command?: Command;
213
+ data?: unknown;
214
+ }
215
+
216
+ export interface CodeActionContext {
217
+ diagnostics: Diagnostic[];
218
+ only?: CodeActionKind[];
219
+ triggerKind?: 1 | 2; // Invoked = 1, Automatic = 2
220
+ }
221
+
222
+ // =============================================================================
223
+ // Symbols
224
+ // =============================================================================
225
+
226
+ export type SymbolKind =
227
+ | 1 // File
228
+ | 2 // Module
229
+ | 3 // Namespace
230
+ | 4 // Package
231
+ | 5 // Class
232
+ | 6 // Method
233
+ | 7 // Property
234
+ | 8 // Field
235
+ | 9 // Constructor
236
+ | 10 // Enum
237
+ | 11 // Interface
238
+ | 12 // Function
239
+ | 13 // Variable
240
+ | 14 // Constant
241
+ | 15 // String
242
+ | 16 // Number
243
+ | 17 // Boolean
244
+ | 18 // Array
245
+ | 19 // Object
246
+ | 20 // Key
247
+ | 21 // Null
248
+ | 22 // EnumMember
249
+ | 23 // Struct
250
+ | 24 // Event
251
+ | 25 // Operator
252
+ | 26; // TypeParameter
253
+
254
+ export const SYMBOL_KIND_NAMES: Record<SymbolKind, string> = {
255
+ 1: "File",
256
+ 2: "Module",
257
+ 3: "Namespace",
258
+ 4: "Package",
259
+ 5: "Class",
260
+ 6: "Method",
261
+ 7: "Property",
262
+ 8: "Field",
263
+ 9: "Constructor",
264
+ 10: "Enum",
265
+ 11: "Interface",
266
+ 12: "Function",
267
+ 13: "Variable",
268
+ 14: "Constant",
269
+ 15: "String",
270
+ 16: "Number",
271
+ 17: "Boolean",
272
+ 18: "Array",
273
+ 19: "Object",
274
+ 20: "Key",
275
+ 21: "Null",
276
+ 22: "EnumMember",
277
+ 23: "Struct",
278
+ 24: "Event",
279
+ 25: "Operator",
280
+ 26: "TypeParameter",
281
+ };
282
+
283
+ export interface DocumentSymbol {
284
+ name: string;
285
+ detail?: string;
286
+ kind: SymbolKind;
287
+ tags?: number[];
288
+ deprecated?: boolean;
289
+ range: Range;
290
+ selectionRange: Range;
291
+ children?: DocumentSymbol[];
292
+ }
293
+
294
+ export interface SymbolInformation {
295
+ name: string;
296
+ kind: SymbolKind;
297
+ tags?: number[];
298
+ deprecated?: boolean;
299
+ location: Location;
300
+ containerName?: string;
301
+ }
302
+
303
+ // =============================================================================
304
+ // Hover
305
+ // =============================================================================
306
+
307
+ export interface MarkupContent {
308
+ kind: "plaintext" | "markdown";
309
+ value: string;
310
+ }
311
+
312
+ export type MarkedString = string | { language: string; value: string };
313
+
314
+ export interface Hover {
315
+ contents: MarkupContent | MarkedString | MarkedString[];
316
+ range?: Range;
317
+ }
318
+
319
+ // =============================================================================
320
+ // Linter Client Interface
321
+ // =============================================================================
322
+
323
+ /**
324
+ * Interface for linter/formatter clients.
325
+ * Can be implemented using LSP protocol or CLI tools.
326
+ */
327
+ export interface LinterClient {
328
+ /** Format file content. Returns formatted content. */
329
+ format(filePath: string, content: string): Promise<string>;
330
+
331
+ /** Get diagnostics for a file. Content should already be written to disk. */
332
+ lint(filePath: string): Promise<Diagnostic[]>;
333
+
334
+ /** Dispose of any resources (e.g., LSP connection) */
335
+ dispose?(): void;
336
+ }
337
+
338
+ /** Factory function to create a LinterClient */
339
+ export type LinterClientFactory = (config: ServerConfig, cwd: string) => LinterClient;
340
+
341
+ // =============================================================================
342
+ // Server Configuration
343
+ // =============================================================================
344
+
345
+ export interface ServerCapabilities {
346
+ flycheck?: boolean;
347
+ ssr?: boolean;
348
+ expandMacro?: boolean;
349
+ runnables?: boolean;
350
+ relatedTests?: boolean;
351
+ }
352
+
353
+ export interface ServerConfig {
354
+ command: string;
355
+ args?: string[];
356
+ fileTypes: string[];
357
+ rootMarkers: string[];
358
+ initOptions?: Record<string, unknown>;
359
+ settings?: Record<string, unknown>;
360
+ disabled?: boolean;
361
+ capabilities?: ServerCapabilities;
362
+ /** If true, this is a linter/formatter server (e.g., Biome) - used only for diagnostics/actions, not type intelligence */
363
+ isLinter?: boolean;
364
+ /** Resolved absolute path to the command binary (set during config loading) */
365
+ resolvedCommand?: string;
366
+ /**
367
+ * Custom linter client factory. If provided, creates a custom client instead of using LSP.
368
+ * The client handles format/lint operations. Useful for tools with buggy LSP implementations.
369
+ */
370
+ createClient?: LinterClientFactory;
371
+ }
372
+
373
+ // =============================================================================
374
+ // Client State
375
+ // =============================================================================
376
+
377
+ export interface OpenFile {
378
+ version: number;
379
+ languageId: string;
380
+ }
381
+
382
+ export interface PendingRequest {
383
+ resolve: (result: unknown) => void;
384
+ reject: (error: Error) => void;
385
+ method: string;
386
+ }
387
+
388
+ export interface LspServerCapabilities {
389
+ renameProvider?: boolean | { prepareProvider?: boolean };
390
+ codeActionProvider?: boolean | { resolveProvider?: boolean };
391
+ hoverProvider?: boolean;
392
+ definitionProvider?: boolean;
393
+ referencesProvider?: boolean;
394
+ documentSymbolProvider?: boolean;
395
+ workspaceSymbolProvider?: boolean;
396
+ [key: string]: unknown;
397
+ }
398
+
399
+ export interface LspClient {
400
+ name: string;
401
+ cwd: string;
402
+ config: ServerConfig;
403
+ process: Subprocess;
404
+ requestId: number;
405
+ diagnostics: Map<string, Diagnostic[]>;
406
+ openFiles: Map<string, OpenFile>;
407
+ pendingRequests: Map<number, PendingRequest>;
408
+ messageBuffer: Uint8Array;
409
+ isReading: boolean;
410
+ serverCapabilities?: LspServerCapabilities;
411
+ lastActivity: number;
412
+ }
413
+
414
+ // =============================================================================
415
+ // Call Hierarchy Types
416
+ // =============================================================================
417
+
418
+ export interface CallHierarchyItem {
419
+ name: string;
420
+ kind: SymbolKind;
421
+ tags?: number[];
422
+ detail?: string;
423
+ uri: string;
424
+ range: Range;
425
+ selectionRange: Range;
426
+ data?: unknown;
427
+ }
428
+
429
+ export interface CallHierarchyIncomingCall {
430
+ from: CallHierarchyItem;
431
+ fromRanges: Range[];
432
+ }
433
+
434
+ export interface CallHierarchyOutgoingCall {
435
+ to: CallHierarchyItem;
436
+ fromRanges: Range[];
437
+ }
438
+
439
+ // =============================================================================
440
+ // Rust-analyzer Specific Types
441
+ // =============================================================================
442
+
443
+ export interface ExpandMacroResult {
444
+ name: string;
445
+ expansion: string;
446
+ }
447
+
448
+ export interface Runnable {
449
+ label: string;
450
+ kind: string;
451
+ args?: {
452
+ workspaceRoot?: string;
453
+ cargoArgs?: string[];
454
+ cargoExtraArgs?: string[];
455
+ executableArgs?: string[];
456
+ };
457
+ location?: {
458
+ targetUri: string;
459
+ targetRange?: Range;
460
+ targetSelectionRange?: Range;
461
+ };
462
+ }
463
+
464
+ export interface RelatedTest {
465
+ runnable?: {
466
+ label: string;
467
+ kind: string;
468
+ args?: Runnable["args"];
469
+ location?: Runnable["location"];
470
+ };
471
+ }
472
+
473
+ // =============================================================================
474
+ // JSON-RPC Protocol Types
475
+ // =============================================================================
476
+
477
+ export interface LspJsonRpcRequest {
478
+ jsonrpc: "2.0";
479
+ id: number;
480
+ method: string;
481
+ params: unknown;
482
+ }
483
+
484
+ export interface LspJsonRpcResponse {
485
+ jsonrpc: "2.0";
486
+ id?: number;
487
+ result?: unknown;
488
+ error?: { code: number; message: string; data?: unknown };
489
+ }
490
+
491
+ export interface LspJsonRpcNotification {
492
+ jsonrpc: "2.0";
493
+ method: string;
494
+ params?: unknown;
495
+ }