@mrclrchtr/supi-code-intelligence 1.16.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +373 -63
  2. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  9. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  12. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  13. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  14. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  15. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  16. package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  17. package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  18. package/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  19. package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  20. package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  21. package/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  22. package/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  23. package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  24. package/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  25. package/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  26. package/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  27. package/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  28. package/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  29. package/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  30. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  31. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  32. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  33. package/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  34. package/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  35. package/node_modules/@mrclrchtr/supi-lsp/README.md +44 -56
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  53. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  54. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  55. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  56. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  57. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  58. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  59. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  60. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  61. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  62. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  63. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  64. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  65. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  66. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  67. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  68. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  69. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.d.ts +21 -2
  70. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.js +1 -0
  71. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.d.ts +2 -1
  72. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/package.json +1 -1
  73. package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -31
  74. package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +27 -0
  75. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-refresh.ts +5 -0
  76. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +246 -1
  77. package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +4 -0
  78. package/node_modules/@mrclrchtr/supi-lsp/src/config/capabilities.ts +3 -0
  79. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +4 -2
  80. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +102 -0
  81. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-actions.ts +59 -0
  82. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-config.ts +4 -0
  83. package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +11 -0
  84. package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +1 -1
  85. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-project-info.ts +2 -1
  86. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +115 -26
  87. package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +177 -134
  88. package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +214 -0
  89. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +320 -0
  90. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +26 -5
  91. package/node_modules/@mrclrchtr/supi-lsp/src/session/service-registry.ts +81 -4
  92. package/node_modules/@mrclrchtr/supi-lsp/src/summary.ts +2 -0
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +18 -37
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  107. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  108. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  109. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  110. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  111. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  112. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  113. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  114. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  115. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  116. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  117. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  118. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  119. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  120. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  121. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  122. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  123. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  124. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  125. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  126. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  127. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/LICENSE +21 -0
  128. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/README.md +265 -0
  129. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs +4661 -0
  130. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs.map +7 -0
  131. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js +4605 -0
  132. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js.map +7 -0
  133. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm +0 -0
  134. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm.map +57 -0
  135. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/package.json +100 -0
  136. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs +4063 -0
  137. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs.map +7 -0
  138. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts +1025 -0
  139. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts.map +58 -0
  140. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts +1025 -0
  141. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts.map +58 -0
  142. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js +4007 -0
  143. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js.map +7 -0
  144. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm +0 -0
  145. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm.map +55 -0
  146. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +6 -12
  147. package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +29 -0
  148. package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +28 -0
  149. package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +5 -0
  150. package/node_modules/@mrclrchtr/supi-tree-sitter/src/provider/tree-sitter-provider.ts +14 -2
  151. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime-controller.ts +157 -0
  152. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +8 -1
  153. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +86 -0
  154. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +35 -16
  155. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/structure.ts +1 -0
  156. package/node_modules/@mrclrchtr/supi-tree-sitter/src/types.ts +10 -0
  157. package/package.json +14 -9
  158. package/src/{model.ts → analysis/architecture/discovery.ts} +15 -72
  159. package/src/analysis/architecture/model.ts +76 -0
  160. package/src/analysis/brief/directory.ts +324 -0
  161. package/src/analysis/brief/enrich.ts +157 -0
  162. package/src/analysis/brief/file.ts +84 -0
  163. package/src/analysis/brief/inventory.ts +177 -0
  164. package/src/analysis/brief/main.ts +176 -0
  165. package/src/analysis/brief/models.ts +75 -0
  166. package/src/{brief.ts → analysis/brief/public-brief.ts} +21 -26
  167. package/src/analysis/brief/summarize.ts +208 -0
  168. package/src/analysis/brief/types.ts +27 -0
  169. package/src/{use-case/generate-brief.ts → analysis/brief/use-case.ts} +67 -144
  170. package/src/analysis/coverage/coverage-warnings.ts +224 -0
  171. package/src/analysis/evidence.ts +91 -0
  172. package/src/{semantic-action-helpers.ts → analysis/helpers.ts} +4 -4
  173. package/src/analysis/provider.ts +186 -0
  174. package/src/analysis/read-next.ts +126 -0
  175. package/src/analysis/readiness.ts +73 -0
  176. package/src/{refactor → analysis/refactor}/safety.ts +1 -1
  177. package/src/{use-case/support/semantic-references.ts → analysis/references/semantic-refs.ts} +58 -26
  178. package/src/analysis/search/pattern.ts +345 -0
  179. package/src/analysis/search/ripgrep.ts +473 -0
  180. package/src/{git-context.ts → analysis/signals/git.ts} +20 -7
  181. package/src/{prioritization-signals.ts → analysis/signals/project.ts} +33 -19
  182. package/src/analysis/target/anchored.ts +349 -0
  183. package/src/analysis/target/bridge.ts +152 -0
  184. package/src/analysis/target/file-resolution.ts +125 -0
  185. package/src/{targeting/resolve-file.ts → analysis/target/file.ts} +40 -20
  186. package/src/{planner → analysis/target}/planner.ts +30 -20
  187. package/src/{targeting → analysis/target}/query.ts +17 -3
  188. package/src/analysis/target/resolve-common.ts +115 -0
  189. package/src/analysis/target/service.ts +229 -0
  190. package/src/analysis/target/symbol.ts +196 -0
  191. package/src/{targeting → analysis/target}/types.ts +17 -1
  192. package/src/analysis/tests/likely-tests.ts +174 -0
  193. package/src/analysis/tests/test-discovery.ts +540 -0
  194. package/src/analysis/tests/vitest.ts +87 -0
  195. package/src/api.ts +34 -41
  196. package/src/app/app.ts +125 -0
  197. package/src/app/manager.ts +65 -0
  198. package/src/extension.ts +132 -1
  199. package/src/index.ts +1 -57
  200. package/src/session/refactor-plans.ts +82 -0
  201. package/src/session/session.ts +300 -0
  202. package/src/session/target-store.ts +293 -0
  203. package/src/substrate/lsp/diagnostic-injection.ts +218 -0
  204. package/src/substrate/lsp/lifecycle.ts +66 -0
  205. package/src/substrate/lsp/overrides.ts +132 -0
  206. package/src/substrate/lsp/recovery.ts +55 -0
  207. package/src/substrate/lsp/settings.ts +286 -0
  208. package/src/substrate/lsp/state.ts +46 -0
  209. package/src/substrate/lsp/utils.ts +17 -0
  210. package/src/substrate/tree-sitter/lifecycle.ts +52 -0
  211. package/src/tool/find/execute.ts +118 -0
  212. package/src/{presentation/markdown/pattern.ts → tool/find/markdown.ts} +102 -53
  213. package/src/{use-case/generate-pattern.ts → tool/find/orchestrate.ts} +67 -33
  214. package/src/tool/find/semantic-search.ts +114 -0
  215. package/src/tool/find/tui.ts +39 -0
  216. package/src/tool/graph/callees.ts +87 -0
  217. package/src/tool/graph/calls-md.ts +54 -0
  218. package/src/tool/graph/collect-relation.ts +371 -0
  219. package/src/tool/graph/execute.ts +95 -0
  220. package/src/tool/graph/implementations-md.ts +79 -0
  221. package/src/tool/graph/implementations.ts +76 -0
  222. package/src/tool/graph/markdown-base.ts +243 -0
  223. package/src/tool/graph/orchestrate.ts +285 -0
  224. package/src/tool/graph/references-md.ts +34 -0
  225. package/src/tool/graph/references.ts +81 -0
  226. package/src/tool/graph/tui.ts +120 -0
  227. package/src/tool/graph/types.ts +97 -0
  228. package/src/tool/guidance.ts +96 -49
  229. package/src/tool/health/execute.ts +76 -0
  230. package/src/tool/health/markdown.ts +280 -0
  231. package/src/tool/health/orchestrate.ts +159 -0
  232. package/src/tool/health/sections/diagnostics.ts +182 -0
  233. package/src/tool/health/sections/recovery.ts +89 -0
  234. package/src/tool/health/sections/signals.ts +89 -0
  235. package/src/tool/health/tui.ts +137 -0
  236. package/src/tool/impact/analysis.ts +247 -0
  237. package/src/tool/impact/change-set-impact.ts +151 -0
  238. package/src/tool/impact/execute.ts +98 -0
  239. package/src/tool/impact/file-level-impact.ts +81 -0
  240. package/src/tool/impact/markdown.ts +283 -0
  241. package/src/tool/impact/orchestrate.ts +97 -0
  242. package/src/tool/impact/result.ts +21 -0
  243. package/src/tool/impact/single-impact.ts +89 -0
  244. package/src/tool/impact/tui.ts +39 -0
  245. package/src/tool/impact/types.ts +34 -0
  246. package/src/tool/infra/cross-field.ts +335 -0
  247. package/src/tool/infra/error-results.ts +199 -0
  248. package/src/tool/infra/pipeline.ts +311 -0
  249. package/src/tool/infra/progress.ts +21 -0
  250. package/src/tool/infra/readiness-message.ts +5 -0
  251. package/src/tool/infra/truncate.ts +49 -0
  252. package/src/tool/inspect/execute.ts +76 -0
  253. package/src/tool/inspect/markdown.ts +169 -0
  254. package/src/tool/inspect/orchestrate.ts +156 -0
  255. package/src/tool/inspect/tui.ts +36 -0
  256. package/src/tool/orientation/deps.ts +63 -0
  257. package/src/tool/orientation/execute.ts +50 -0
  258. package/src/tool/orientation/markdown.ts +35 -0
  259. package/src/tool/orientation/mode.ts +88 -0
  260. package/src/tool/orientation/orchestrate.ts +478 -0
  261. package/src/tool/orientation/precise-target.ts +257 -0
  262. package/src/tool/orientation/tui.ts +131 -0
  263. package/src/{refactor/apply-workspace-edit.ts → tool/refactor-apply/apply.ts} +39 -16
  264. package/src/tool/refactor-apply/execute.ts +20 -0
  265. package/src/tool/refactor-apply/markdown.ts +118 -0
  266. package/src/tool/refactor-apply/orchestrate.ts +89 -0
  267. package/src/tool/refactor-apply/tui.ts +51 -0
  268. package/src/tool/refactor-plan/execute.ts +73 -0
  269. package/src/tool/refactor-plan/markdown.ts +118 -0
  270. package/src/tool/refactor-plan/orchestrate.ts +363 -0
  271. package/src/tool/refactor-plan/tui.ts +42 -0
  272. package/src/tool/register.ts +123 -0
  273. package/src/tool/resolve/execute.ts +82 -0
  274. package/src/tool/resolve/markdown.ts +150 -0
  275. package/src/tool/resolve/orchestrate.ts +134 -0
  276. package/src/tool/resolve/tui.ts +40 -0
  277. package/src/tool/schemas.ts +337 -0
  278. package/src/tool/specs.ts +257 -0
  279. package/src/types/details.ts +188 -0
  280. package/src/types/execution.ts +60 -0
  281. package/src/types/index.ts +28 -0
  282. package/src/{intent/types.ts → types/tool-names.ts} +15 -14
  283. package/src/ui/footer.ts +52 -0
  284. package/src/ui/markdown/brief.ts +218 -0
  285. package/src/ui/markdown/gather.ts +177 -0
  286. package/src/{use-case/build-overview.ts → ui/markdown/overview-data.ts} +2 -2
  287. package/src/{presentation → ui}/markdown/overview.ts +2 -2
  288. package/src/ui/markdown/types.ts +80 -0
  289. package/{node_modules/@mrclrchtr/supi-lsp/src/ui/renderer.ts → src/ui/message-renderer.ts} +11 -10
  290. package/src/ui/status-command.ts +260 -0
  291. package/src/ui/status-overlay.ts +500 -0
  292. package/src/ui/tui/common.ts +220 -0
  293. package/src/ui/tui/index.ts +37 -0
  294. package/node_modules/@mrclrchtr/supi-lsp/src/extension.ts +0 -1
  295. package/node_modules/@mrclrchtr/supi-lsp/src/format.ts +0 -373
  296. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/diagnostic-injection.ts +0 -182
  297. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/session-lifecycle.ts +0 -149
  298. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/status-command.ts +0 -38
  299. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/workspace-recovery.ts +0 -92
  300. package/node_modules/@mrclrchtr/supi-lsp/src/lsp.ts +0 -37
  301. package/node_modules/@mrclrchtr/supi-lsp/src/session/lsp-state.ts +0 -93
  302. package/node_modules/@mrclrchtr/supi-lsp/src/session/settings-registration.ts +0 -296
  303. package/node_modules/@mrclrchtr/supi-lsp/src/session/tree-persist.ts +0 -75
  304. package/node_modules/@mrclrchtr/supi-lsp/src/tool/guidance.ts +0 -69
  305. package/node_modules/@mrclrchtr/supi-lsp/src/tool/names.ts +0 -27
  306. package/node_modules/@mrclrchtr/supi-lsp/src/tool/overrides.ts +0 -204
  307. package/node_modules/@mrclrchtr/supi-lsp/src/tool/register-tools.ts +0 -69
  308. package/node_modules/@mrclrchtr/supi-lsp/src/tool/service-actions.ts +0 -399
  309. package/node_modules/@mrclrchtr/supi-lsp/src/tool/tool-specs.ts +0 -248
  310. package/node_modules/@mrclrchtr/supi-lsp/src/ui/ui.ts +0 -360
  311. package/node_modules/@mrclrchtr/supi-lsp/src/workspace-change.ts +0 -40
  312. package/node_modules/@mrclrchtr/supi-tree-sitter/src/extension.ts +0 -1
  313. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/formatting.ts +0 -104
  314. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/guidance.ts +0 -35
  315. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/handlers.ts +0 -196
  316. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/register-tools.ts +0 -107
  317. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/tool-specs.ts +0 -117
  318. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tree-sitter.ts +0 -47
  319. package/src/brief-focused.ts +0 -563
  320. package/src/code-intelligence.ts +0 -70
  321. package/src/pattern-structured.ts +0 -194
  322. package/src/presentation/markdown/affected.ts +0 -170
  323. package/src/presentation/markdown/brief.ts +0 -174
  324. package/src/presentation/markdown/map.ts +0 -54
  325. package/src/presentation/markdown/refactor.ts +0 -27
  326. package/src/presentation/markdown/relations.ts +0 -121
  327. package/src/resolve-target.ts +0 -130
  328. package/src/search-helpers.ts +0 -303
  329. package/src/substrates/types.ts +0 -30
  330. package/src/target-resolution.ts +0 -122
  331. package/src/targeting/resolve-anchored.ts +0 -80
  332. package/src/targeting/resolve-symbol.ts +0 -110
  333. package/src/tool/execute-affected.ts +0 -71
  334. package/src/tool/execute-brief.ts +0 -59
  335. package/src/tool/execute-map.ts +0 -35
  336. package/src/tool/execute-pattern.ts +0 -29
  337. package/src/tool/execute-refactor.ts +0 -101
  338. package/src/tool/execute-relations.ts +0 -79
  339. package/src/tool/register-tools.ts +0 -32
  340. package/src/tool/tool-specs.ts +0 -190
  341. package/src/tool/validation.ts +0 -43
  342. package/src/types.ts +0 -169
  343. package/src/use-case/generate-affected.ts +0 -297
  344. package/src/use-case/generate-map.ts +0 -176
  345. package/src/use-case/generate-relations.ts +0 -438
  346. package/src/use-case/types.ts +0 -43
  347. package/src/workspace/request-context.ts +0 -139
  348. /package/src/{query-params.ts → tool/params.ts} +0 -0
