@mrclrchtr/supi-lsp 1.7.0 → 1.9.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.
- package/README.md +33 -10
- package/node_modules/@mrclrchtr/supi-code-runtime/README.md +13 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +97 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +53 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +30 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +76 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +186 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +119 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-provider-registry.ts +36 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-tag.ts +31 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +255 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +30 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +40 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project-roots.ts +170 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/registry-utils.ts +86 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session-utils.ts +29 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +15 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +41 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +226 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/terminal.ts +60 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +116 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/package.json +40 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +35 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +68 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +31 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +110 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/context.ts +41 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +170 -0
- package/node_modules/@mrclrchtr/supi-core/README.md +3 -13
- package/node_modules/@mrclrchtr/supi-core/package.json +13 -8
- package/node_modules/@mrclrchtr/supi-core/src/api.ts +26 -92
- package/node_modules/@mrclrchtr/supi-core/src/config.ts +11 -0
- package/node_modules/@mrclrchtr/supi-core/src/context.ts +16 -0
- package/node_modules/@mrclrchtr/supi-core/src/index.ts +26 -92
- package/node_modules/@mrclrchtr/supi-core/src/path.ts +2 -0
- package/node_modules/@mrclrchtr/supi-core/src/project.ts +15 -0
- package/node_modules/@mrclrchtr/supi-core/src/session.ts +4 -0
- package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -0
- package/node_modules/@mrclrchtr/supi-core/src/settings.ts +9 -0
- package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +11 -0
- package/node_modules/@mrclrchtr/supi-core/src/types.ts +2 -0
- package/node_modules/vscode-jsonrpc/License.txt +11 -0
- package/node_modules/vscode-jsonrpc/README.md +69 -0
- package/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
- package/node_modules/vscode-jsonrpc/browser.js +7 -0
- package/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
- package/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
- package/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
- package/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
- package/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
- package/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
- package/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
- package/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
- package/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
- package/node_modules/vscode-jsonrpc/lib/common/connection.js +1214 -0
- package/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
- package/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
- package/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
- package/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
- package/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
- package/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
- package/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
- package/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
- package/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
- package/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
- package/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
- package/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
- package/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
- package/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
- package/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
- package/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
- package/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
- package/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
- package/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
- package/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
- package/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
- package/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
- package/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
- package/node_modules/vscode-jsonrpc/node.cmd +5 -0
- package/node_modules/vscode-jsonrpc/node.d.ts +6 -0
- package/node_modules/vscode-jsonrpc/node.js +7 -0
- package/node_modules/vscode-jsonrpc/package.json +45 -0
- package/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
- package/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
- package/node_modules/vscode-languageserver-protocol/License.txt +11 -0
- package/node_modules/vscode-languageserver-protocol/README.md +16 -0
- package/node_modules/vscode-languageserver-protocol/browser.d.ts +6 -0
- package/node_modules/vscode-languageserver-protocol/browser.js +7 -0
- package/node_modules/vscode-languageserver-protocol/lib/browser/main.d.ts +4 -0
- package/node_modules/vscode-languageserver-protocol/lib/browser/main.js +28 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/api.d.ts +58 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/api.js +77 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/connection.d.ts +187 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/connection.js +15 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/messages.d.ts +51 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/messages.js +44 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.d.ts +1 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.$.js +43 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.d.ts +86 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.js +42 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.d.ts +66 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.js +32 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.d.ts +35 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.js +24 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.d.ts +3252 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.d.ts +37 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.js +22 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.d.ts +341 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.js +74 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.d.ts +306 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.js +101 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.d.ts +109 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.js +30 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.d.ts +38 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.js +21 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.d.ts +110 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlayHint.js +43 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.d.ts +57 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineCompletion.js +22 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.d.ts +86 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.js +30 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.js +943 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.d.ts +52 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.js +19 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.d.ts +106 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.js +68 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.d.ts +400 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.notebook.js +214 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.d.ts +107 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.js +37 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.d.ts +41 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.js +20 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.d.ts +223 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.js +57 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.d.ts +72 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.js +22 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.d.ts +38 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.js +21 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.d.ts +83 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.typeHierarchy.js +42 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.d.ts +74 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolder.js +27 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/utils/is.d.ts +9 -0
- package/node_modules/vscode-languageserver-protocol/lib/common/utils/is.js +46 -0
- package/node_modules/vscode-languageserver-protocol/lib/node/main.d.ts +6 -0
- package/node_modules/vscode-languageserver-protocol/lib/node/main.js +28 -0
- package/node_modules/vscode-languageserver-protocol/metaModel.schema.json +783 -0
- package/node_modules/vscode-languageserver-protocol/node.cmd +5 -0
- package/node_modules/vscode-languageserver-protocol/node.d.ts +6 -0
- package/node_modules/vscode-languageserver-protocol/node.js +7 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/License.txt +11 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/README.md +69 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.d.ts +6 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/browser.js +7 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.d.ts +17 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/main.js +76 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +12 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/browser/ril.js +156 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.d.ts +14 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/api.js +81 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts +32 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/cancellation.js +96 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +358 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/connection.js +1212 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.d.ts +9 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/disposable.js +16 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.d.ts +52 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/encoding.js +70 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.d.ts +39 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/events.js +128 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.d.ts +7 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/is.js +35 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +53 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +398 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.d.ts +18 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +152 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.d.ts +77 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageReader.js +197 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.d.ts +60 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +115 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.d.ts +369 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/messages.js +306 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.d.ts +74 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/ral.js +23 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.d.ts +10 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/semaphore.js +68 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.d.ts +15 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +76 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.d.ts +63 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/main.js +257 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +13 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/lib/node/ril.js +161 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.cmd +5 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.d.ts +6 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/node.js +7 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/package.json +45 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/thirdpartynotices.txt +16 -0
- package/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc/typings/thenable.d.ts +5 -0
- package/node_modules/vscode-languageserver-protocol/package.json +45 -0
- package/node_modules/vscode-languageserver-protocol/thirdpartynotices.txt +31 -0
- package/node_modules/vscode-languageserver-types/License.txt +11 -0
- package/node_modules/vscode-languageserver-types/README.md +17 -0
- package/node_modules/vscode-languageserver-types/lib/esm/main.d.ts +3139 -0
- package/node_modules/vscode-languageserver-types/lib/esm/main.js +2222 -0
- package/node_modules/vscode-languageserver-types/lib/esm/package.json +3 -0
- package/node_modules/vscode-languageserver-types/lib/umd/main.d.ts +3139 -0
- package/node_modules/vscode-languageserver-types/lib/umd/main.js +2272 -0
- package/node_modules/vscode-languageserver-types/package.json +38 -0
- package/node_modules/vscode-languageserver-types/thirdpartynotices.txt +16 -0
- package/package.json +9 -6
- package/src/config/config.ts +1 -1
- package/src/handlers/diagnostic-injection.ts +182 -0
- package/src/handlers/session-lifecycle.ts +149 -0
- package/src/handlers/status-command.ts +38 -0
- package/src/handlers/workspace-recovery.ts +92 -0
- package/src/lsp.ts +18 -414
- package/src/manager/capability-index.ts +24 -0
- package/src/manager/client-pool.ts +33 -0
- package/src/manager/diagnostic-store.ts +51 -0
- package/src/manager/manager-helpers.ts +1 -1
- package/src/manager/manager-workspace-symbol.ts +1 -1
- package/src/manager/manager.ts +1 -1
- package/src/manager/recovery-coordinator.ts +37 -0
- package/src/manager/workspace-router.ts +44 -0
- package/src/provider/lsp-semantic-provider.ts +156 -0
- package/src/session/runtime-registration.ts +39 -0
- package/src/session/scanner.ts +1 -1
- package/src/session/service-registry.ts +1 -1
- package/src/session/settings-registration.ts +1 -1
- package/src/tool/guidance.ts +5 -14
- package/src/tool/names.ts +12 -4
- package/src/tool/register-tools.ts +2 -4
- package/src/tool/service-actions.ts +141 -0
- package/src/tool/tool-specs.ts +93 -93
- package/src/utils.ts +1 -1
- package/src/workspace-change.ts +40 -0
- package/node_modules/@mrclrchtr/supi-core/src/extension.ts +0 -1
package/src/lsp.ts
CHANGED
|
@@ -1,75 +1,25 @@
|
|
|
1
|
-
// LSP Extension for pi —
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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 { getDefaultWorkspaceRuntime } from "@mrclrchtr/supi-code-runtime/api";
|
|
7
|
+
import { registerDiagnosticInjectionHandlers } from "./handlers/diagnostic-injection.ts";
|
|
8
|
+
import { registerSessionLifecycleHandlers } from "./handlers/session-lifecycle.ts";
|
|
9
|
+
import { registerLspStatusCommand } from "./handlers/status-command.ts";
|
|
10
|
+
import { registerWorkspaceRecoveryHandler } from "./handlers/workspace-recovery.ts";
|
|
11
|
+
import { createRuntimeState } from "./session/lsp-state.ts";
|
|
12
|
+
import { registerLspSettings } from "./session/settings-registration.ts";
|
|
13
|
+
import { registerTreePersistHandlers } from "./session/tree-persist.ts";
|
|
14
|
+
import { defaultLspToolPromptSurfaces } from "./tool/guidance.ts";
|
|
64
15
|
import { registerLspAwareToolOverrides } from "./tool/overrides.ts";
|
|
65
16
|
import { registerLspTools } from "./tool/register-tools.ts";
|
|
66
17
|
import { registerLspMessageRenderer } from "./ui/renderer.ts";
|
|
67
|
-
import { toggleLspStatusOverlay, updateLspUi } from "./ui/ui.ts";
|
|
68
|
-
import { fileToUri, resolveSessionPath } from "./utils.ts";
|
|
69
18
|
|
|
70
19
|
export default function lspExtension(pi: ExtensionAPI) {
|
|
71
20
|
registerLspSettings();
|
|
72
21
|
const state = createRuntimeState();
|
|
22
|
+
const runtime = getDefaultWorkspaceRuntime();
|
|
73
23
|
|
|
74
24
|
registerLspAwareToolOverrides(pi, {
|
|
75
25
|
getInlineSeverity: () => state.inlineSeverity,
|
|
@@ -78,356 +28,10 @@ export default function lspExtension(pi: ExtensionAPI) {
|
|
|
78
28
|
});
|
|
79
29
|
|
|
80
30
|
registerLspTools(pi, defaultLspToolPromptSurfaces);
|
|
81
|
-
registerSessionLifecycleHandlers(pi, state);
|
|
82
|
-
|
|
31
|
+
registerSessionLifecycleHandlers(pi, state, runtime);
|
|
32
|
+
registerDiagnosticInjectionHandlers(pi, state);
|
|
33
|
+
registerWorkspaceRecoveryHandler(pi, state);
|
|
83
34
|
registerTreePersistHandlers(pi, state);
|
|
84
35
|
registerLspStatusCommand(pi, state);
|
|
85
36
|
registerLspMessageRenderer(pi);
|
|
86
37
|
}
|
|
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
|
-
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Capability index — indexes and queries server capabilities.
|
|
2
|
+
|
|
3
|
+
import type { ServerCapabilities } from "../config/types.ts";
|
|
4
|
+
import { getSupportedLspServerActions } from "../tool/tool-specs.ts";
|
|
5
|
+
import type { LspManager } from "./manager.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Indexes and queries what each server supports.
|
|
9
|
+
*/
|
|
10
|
+
export interface CapabilityIndex {
|
|
11
|
+
/** Get the list of supported LSP actions for a server's capabilities. */
|
|
12
|
+
getSupportedActions(capabilities: ServerCapabilities | null | undefined): string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create a CapabilityIndex for a workspace.
|
|
17
|
+
*/
|
|
18
|
+
export function createCapabilityIndex(_manager: LspManager): CapabilityIndex {
|
|
19
|
+
return {
|
|
20
|
+
getSupportedActions(capabilities) {
|
|
21
|
+
return getSupportedLspServerActions(capabilities);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Client pool — manages LSP client lifecycle (start, stop, reconnect).
|
|
2
|
+
|
|
3
|
+
import type { LspManager } from "./manager.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Manages the lifecycle of LSP client instances for a workspace.
|
|
7
|
+
* Currently delegates to LspManager; the extraction will grow
|
|
8
|
+
* as responsibilities are migrated from manager.ts.
|
|
9
|
+
*/
|
|
10
|
+
export interface ClientPool {
|
|
11
|
+
/**
|
|
12
|
+
* Ensure a file has an active client and return it.
|
|
13
|
+
* Returns null if no server can serve the file.
|
|
14
|
+
*/
|
|
15
|
+
ensureFileOpen(filePath: string): ReturnType<LspManager["ensureFileOpen"]>;
|
|
16
|
+
|
|
17
|
+
/** Shut down all active clients. */
|
|
18
|
+
shutdownAll(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Create a ClientPool backed by LspManager.
|
|
23
|
+
*/
|
|
24
|
+
export function createClientPool(manager: LspManager): ClientPool {
|
|
25
|
+
return {
|
|
26
|
+
async ensureFileOpen(filePath: string) {
|
|
27
|
+
return manager.ensureFileOpen(filePath);
|
|
28
|
+
},
|
|
29
|
+
async shutdownAll() {
|
|
30
|
+
return manager.shutdownAll();
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Diagnostic store — stores, aggregates, and queries diagnostics.
|
|
2
|
+
|
|
3
|
+
import type { Diagnostic } from "../config/types.ts";
|
|
4
|
+
import type { LspManager } from "./manager.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Stores and queries diagnostics per file.
|
|
8
|
+
* Currently delegates to LspManager methods.
|
|
9
|
+
*/
|
|
10
|
+
export interface DiagnosticStore {
|
|
11
|
+
/** Get workspace diagnostic summary grouped by file. */
|
|
12
|
+
getDiagnosticSummary(): Array<{ file: string; errors: number; warnings: number }>;
|
|
13
|
+
|
|
14
|
+
/** Get outstanding diagnostics at or above severity. */
|
|
15
|
+
getOutstandingDiagnostics(
|
|
16
|
+
maxSeverity?: number,
|
|
17
|
+
): Array<{ file: string; diagnostics: Diagnostic[] }>;
|
|
18
|
+
|
|
19
|
+
/** Get outstanding diagnostic summary grouped by file. */
|
|
20
|
+
getOutstandingDiagnosticSummary(maxSeverity?: number): Array<{
|
|
21
|
+
file: string;
|
|
22
|
+
total: number;
|
|
23
|
+
errors: number;
|
|
24
|
+
warnings: number;
|
|
25
|
+
information: number;
|
|
26
|
+
hints: number;
|
|
27
|
+
}>;
|
|
28
|
+
|
|
29
|
+
/** Sync a file and return its diagnostics. */
|
|
30
|
+
syncAndGetDiagnostics(filePath: string, maxSeverity?: number): Promise<Diagnostic[] | null>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Create a DiagnosticStore backed by LspManager.
|
|
35
|
+
*/
|
|
36
|
+
export function createDiagnosticStore(manager: LspManager): DiagnosticStore {
|
|
37
|
+
return {
|
|
38
|
+
getDiagnosticSummary() {
|
|
39
|
+
return manager.getDiagnosticSummary();
|
|
40
|
+
},
|
|
41
|
+
getOutstandingDiagnostics(maxSeverity = 1) {
|
|
42
|
+
return manager.getOutstandingDiagnostics(maxSeverity);
|
|
43
|
+
},
|
|
44
|
+
getOutstandingDiagnosticSummary(maxSeverity = 1) {
|
|
45
|
+
return manager.getOutstandingDiagnosticSummary(maxSeverity);
|
|
46
|
+
},
|
|
47
|
+
async syncAndGetDiagnostics(filePath: string, maxSeverity = 4) {
|
|
48
|
+
return manager.syncFileAndGetDiagnostics(filePath, maxSeverity);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -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/
|
|
3
|
+
import { walkProject } from "@mrclrchtr/supi-core/project";
|
|
4
4
|
import type { LspClient } from "../client/client.ts";
|
|
5
5
|
import type {
|
|
6
6
|
DocumentSymbol,
|
package/src/manager/manager.ts
CHANGED
|
@@ -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/
|
|
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 {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Recovery coordinator — orchestrates stale diagnostic recovery.
|
|
2
|
+
|
|
3
|
+
import type { LspManager } from "./manager.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Orchestrates stale diagnostic detection and recovery.
|
|
7
|
+
*/
|
|
8
|
+
export interface RecoveryCoordinator {
|
|
9
|
+
/**
|
|
10
|
+
* Trigger a workspace-wide diagnostics refresh.
|
|
11
|
+
* Returns info about refreshed/restarted clients and stale assessment.
|
|
12
|
+
*/
|
|
13
|
+
recover(options?: {
|
|
14
|
+
restartIfStillStale?: boolean;
|
|
15
|
+
maxWaitMs?: number;
|
|
16
|
+
quietMs?: number;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
refreshedClients: number;
|
|
19
|
+
restartedClients: number;
|
|
20
|
+
staleAssessment: {
|
|
21
|
+
suspected: boolean;
|
|
22
|
+
matchedFiles: Array<{ file: string; diagnostics: unknown[] }>;
|
|
23
|
+
warning: string | null;
|
|
24
|
+
};
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Create a RecoveryCoordinator backed by LspManager.
|
|
30
|
+
*/
|
|
31
|
+
export function createRecoveryCoordinator(manager: LspManager): RecoveryCoordinator {
|
|
32
|
+
return {
|
|
33
|
+
async recover(options) {
|
|
34
|
+
return manager.recoverWorkspaceDiagnostics(options);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Workspace router — routes files to the correct LSP client based on project root.
|
|
2
|
+
|
|
3
|
+
import type { ProjectServerInfo } from "../config/server-config.ts";
|
|
4
|
+
import type { LspManager } from "./manager.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Routes file paths to the correct LSP client and tracks
|
|
8
|
+
* which project roots are known.
|
|
9
|
+
*/
|
|
10
|
+
export interface WorkspaceRouter {
|
|
11
|
+
/** Check whether a file can be served by any active server. */
|
|
12
|
+
canServeFile(filePath: string): boolean;
|
|
13
|
+
|
|
14
|
+
/** Check whether a source file type is supported. */
|
|
15
|
+
isSupportedSourceFile(filePath: string): boolean;
|
|
16
|
+
|
|
17
|
+
/** Get known project server info. */
|
|
18
|
+
getProjectServers(): ProjectServerInfo[];
|
|
19
|
+
|
|
20
|
+
/** Register detected servers from the workspace scan. */
|
|
21
|
+
registerDetectedServers(servers: Array<{ language: string; root: string }>): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a WorkspaceRouter backed by LspManager.
|
|
26
|
+
*/
|
|
27
|
+
export function createWorkspaceRouter(manager: LspManager): WorkspaceRouter {
|
|
28
|
+
return {
|
|
29
|
+
canServeFile(filePath: string) {
|
|
30
|
+
return manager.canServeFile(filePath);
|
|
31
|
+
},
|
|
32
|
+
isSupportedSourceFile(filePath: string) {
|
|
33
|
+
return manager.isSupportedSourceFile(filePath);
|
|
34
|
+
},
|
|
35
|
+
getProjectServers(): ProjectServerInfo[] {
|
|
36
|
+
return manager.getKnownProjectServers([]);
|
|
37
|
+
},
|
|
38
|
+
registerDetectedServers(servers: Array<{ language: string; root: string }>) {
|
|
39
|
+
manager.registerDetectedServers(
|
|
40
|
+
servers as unknown as Parameters<typeof manager.registerDetectedServers>[0],
|
|
41
|
+
);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|