gsd-pi 2.34.0-dev.ed0bfbf → 2.35.0-dev.30eec3f

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 (334) hide show
  1. package/dist/cli.js +7 -2
  2. package/dist/resource-loader.d.ts +1 -1
  3. package/dist/resource-loader.js +13 -1
  4. package/dist/resources/extensions/async-jobs/await-tool.js +0 -2
  5. package/dist/resources/extensions/async-jobs/job-manager.js +0 -6
  6. package/dist/resources/extensions/bg-shell/output-formatter.js +1 -19
  7. package/dist/resources/extensions/bg-shell/process-manager.js +0 -4
  8. package/dist/resources/extensions/bg-shell/types.js +0 -2
  9. package/dist/resources/extensions/context7/index.js +5 -0
  10. package/dist/resources/extensions/get-secrets-from-user.js +2 -30
  11. package/dist/resources/extensions/google-search/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +43 -1
  13. package/dist/resources/extensions/gsd/auto-loop.js +10 -1
  14. package/dist/resources/extensions/gsd/auto-recovery.js +35 -0
  15. package/dist/resources/extensions/gsd/auto-start.js +35 -2
  16. package/dist/resources/extensions/gsd/auto.js +59 -4
  17. package/dist/resources/extensions/gsd/changelog.js +162 -0
  18. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  19. package/dist/resources/extensions/gsd/commands-handlers.js +2 -2
  20. package/dist/resources/extensions/gsd/commands-inspect.js +10 -3
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -1
  22. package/dist/resources/extensions/gsd/commands.js +8 -1
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  24. package/dist/resources/extensions/gsd/doctor-checks.js +113 -5
  25. package/dist/resources/extensions/gsd/doctor-environment.js +26 -17
  26. package/dist/resources/extensions/gsd/doctor-proactive.js +22 -0
  27. package/dist/resources/extensions/gsd/doctor.js +36 -0
  28. package/dist/resources/extensions/gsd/files.js +11 -2
  29. package/dist/resources/extensions/gsd/gitignore.js +54 -7
  30. package/dist/resources/extensions/gsd/guided-flow.js +5 -3
  31. package/dist/resources/extensions/gsd/health-widget-core.js +96 -0
  32. package/dist/resources/extensions/gsd/health-widget.js +97 -46
  33. package/dist/resources/extensions/gsd/index.js +10 -1
  34. package/dist/resources/extensions/gsd/migrate-external.js +55 -2
  35. package/dist/resources/extensions/gsd/paths.js +74 -7
  36. package/dist/resources/extensions/gsd/post-unit-hooks.js +4 -1
  37. package/dist/resources/extensions/gsd/preferences-validation.js +54 -1
  38. package/dist/resources/extensions/gsd/preferences.js +2 -0
  39. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  40. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  41. package/dist/resources/extensions/gsd/roadmap-mutations.js +55 -0
  42. package/dist/resources/extensions/gsd/session-lock.js +26 -2
  43. package/dist/resources/extensions/gsd/templates/plan.md +8 -0
  44. package/dist/resources/extensions/gsd/worktree-resolver.js +12 -0
  45. package/dist/resources/extensions/remote-questions/remote-command.js +2 -22
  46. package/dist/resources/extensions/shared/mod.js +1 -1
  47. package/dist/resources/extensions/shared/sanitize.js +30 -0
  48. package/dist/resources/extensions/subagent/index.js +6 -14
  49. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  50. package/package.json +2 -1
  51. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  52. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  53. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  54. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  55. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  56. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  57. package/packages/pi-agent-core/dist/agent.js +11 -22
  58. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  59. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  60. package/packages/pi-agent-core/dist/proxy.js +2 -8
  61. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  62. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  63. package/packages/pi-agent-core/src/agent.ts +12 -23
  64. package/packages/pi-agent-core/src/proxy.ts +2 -8
  65. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  66. package/packages/pi-ai/dist/providers/azure-openai-responses.js +5 -41
  67. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  68. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  69. package/packages/pi-ai/dist/providers/openai-completions.js +10 -73
  70. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  71. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  72. package/packages/pi-ai/dist/providers/openai-responses.js +9 -80
  73. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  74. package/packages/pi-ai/dist/providers/openai-shared.d.ts +65 -0
  75. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -0
  76. package/packages/pi-ai/dist/providers/openai-shared.js +146 -0
  77. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -0
  78. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  79. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +7 -135
  80. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  81. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  82. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +7 -135
  83. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  84. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts +46 -0
  85. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts.map +1 -0
  86. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js +160 -0
  87. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js.map +1 -0
  88. package/packages/pi-ai/src/providers/azure-openai-responses.ts +11 -45
  89. package/packages/pi-ai/src/providers/openai-completions.ts +16 -86
  90. package/packages/pi-ai/src/providers/openai-responses.ts +16 -96
  91. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  92. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +14 -162
  93. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +13 -161
  94. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  95. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -63
  96. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  97. package/packages/pi-coding-agent/dist/core/agent-session.js +104 -641
  98. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  99. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +0 -1
  100. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  101. package/packages/pi-coding-agent/dist/core/auth-storage.js +4 -35
  102. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  103. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  104. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +5 -43
  105. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  106. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  107. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +11 -69
  108. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  109. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +40 -0
  110. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  111. package/packages/pi-coding-agent/dist/core/compaction/utils.js +78 -0
  112. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  113. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +77 -0
  114. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -0
  115. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +331 -0
  116. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -0
  117. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +2 -2
  118. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  119. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  120. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +15 -0
  122. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/extensions/runner.js +129 -243
  124. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  125. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +49 -42
  126. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  127. package/packages/pi-coding-agent/dist/core/extensions/types.js +2 -21
  128. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  129. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts +39 -0
  130. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts.map +1 -0
  131. package/packages/pi-coding-agent/dist/core/lock-utils.js +89 -0
  132. package/packages/pi-coding-agent/dist/core/lock-utils.js.map +1 -0
  133. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +2 -0
  134. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  135. package/packages/pi-coding-agent/dist/core/lsp/config.js +4 -1
  136. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  137. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  138. package/packages/pi-coding-agent/dist/core/lsp/index.js +52 -107
  139. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  140. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  141. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +2 -21
  142. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +0 -1
  144. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/lsp/types.js +0 -28
  146. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  148. package/packages/pi-coding-agent/dist/core/package-manager.js +2 -4
  149. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +2 -4
  151. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/core/resource-loader.js +46 -60
  153. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +87 -0
  155. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -0
  156. package/packages/pi-coding-agent/dist/core/retry-handler.js +295 -0
  157. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -0
  158. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -1
  159. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/session-manager.js +3 -28
  161. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -0
  163. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  164. package/packages/pi-coding-agent/dist/core/settings-manager.js +76 -166
  165. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  167. package/packages/pi-coding-agent/dist/core/skills.js +1 -3
  168. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  169. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  170. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  171. package/packages/pi-coding-agent/dist/index.js +1 -1
  172. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  173. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts +1 -1
  174. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  175. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +9 -26
  176. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -13
  179. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  180. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  181. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  182. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +61 -0
  183. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  184. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  185. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +6 -9
  186. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  187. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -0
  188. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  189. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -16
  190. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  192. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  193. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  194. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  195. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  196. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  197. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +15 -0
  198. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  199. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  200. package/packages/pi-coding-agent/dist/modes/print-mode.js +2 -30
  201. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  202. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -28
  204. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts +19 -0
  206. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  207. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js +45 -0
  208. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js.map +1 -0
  209. package/packages/pi-coding-agent/dist/utils/error.d.ts +5 -0
  210. package/packages/pi-coding-agent/dist/utils/error.d.ts.map +1 -0
  211. package/packages/pi-coding-agent/dist/utils/error.js +7 -0
  212. package/packages/pi-coding-agent/dist/utils/error.js.map +1 -0
  213. package/packages/pi-coding-agent/package.json +1 -1
  214. package/packages/pi-coding-agent/src/core/agent-session.ts +117 -745
  215. package/packages/pi-coding-agent/src/core/auth-storage.ts +4 -38
  216. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +7 -53
  217. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +14 -74
  218. package/packages/pi-coding-agent/src/core/compaction/utils.ts +100 -0
  219. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +424 -0
  220. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -21
  221. package/packages/pi-coding-agent/src/core/extensions/runner.ts +119 -243
  222. package/packages/pi-coding-agent/src/core/extensions/types.ts +50 -69
  223. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  224. package/packages/pi-coding-agent/src/core/lsp/config.ts +4 -1
  225. package/packages/pi-coding-agent/src/core/lsp/index.ts +83 -152
  226. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +2 -22
  227. package/packages/pi-coding-agent/src/core/lsp/types.ts +0 -29
  228. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -4
  229. package/packages/pi-coding-agent/src/core/resource-loader.ts +56 -69
  230. package/packages/pi-coding-agent/src/core/retry-handler.ts +359 -0
  231. package/packages/pi-coding-agent/src/core/session-manager.ts +3 -30
  232. package/packages/pi-coding-agent/src/core/settings-manager.ts +85 -164
  233. package/packages/pi-coding-agent/src/core/skills.ts +1 -4
  234. package/packages/pi-coding-agent/src/index.ts +1 -7
  235. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +17 -29
  236. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -13
  237. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +81 -0
  238. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +14 -19
  239. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -18
  240. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  241. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +14 -0
  242. package/packages/pi-coding-agent/src/modes/print-mode.ts +2 -30
  243. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -28
  244. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  245. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  246. package/packages/pi-tui/dist/components/markdown.d.ts +5 -0
  247. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  248. package/packages/pi-tui/dist/components/markdown.js +25 -31
  249. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  250. package/packages/pi-tui/dist/keys.d.ts +0 -4
  251. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  252. package/packages/pi-tui/dist/keys.js +94 -162
  253. package/packages/pi-tui/dist/keys.js.map +1 -1
  254. package/packages/pi-tui/src/components/markdown.ts +25 -29
  255. package/packages/pi-tui/src/keys.ts +94 -173
  256. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -0
  257. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  258. package/pkg/dist/modes/interactive/theme/theme.js +6 -16
  259. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  260. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  261. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  262. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  263. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  264. package/pkg/package.json +1 -1
  265. package/src/resources/extensions/async-jobs/await-tool.ts +0 -2
  266. package/src/resources/extensions/async-jobs/job-manager.ts +0 -7
  267. package/src/resources/extensions/bg-shell/output-formatter.ts +0 -17
  268. package/src/resources/extensions/bg-shell/process-manager.ts +0 -4
  269. package/src/resources/extensions/bg-shell/types.ts +0 -12
  270. package/src/resources/extensions/context7/index.ts +7 -0
  271. package/src/resources/extensions/get-secrets-from-user.ts +2 -35
  272. package/src/resources/extensions/google-search/index.ts +7 -0
  273. package/src/resources/extensions/gsd/auto-dispatch.ts +49 -1
  274. package/src/resources/extensions/gsd/auto-loop.ts +11 -1
  275. package/src/resources/extensions/gsd/auto-recovery.ts +39 -0
  276. package/src/resources/extensions/gsd/auto-start.ts +42 -2
  277. package/src/resources/extensions/gsd/auto.ts +61 -3
  278. package/src/resources/extensions/gsd/changelog.ts +213 -0
  279. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  280. package/src/resources/extensions/gsd/commands-handlers.ts +2 -2
  281. package/src/resources/extensions/gsd/commands-inspect.ts +10 -3
  282. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +5 -1
  283. package/src/resources/extensions/gsd/commands.ts +9 -1
  284. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  285. package/src/resources/extensions/gsd/doctor-checks.ts +107 -5
  286. package/src/resources/extensions/gsd/doctor-environment.ts +26 -16
  287. package/src/resources/extensions/gsd/doctor-proactive.ts +24 -0
  288. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  289. package/src/resources/extensions/gsd/doctor.ts +35 -0
  290. package/src/resources/extensions/gsd/files.ts +12 -2
  291. package/src/resources/extensions/gsd/gitignore.ts +54 -7
  292. package/src/resources/extensions/gsd/guided-flow.ts +5 -3
  293. package/src/resources/extensions/gsd/health-widget-core.ts +129 -0
  294. package/src/resources/extensions/gsd/health-widget.ts +103 -59
  295. package/src/resources/extensions/gsd/index.ts +10 -1
  296. package/src/resources/extensions/gsd/migrate-external.ts +47 -2
  297. package/src/resources/extensions/gsd/paths.ts +73 -7
  298. package/src/resources/extensions/gsd/post-unit-hooks.ts +5 -1
  299. package/src/resources/extensions/gsd/preferences-validation.ts +54 -1
  300. package/src/resources/extensions/gsd/preferences.ts +2 -0
  301. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  302. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  303. package/src/resources/extensions/gsd/roadmap-mutations.ts +66 -0
  304. package/src/resources/extensions/gsd/session-lock.ts +29 -2
  305. package/src/resources/extensions/gsd/templates/plan.md +8 -0
  306. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
  307. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +98 -2
  308. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +59 -3
  309. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +20 -0
  310. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +214 -0
  311. package/src/resources/extensions/gsd/tests/health-widget.test.ts +158 -0
  312. package/src/resources/extensions/gsd/tests/paths.test.ts +113 -0
  313. package/src/resources/extensions/gsd/tests/preferences.test.ts +40 -2
  314. package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
  315. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +15 -0
  316. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +2 -0
  317. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +32 -0
  318. package/src/resources/extensions/gsd/worktree-resolver.ts +11 -0
  319. package/src/resources/extensions/remote-questions/remote-command.ts +2 -23
  320. package/src/resources/extensions/shared/mod.ts +1 -1
  321. package/src/resources/extensions/shared/sanitize.ts +36 -0
  322. package/src/resources/extensions/subagent/index.ts +6 -12
  323. package/src/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  324. package/dist/resources/extensions/shared/wizard-ui.js +0 -478
  325. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  326. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  327. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  328. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  329. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  330. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  331. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  332. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  333. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  334. package/src/resources/extensions/shared/wizard-ui.ts +0 -551
