@mrclrchtr/supi-lsp 1.7.0 → 1.8.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 (206) hide show
  1. package/README.md +13 -8
  2. package/node_modules/@mrclrchtr/supi-core/package.json +13 -2
  3. package/node_modules/@mrclrchtr/supi-core/src/api.ts +26 -92
  4. package/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
  5. package/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
  6. package/node_modules/@mrclrchtr/supi-core/src/index.ts +26 -92
  7. package/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
  8. package/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
  9. package/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
  10. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
  11. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
  12. package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
  13. package/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
  14. package/node_modules/vscode-jsonrpc/License.txt +11 -0
  15. package/node_modules/vscode-jsonrpc/README.md +69 -0
  16. package/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
  17. package/node_modules/vscode-jsonrpc/browser.js +7 -0
  18. package/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
  19. package/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
  20. package/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
  21. package/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
  22. package/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
  23. package/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
  24. package/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
  25. package/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
  26. package/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
  27. package/node_modules/vscode-jsonrpc/lib/common/connection.js +1214 -0
  28. package/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
  29. package/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
  30. package/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
  31. package/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
  32. package/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
  33. package/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
  34. package/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
  35. package/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
  36. package/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
  37. package/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
  38. package/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
  39. package/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
  40. package/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
  41. package/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
  42. package/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
  43. package/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
  44. package/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
  45. package/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
  46. package/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
  47. package/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
  48. package/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
  49. package/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
  50. package/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
  51. package/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
  52. package/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
  53. package/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
  54. package/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
  55. package/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
  56. package/node_modules/vscode-jsonrpc/node.cmd +5 -0
  57. package/node_modules/vscode-jsonrpc/node.d.ts +6 -0
  58. package/node_modules/vscode-jsonrpc/node.js +7 -0
  59. package/node_modules/vscode-jsonrpc/package.json +45 -0
  60. package/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
  61. package/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
  62. package/node_modules/vscode-languageserver-protocol/License.txt +11 -0
  63. package/node_modules/vscode-languageserver-protocol/README.md +16 -0
  64. package/node_modules/vscode-languageserver-protocol/browser.d.ts +6 -0
  65. package/node_modules/vscode-languageserver-protocol/browser.js +7 -0
  66. package/node_modules/vscode-languageserver-protocol/lib/browser/main.d.ts +4 -0
  67. package/node_modules/vscode-languageserver-protocol/lib/browser/main.js +28 -0
  68. package/node_modules/vscode-languageserver-protocol/lib/common/api.d.ts +58 -0
  69. package/node_modules/vscode-languageserver-protocol/lib/common/api.js +77 -0
  70. package/node_modules/vscode-languageserver-protocol/lib/common/connection.d.ts +187 -0
  71. package/node_modules/vscode-languageserver-protocol/lib/common/connection.js +15 -0
  72. package/node_modules/vscode-languageserver-protocol/lib/common/messages.d.ts +51 -0
  73. package/node_modules/vscode-languageserver-protocol/lib/common/messages.js +44 -0
  74. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.d.ts +1 -0
  75. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.js +43 -0
  76. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.d.ts +86 -0
  77. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.js +42 -0
  78. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.d.ts +66 -0
  79. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.js +32 -0
  80. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.d.ts +35 -0
  81. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.js +24 -0
  82. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.d.ts +3252 -0
  83. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.d.ts +37 -0
  84. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.js +22 -0
  85. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.d.ts +341 -0
  86. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.js +74 -0
  87. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.d.ts +306 -0
  88. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.js +101 -0
  89. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.d.ts +109 -0
  90. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.js +30 -0
  91. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.d.ts +38 -0
  92. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.js +21 -0
  93. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.d.ts +110 -0
  94. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.js +43 -0
  95. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.d.ts +57 -0
  96. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.js +22 -0
  97. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.d.ts +86 -0
  98. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.js +30 -0
  99. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.js +943 -0
  100. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.d.ts +52 -0
  101. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.js +19 -0
  102. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.d.ts +106 -0
  103. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.js +68 -0
  104. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.d.ts +400 -0
  105. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.js +214 -0
  106. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.d.ts +107 -0
  107. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.js +37 -0
  108. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.d.ts +41 -0
  109. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.js +20 -0
  110. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.d.ts +223 -0
  111. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.js +57 -0
  112. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.d.ts +72 -0
  113. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.js +22 -0
  114. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.d.ts +38 -0
  115. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.js +21 -0
  116. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.d.ts +83 -0
  117. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.js +42 -0
  118. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.d.ts +74 -0
  119. package/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.js +27 -0
  120. package/node_modules/vscode-languageserver-protocol/lib/common/utils/is.d.ts +9 -0
  121. package/node_modules/vscode-languageserver-protocol/lib/common/utils/is.js +46 -0
  122. package/node_modules/vscode-languageserver-protocol/lib/node/main.d.ts +6 -0
  123. package/node_modules/vscode-languageserver-protocol/lib/node/main.js +28 -0
  124. package/node_modules/vscode-languageserver-protocol/metaModel.schema.json +783 -0
  125. package/node_modules/vscode-languageserver-protocol/node.cmd +5 -0
  126. package/node_modules/vscode-languageserver-protocol/node.d.ts +6 -0
  127. package/node_modules/vscode-languageserver-protocol/node.js +7 -0
  128. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/License.txt +11 -0
  129. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/README.md +69 -0
  130. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
  131. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.js +7 -0
  132. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
  133. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
  134. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
  135. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
  136. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
  137. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
  138. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
  139. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
  140. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
  141. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.js +1212 -0
  142. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
  143. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
  144. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
  145. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
  146. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
  147. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
  148. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
  149. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
  150. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
  151. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
  152. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
  153. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
  154. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
  155. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
  156. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
  157. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
  158. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
  159. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
  160. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
  161. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
  162. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
  163. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
  164. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
  165. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
  166. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
  167. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
  168. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
  169. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
  170. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.cmd +5 -0
  171. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.d.ts +6 -0
  172. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.js +7 -0
  173. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/package.json +45 -0
  174. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
  175. package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
  176. package/node_modules/vscode-languageserver-protocol/package.json +45 -0
  177. package/node_modules/vscode-languageserver-protocol/thirdpartynotices.txt +31 -0
  178. package/node_modules/vscode-languageserver-types/License.txt +11 -0
  179. package/node_modules/vscode-languageserver-types/README.md +17 -0
  180. package/node_modules/vscode-languageserver-types/lib/esm/main.d.ts +3139 -0
  181. package/node_modules/vscode-languageserver-types/lib/esm/main.js +2222 -0
  182. package/node_modules/vscode-languageserver-types/lib/esm/package.json +3 -0
  183. package/node_modules/vscode-languageserver-types/lib/umd/main.d.ts +3139 -0
  184. package/node_modules/vscode-languageserver-types/lib/umd/main.js +2272 -0
  185. package/node_modules/vscode-languageserver-types/package.json +38 -0
  186. package/node_modules/vscode-languageserver-types/thirdpartynotices.txt +16 -0
  187. package/package.json +2 -2
  188. package/src/config/config.ts +1 -1
  189. package/src/handlers/diagnostic-injection.ts +182 -0
  190. package/src/handlers/session-lifecycle.ts +139 -0
  191. package/src/handlers/status-command.ts +38 -0
  192. package/src/handlers/workspace-recovery.ts +92 -0
  193. package/src/lsp.ts +15 -413
  194. package/src/manager/manager-helpers.ts +1 -1
  195. package/src/manager/manager-workspace-symbol.ts +1 -1
  196. package/src/manager/manager.ts +1 -1
  197. package/src/session/scanner.ts +1 -1
  198. package/src/session/service-registry.ts +1 -1
  199. package/src/session/settings-registration.ts +1 -1
  200. package/src/tool/guidance.ts +5 -14
  201. package/src/tool/names.ts +12 -4
  202. package/src/tool/register-tools.ts +2 -3
  203. package/src/tool/service-actions.ts +141 -0
  204. package/src/tool/tool-specs.ts +93 -93
  205. package/src/utils.ts +1 -1
  206. package/src/workspace-change.ts +40 -0
