@mrclrchtr/supi-code-intelligence 6.0.1 → 6.2.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 (147) hide show
  1. package/README.md +2 -2
  2. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
  3. package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +5 -0
  4. package/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  5. package/node_modules/@mrclrchtr/supi-core/src/debug-identity.ts +11 -0
  6. package/node_modules/@mrclrchtr/supi-core/src/debug.ts +5 -0
  7. package/node_modules/@mrclrchtr/supi-lsp/README.md +26 -4
  8. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
  9. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +5 -0
  10. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  11. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug-identity.ts +11 -0
  12. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug.ts +5 -0
  13. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-jsonrpc/package.json +1 -1
  14. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.d.ts +1 -1
  15. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.d.ts +2 -2
  16. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.d.ts +9 -9
  17. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/package.json +3 -3
  18. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/esm/main.d.ts +2 -2
  19. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/esm/main.js +1 -1
  20. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/umd/main.d.ts +2 -2
  21. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/lib/umd/main.js +1 -1
  22. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-types/package.json +1 -1
  23. package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -5
  24. package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +14 -7
  25. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-cache.ts +1 -1
  26. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-capabilities.ts +0 -5
  27. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-publication.ts +6 -3
  28. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-refresh.ts +2 -1
  29. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-timing.ts +5 -2
  30. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostics.ts +2 -1
  31. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +23 -5
  32. package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +40 -18
  33. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +164 -30
  34. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +9 -87
  35. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-config.ts +8 -1
  36. package/node_modules/@mrclrchtr/supi-lsp/src/config/tsconfig-scope.ts +4 -5
  37. package/node_modules/@mrclrchtr/supi-lsp/src/config/types.ts +1 -29
  38. package/node_modules/@mrclrchtr/supi-lsp/src/debug-telemetry.ts +7 -21
  39. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-severity.ts +6 -0
  40. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-summary.ts +11 -14
  41. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/evidence.ts +0 -5
  42. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/stale-diagnostics.ts +0 -1
  43. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/workspace-sentinels.ts +29 -49
  44. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-client-state.ts +1 -1
  45. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +4 -8
  46. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-helpers.ts +1 -9
  47. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-project-info.ts +12 -6
  48. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +9 -1
  49. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +26 -41
  50. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +849 -117
  51. package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +6 -4
  52. package/node_modules/@mrclrchtr/supi-lsp/src/provider/semantic-symbol-mapper.ts +59 -28
  53. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +27 -19
  54. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-diagnostic-surface.ts +10 -0
  55. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-diagnostics.ts +26 -0
  56. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +0 -17
  57. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registry.ts +118 -27
  58. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-transition-debug.ts +7 -2
  59. package/node_modules/@mrclrchtr/supi-lsp/src/session/scanner.ts +24 -21
  60. package/node_modules/@mrclrchtr/supi-lsp/src/session/workspace-lsp-runtime.ts +33 -5
  61. package/node_modules/@mrclrchtr/supi-lsp/src/summary.ts +19 -40
  62. package/node_modules/@mrclrchtr/supi-lsp/src/utils.ts +13 -19
  63. package/node_modules/@mrclrchtr/supi-lsp/src/workspace-path-policy.ts +287 -0
  64. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +6 -18
  65. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
  66. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +5 -0
  67. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  68. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug-identity.ts +11 -0
  69. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug.ts +5 -0
  70. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +3 -5
  71. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +1 -1
  72. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm.json +1 -1
  73. package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +1 -11
  74. package/node_modules/@mrclrchtr/supi-tree-sitter/src/coordinates.ts +19 -0
  75. package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +5 -23
  76. package/node_modules/@mrclrchtr/supi-tree-sitter/src/operation-support.ts +3 -21
  77. package/node_modules/@mrclrchtr/supi-tree-sitter/src/provider/tree-sitter-provider.ts +5 -9
  78. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime-controller.ts +10 -20
  79. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +7 -1
  80. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-client.ts +9 -5
  81. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-protocol.ts +134 -9
  82. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-name.ts +96 -0
  83. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +11 -12
  84. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +39 -56
  85. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/exports.ts +9 -7
  86. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/js-binding-pattern.ts +26 -0
  87. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/node-at.ts +2 -21
  88. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/outline-html-sql.ts +144 -12
  89. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/outline.ts +50 -37
  90. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/scope.ts +138 -0
  91. package/node_modules/@mrclrchtr/supi-tree-sitter/src/types.ts +0 -7
  92. package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/parsed-file-store.ts +1 -14
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/runtime.ts +0 -10
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/service.ts +6 -8
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/worker-main.ts +34 -10
  96. package/package.json +5 -5
  97. package/src/analysis/capability/capability-warnings.ts +4 -22
  98. package/src/analysis/health/recovery.ts +4 -0
  99. package/src/analysis/health/server-status.ts +64 -0
  100. package/src/analysis/health/signals.ts +1 -0
  101. package/src/analysis/provider.ts +2 -1
  102. package/src/analysis/search/ast-scan-timing.ts +4 -2
  103. package/src/analysis/search/ast-scan.ts +1 -1
  104. package/src/analysis/target/symbol.ts +28 -16
  105. package/src/analysis/target/types.ts +1 -0
  106. package/src/api.ts +1 -0
  107. package/src/extension.ts +4 -2
  108. package/src/session/find-workflow.ts +5 -12
  109. package/src/session/health-refresh.ts +30 -4
  110. package/src/session/health-types.ts +27 -2
  111. package/src/session/health-workflow.ts +5 -1
  112. package/src/session/input/health-refactor.ts +16 -14
  113. package/src/session/refactor-types.ts +14 -1
  114. package/src/session/refactor-workflow.ts +21 -16
  115. package/src/session/semantic-demand.ts +36 -0
  116. package/src/session/target-workflow.ts +9 -12
  117. package/src/substrate/lsp/lifecycle.ts +0 -3
  118. package/src/substrate/lsp/maintenance.ts +4 -5
  119. package/src/substrate/lsp/settings.ts +6 -9
  120. package/src/substrate/lsp/state.ts +0 -2
  121. package/src/substrate/workspace-provider-host.ts +2 -2
  122. package/src/tool/code_health/file-scope-markdown.ts +43 -0
  123. package/src/tool/code_health/guidance.ts +2 -2
  124. package/src/tool/code_health/markdown.ts +81 -69
  125. package/src/tool/code_health/refresh-outcome.ts +46 -0
  126. package/src/tool/code_health/refresh-status.ts +166 -23
  127. package/src/tool/code_health/result.ts +15 -5
  128. package/src/tool/code_health/spec.ts +2 -1
  129. package/src/tool/code_health/tui.ts +42 -8
  130. package/src/tool/code_refactor_apply/guidance.ts +3 -2
  131. package/src/tool/code_refactor_plan/guidance.ts +1 -1
  132. package/src/tool/register.ts +5 -2
  133. package/src/tool/result/errors.ts +1 -0
  134. package/src/tool/result/types.ts +6 -0
  135. package/src/tool/schemas.ts +21 -11
  136. package/src/ui/footer.ts +7 -5
  137. package/src/ui/status-command.ts +31 -0
  138. package/src/ui/status-overlay.ts +69 -23
  139. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-actions.ts +0 -59
  140. package/node_modules/@mrclrchtr/supi-lsp/src/pattern-matcher.ts +0 -24
  141. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-kotlin-wasm.mjs +0 -132
  142. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-sql-wasm.mjs +0 -158
  143. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/vendor-wasm.mjs +0 -167
  144. package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +0 -42
  145. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime-registration.ts +0 -37
  146. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/service-registry.ts +0 -30
  147. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/structure.ts +0 -8