@@ -4,7 +4,7 @@ import * as path from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { ensureFileOpen, getActiveClients, getOrCreateClient, refreshFile, sendRequest, setIdleTimeout, WARMUP_TIMEOUT_MS, } from "./client.js";
7
- import { getServersForFile, loadConfig, hasRootMarkers, resolveCommand } from "./config.js";
7
+ import { getServerForFile, getServersForFile, loadConfig, hasRootMarkers, resolveCommand } from "./config.js";
8
8
  import { applyTextEdits, applyWorkspaceEdit } from "./edits.js";
9
9
  import { ToolAbortError, clampTimeout, throwIfAborted } from "./helpers.js";
10
10
  import { detectLspmux } from "./lspmux.js";
@@ -62,13 +62,6 @@ function getConfig(cwd) {
62
62
  function getLspServers(config) {
63
63
  return Object.entries(config.servers);
64
64
  }
65
- function getLspServersForFile(config, filePath) {
66
- return getServersForFile(config, filePath);
67
- }
68
- function getLspServerForFile(config, filePath) {
69
- const servers = getLspServersForFile(config, filePath);
70
- return servers.length > 0 ? servers[0] : null;
71
- }
72
65
  const DIAGNOSTIC_MESSAGE_LIMIT = 50;
73
66
  const SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;
74
67
  const BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;
@@ -105,6 +98,48 @@ async function formatLocationWithContext(location, cwd) {
105
98
  }
106
99
  return `${header}\n${context.map(lineText => ` ${lineText}`).join("\n")}`;
107
100
  }