package/src/lsp.ts CHANGED
@@ -1,71 +1,19 @@
1
- // LSP Extension for pi — registers an expert semantic toolset, keeps language servers warm,
2
- // surfaces inline diagnostics, and injects diagnostic context only when outstanding issues exist.
3
- // biome-ignore-all lint/nursery/noExcessiveLinesPerFile: lsp.ts stays cohesive wiring; recovery and sentinel helpers live in focused modules.
4
-
5
- import * as path from "node:path";
6
- import type {
7
- AgentEndEvent,
8
- BeforeAgentStartEvent,
9
- BeforeAgentStartEventResult,
10
- ContextEvent,
11
- ExtensionAPI,
12
- ExtensionContext,
13
- SessionStartEvent,
14
- ToolResultEvent,
15
- } from "@earendil-works/pi-coding-agent";
16
- import { pruneAndReorderContextMessages, restorePromptContent } from "@mrclrchtr/supi-core/api";
17
- import { loadConfig, resolveLanguageAlias } from "./config/config.ts";
18
- import { clearTsconfigCache } from "./config/tsconfig-scope.ts";
19
- import { FileChangeType, type FileEvent } from "./config/types.ts";
20
- import {
21
- diagnosticsContextFingerprint,
22
- formatDiagnosticsContext,
23
- MAX_DETAILED_DIAGNOSTICS,
24
- } from "./diagnostics/diagnostic-context.ts";
25
- import { formatDiagnosticsDisplayContent } from "./diagnostics/diagnostic-display.ts";
26
- import { assessStaleDiagnostics } from "./diagnostics/stale-diagnostics.ts";
27
- import {
28
- isWorkspaceRecoveryTrigger,
29
- scanWorkspaceSentinels,
30
- syncWorkspaceSentinelSnapshot,
31
- } from "./diagnostics/workspace-sentinels.ts";
32
- import { LspManager } from "./manager/manager.ts";
33
- import { forceResyncStaleModuleFiles } from "./manager/manager-stale-resync.ts";
34
- import {
35
- createRuntimeState,
36
- disableLspState,
37
- ensureLspToolsActive,
38
- isLspAwareTool,
39
- type LspRuntimeState,
40
- refreshProjectServers,
41
- removeLspTools,
42
- } from "./session/lsp-state.ts";
43
- import {
44
- scanMissingServers,
45
- scanProjectCapabilities,
46
- startDetectedServers,
47
- } from "./session/scanner.ts";
48
- import {
49
- clearSessionLspService,
50
- SessionLspService,
51
- setSessionLspServiceState,
52
- } from "./session/service-registry.ts";
53
- import {
54
- getLspDisabledMessage,
55
- loadLspSettings,
56
- registerLspSettings,
57
- } from "./session/settings-registration.ts";
58
- import {
59
- persistLspActiveState,
60
- persistLspInactiveState,
61
- registerTreePersistHandlers,
62
- } from "./session/tree-persist.ts";
63
- import { buildLspToolPromptSurfaces, defaultLspToolPromptSurfaces } from "./tool/guidance.ts";
1
+ // LSP Extension for pi — wires together the expert semantic toolset and all
2
+ // event/behaviour handlers. Handler registration is delegated to focused
3
+ // modules so each orchestration concern lives in its own file.
4
+
5
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
+ import { registerDiagnosticInjectionHandlers } from "./handlers/diagnostic-injection.ts";
7
+ import { registerSessionLifecycleHandlers } from "./handlers/session-lifecycle.ts";
8
+ import { registerLspStatusCommand } from "./handlers/status-command.ts";
9
+ import { registerWorkspaceRecoveryHandler } from "./handlers/workspace-recovery.ts";
10
+ import { createRuntimeState } from "./session/lsp-state.ts";
11
+ import { registerLspSettings } from "./session/settings-registration.ts";
12
+ import { registerTreePersistHandlers } from "./session/tree-persist.ts";
13
+ import { defaultLspToolPromptSurfaces } from "./tool/guidance.ts";
64
14
  import { registerLspAwareToolOverrides } from "./tool/overrides.ts";