package/README.md CHANGED
@@ -81,7 +81,7 @@ The package adds eight tools that Pi selects as needed:
81
81
  | `code_graph` | Follow LSP references and implementations plus AST calls made by a symbol |
82
82
  | `code_find` | Search LSP workspace symbols or parsed AST source structure rather than raw text |
83
83
  | `code_health` | Check live diagnostics, language servers, and code-intelligence availability |
84
- | `code_refactor_plan` | Preview a precise rename or extraction without changing files |
84
+ | `code_refactor_plan` | Preview a precise rename, extraction, import cleanup, or dead-code deletion without changing files |
85
85
  | `code_refactor_apply` | Apply a fresh refactor plan after safety checks |
86
86
 
87
87
  Pi's built-in `grep` remains the right tool for literal or regular-expression searches; these tools add symbol and source-structure awareness.
@@ -123,7 +123,7 @@ If a server is missing, the agent can still use available workspace and structur
123
123
 
124
124
  ## Status and settings
125
125
 
126
- Open the status view to see detected languages, running or missing servers, and capability warnings:
126
+ Open the status view to see each LSP route with its workspace-relative root, running or missing servers, typed route issue counts, and capability warnings:
127
127
 
128
128
  ```text
129
129
  /supi-ci-status
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-code-runtime",
3
- "version": "6.0.1",
3
+ "version": "6.2.0",
4
4
  "description": "Shared workspace context and capability contracts for code intelligence",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -75,9 +75,14 @@ export interface SemanticProvider {
75
75
  filePath: string,
76
76
  control?: CodeRequestControl,
77
77
  ): Promise<CodeQueryResult<DocumentCodeSymbol[]>>;
78
+ /**
79
+ * Collect workspace symbols from routes that can contribute within the
80
+ * optional canonical path scopes.
81
+ */
78
82
  workspaceSymbols(
79
83
  query: string,
80
84
  control?: CodeRequestControl,
85
+ scopes?: readonly string[],
81
86
  ): Promise<CodeQueryResult<CodeSymbol[]>>;
82
87
 
83
88
  /** Optional definition capability with explicit completed-empty semantics. */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "6.0.1",
3
+ "version": "6.2.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,11 @@
1
+ /** Maximum UTF-16 code-unit length of one debug identity string. */
2
+ export const MAX_DEBUG_IDENTITY_STRING = 512;
3
+
4
+ /** Marker appended to a truncated debug identity string. */
5
+ export const DEBUG_IDENTITY_TRUNCATION_MARKER = "…";
6
+
7
+ /** Bound one debug identity string, including its truncation marker. */
8
+ export function truncateDebugIdentity(value: string): string {
9
+ if (value.length <= MAX_DEBUG_IDENTITY_STRING) return value;
10
+ return `${value.slice(0, MAX_DEBUG_IDENTITY_STRING - 1)}${DEBUG_IDENTITY_TRUNCATION_MARKER}`;
11
+ }
@@ -3,6 +3,11 @@
3
3
  // Kept separate from debug-registry.ts so debug-timing.ts can import the
4
4
  // registry without creating an import cycle through the barrel re-export.
5
5
 
6
+ export {
7
+ DEBUG_IDENTITY_TRUNCATION_MARKER,
8
+ MAX_DEBUG_IDENTITY_STRING,
9
+ truncateDebugIdentity,
10
+ } from "./debug-identity.ts";
6
11
  // biome-ignore lint/performance/noReExportAll: preserve the stable debug domain entry point
7
12
  export * from "./debug-registry.ts";
8
13
  // biome-ignore lint/performance/noReExportAll: preserve the stable debug domain entry point
@@ -82,6 +82,24 @@ Configuration overrides merge with the built-in server definitions. Use `.pi/sup
82
82
 