@@ -1,69 +0,0 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
- import { getSessionLspService } from "../session/service-registry.ts";
3
- import type { LspToolPromptSurfaceMap } from "./guidance.ts";
4
- import { LSP_TOOL_DEFINITION_SPECS } from "./tool-specs.ts";
5
-
6
- /** Register the expert LSP toolset. Tools are re-registered on session_start to refresh guidance. */
7
- export function registerLspTools(pi: ExtensionAPI, promptSurfaces: LspToolPromptSurfaceMap): void {
8
- for (const spec of LSP_TOOL_DEFINITION_SPECS) {
9
- const surface = promptSurfaces[spec.name];
10
- pi.registerTool({
11
- name: spec.name,
12
- label: spec.label,
13
- description: surface.description,
14
- promptSnippet: surface.promptSnippet,
15
- promptGuidelines: surface.promptGuidelines,
16
- parameters: spec.parameters,
17
- execute: createToolExecutor(spec.run),
18
- });
19
- }
20
- }
21
-
22
- function getReadyService(cwd: string) {
23
- const state = getSessionLspService(cwd);
24
- return state.kind === "ready" ? state.service : null;
25
- }
26
-
27
- function describeUnavailableService(cwd: string): string {
28
- const state = getSessionLspService(cwd);
29
- switch (state.kind) {
30
- case "pending":
31
- return "LSP is still starting for this workspace. Retry in a moment.";
32
- case "inactive":
33
- return `LSP is inactive on the current session branch for ${cwd}.`;
34
- case "disabled":
35
- return `LSP is disabled for ${cwd}.`;
36
- case "unavailable":
37
- return state.reason;
38
- default:
39
- return "LSP not initialized. Start a new session first.";
40
- }
41
- }
42
-
43
- function createToolExecutor(
44
- run: (
45
- service: NonNullable<ReturnType<typeof getReadyService>>,
46
- cwd: string,
47
- params: unknown,
48
- ) => Promise<string>,
49
- ) {
50
- return async (
51
- _toolCallId: string,
52
- params: unknown,
53
- ...rest: [AbortSignal | undefined, unknown, ExtensionContext]
54
- ) => {
55
- const ctx = rest[2];
56
- const service = getReadyService(ctx.cwd);
57
- const text = service
58
- ? await run(service, ctx.cwd, params)
59
- : describeUnavailableService(ctx.cwd);
60
- return makeTextResult(text);
61
- };
62
- }
63
-
64
- function makeTextResult(text: string) {
65
- return {
66
- content: [{ type: "text" as const, text }],
67
- details: {},
68
- };
69
- }
@@ -1,399 +0,0 @@
1
- // Service-backed LSP tool actions used by the public expert toolset.
2
-
3
- import * as fs from "node:fs";
4
- import * as path from "node:path";
5
- import type { Position } from "../config/types.ts";
6
- import { formatDiagnostics } from "../diagnostics/diagnostics.ts";
7
- import {
8
- formatCodeActions,
9
- formatDocumentSymbols,
10
- formatHover,
11
- formatLocations,
12
- formatSymbolInformation,
13
- formatWorkspaceEdit,
14
- formatWorkspaceSymbols,
15
- normalizeLocations,
16
- } from "../format.ts";
17
- import type { SessionLspService } from "../session/service-registry.ts";
18
- import { resolveSessionPath } from "../utils.ts";
19
-
20
- export type LspLookupKind = "hover" | "definition" | "references" | "implementation";
21
- export type LspRefactorKind = "rename" | "code_actions";
22
-
23
- export interface LspLookupToolParams {
24
- kind: LspLookupKind;
25
- file: string;
26
- line: number;
27
- character: number;
28
- }
29
-
30
- export interface LspDocumentSymbolsToolParams {
31
- file: string;
32
- }
33
-
34
- export interface LspWorkspaceSymbolsToolParams {
35
- query: string;
36
- }
37
-
38
- export interface LspDiagnosticsToolParams {
39
- file?: string;
40
- }
41
-
42
- export interface LspRefactorToolParams {
43
- kind: LspRefactorKind;
44
- file: string;
45
- line: number;
46
- character: number;
47
- newName?: string;
48
- }
49
-
50
- function validatePositivePosition(line: number, character: number): string | null {
51
- if (!Number.isInteger(line) || line < 1) {
52
- return "Validation error: `line` must be a positive 1-based integer.";
53
- }
54
- if (!Number.isInteger(character) || character < 1) {
55
- return "Validation error: `character` must be a positive 1-based integer.";
56
- }
57
- return null;
58
- }
59
-
60
- function toZeroBased(line: number, character: number): Position {
61
- return { line: line - 1, character: character - 1 };
62
- }
63
-
64
- function validateFile(service: SessionLspService, cwd: string, file: string): string | null {
65
- const resolvedPath = resolveSessionPath(cwd, file);
66
- if (!fs.existsSync(resolvedPath)) {
67
- return `File not found: \`${file}\``;
68
- }
69
- if (!service.isSupportedSourceFile(file)) {
70
- return noServerMessage(resolvedPath);
71
- }
72
- return null;
73
- }
74
-
75
- function noServerMessage(filePath: string): string {
76
- return `No LSP server available for this file type (${path.extname(filePath) || "unknown"})`;
77
- }
78
-
79
- function formatUnexpectedFailure(label: string, error: unknown): string {
80
- const message = error instanceof Error ? error.message : String(error);
81
- return `LSP ${label} failed: ${message}`;
82
- }
83
-
84
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: semantic lookup dispatch stays clearer as a single position-based switch.
85
- export async function executeLookup(
86
- service: SessionLspService,
87
- cwd: string,
88
- params: LspLookupToolParams,
89
- ): Promise<string> {
90
- try {
91
- const positionError = validatePositivePosition(params.line, params.character);
92
- if (positionError) return positionError;
93
-
94
- const fileError = validateFile(service, cwd, params.file);
95
- if (fileError) return fileError;
96
-
97
- const position = toZeroBased(params.line, params.character);
98
- switch (params.kind) {
99
- case "hover": {
100
- const hover = await service.hover(params.file, position);
101
- return hover ? formatHover(hover) : "No hover information available at this position.";
102
- }
103
- case "definition": {
104
- const result = await service.definition(params.file, position);
105
- if (!result) return "No definition found.";
106
- const locations = normalizeLocations(result);
107
- return locations.length > 0
108
- ? formatLocations("Definition", locations, cwd)
109
- : "No definition found.";
110
- }
111
- case "references": {
112
- const references = await service.references(params.file, position);
113
- return references && references.length > 0
114
- ? formatLocations("References", references, cwd)
115
- : "No references found.";
116
- }
117
- case "implementation": {
118
- const result = await service.implementation(params.file, position);
119
- if (!result) return "No implementation found.";
120
- const locations = normalizeLocations(result);
121
- return locations.length > 0
122
- ? formatLocations("Implementation", locations, cwd)
123
- : "No implementation found.";
124
- }
125
- }
126
- } catch (error) {
127
- return formatUnexpectedFailure("lookup", error);
128
- }
129
- }
130
-
131
- // ---------------------------------------------------------------------------
132
- // Focused lookup tools (replacing the old multiplexed executeLookup)
133
- // ---------------------------------------------------------------------------
134
-
135
- export interface LspPositionToolParams {
136
- file: string;
137
- line: number;
138
- character: number;
139
- }
140
-
141
- export interface LspRenameToolParams {
142
- file: string;
143
- line: number;
144
- character: number;
145
- newName: string;
146
- }
147
-
148
- export async function executeHover(
149
- service: SessionLspService,
150
- cwd: string,
151
- params: LspPositionToolParams,
152
- ): Promise<string> {
153
- try {
154
- const positionError = validatePositivePosition(params.line, params.character);
155
- if (positionError) return positionError;
156
- const fileError = validateFile(service, cwd, params.file);
157
- if (fileError) return fileError;
158
- const position = toZeroBased(params.line, params.character);
159
- const hover = await service.hover(params.file, position);
160
- return hover ? formatHover(hover) : "No hover information available at this position.";
161
- } catch (error) {
162
- return formatUnexpectedFailure("hover", error);
163
- }
164
- }
165
-
166
- export async function executeDefinition(
167
- service: SessionLspService,
168
- cwd: string,
169
- params: LspPositionToolParams,
170
- ): Promise<string> {
171
- try {
172
- const positionError = validatePositivePosition(params.line, params.character);
173
- if (positionError) return positionError;
174
- const fileError = validateFile(service, cwd, params.file);
175
- if (fileError) return fileError;
176
- const position = toZeroBased(params.line, params.character);
177
- const result = await service.definition(params.file, position);
178
- if (!result) return "No definition found.";
179
- const locations = normalizeLocations(result);
180
- return locations.length > 0
181
- ? formatLocations("Definition", locations, cwd)
182
- : "No definition found.";
183
- } catch (error) {
184
- return formatUnexpectedFailure("definition", error);
185
- }
186
- }
187
-
188
- export async function executeReferences(
189
- service: SessionLspService,
190
- cwd: string,
191
- params: LspPositionToolParams,
192
- ): Promise<string> {
193
- try {
194
- const positionError = validatePositivePosition(params.line, params.character);
195
- if (positionError) return positionError;
196
- const fileError = validateFile(service, cwd, params.file);
197
- if (fileError) return fileError;
198
- const position = toZeroBased(params.line, params.character);
199
- const references = await service.references(params.file, position);
200
- return references && references.length > 0
201
- ? formatLocations("References", references, cwd)
202
- : "No references found.";
203
- } catch (error) {
204
- return formatUnexpectedFailure("references", error);
205
- }
206
- }
207
-
208
- export async function executeImplementation(
209
- service: SessionLspService,
210
- cwd: string,
211
- params: LspPositionToolParams,
212
- ): Promise<string> {
213
- try {
214
- const positionError = validatePositivePosition(params.line, params.character);
215
- if (positionError) return positionError;
216
- const fileError = validateFile(service, cwd, params.file);
217
- if (fileError) return fileError;
218
- const position = toZeroBased(params.line, params.character);
219
- const result = await service.implementation(params.file, position);
220
- if (!result) return "No implementation found.";
221
- const locations = normalizeLocations(result);
222
- return locations.length > 0
223
- ? formatLocations("Implementation", locations, cwd)
224
- : "No implementation found.";
225
- } catch (error) {
226
- return formatUnexpectedFailure("implementation", error);
227
- }
228
- }
229
-
230
- export async function executeRename(
231
- service: SessionLspService,
232
- cwd: string,
233
- params: LspRenameToolParams,
234
- ): Promise<string> {
235
- try {
236
- const positionError = validatePositivePosition(params.line, params.character);
237
- if (positionError) return positionError;
238
- const fileError = validateFile(service, cwd, params.file);
239
- if (fileError) return fileError;
240
- const newName = params.newName?.trim();
241
- if (!newName) {
242
- return "Validation error: `newName` is required for rename.";
243
- }
244
- const position = toZeroBased(params.line, params.character);
245
- const edit = await service.rename(params.file, position, newName);
246
- return edit ? formatWorkspaceEdit(edit, cwd) : "Rename not available at this position.";
247
- } catch (error) {
248
- return formatUnexpectedFailure("rename", error);
249
- }
250
- }
251
-
252
- export async function executeCodeActions(
253
- service: SessionLspService,
254
- cwd: string,
255
- params: LspPositionToolParams,
256
- ): Promise<string> {
257
- try {
258
- const positionError = validatePositivePosition(params.line, params.character);
259
- if (positionError) return positionError;
260
- const fileError = validateFile(service, cwd, params.file);
261
- if (fileError) return fileError;
262
- const position = toZeroBased(params.line, params.character);
263
- const actions = await service.codeActions(params.file, position);
264
- return actions && actions.length > 0
265
- ? formatCodeActions(actions)
266
- : "No code actions available at this position.";
267
- } catch (error) {
268
- return formatUnexpectedFailure("code actions", error);
269
- }
270
- }
271
-
272
- export async function executeDocumentSymbols(
273
- service: SessionLspService,
274
- cwd: string,
275
- params: LspDocumentSymbolsToolParams,
276
- ): Promise<string> {
277
- try {
278
- const fileError = validateFile(service, cwd, params.file);
279
- if (fileError) return fileError;
280
-
281
- const symbols = await service.documentSymbols(params.file);
282
- if (!symbols || symbols.length === 0) return "No document symbols found.";
283
-
284
- if ("children" in symbols[0] || "selectionRange" in symbols[0]) {
285
- return formatDocumentSymbols(symbols as import("../config/types.ts").DocumentSymbol[], 0);
286
- }
287
- return formatSymbolInformation(
288
- symbols as import("../config/types.ts").SymbolInformation[],
289
- cwd,
290
- );
291
- } catch (error) {
292
- return formatUnexpectedFailure("document symbol lookup", error);
293
- }
294
- }
295
-
296
- export async function executeWorkspaceSymbols(
297
- service: SessionLspService,
298
- cwd: string,
299
- params: LspWorkspaceSymbolsToolParams,
300
- ): Promise<string> {
301
- try {
302
- const query = params.query.trim();
303
- if (query.length === 0) {
304
- return "Validation error: `query` must be a non-empty string.";
305
- }
306
-
307
- const symbols = await service.workspaceSymbol(query);
308
- if (!symbols) return "Workspace symbol search is not supported by the active language servers.";
309
- if (symbols.length === 0) return `No symbols found for query \`${query}\`.`;
310
-
311
- return formatWorkspaceSymbols(symbols, cwd);
312
- } catch (error) {
313
- return formatUnexpectedFailure("workspace symbol lookup", error);
314
- }
315
- }
316
-
317
- export async function executeDiagnostics(
318
- service: SessionLspService,
319
- cwd: string,
320
- params: LspDiagnosticsToolParams,
321
- ): Promise<string> {
322
- try {
323
- if (params.file) {
324
- const resolvedPath = resolveSessionPath(cwd, params.file);
325
- if (!fs.existsSync(resolvedPath)) {
326
- return `File not found: \`${params.file}\``;
327
- }
328
- if (!service.isSupportedSourceFile(params.file)) {
329
- return noServerMessage(resolvedPath);
330
- }
331
-
332
- const diagnostics = await service.fileDiagnostics(params.file, 4);
333
- if (!diagnostics) return noServerMessage(resolvedPath);
334
- return formatDiagnostics(resolvedPath, diagnostics, cwd);
335
- }
336
-
337
- const summary = service.getWorkspaceDiagnosticSummary();
338
- if (summary.length === 0) return "No diagnostics across any files.";
339
-
340
- const lines = ["## Diagnostics Summary", ""];
341
- for (const entry of summary) {
342
- lines.push(`- **${entry.file}**: ${entry.errors} error(s), ${entry.warnings} warning(s)`);
343
- }
344
- return lines.join("\n");
345
- } catch (error) {
346
- return formatUnexpectedFailure("diagnostics", error);
347
- }
348
- }
349
-
350
- export async function executeRefactor(
351
- service: SessionLspService,
352
- cwd: string,
353
- params: LspRefactorToolParams,
354
- ): Promise<string> {
355
- try {
356
- const positionError = validatePositivePosition(params.line, params.character);
357
- if (positionError) return positionError;
358
-
359
- const fileError = validateFile(service, cwd, params.file);
360
- if (fileError) return fileError;
361
-
362
- const position = toZeroBased(params.line, params.character);
363
-
364
- if (params.kind === "rename") {
365
- if (!params.newName || params.newName.trim().length === 0) {
366
- return "Validation error: `newName` is required for rename.";
367
- }
368
-
369
- const edit = await service.rename(params.file, position, params.newName.trim());
370
- return edit ? formatWorkspaceEdit(edit, cwd) : "Rename not available at this position.";
371
- }
372
-
373
- const actions = await service.codeActions(params.file, position);
374
- return actions && actions.length > 0
375
- ? formatCodeActions(actions)
376
- : "No code actions available at this position.";
377
- } catch (error) {
378
- return formatUnexpectedFailure("refactor", error);
379
- }
380
- }
381
-
382
- export async function executeRecover(service: SessionLspService): Promise<string> {
383
- try {
384
- const result = await service.recoverDiagnostics({ restartIfStillStale: true });
385
- const refreshed = pluralize(result.refreshedClients, "client");
386
- const restarted = pluralize(result.restartedClients, "client");
387
- const status = result.staleAssessment.suspected
388
- ? "stale diagnostics still suspected"
389
- : "stale diagnostics cleared";
390
- const warning = result.staleAssessment.warning ? ` — ${result.staleAssessment.warning}` : "";
391
- return `LSP recovery complete: refreshed ${refreshed}, restarted ${restarted}, ${status}${warning}.`;
392
- } catch (error) {
393
- return formatUnexpectedFailure("recovery", error);
394
- }
395
- }
396
-
397
- function pluralize(count: number, word: string): string {
398
- return `${count} ${word}${count === 1 ? "" : "s"}`;
399
- }