101
+ async function formatLocationResults(result, label, cwd) {
102
+ const locations = normalizeLocationResult(result);
103
+ if (locations.length === 0) {
104
+ return `No ${label} found`;
105
+ }
106
+ const lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));
107
+ return `Found ${locations.length} ${label}(s):\n${lines.join("\n")}`;
108
+ }
109
+ async function formatCallHierarchyResults(client, position, uri, direction, cwd, signal) {
110
+ const prepareResult = (await sendRequest(client, "textDocument/prepareCallHierarchy", { textDocument: { uri }, position }, signal));
111
+ if (!prepareResult || prepareResult.length === 0) {
112
+ return "No call hierarchy item found at this position";
113
+ }
114
+ const method = direction === "incoming" ? "callHierarchy/incomingCalls" : "callHierarchy/outgoingCalls";
115
+ const callResult = (await sendRequest(client, method, { item: prepareResult[0] }, signal));
116
+ if (!callResult || callResult.length === 0) {
117
+ const verb = direction === "incoming" ? "incoming calls" : "outgoing calls";
118
+ const prep = direction === "incoming" ? "for" : "from";
119
+ return `No ${verb} found ${prep} ${prepareResult[0].name}`;
120
+ }
121
+ const lines = [];
122
+ const limited = callResult.slice(0, REFERENCE_CONTEXT_LIMIT);
123
+ for (const call of limited) {
124
+ const item = "from" in call ? call.from : call.to;
125
+ const header = formatCallHierarchyItem(item, cwd);
126
+ const filePath = uriToFile(item.uri);
127
+ const callLine = ("from" in call ? call.fromRanges[0]?.start.line : undefined) ?? item.selectionRange.start.line;
128
+ const context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);
129
+ if (context.length > 0) {
130
+ lines.push(` ${header}\n${context.map(l => ` ${l}`).join("\n")}`);
131
+ }
132
+ else {
133
+ lines.push(` ${header}`);
134
+ }
135
+ }
136
+ const noun = direction === "incoming" ? "caller" : "callee";
137
+ const prep = direction === "incoming" ? "of" : "from";
138
+ const truncation = callResult.length > REFERENCE_CONTEXT_LIMIT
139
+ ? `\n ... ${callResult.length - REFERENCE_CONTEXT_LIMIT} additional ${noun}(s) omitted`
140
+ : "";
141
+ return `${callResult.length} ${noun}(s) ${prep} ${prepareResult[0].name}:\n${lines.join("\n")}${truncation}`;
142
+ }
108
143
  async function reloadServer(client, serverName, signal) {
109
144
  let output = `Restarted ${serverName}`;
110
145
  const reloadMethods = ["rust-analyzer/reloadWorkspace", "workspace/didChangeConfiguration"];
@@ -489,7 +524,7 @@ export function createLspTool(cwd) {
489
524
  };
490
525
  }