83
83
  Gopls pull diagnostics stay opt-in while golang/go#70199 is open; without the option the built-in Go configuration stays in push mode. Kotlin's `--stdio` argument is already part of the built-in configuration and needs no override.
84
84
 
85
+ ### Automatic workspace path policy
86
+
87
+ Automatic LSP work uses one path policy that does not change for each workspace runtime. It covers project discovery, route startup, warm-up, sentinel and source-file lists, created-file tracking, runtime guidance, and diagnostic summaries not tied to one request.
88
+
89
+ The policy excludes these directories by default: `.git`, `.cache`, `.pi`, `.pnpm`, `node_modules`, `dist`, `build`, `out`, `coverage`, `.next`, `.nuxt`, `.turbo`, and `__pycache__`. It also applies `lsp.exclude` patterns and root or nested `.gitignore` rules. Patterns use gitignore syntax, including rules relative to each directory and `!` rules. Built-in exclusions cannot be enabled again. Symbolic-link directories are not visited. Other dot-directories, such as `.github` and `.storybook`, remain allowed.
90
+
91
+ Set `lsp.exclude` in project or global SuPi configuration:
92
+
93
+ ```json
94
+ {
95
+ "lsp": {
96
+ "exclude": ["generated/**", "!generated/keep.ts"]
97
+ }
98
+ }
99
+ ```
100
+
101
+ An exact semantic request can still route an excluded file when a compatible server is available. This does not add the file to automatic work. Configured diagnostic suppression still applies to diagnostic output.
102
+
85
103
  ### Custom server configuration
86
104
 
87
105
  A custom server needs a command and at least one file type:
@@ -104,7 +122,7 @@ A custom server needs a command and at least one file type:
104
122
 
105
123
  File types do not include a leading dot. If `rootMarkers` is omitted, the server uses the session root.
106
124
 
107
- The `lsp.enabled` and `lsp.active` settings are deprecated and ignored. Disable one language with `lsp.servers.<language>.enabled: false`. Use `/supi-ci-status` from `@mrclrchtr/supi-code-intelligence` to see detected, running, and missing servers.
125
+ Disable one language with `lsp.servers.<language>.enabled: false`. Use `/supi-ci-status` from `@mrclrchtr/supi-code-intelligence` to see detected, running, and missing servers.
108
126
 
109
127
  ## What it provides
110
128
 
@@ -146,7 +164,11 @@ Retained and persisted LSP debug events may identify local workspaces, servers,
146
164
  - `method` — exact LSP method, e.g. `textDocument/hover`
147
165
  - `root` — server root, absolute where present
148
166
 