65
15
  import { registerLspTools } from "./tool/register-tools.ts";
66
16
  import { registerLspMessageRenderer } from "./ui/renderer.ts";
67
- import { toggleLspStatusOverlay, updateLspUi } from "./ui/ui.ts";
68
- import { fileToUri, resolveSessionPath } from "./utils.ts";
69
17
 
70
18
  export default function lspExtension(pi: ExtensionAPI) {
71
19
  registerLspSettings();
@@ -79,355 +27,9 @@ export default function lspExtension(pi: ExtensionAPI) {
79
27
 
80
28
  registerLspTools(pi, defaultLspToolPromptSurfaces);
81
29
  registerSessionLifecycleHandlers(pi, state);
82
- registerBehaviorHandlers(pi, state);
30
+ registerDiagnosticInjectionHandlers(pi, state);
31
+ registerWorkspaceRecoveryHandler(pi, state);
83
32
  registerTreePersistHandlers(pi, state);
84
33
  registerLspStatusCommand(pi, state);
85
34
  registerLspMessageRenderer(pi);
86
35
  }
87
-
88
- function registerSessionLifecycleHandlers(pi: ExtensionAPI, state: LspRuntimeState): void {
89
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: session_start orchestrates setup, server detection, settings, and persistence.
90
- pi.on("session_start", async (_event: SessionStartEvent, ctx: ExtensionContext) => {
91
- if (state.manager) {
92
- clearSessionLspService(state.manager.getCwd());
93
- await state.manager.shutdownAll();
94
- }
95
-
96
- const cwd = ctx.cwd;
97
- clearTsconfigCache();
98
- const lspSettings = loadLspSettings(cwd);
99
-
100
- if (!lspSettings.enabled) {
101
- clearSessionLspService(cwd);
102
- disableLspState(pi, state);
103
- persistLspInactiveState(pi, state);
104
- setSessionLspServiceState(cwd, { kind: "disabled" });
105
- return;
106
- }
107
-
108
- state.inlineSeverity = lspSettings.severity;
109
-
110
- const config = loadConfig(cwd);
111
-
112
- // Apply server allowlist filter from supi shared config
113
- if (lspSettings.active.length > 0) {
114
- const allowList = new Set(lspSettings.active.map(resolveLanguageAlias));
115
- for (const name of Object.keys(config.servers)) {
116
- if (!allowList.has(name)) {
117
- delete config.servers[name];
118
- }
119
- }
120
- }
121
-
122
- clearSessionLspService(cwd);
123
- state.manager = new LspManager(config, cwd);
124
- state.manager.setExcludePatterns(lspSettings.exclude ?? []);
125
- setSessionLspServiceState(cwd, { kind: "pending" });
126
- state.detectedServers = scanProjectCapabilities(config, cwd);
127
- state.manager.registerDetectedServers(state.detectedServers);
128
- await startDetectedServers(state.manager, state.detectedServers);
129
-
130
- const missing = scanMissingServers(config, cwd);
131
- if (missing.length > 0) {
132
- const parts = missing.map((m) => `${m.name} (${m.command})`);
133
- ctx.ui.notify(
134
- `LSP server not found for: ${parts.join(", ")}. Install the server to enable language intelligence.`,
135
- "warning",
136
- );
137
- }
138
-
139
- state.sentinelSnapshot = scanWorkspaceSentinels(cwd);
140
- state.lastWorkspaceChangeAt = 0;
141
- state.staleSuspected = false;
142
- refreshProjectServers(state);
143
- state.lastDiagnosticsFingerprint = null;
144
- state.currentContextToken = null;
145
- state.lspActive = true;
146
- setSessionLspServiceState(cwd, {
147
- kind: "ready",
148
- service: new SessionLspService(state.manager),
149
- });
150
- registerLspTools(pi, buildLspToolPromptSurfaces(state.projectServers, cwd));
151
- ensureLspToolsActive(pi);
152
- persistLspActiveState(pi, state);
153
- updateLspUi(ctx, state.manager, state.inlineSeverity, state.projectServers);
154
- });
155
-
156
- pi.on("session_shutdown", async () => {
157
- clearTsconfigCache();
158
- if (state.manager) {
159
- clearSessionLspService(state.manager.getCwd());
160
- await state.manager.shutdownAll();
161
- state.manager = null;
162
- }
163
-
164
- state.inspector.close?.();
165
- state.detectedServers = [];
166
- state.projectServers = [];
167
- state.lastDiagnosticsFingerprint = null;
168
- state.currentContextToken = null;
169
- state.staleSuspected = false;
170
- state.lastWorkspaceChangeAt = 0;
171
- state.sentinelSnapshot = new Map();
172
- });
173
-
174
- pi.on("agent_end", async (_event: AgentEndEvent, ctx: ExtensionContext) => {
175
- state.currentContextToken = null;
176
- refreshProjectServers(state);
177
-
178
- if (state.manager) {
179
- updateLspUi(ctx, state.manager, state.inlineSeverity, state.projectServers);
180
- }
181
- });
182
- }
183
-
184
- function markWorkspaceChange(state: LspRuntimeState): void {
185
- state.lastWorkspaceChangeAt = Date.now();
186
- state.staleSuspected = true;
187
- state.lastDiagnosticsFingerprint = null;
188
- state.currentContextToken = null;
189
- }
190
-
191
- function softRecoverWorkspaceChanges(
192
- state: LspRuntimeState,
193
- changes: import("./config/types.ts").FileEvent[],
194
- ): boolean {
195
- if (!state.manager || changes.length === 0) return false;
196
-
197
- clearTsconfigCache();
198
- state.manager.clearAllPullResultIds();
199
- state.manager.notifyWorkspaceFileChanges(changes);
200
- markWorkspaceChange(state);
201
- return true;
202
- }
203
-
204
- function refreshWorkspaceSentinels(state: LspRuntimeState, cwd: string): boolean {
205
- const { snapshot, changes } = syncWorkspaceSentinelSnapshot(cwd, state.sentinelSnapshot);
206
- state.sentinelSnapshot = snapshot;
207
- return softRecoverWorkspaceChanges(state, changes);
208
- }
209
-
210
- function shouldInvalidateTsconfigScopeCache(filePath: string): boolean {
211
- const ext = path.extname(filePath).toLowerCase();
212
- return ext === ".json" || ext === ".jsonc";
213
- }
214
-
215
- function recoverWorkspaceChangesFromToolResult(
216
- state: LspRuntimeState,
217
- cwd: string,
218
- event: { toolName: string; isError: boolean; input?: unknown },
219
- ): boolean {
220
- if (!state.manager || event.isError) return false;
221
- if (event.toolName !== "write" && event.toolName !== "edit") return false;
222
- if (!event.input || typeof event.input !== "object") return false;
223
-
224
- const pathValue = (event.input as { path?: unknown }).path;
225
- if (typeof pathValue !== "string") return false;
226
-
227
- const resolvedPath = resolveSessionPath(cwd, pathValue);
228
- if (shouldInvalidateTsconfigScopeCache(resolvedPath)) {
229
- clearTsconfigCache();
230
- }
231
- const fileEvent: FileEvent = { uri: fileToUri(resolvedPath), type: FileChangeType.Changed };
232
-
233
- // Sentinel files (package.json, tsconfig.json, lockfiles, .d.ts)
234
- if (isWorkspaceRecoveryTrigger(resolvedPath, cwd)) {
235
- if (resolvedPath.endsWith(".d.ts")) {
236
- return softRecoverWorkspaceChanges(state, [fileEvent]);
237
- }
238
-
239
- const { snapshot, changes } = syncWorkspaceSentinelSnapshot(cwd, state.sentinelSnapshot);
240
- state.sentinelSnapshot = snapshot;
241
- return softRecoverWorkspaceChanges(state, changes.length > 0 ? changes : [fileEvent]);
242
- }
243
-
244
- // Source files matching an active language server's file types
245
- if (state.manager.hasServerForExtension(resolvedPath)) {
246
- return softRecoverWorkspaceChanges(state, [fileEvent]);
247
- }
248
-
249
- return false;
250
- }
251
-
252
- /** Build the `lsp-context` custom message used to surface outstanding diagnostics. */
253
- // biome-ignore lint/complexity/useMaxParams: wrapper groups the prompt payload fields in one place.
254
- function buildDiagnosticResult(
255
- diagnostics: import("./manager/manager-types.ts").OutstandingDiagnosticSummaryEntry[],
256
- detailed: { file: string; diagnostics: import("./config/types.ts").Diagnostic[] }[] | undefined,
257
- severity: number,
258
- token: string,
259
- staleWarning?: string | null,
260
- ): BeforeAgentStartEventResult {
261
- return {
262
- message: {
263
- customType: "lsp-context",
264
- content: formatDiagnosticsDisplayContent(diagnostics, detailed),
265
- display: true,
266
- details: {
267
- contextToken: token,
268
- promptContent: formatDiagnosticsContext(diagnostics, 3, detailed, staleWarning),
269
- inlineSeverity: severity,
270
- ...(staleWarning ? { staleWarning } : {}),
271
- diagnostics: diagnostics.map((d) => ({
272
- file: d.file,
273
- errors: d.errors,
274
- warnings: d.warnings,
275
- information: d.information,
276
- hints: d.hints,
277
- })),
278
- },
279
- },
280
- };
281
- }
282
-
283
- function registerBehaviorHandlers(pi: ExtensionAPI, state: LspRuntimeState): void {
284
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: before_agent_start coordinates sentinel recovery, pruning, refresh, and diagnostic injection.
285
- pi.on("before_agent_start", async (_event: BeforeAgentStartEvent, ctx: ExtensionContext) => {
286
- if (!state.manager || !state.lspActive) {
287
- removeLspTools(pi);
288
- if (!state.manager && state.lspActive) {
289
- persistLspInactiveState(pi, state);
290
- }
291
- return;
292
- }
293
-
294
- ensureLspToolsActive(pi);
295
-
296
- refreshWorkspaceSentinels(state, ctx.cwd);
297
-
298
- /**
299
- * Two-pass prune/refresh pattern:
300
- *
301
- * 1. Prune files deleted since the last turn and send didClose.
302
- * 2. Re-sync remaining open docs and wait for diagnostics to settle.
303
- * 3. Prune *again* — late publishDiagnostics notifications (already
304
- * in-flight when step 1 ran) may have re-created stale entries for
305
- * files that no longer exist. `getAllDiagnostics()` also filters
306
- * by existence, so this second pass is belt-and-suspenders.
307
- */
308
- state.manager.pruneMissingFiles();
309
- try {
310
- await state.manager.refreshOpenDiagnostics();
311
- } catch {
312
- // Refresh failures must not prevent agent startup
313
- }
314
- state.manager.pruneMissingFiles();
315
-
316
- // Force re-open files with module-resolution errors to clear stale
317
- // diagnostics that persist when the TS server caches by content hash.
318
- // Must run before the diagnostic summary so fresh results are captured.
319
- try {
320
- await forceResyncStaleModuleFiles(state.manager, ctx.cwd);
321
- } catch {
322
- // Best-effort: don't fail the agent turn
323
- }
324
-
325
- refreshProjectServers(state);
326
- updateLspUi(ctx, state.manager, state.inlineSeverity, state.projectServers);
327
-
328
- const diagnostics = state.manager.getOutstandingDiagnosticSummary(state.inlineSeverity);
329
- const totalDiags = diagnostics.reduce((sum, d) => sum + d.total, 0);
330
- const detailed =
331
- totalDiags <= MAX_DETAILED_DIAGNOSTICS
332
- ? state.manager.getOutstandingDiagnostics(state.inlineSeverity)
333
- : undefined;
334
- const staleAssessment = state.staleSuspected
335
- ? assessStaleDiagnostics(state.manager.getOutstandingDiagnostics(4))
336
- : { suspected: false, matchedFiles: [], warning: null };
337
- state.staleSuspected = staleAssessment.suspected;
338
-
339
- const staleWarning = staleAssessment.suspected ? staleAssessment.warning : null;
340
- const content = formatDiagnosticsContext(diagnostics, 3, detailed, staleWarning);
341
- const fingerprint = diagnosticsContextFingerprint(content);
342
-
343
- if (!content) {
344
- state.lastDiagnosticsFingerprint = null;
345
- state.currentContextToken = null;
346
- return;
347
- }
348
-
349
- if (fingerprint === state.lastDiagnosticsFingerprint) {
350
- state.currentContextToken = null;
351
- return;
352
- }
353
-
354
- state.lastDiagnosticsFingerprint = fingerprint;
355
- state.currentContextToken = `lsp-context-${++state.contextCounter}`;
356
-
357
- return buildDiagnosticResult(
358
- diagnostics,
359
- detailed,
360
- state.inlineSeverity,
361
- state.currentContextToken,
362
- staleWarning,
363
- );
364
- });
365
-
366
- pi.on("context", (event: ContextEvent) => {
367
- const messages = pruneAndReorderContextMessages(
368
- event.messages as Array<{
369
- role?: string;
370
- customType?: string;
371
- content?: unknown;
372
- details?: unknown;
373
- }>,
374
- "lsp-context",
375
- state.currentContextToken,
376
- );
377
- const contextMessages = restorePromptContent(
378
- messages,
379
- "lsp-context",
380
- state.currentContextToken,
381
- ) as typeof event.messages;
382
-
383
- if (
384
- contextMessages.length === event.messages.length &&
385
- contextMessages.every((message, index) => message === event.messages[index])
386
- ) {
387
- return;
388
- }
389
- return { messages: contextMessages };
390
- });
391
-
392
- pi.on("tool_result", async (event: ToolResultEvent, ctx: ExtensionContext) => {
393
- if (!state.manager) return;
394
-
395
- const recoveryTriggered = recoverWorkspaceChangesFromToolResult(state, ctx.cwd, {
396
- toolName: event.toolName,
397
- isError: event.isError,
398
- input: (event as { input?: unknown }).input,
399
- });
400
-
401
- if (recoveryTriggered || isLspAwareTool(event.toolName)) {
402
- refreshProjectServers(state);
403
- updateLspUi(ctx, state.manager, state.inlineSeverity, state.projectServers);
404
- }
405
- });
406
- }
407
-
408
- function registerLspStatusCommand(pi: ExtensionAPI, state: LspRuntimeState): void {
409
- pi.registerCommand("lsp-status", {
410
- description: "Show detected LSP servers, roots, open files, and diagnostics",
411
- handler: async (_args: string, ctx: ExtensionContext) => {
412
- const lspSettings = loadLspSettings(ctx.cwd);
413
- if (!lspSettings.enabled) {
414
- ctx.ui.notify(getLspDisabledMessage(ctx.cwd), "warning");
415
- return;
416
- }
417
-
418
- if (!state.manager) {
419
- ctx.ui.notify("LSP not initialized", "warning");
420
- return;
421
- }
422
-
423
- refreshProjectServers(state);
424
- toggleLspStatusOverlay(
425
- ctx,
426
- state.manager,
427
- state.inlineSeverity,
428
- state.inspector,
429
- state.projectServers,
430
- );
431
- },
432
- });
433
- }
@@ -1,5 +1,5 @@
1
1
  import * as path from "node:path";
2
- import * as projectRoots from "@mrclrchtr/supi-core/api";
2
+ import * as projectRoots from "@mrclrchtr/supi-core/project";
3
3
  import { isGlobMatch } from "../pattern-matcher.ts";
4
4
  import { resolveSessionPath } from "../utils.ts";
5
5
 
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { walkProject } from "@mrclrchtr/supi-core/api";
3
+ import { walkProject } from "@mrclrchtr/supi-core/project";
4
4
  import type { LspClient } from "../client/client.ts";
5
5
  import type {
6
6
  DocumentSymbol,
@@ -2,7 +2,7 @@
2
2
  // biome-ignore-all lint/nursery/noExcessiveLinesPerFile: LspManager stays cohesive; recovery and sync helpers are split into manager-*.ts modules.
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
- import * as projectRoots from "@mrclrchtr/supi-core/api";
5
+ import * as projectRoots from "@mrclrchtr/supi-core/project";
6
6
  import { LspClient } from "../client/client.ts";
7
7
  import { getServerForFile } from "../config/config.ts";
8
8
  import type {
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { dedupeTopmostRoots, walkProject } from "@mrclrchtr/supi-core/api";
3
+ import { dedupeTopmostRoots, walkProject } from "@mrclrchtr/supi-core/project";
4
4
  import type {
5
5
  DetectedProjectServer,
6
6
  LspConfig,
@@ -2,7 +2,7 @@
2
2
  // Peer extensions can import `getSessionLspService` from the package root
3
3
  // to reuse the active LSP runtime without starting duplicate servers.
4
4
 
5
- import { createSessionStateRegistry } from "@mrclrchtr/supi-core/api";
5
+ import { createSessionStateRegistry } from "@mrclrchtr/supi-core/session";
6
6
  import type {
7
7
  CodeAction,
8
8
  Diagnostic,
@@ -7,7 +7,7 @@ import {
7
7
  loadSupiConfig,
8
8
  loadSupiConfigForScope,
9
9
  registerConfigSettings,
10
- } from "@mrclrchtr/supi-core/api";
10
+ } from "@mrclrchtr/supi-core/config";
11
11
  import { loadConfig } from "../config/config.ts";
12
12
 
13
13
  // ── Types ────────────────────────────────────────────────────
@@ -2,7 +2,7 @@
2
2
 
3
3
  import * as path from "node:path";
4
4
  import type { ProjectServerInfo } from "../config/server-config.ts";
5
- import { LSP_LOOKUP_TOOL, type LspToolName } from "./names.ts";
5
+ import { LSP_HOVER_TOOL, type LspToolName } from "./names.ts";
6
6
  import { LSP_TOOL_DEFINITION_SPECS } from "./tool-specs.ts";
7
7
 
8
8
  export interface LspToolPromptSurface {
@@ -28,7 +28,7 @@ export function buildLspToolPromptSurfaces(
28
28
  description: spec.description,
29
29
  promptSnippet: spec.promptSnippet,
30
30
  promptGuidelines:
31
- "includeCoverageGuidelines" in spec && spec.includeCoverageGuidelines
31
+ spec.name === LSP_HOVER_TOOL && coverageGuidelines.length > 0
32
32
  ? [...spec.basePromptGuidelines, ...coverageGuidelines]
33
33
  : [...spec.basePromptGuidelines],
34
34
  } satisfies LspToolPromptSurface,
@@ -43,8 +43,8 @@ function buildCoverageGuidelines(servers: ProjectServerInfo[], cwd: string): str
43
43
  const root = displayRoot(server.root, cwd);
44
44
  const fileTypes = server.fileTypes.map((entry) => `.${entry}`).join(",");
45
45
  const actions = server.supportedActions.join(",");
46
- const actionText = actions.length > 0 ? ` | actions: ${actions}` : "";
47
- return `lsp server coverage: ${server.name} | root: ${root} | files: ${fileTypes}${actionText}`;
46
+ const actionText = actions.length > 0 ? ` | actions:${actions}` : "";
47
+ return `lsp server coverage: ${server.name} | root:${root} | files:${fileTypes}${actionText}`;
48
48
  });
49
49
 
50
50
  const unavailable = servers
@@ -54,7 +54,7 @@ function buildCoverageGuidelines(servers: ProjectServerInfo[], cwd: string): str
54
54
  const dynamic = [...active];
55
55
  if (unavailable.length > 0) {
56
56
  dynamic.push(
57
- `lsp server unavailable: ${unavailable.join(",")} — install or enable to extend semantic coverage`,
57
+ `lsp server unavailable: ${unavailable.join(",")} — install or enable for more coverage`,
58
58
  );
59
59
  }
60
60
 
@@ -67,12 +67,3 @@ function displayRoot(root: string, cwd: string): string {
67
67
  if (relative.startsWith(`..${path.sep}`) || relative === "..") return root;
68
68
  return relative.replaceAll(path.sep, "/");
69
69
  }
70
-
71
- // Compatibility exports for older internal tests and helper imports.
72
- export const toolDescription = defaultLspToolPromptSurfaces[LSP_LOOKUP_TOOL].description;
73
- export const promptSnippet = defaultLspToolPromptSurfaces[LSP_LOOKUP_TOOL].promptSnippet;
74
- export const promptGuidelines = defaultLspToolPromptSurfaces[LSP_LOOKUP_TOOL].promptGuidelines;
75
-
76
- export function buildProjectGuidelines(servers: ProjectServerInfo[], cwd: string): string[] {
77
- return buildLspToolPromptSurfaces(servers, cwd)[LSP_LOOKUP_TOOL].promptGuidelines;
78
- }
package/src/tool/names.ts CHANGED
@@ -1,18 +1,26 @@
1
1
  // Stable LSP tool names shared across registration, guidance, and runtime state.
2
2
 
3
- export const LSP_LOOKUP_TOOL = "lsp_lookup";
3
+ export const LSP_HOVER_TOOL = "lsp_hover";
4
+ export const LSP_DEFINITION_TOOL = "lsp_definition";
5
+ export const LSP_REFERENCES_TOOL = "lsp_references";
6
+ export const LSP_IMPLEMENTATION_TOOL = "lsp_implementation";
4
7
  export const LSP_DOCUMENT_SYMBOLS_TOOL = "lsp_document_symbols";
5
8
  export const LSP_WORKSPACE_SYMBOLS_TOOL = "lsp_workspace_symbols";
6
9
  export const LSP_DIAGNOSTICS_TOOL = "lsp_diagnostics";
7
- export const LSP_REFACTOR_TOOL = "lsp_refactor";
10
+ export const LSP_RENAME_TOOL = "lsp_rename";
11
+ export const LSP_CODE_ACTIONS_TOOL = "lsp_code_actions";
8
12
  export const LSP_RECOVER_TOOL = "lsp_recover";
9
13
 
10
14
  export const LSP_TOOL_NAMES = [
11
- LSP_LOOKUP_TOOL,
15
+ LSP_HOVER_TOOL,
16
+ LSP_DEFINITION_TOOL,
17
+ LSP_REFERENCES_TOOL,
18
+ LSP_IMPLEMENTATION_TOOL,
12
19
  LSP_DOCUMENT_SYMBOLS_TOOL,
13
20
  LSP_WORKSPACE_SYMBOLS_TOOL,
14
21
  LSP_DIAGNOSTICS_TOOL,
15
- LSP_REFACTOR_TOOL,
22
+ LSP_RENAME_TOOL,
23
+ LSP_CODE_ACTIONS_TOOL,
16
24
  LSP_RECOVER_TOOL,
17
25
  ] as const;
18
26
 
@@ -51,10 +51,9 @@ function createToolExecutor(
51
51
  return async (
52
52
  _toolCallId: string,
53
53
  params: unknown,
54
- _signal: AbortSignal | undefined,
55
- _onUpdate: unknown,
56
- ctx: ExtensionContext,
54
+ ...rest: [AbortSignal | undefined, unknown, ExtensionContext]
57
55
  ) => {
56
+ const ctx = rest[2];
58
57
  const service = getReadyService(ctx.cwd);
59
58
  const text = service
60
59
  ? await run(service, ctx.cwd, params)