491
526
  // File-specific actions
492
- const serverInfo = resolvedFile ? getLspServerForFile(config, resolvedFile) : null;
527
+ const serverInfo = resolvedFile ? getServerForFile(config, resolvedFile) : null;
493
528
  if (!serverInfo) {
494
529
  return {
495
530
  content: [{ type: "text", text: "No language server found for this action" }],
@@ -512,48 +547,18 @@ export function createLspTool(cwd) {
512
547
  let output;
513
548
  switch (action) {
514
549
  case "definition": {
515
- const result = (await sendRequest(client, "textDocument/definition", {
516
- textDocument: { uri },
517
- position,
518
- }, signal));
519
- const locations = normalizeLocationResult(result);
520
- if (locations.length === 0) {
521
- output = "No definition found";
522
- }
523
- else {
524
- const lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));
525
- output = `Found ${locations.length} definition(s):\n${lines.join("\n")}`;
526
- }
550
+ const result = await sendRequest(client, "textDocument/definition", { textDocument: { uri }, position }, signal);
551
+ output = await formatLocationResults(result, "definition", cwd);
527
552
  break;
528
553
  }
529
554
  case "type_definition": {
530
- const result = (await sendRequest(client, "textDocument/typeDefinition", {
531
- textDocument: { uri },
532
- position,
533
- }, signal));
534
- const locations = normalizeLocationResult(result);
535
- if (locations.length === 0) {
536
- output = "No type definition found";
537
- }
538
- else {
539
- const lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));
540
- output = `Found ${locations.length} type definition(s):\n${lines.join("\n")}`;
541
- }
555
+ const result = await sendRequest(client, "textDocument/typeDefinition", { textDocument: { uri }, position }, signal);
556
+ output = await formatLocationResults(result, "type definition", cwd);
542
557
  break;
543
558
  }