149
- `runtime.transition` events carry `cwd` and a bounded `servers` array (name, status, ready; at most 16 entries) alongside the aggregate counts. `readiness.*` events carry `cwd`, `server`, and `root`; their messages and data never embed raw progress-token values. `request.timing` events carry the exact `method`, `server`, and `cwd`, plus the JSON-RPC error code: the server-reported code for failed requests, and the defined constant `-32095` (`LSP_REQUEST_TIMEOUT_ERROR_CODE`) for local timeouts; cancellations carry no code. `diagnostics.timing` events carry `cwd`, `server`, and a workspace-relative `file` for `sync-file` operations; `refresh-open` stays aggregate. `runtime.recovery` events carry `cwd` and bounded attempted/restarted server names; a cancelled pass records the server names still running at cancellation, while restart identity requires the pass result. `capability.transition` events fire only on semantic ready↔pending transitions and carry `cwd` and the ready state — never for initialize, registration, or unregistration traffic. Code-intelligence events (`code-operation.*`, `workflow.timing`, `ast-scan.timing`) carry `cwd` only.
167
+ `runtime.transition` events carry `cwd` and a bounded `servers` array (name, status, ready, and an optional process-crash status reason; at most 16 entries) alongside the aggregate counts. `readiness.*` events carry `cwd`, `server`, and `root`; their messages and data never embed raw progress-token values. `request.timing` events carry the exact `method`, `server`, and `cwd`, plus the JSON-RPC error code: the server-reported code for failed requests, and the defined constant `-32095` (`LSP_REQUEST_TIMEOUT_ERROR_CODE`) for local timeouts; cancellations carry no code. `diagnostics.timing` events carry `cwd`, `server`, and a workspace-relative `file` for `sync-file` operations; `refresh-open` stays aggregate. `runtime.recovery` events carry `cwd`, bounded server and route-root identity, an outcome, and elapsed time for process-crash recovery. Diagnostic recovery events keep their existing bounded attempted/restarted server names. `capability.transition` events fire only on semantic ready↔pending transitions and carry `cwd` and the ready state — never for initialize, registration, or unregistration traffic. Code-intelligence events (`code-operation.*`, `workflow.timing`, `ast-scan.timing`) carry `cwd` only.
168
+
169
+ `ProjectServerInfo.statusReason` is present only for process-crash recovery states: `process-crashed`, `process-crash-recovery-pending`, or `process-crash-recovery-exhausted`. An LSP route is one configured server and workspace root. A route stays in `error` status for all three states.
170
+
171
+ Semantic evidence operations recover each required, previously running crashed route and wait for the shared replacement. Scoped workspace-symbol operations select routes by operation support and root intersection; unscoped operations select every known supporting route. Required routes start in parallel. File diagnostics can also recover their route. An explicit broad diagnostic refresh can recover crashed routes that retain tracked files in its scope. Server inventory, workspace readiness, and passive diagnostic snapshots do not start recovery. Recovery never cold-starts a route that did not initialize successfully.
150
172
 
151
173
  Identity strings — `cwd`, `server`, `file`, `method`, and `root` — are bounded to 512 UTF-16 code units (marker included; truncation appends `…`) and server lists to 16 entries. No raw protocol dumps, request/response params, diagnostic text, progress tokens, or unbounded file lists are recorded; `openFiles` stays a count. Identity fields are intentionally **not** secret-redacted — the debug registry still redacts secret keys and values, but server names, workspace-relative files, and method names pass through unredacted so local protocol failures stay diagnosable. The supi-debug package documents this disclosure for retained and persisted events.
152
174
 
@@ -187,7 +209,7 @@ Detected servers start concurrently. In a polyglot workspace, disable unneeded l
187
209
  }
188
210
  ```
189
211
 
190
- The old `lsp.enabled` and `lsp.active` settings are deprecated and ignored. If every server definition is disabled, the controller publishes an explicit `disabled` runtime state instead of an empty `ready` runtime. When a ready owner has no active client yet, it stays published for lazy routing while semantic capability remains pending.
212
+ If every server definition is disabled, the controller publishes an explicit `disabled` runtime state instead of an empty `ready` runtime. When a ready owner has no active client yet, it stays published for lazy routing while semantic capability remains pending.
191
213
 
192
214
  ## Architecture
193
215
 
@@ -208,7 +230,7 @@ See [`docs/adr/0016-workspace-lsp-runtime-interface.md`](../../docs/adr/0016-wor
208
230
 
209
231
  ## Package exports
210
232
 
211
- - `@mrclrchtr/supi-lsp/api` — runtime/controller/config types and registry operations
233
+ - `@mrclrchtr/supi-lsp/api` — runtime/controller/config types, registry operations, and automatic path-policy helpers
212
234
  - `@mrclrchtr/supi-lsp/provider/lsp-semantic-provider` — semantic provider adapter
213
235
 
214
236
  ## Source
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-code-runtime",
3
- "version": "6.0.1",
3
+ "version": "6.2.0",
4
4
  "description": "Shared workspace context and capability contracts for code intelligence",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -75,9 +75,14 @@ export interface SemanticProvider {
75
75
  filePath: string,
76
76
  control?: CodeRequestControl,
77
77
  ): Promise<CodeQueryResult<DocumentCodeSymbol[]>>;
78
+ /**
79
+ * Collect workspace symbols from routes that can contribute within the
80
+ * optional canonical path scopes.
81
+ */
78
82
  workspaceSymbols(
79
83
  query: string,
80
84
  control?: CodeRequestControl,
85
+ scopes?: readonly string[],
81
86
  ): Promise<CodeQueryResult<CodeSymbol[]>>;
82
87
 
83
88
  /** Optional definition capability with explicit completed-empty semantics. */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "6.0.1",
3
+ "version": "6.2.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,11 @@
1
+ /** Maximum UTF-16 code-unit length of one debug identity string. */
2
+ export const MAX_DEBUG_IDENTITY_STRING = 512;
3
+
4
+ /** Marker appended to a truncated debug identity string. */
5
+ export const DEBUG_IDENTITY_TRUNCATION_MARKER = "…";
6
+
7
+ /** Bound one debug identity string, including its truncation marker. */
8
+ export function truncateDebugIdentity(value: string): string {
9
+ if (value.length <= MAX_DEBUG_IDENTITY_STRING) return value;
10
+ return `${value.slice(0, MAX_DEBUG_IDENTITY_STRING - 1)}${DEBUG_IDENTITY_TRUNCATION_MARKER}`;
11
+ }
@@ -3,6 +3,11 @@
3
3
  // Kept separate from debug-registry.ts so debug-timing.ts can import the
4
4
  // registry without creating an import cycle through the barrel re-export.
5
5
 
6
+ export {
7
+ DEBUG_IDENTITY_TRUNCATION_MARKER,
8
+ MAX_DEBUG_IDENTITY_STRING,
9
+ truncateDebugIdentity,
10
+ } from "./debug-identity.ts";
6
11
  // biome-ignore lint/performance/noReExportAll: preserve the stable debug domain entry point
7
12
  export * from "./debug-registry.ts";
8
13
  // biome-ignore lint/performance/noReExportAll: preserve the stable debug domain entry point
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vscode-jsonrpc",
3
3
  "description": "A json rpc implementation over streams",
4
- "version": "9.0.1",
4
+ "version": "9.0.2",
5
5
  "author": "Microsoft Corporation",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -62,7 +62,7 @@ export interface ColorPresentationParams extends WorkDoneProgressParams, Partial
62
62
  export declare namespace ColorPresentationRequest {
63
63
  const method: 'textDocument/colorPresentation';
64
64
  const messageDirection: MessageDirection;
65
- const type: ProtocolRequestType<ColorPresentationParams, ColorPresentation[], ColorPresentation[], void, WorkDoneProgressOptions & TextDocumentRegistrationOptions>;
65
+ const type: ProtocolRequestType<ColorPresentationParams, ColorPresentation[], ColorPresentation[], void, DocumentColorRegistrationOptions>;
66
66
  type HandlerSignature = RequestHandler<ColorPresentationParams, ColorPresentation[], void>;
67
67
  const capabilities: CM<"textDocument.colorProvider", "colorProvider">;
68
68
  }
@@ -2778,12 +2778,12 @@ export interface CodeActionClientCapabilities {
2778
2778
  * Client supports the tag property on a code action. Clients
2779
2779
  * supporting tags have to handle unknown tags gracefully.
2780
2780
  *
2781
- * @since 3.18.0 - proposed
2781
+ * @since 3.18.0
2782
2782
  */
2783
2783
  tagSupport?: CodeActionTagOptions;
2784
2784
  }
2785
2785
  /**
2786
- * @since 3.18.0 - proposed
2786
+ * @since 3.18.0
2787
2787
  */
2788
2788
  export type CodeActionTagOptions = {
2789
2789
  /**
@@ -1,5 +1,5 @@
1
1
  import { NotificationHandler, RequestHandler } from 'vscode-jsonrpc';
2
- import { WorkspaceEdit } from 'vscode-languageserver-types';
2
+ import { WorkspaceEdit, type DocumentUri } from 'vscode-languageserver-types';
3
3
  import { CM, MessageDirection, ProtocolNotificationType, ProtocolRequestType } from './messages';
4
4
  /**
5
5
  * Options for notifications/requests for user operations on files.
@@ -172,9 +172,9 @@ export interface CreateFilesParams {
172
172
  */
173
173
  export interface FileCreate {
174
174
  /**
175
- * A file:// URI for the location of the file/folder being created.
175
+ * A URI for the location of the file/folder being created.
176
176
  */
177
- uri: string;
177
+ uri: DocumentUri;
178
178
  }
179
179
  /**
180
180
  * The parameters sent in notifications/requests for user-initiated renames of
@@ -196,13 +196,13 @@ export interface RenameFilesParams {
196
196
  */
197
197
  export interface FileRename {
198
198
  /**
199
- * A file:// URI for the original location of the file/folder being renamed.
199
+ * A URI for the original location of the file/folder being renamed.
200
200
  */
201
- oldUri: string;
201
+ oldUri: DocumentUri;
202
202
  /**
203
- * A file:// URI for the new location of the file/folder being renamed.
203
+ * A URI for the new location of the file/folder being renamed.
204
204
  */
205
- newUri: string;
205
+ newUri: DocumentUri;
206
206
  }
207
207
  /**
208
208
  * The parameters sent in notifications/requests for user-initiated deletes of
@@ -223,9 +223,9 @@ export interface DeleteFilesParams {
223
223
  */
224
224
  export interface FileDelete {
225
225
  /**
226
- * A file:// URI for the location of the file/folder being deleted.
226
+ * A URI for the location of the file/folder being deleted.
227
227
  */
228
- uri: string;
228
+ uri: DocumentUri;
229
229
  }
230
230
  /**
231
231
  * The will create files request is sent from the client to the server before files are actually
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vscode-languageserver-protocol",
3
3
  "description": "VSCode Language Server Protocol implementation",
4
- "version": "3.18.2",
4
+ "version": "3.18.3",
5
5
  "author": "Microsoft Corporation",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -27,8 +27,8 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "vscode-jsonrpc": "9.0.1",
31
- "vscode-languageserver-types": "3.18.0"
30
+ "vscode-jsonrpc": "9.0.2",
31
+ "vscode-languageserver-types": "3.18.3"
32
32
  },
33
33
  "scripts": {
34
34
  "prepublishOnly": "echo \"⛔ Can only publish from a secure pipeline ⛔\" && node ../build/npm/fail",
@@ -2517,7 +2517,7 @@ export type CodeActionDisabled = {
2517
2517
  /**
2518
2518
  * Code action tags are extra annotations that tweak the behavior of a code action.
2519
2519
  *
2520
- * @since 3.18.0 - proposed
2520
+ * @since 3.18.0
2521
2521
  */
2522
2522
  export declare namespace CodeActionTag {
2523
2523
  /**
@@ -2599,7 +2599,7 @@ export interface CodeAction {
2599
2599
  /**
2600
2600
  * Tags for this code action.
2601
2601
  *
2602
- * @since 3.18.0 - proposed
2602
+ * @since 3.18.0
2603
2603
  */
2604
2604
  tags?: CodeActionTag[];
2605
2605
  }
@@ -1758,7 +1758,7 @@ export var CodeActionContext;
1758
1758
  /**
1759
1759
  * Code action tags are extra annotations that tweak the behavior of a code action.
1760
1760
  *
1761
- * @since 3.18.0 - proposed
1761
+ * @since 3.18.0
1762
1762
  */
1763
1763
  export var CodeActionTag;
1764
1764
  (function (CodeActionTag) {
@@ -2517,7 +2517,7 @@ export type CodeActionDisabled = {
2517
2517
  /**
2518
2518
  * Code action tags are extra annotations that tweak the behavior of a code action.
2519
2519
  *
2520
- * @since 3.18.0 - proposed
2520
+ * @since 3.18.0
2521
2521
  */
2522
2522
  export declare namespace CodeActionTag {
2523
2523
  /**
@@ -2599,7 +2599,7 @@ export interface CodeAction {
2599
2599
  /**
2600
2600
  * Tags for this code action.
2601
2601
  *
2602
- * @since 3.18.0 - proposed
2602
+ * @since 3.18.0
2603
2603
  */
2604
2604
  tags?: CodeActionTag[];
2605
2605
  }
@@ -1790,7 +1790,7 @@
1790
1790
  /**
1791
1791
  * Code action tags are extra annotations that tweak the behavior of a code action.
1792
1792
  *
1793
- * @since 3.18.0 - proposed
1793
+ * @since 3.18.0
1794
1794
  */
1795
1795
  var CodeActionTag;
1796
1796
  (function (CodeActionTag) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vscode-languageserver-types",
3
3
  "description": "Types used by the Language server for node",
4
- "version": "3.18.0",
4
+ "version": "3.18.3",
5
5
  "author": "Microsoft Corporation",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-lsp",
3
- "version": "6.0.1",
3
+ "version": "6.2.0",
4
4
  "description": "Language Server Protocol runtime for SuPi code intelligence",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,8 +37,8 @@
37
37
  "vscode-jsonrpc": "^9.0.0",
38
38
  "vscode-languageserver-protocol": "^3.18.0",
39
39
  "vscode-languageserver-types": "^3.18.0",
40
- "@mrclrchtr/supi-code-runtime": "6.0.1",
41
- "@mrclrchtr/supi-core": "6.0.1"
40
+ "@mrclrchtr/supi-code-runtime": "6.2.0",
41
+ "@mrclrchtr/supi-core": "6.2.0"
42
42
  },
43
43
  "bundledDependencies": [
44
44
  "@mrclrchtr/supi-code-runtime",
@@ -53,7 +53,6 @@
53
53
  "exports": {
54
54
  "./api": "./src/api.ts",
55
55
  "./package.json": "./package.json",
56
- "./provider/lsp-semantic-provider": "./src/provider/lsp-semantic-provider.ts",
57
- "./debug-telemetry": "./src/debug-telemetry.ts"
56
+ "./provider/lsp-semantic-provider": "./src/provider/lsp-semantic-provider.ts"
58
57
  }
59
58
  }
@@ -1,13 +1,8 @@
1
1
  // Public API surface for the LSP session-scoped service.
2
2
 
3
3
  export { type LoadConfigOptions, loadConfig } from "./config/config.ts";
4
- export type { DeprecatedLspKeys, LspSettings } from "./config/lsp-settings.ts";
5
- export {
6
- getDeprecatedLspKeys,
7
- getLspDisabledMessage,
8
- hasDeprecatedLspKeys,
9
- loadLspSettings,
10
- } from "./config/lsp-settings.ts";
4
+ export type { LspSettings } from "./config/lsp-settings.ts";
5
+ export { loadLspSettings } from "./config/lsp-settings.ts";
11
6
  export {
12
7
  clearTsconfigCache,
13
8
  type FileScopeDecision,
@@ -30,6 +25,7 @@ export type {
30
25
  MissingServer,
31
26
  Position,
32
27
  ProjectServerInfo,
28
+ ProjectServerStatusReason,
33
29
  Range,
34
30
  SymbolInformation,
35
31
  WorkspaceEdit,
@@ -42,6 +38,8 @@ export { isLikelyStaleDiagnostic } from "./diagnostics/stale-diagnostics.ts";
42
38
  export {
43
39
  scanWorkspaceSentinels,
44
40
  syncWorkspaceSentinelSnapshot,
41
+ type WorkspaceSentinelScanOptions,
42
+ type WorkspaceSentinelSyncResult,
45
43
  } from "./diagnostics/workspace-sentinels.ts";
46
44
  export { raceReadinessValue, raceRequestControl } from "./session/readiness.ts";
47
45
  export type {
@@ -57,6 +55,8 @@ export type {
57
55
  DiagnosticEvidenceStatus,
58
56
  DiagnosticEvidenceSummary,
59
57
  OutstandingDiagnosticSummaryEntry,
58
+ ProcessCrashDiagnosticDemand,
59
+ ProcessCrashRecoverySummary,
60
60
  RecoverDiagnosticsResult,
61
61
  RoutedMutationResponse,
62
62
  SemanticReadinessResult,
@@ -69,8 +69,15 @@ export type {
69
69
  } from "./session/runtime-registry.ts";
70
70
  export {
71
71
  clearWorkspaceLspRuntime,
72
+ emptyProcessCrashRecoverySummary,
72
73
  getWorkspaceLspRuntime,
73
74
  setWorkspaceLspRuntimeState,
74
75
  waitForWorkspaceLspRuntime,
75
76
  } from "./session/runtime-registry.ts";
76
77
  export { scanMissingServers } from "./session/scanner.ts";
78
+ export {
79
+ AUTOMATIC_LSP_EXCLUDED_DIRECTORIES,
80
+ type AutomaticLspPathPolicy,
81
+ createAutomaticLspPathPolicy,
82
+ createDefaultAutomaticLspPathPolicy,
83
+ } from "./workspace-path-policy.ts";
@@ -1,5 +1,5 @@
1
+ import { uriToFile } from "@mrclrchtr/supi-core/path";
1
2
  import type { PublishDiagnosticsParams } from "../config/types.ts";
2
- import { uriToFile } from "../utils.ts";
3
3
  import {
4
4
  type DiagnosticCacheEntry,
5
5
  isTentativePushEntry,
@@ -66,11 +66,6 @@ export class ClientDynamicRegistrations {
66
66
  return (this.idsByMethod.get(method)?.size ?? 0) > 0;
67
67
  }
68
68
 
69
- /** Snapshot of the active registration ids for a method. */
70
- ids(method: string): readonly string[] {
71
- return [...(this.idsByMethod.get(method) ?? [])];
72
- }
73
-
74
69
  /** Drop all registrations — capability loss on shutdown, crash, or disposal. */
75
70
  clear(): void {
76
71
  this.idsByMethod.clear();
@@ -9,9 +9,12 @@
9
9
  // and timing data. They never carry diagnostic payloads or source text.
10
10
 
11
11
  import * as path from "node:path";
12
- import { recordDebugEvent } from "@mrclrchtr/supi-core/debug";
13
- import { boundCwd, truncateIdentity } from "../debug-telemetry.ts";
14
- import { uriToFile } from "../utils.ts";
12
+ import {
13
+ recordDebugEvent,
14
+ truncateDebugIdentity as truncateIdentity,
15
+ } from "@mrclrchtr/supi-core/debug";
16
+ import { uriToFile } from "@mrclrchtr/supi-core/path";
17
+ import { boundCwd } from "../debug-telemetry.ts";
15
18
 
16
19
  /** Maximum tracked synchronizations before the oldest entry is evicted. */
17
20
  export const MAX_TRACKED_SYNCHRONIZATIONS = 64;
@@ -5,12 +5,13 @@ import {
5
5
  isCodeRequestInterruption,
6
6
  throwIfCodeRequestInterrupted,
7
7
  } from "@mrclrchtr/supi-code-runtime/api";
8
+ import { fileToUri, uriToFile } from "@mrclrchtr/supi-core/path";
8
9
  import type { TextDocumentIdentifier } from "../config/types.ts";
9
10
  import {
10
11
  type DiagnosticEvidenceSummary,
11
12
  summarizeDiagnosticEvidence,
12
13
  } from "../diagnostics/evidence.ts";
13
- import { detectLanguageId, fileToUri, uriToFile } from "../utils.ts";
14
+ import { detectLanguageId } from "../utils.ts";
14
15
  import {
15
16
  type DiagnosticCacheEntry,
16
17
  type DiagnosticSynchronization,
@@ -1,6 +1,9 @@
1
1
  import type { CodeRequestControl } from "@mrclrchtr/supi-code-runtime/api";
2
- import { startDebugTimer } from "@mrclrchtr/supi-core/debug";
3
- import { boundCwd, truncateIdentity } from "../debug-telemetry.ts";
2
+ import {
3
+ startDebugTimer,
4
+ truncateDebugIdentity as truncateIdentity,
5
+ } from "@mrclrchtr/supi-core/debug";
6
+ import { boundCwd } from "../debug-telemetry.ts";
4
7
 
5
8
  type DiagnosticCollection = "cache" | "fallback" | "none" | "pull" | "push";
6
9
  type DiagnosticFreshness = "not-observed" | "observed";
@@ -7,9 +7,10 @@ import {
7
7
  throwIfCodeRequestInterrupted,
8
8
  unavailableCodeQuery,
9
9
  } from "@mrclrchtr/supi-code-runtime/api";
10
+ import { fileToUri, uriToFile } from "@mrclrchtr/supi-core/path";
10
11
  import type { Diagnostic, TextDocumentItem } from "../config/types.ts";
11
12
  import type { DiagnosticEvidenceSummary } from "../diagnostics/evidence.ts";
12
- import { detectLanguageId, fileToUri, uriToFile } from "../utils.ts";
13
+ import { detectLanguageId } from "../utils.ts";
13
14
  import { applyPushDiagnostics, buildClientDiagnosticSnapshot } from "./client-diagnostic-cache.ts";
14
15
  import { collectSynchronizedFileDiagnostics } from "./client-diagnostic-collection.ts";
15
16
  import {
@@ -12,7 +12,11 @@ import {
12
12
  throwIfCodeRequestInterrupted,
13
13
  unavailableCodeQuery,
14
14
  } from "@mrclrchtr/supi-code-runtime/api";
15
- import { recordDebugEvent } from "@mrclrchtr/supi-core/debug";
15
+ import {
16
+ recordDebugEvent,
17
+ truncateDebugIdentity as truncateIdentity,
18
+ } from "@mrclrchtr/supi-core/debug";
19
+ import { fileToUri } from "@mrclrchtr/supi-core/path";
16
20
  import { type ProgressToken, TextDocumentSyncKind } from "vscode-languageserver-protocol";
17
21
  import { CLIENT_CAPABILITIES } from "../config/capabilities.ts";
18
22
  import type {
@@ -35,10 +39,9 @@ import type {
35
39
  WorkspaceEdit,
36
40
  WorkspaceSymbol,
37
41
  } from "../config/types.ts";
38
- import { boundCwd, truncateIdentity } from "../debug-telemetry.ts";
42
+ import { boundCwd } from "../debug-telemetry.ts";
39
43
  import type { DiagnosticEvidenceSummary } from "../diagnostics/evidence.ts";
40
44
  import { raceRequestControl } from "../session/readiness.ts";
41
- import { fileToUri } from "../utils.ts";
42
45
  import {
43
46
  ClientDynamicRegistrations,
44
47
  DOCUMENT_DIAGNOSTIC_METHOD,
@@ -141,6 +144,15 @@ function killProcessTree(pid: number): void {
141
144
  }
142
145
  }
143
146
 
147
+ /** Terminate a failed startup without leaving server descendants running. */
148
+ function killFailedStartupProcess(child: ChildProcess): void {
149
+ if (child.pid) {
150
+ killProcessTree(child.pid);
151
+ return;
152
+ }
153
+ child.kill();
154
+ }
155
+
144
156
  // ── Types ─────────────────────────────────────────────────────────────
145
157
  export type ClientStatus = "initializing" | "running" | "error" | "shutdown";
146
158
 
@@ -285,7 +297,7 @@ export class LspClient {
285
297
  if (!this.process.stdin || !this.process.stdout) {
286
298
  const failure = new Error(`${cmd}: missing stdin/stdout`);
287
299
  this.handleProcessFailure(failure);
288
- this.process.kill();
300
+ killFailedStartupProcess(this.process);
289
301
  throw failure;
290
302
  }
291
303
 
@@ -335,8 +347,14 @@ export class LspClient {
335
347
  if (positionEncoding !== "utf-16") {
336
348
  throw new Error(`Server selected unsupported position encoding "${positionEncoding}".`);
337
349
  }
350
+ if (this._status !== "initializing") {
351
+ throw new Error(`${this.name}: client shutdown during initialize`);
352
+ }
338
353
  this.capabilities = result.capabilities;
339
354
  await this.rpc.sendNotification("initialized", {});
355
+ if (this._status !== "initializing") {
356
+ throw new Error(`${this.name}: client shutdown during initialize`);
357
+ }
340
358
  this._status = "running";
341
359
  this.publishLifecycle("startup");
342
360
 
@@ -344,7 +362,7 @@ export class LspClient {
344
362
  } catch (err) {
345
363
  const failure = new Error(`${this.name}: initialize failed: ${err}`, { cause: err });
346
364
  this.handleProcessFailure(failure);
347
- this.process.kill();
365
+ killFailedStartupProcess(this.process);
348
366
  throw failure;
349
367
  }
350
368
  }