544
559
  case "implementation": {
545
- const result = (await sendRequest(client, "textDocument/implementation", {
546
- textDocument: { uri },
547
- position,
548
- }, signal));
549
- const locations = normalizeLocationResult(result);
550
- if (locations.length === 0) {
551
- output = "No implementation found";
552
- }
553
- else {
554
- const lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));
555
- output = `Found ${locations.length} implementation(s):\n${lines.join("\n")}`;
556
- }
560
+ const result = await sendRequest(client, "textDocument/implementation", { textDocument: { uri }, position }, signal);
561
+ output = await formatLocationResults(result, "implementation", cwd);
557
562
  break;
558
563
  }
559
564
  case "references": {
@@ -683,71 +688,11 @@ export function createLspTool(cwd) {
683
688
  break;
684
689
  }
685
690
  case "incoming_calls": {
686
- const prepareResult = (await sendRequest(client, "textDocument/prepareCallHierarchy", {
687
- textDocument: { uri },
688
- position,
689
- }, signal));
690
- if (!prepareResult || prepareResult.length === 0) {
691
- output = "No call hierarchy item found at this position";
692
- break;
693
- }
694
- const incomingResult = (await sendRequest(client, "callHierarchy/incomingCalls", { item: prepareResult[0] }, signal));
695
- if (!incomingResult || incomingResult.length === 0) {
696
- output = `No incoming calls found for ${prepareResult[0].name}`;
697
- break;
698
- }
699
- const incomingLines = [];
700
- const limitedIncoming = incomingResult.slice(0, REFERENCE_CONTEXT_LIMIT);
701
- for (const call of limitedIncoming) {
702
- const header = formatCallHierarchyItem(call.from, cwd);
703
- const filePath = uriToFile(call.from.uri);
704
- const callLine = call.fromRanges[0]?.start.line ?? call.from.selectionRange.start.line;
705
- const context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);
706
- if (context.length > 0) {
707
- incomingLines.push(` ${header}\n${context.map(l => ` ${l}`).join("\n")}`);
708
- }
709
- else {
710
- incomingLines.push(` ${header}`);
711
- }
712
- }
713
- const truncation = incomingResult.length > REFERENCE_CONTEXT_LIMIT
714
- ? `\n ... ${incomingResult.length - REFERENCE_CONTEXT_LIMIT} additional caller(s) omitted`
715
- : "";
716
- output = `${incomingResult.length} caller(s) of ${prepareResult[0].name}:\n${incomingLines.join("\n")}${truncation}`;
691
+ output = await formatCallHierarchyResults(client, position, uri, "incoming", cwd, signal);
717
692
  break;
718
693
  }
719
694
  case "outgoing_calls": {
720
- const prepareResult = (await sendRequest(client, "textDocument/prepareCallHierarchy", {
721
- textDocument: { uri },
722
- position,
723
- }, signal));
724
- if (!prepareResult || prepareResult.length === 0) {
725
- output = "No call hierarchy item found at this position";
726
- break;
727
- }
728
- const outgoingResult = (await sendRequest(client, "callHierarchy/outgoingCalls", { item: prepareResult[0] }, signal));
729
- if (!outgoingResult || outgoingResult.length === 0) {
730
- output = `No outgoing calls found from ${prepareResult[0].name}`;
731
- break;
732
- }
733
- const outgoingLines = [];
734
- const limitedOutgoing = outgoingResult.slice(0, REFERENCE_CONTEXT_LIMIT);
735
- for (const call of limitedOutgoing) {
736
- const header = formatCallHierarchyItem(call.to, cwd);
737
- const filePath = uriToFile(call.to.uri);
738
- const callLine = call.to.selectionRange.start.line;
739
- const context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);
740
- if (context.length > 0) {
741
- outgoingLines.push(` ${header}\n${context.map(l => ` ${l}`).join("\n")}`);
742
- }
743
- else {
744
- outgoingLines.push(` ${header}`);
745
- }
746
- }
747
- const outTruncation = outgoingResult.length > REFERENCE_CONTEXT_LIMIT
748
- ? `\n ... ${outgoingResult.length - REFERENCE_CONTEXT_LIMIT} additional callee(s) omitted`
749
- : "";
750
- output = `${outgoingResult.length} callee(s) from ${prepareResult[0].name}:\n${outgoingLines.join("\n")}${outTruncation}`;
695
+ output = await formatCallHierarchyResults(client, position, uri, "outgoing", cwd, signal);
751
696
  break;
752
697
  }
753
698
  case "format": {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServersForFile, type LspConfig, loadConfig, hasRootMarkers, resolveCommand } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nfunction getLspServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {\n\treturn getServersForFile(config, filePath);\n}\n\nfunction getLspServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {\n\tconst servers = getLspServersForFile(config, filePath);\n\treturn servers.length > 0 ? servers[0] : null;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tlet serverStatus: string;\n\t\t\t\tif (servers.length > 0) {\n\t\t\t\t\tserverStatus = `Active language servers: ${servers.join(\", \")}`;\n\t\t\t\t} else {\n\t\t\t\t\t// Diagnose why no servers were detected\n\t\t\t\t\tconst DEFAULTS = (await import(\"./defaults.json\", { with: { type: \"json\" } })).default as Record<string, { command: string; rootMarkers: string[] }>;\n\t\t\t\t\tconst diagnostics: string[] = [\"No language servers configured for this project.\"];\n\t\t\t\t\tconst matchedButMissing: string[] = [];\n\t\t\t\t\tconst noMarkers: string[] = [];\n\n\t\t\t\t\tfor (const [name, def] of Object.entries(DEFAULTS)) {\n\t\t\t\t\t\tif (hasRootMarkers(cwd, def.rootMarkers)) {\n\t\t\t\t\t\t\tconst resolved = resolveCommand(def.command, cwd);\n\t\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\t\tmatchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (matchedButMissing.length > 0) {\n\t\t\t\t\t\tdiagnostics.push(\"\\nDetected projects missing language servers:\");\n\t\t\t\t\t\tdiagnostics.push(...matchedButMissing);\n\t\t\t\t\t\tdiagnostics.push(\"\\nInstall the missing server command and restart GSD, or run: lsp reload\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiagnostics.push(\"No recognized project markers found in the working directory.\");\n\t\t\t\t\t\tdiagnostics.push(\"LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tserverStatus = diagnostics.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getLspServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No type definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} type definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No implementation found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} implementation(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/incomingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyIncomingCall[] | null;\n\n\t\t\t\t\t\tif (!incomingResult || incomingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No incoming calls found for ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingLines: string[] = [];\n\t\t\t\t\t\tconst limitedIncoming = incomingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedIncoming) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.from, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.from.uri);\n\t\t\t\t\t\t\tconst callLine = call.fromRanges[0]?.start.line ?? call.from.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst truncation = incomingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${incomingResult.length - REFERENCE_CONTEXT_LIMIT} additional caller(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${incomingResult.length} caller(s) of ${prepareResult[0].name}:\\n${incomingLines.join(\"\\n\")}${truncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/outgoingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyOutgoingCall[] | null;\n\n\t\t\t\t\t\tif (!outgoingResult || outgoingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No outgoing calls found from ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingLines: string[] = [];\n\t\t\t\t\t\tconst limitedOutgoing = outgoingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedOutgoing) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.to, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.to.uri);\n\t\t\t\t\t\t\tconst callLine = call.to.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outTruncation = outgoingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${outgoingResult.length - REFERENCE_CONTEXT_LIMIT} additional callee(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${outgoingResult.length} callee(s) from ${prepareResult[0].name}:\\n${outgoingLines.join(\"\\n\")}${outTruncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServerForFile, getServersForFile, type LspConfig, loadConfig, hasRootMarkers, resolveCommand } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function formatLocationResults(\n\tresult: Location | Location[] | LocationLink | LocationLink[] | null,\n\tlabel: string,\n\tcwd: string,\n): Promise<string> {\n\tconst locations = normalizeLocationResult(result);\n\tif (locations.length === 0) {\n\t\treturn `No ${label} found`;\n\t}\n\tconst lines = await Promise.all(locations.map(location => formatLocationWithContext(location, cwd)));\n\treturn `Found ${locations.length} ${label}(s):\\n${lines.join(\"\\n\")}`;\n}\n\nasync function formatCallHierarchyResults(\n\tclient: LspClient,\n\tposition: { line: number; character: number },\n\turi: string,\n\tdirection: \"incoming\" | \"outgoing\",\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst prepareResult = (await sendRequest(\n\t\tclient,\n\t\t\"textDocument/prepareCallHierarchy\",\n\t\t{ textDocument: { uri }, position },\n\t\tsignal,\n\t)) as CallHierarchyItem[] | null;\n\n\tif (!prepareResult || prepareResult.length === 0) {\n\t\treturn \"No call hierarchy item found at this position\";\n\t}\n\n\tconst method = direction === \"incoming\" ? \"callHierarchy/incomingCalls\" : \"callHierarchy/outgoingCalls\";\n\tconst callResult = (await sendRequest(client, method, { item: prepareResult[0] }, signal)) as\n\t\t| CallHierarchyIncomingCall[]\n\t\t| CallHierarchyOutgoingCall[]\n\t\t| null;\n\n\tif (!callResult || callResult.length === 0) {\n\t\tconst verb = direction === \"incoming\" ? \"incoming calls\" : \"outgoing calls\";\n\t\tconst prep = direction === \"incoming\" ? \"for\" : \"from\";\n\t\treturn `No ${verb} found ${prep} ${prepareResult[0].name}`;\n\t}\n\n\tconst lines: string[] = [];\n\tconst limited = callResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\tfor (const call of limited) {\n\t\tconst item = \"from\" in call ? call.from : call.to;\n\t\tconst header = formatCallHierarchyItem(item, cwd);\n\t\tconst filePath = uriToFile(item.uri);\n\t\tconst callLine = (\"from\" in call ? call.fromRanges[0]?.start.line : undefined) ?? item.selectionRange.start.line;\n\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\tif (context.length > 0) {\n\t\t\tlines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t} else {\n\t\t\tlines.push(` ${header}`);\n\t\t}\n\t}\n\n\tconst noun = direction === \"incoming\" ? \"caller\" : \"callee\";\n\tconst prep = direction === \"incoming\" ? \"of\" : \"from\";\n\tconst truncation = callResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t? `\\n ... ${callResult.length - REFERENCE_CONTEXT_LIMIT} additional ${noun}(s) omitted`\n\t\t: \"\";\n\treturn `${callResult.length} ${noun}(s) ${prep} ${prepareResult[0].name}:\\n${lines.join(\"\\n\")}${truncation}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tlet serverStatus: string;\n\t\t\t\tif (servers.length > 0) {\n\t\t\t\t\tserverStatus = `Active language servers: ${servers.join(\", \")}`;\n\t\t\t\t} else {\n\t\t\t\t\t// Diagnose why no servers were detected\n\t\t\t\t\tconst DEFAULTS = (await import(\"./defaults.json\", { with: { type: \"json\" } })).default as Record<string, { command: string; rootMarkers: string[] }>;\n\t\t\t\t\tconst diagnostics: string[] = [\"No language servers configured for this project.\"];\n\t\t\t\t\tconst matchedButMissing: string[] = [];\n\t\t\t\t\tconst noMarkers: string[] = [];\n\n\t\t\t\t\tfor (const [name, def] of Object.entries(DEFAULTS)) {\n\t\t\t\t\t\tif (hasRootMarkers(cwd, def.rootMarkers)) {\n\t\t\t\t\t\t\tconst resolved = resolveCommand(def.command, cwd);\n\t\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\t\tmatchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (matchedButMissing.length > 0) {\n\t\t\t\t\t\tdiagnostics.push(\"\\nDetected projects missing language servers:\");\n\t\t\t\t\t\tdiagnostics.push(...matchedButMissing);\n\t\t\t\t\t\tdiagnostics.push(\"\\nInstall the missing server command and restart GSD, or run: lsp reload\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiagnostics.push(\"No recognized project markers found in the working directory.\");\n\t\t\t\t\t\tdiagnostics.push(\"LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tserverStatus = diagnostics.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"type definition\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{ textDocument: { uri }, position },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\toutput = await formatLocationResults(result as Location | Location[] | LocationLink | LocationLink[] | null, \"implementation\", cwd);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"incoming\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\toutput = await formatCallHierarchyResults(client, position, uri, \"outgoing\", cwd, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lspmux.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AAMH,UAAU,YAAY;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,WAAW;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAkGD,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyBzD;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AA+BD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAGtG"}
1
+ {"version":3,"file":"lspmux.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AAMH,UAAU,YAAY;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,WAAW;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AA6ED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyBzD;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AA+BD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAGtG"}
@@ -1,8 +1,9 @@
1
- import { execSync, spawn } from "node:child_process";
1
+ import { spawn } from "node:child_process";
2
2
  import * as fsPromises from "node:fs/promises";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import { LSP_LIVENESS_TIMEOUT_MS, LSP_STATE_CACHE_TTL_MS } from "../constants.js";
6
+ import { which } from "./config.js";
6
7
  // =============================================================================
7
8
  // Constants
8
9
  // =============================================================================
@@ -10,26 +11,6 @@ const DEFAULT_SUPPORTED_SERVERS = new Set([
10
11
  "rust-analyzer",
11
12
  ]);
12
13
  // =============================================================================
13
- // Helpers
14
- // =============================================================================
15
- function which(command) {
16
- try {
17
- // On Windows, prefer `where.exe` over `which` — MSYS/Git Bash's `which`
18
- // returns POSIX paths (/c/Users/...) that Node's spawn() can't execute (#1121).
19
- const isWindows = process.platform === "win32";
20
- const cmd = isWindows ? "where.exe" : "which";
21
- const result = isWindows
22
- ? execSync(`${cmd} ${command}`, { encoding: "utf-8" })
23
- : execSync(`which ${command}`, { encoding: "utf-8" });
24
- // `where.exe` may return multiple lines — take the first
25
- const resolved = result.trim().split(/\r?\n/)[0]?.trim();
26
- return resolved || null;
27
- }
28
- catch {
29
- return null;
30
- }
31
- }
32
- // =============================================================================
33
14
  // Config Path
34
15
  // =============================================================================
35
16
  function getConfigPath() {