@windagency/valora 2.2.0 → 2.3.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 +45 -19
- package/data/agents/secops-engineer.md +74 -7
- package/data/commands/_meta/schema.json +8 -1
- package/data/commands/assert.md +1 -1
- package/data/commands/generate-all-documentation.md +1 -1
- package/data/commands/generate-docs.md +1 -1
- package/data/commands/implement.md +2 -0
- package/data/commands/plan-architecture.md +1 -1
- package/data/commands/plan-implementation.md +1 -1
- package/data/commands/plan.md +1 -1
- package/data/commands/refine-task.md +1 -1
- package/data/commands/registry.json +11 -11
- package/data/commands/review-code.md +1 -1
- package/data/commands/review-functional.md +1 -1
- package/data/prompts/01_onboard/analyze-patterns.md +1 -0
- package/data/prompts/01_onboard/collect-clarifications.md +1 -0
- package/data/prompts/01_onboard/map-dependencies.md +1 -0
- package/data/prompts/02_context/analyze-change-scope.md +1 -0
- package/data/prompts/02_context/analyze-changes-for-review.md +1 -0
- package/data/prompts/02_context/analyze-codebase-changes.md +1 -0
- package/data/prompts/02_context/analyze-command-execution.md +1 -0
- package/data/prompts/02_context/analyze-commits-for-pr.md +1 -0
- package/data/prompts/02_context/analyze-functional-scope.md +1 -0
- package/data/prompts/02_context/analyze-git-branch.md +1 -0
- package/data/prompts/02_context/analyze-git-status.md +1 -0
- package/data/prompts/02_context/analyze-task-context.md +1 -0
- package/data/prompts/02_context/extract-ticket-info.md +1 -0
- package/data/prompts/02_context/extract-ticket-references.md +1 -0
- package/data/prompts/02_context/gather-git-metrics.md +1 -0
- package/data/prompts/02_context/identify-completed-workflow.md +1 -0
- package/data/prompts/02_context/load-and-analyze-parallel.md +1 -0
- package/data/prompts/02_context/load-commit-template.md +1 -0
- package/data/prompts/02_context/load-implementation-context.md +1 -0
- package/data/prompts/02_context/load-plan-context.md +1 -0
- package/data/prompts/02_context/load-pr-template.md +1 -0
- package/data/prompts/02_context/scan-codebase.md +1 -0
- package/data/prompts/02_context/use-modern-cli-tools.md +1 -0
- package/data/prompts/03_plan/assess-complexity.md +1 -0
- package/data/prompts/03_plan/assess-risks.md +1 -0
- package/data/prompts/03_plan/breakdown-implementation.md +1 -0
- package/data/prompts/03_plan/define-architecture.md +1 -0
- package/data/prompts/03_plan/identify-dependencies.md +1 -0
- package/data/prompts/04_code/calculate-version-bump.md +1 -0
- package/data/prompts/04_code/create-version-tag.md +1 -0
- package/data/prompts/04_code/determine-commit-strategy.md +1 -0
- package/data/prompts/04_code/determine-labels.md +1 -0
- package/data/prompts/04_code/determine-reviewers.md +1 -0
- package/data/prompts/04_code/generate-commit-messages.md +1 -0
- package/data/prompts/04_code/generate-pr-description.md +1 -0
- package/data/prompts/04_code/generate-pr-title.md +1 -0
- package/data/prompts/04_code/implement-changes.md +1 -0
- package/data/prompts/04_code/implement-tests.md +1 -0
- package/data/prompts/04_code/interactive-review.md +1 -0
- package/data/prompts/04_code/push-and-create-pr.md +1 -0
- package/data/prompts/04_code/stage-and-commit.md +1 -0
- package/data/prompts/04_code/validate-prerequisites.md +1 -0
- package/data/prompts/04_code/verify-implementation.md +1 -0
- package/data/prompts/05_review/assess-code-quality.md +1 -0
- package/data/prompts/05_review/assess-constraints.md +1 -0
- package/data/prompts/05_review/evaluate-quality-outcomes.md +1 -0
- package/data/prompts/05_review/generate-commit-insights.md +1 -0
- package/data/prompts/05_review/identify-improvement-areas.md +1 -0
- package/data/prompts/05_review/synthesize-plan-assessment.md +1 -0
- package/data/prompts/05_review/synthesize-validation-report.md +1 -0
- package/data/prompts/05_review/validate-functional-requirements.md +1 -0
- package/data/prompts/05_review/validate-maintainability.md +1 -0
- package/data/prompts/05_review/validate-performance.md +1 -0
- package/data/prompts/05_review/validate-pr-creation.md +1 -0
- package/data/prompts/05_review/validate-pr-readiness.md +1 -0
- package/data/prompts/05_review/validate-risk-coverage.md +1 -0
- package/data/prompts/05_review/validate-step-quality.md +1 -0
- package/data/prompts/05_review/validate-technical-feasibility.md +1 -0
- package/data/prompts/05_review/validate-test-strategy.md +1 -0
- package/data/prompts/05_review/verify-commits.md +1 -0
- package/data/prompts/06_test/analyze-results.md +1 -0
- package/data/prompts/06_test/analyze-test-infrastructure.md +1 -0
- package/data/prompts/06_test/execute-tests.md +1 -0
- package/data/prompts/07_documentation/generate-all-domains-parallel.md +1 -0
- package/data/prompts/07_documentation/generate-code-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-summary.md +1 -0
- package/data/prompts/07_documentation/generate-functional-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-prd.md +1 -0
- package/data/prompts/07_documentation/review-and-persist-parallel.md +1 -0
- package/data/prompts/07_documentation/update-changelog.md +1 -0
- package/data/prompts/07_documentation/update-inline-docs.md +1 -0
- package/data/prompts/07_documentation/update-knowledge-base.md +1 -0
- package/data/prompts/_meta/schema.json +4 -0
- package/data/prompts/registry.json +72 -72
- package/dist/ast/ast-context.service.d.ts +32 -0
- package/dist/ast/ast-context.service.d.ts.map +1 -0
- package/dist/ast/ast-context.service.js +220 -0
- package/dist/ast/ast-context.service.js.map +1 -0
- package/dist/ast/ast-index-watcher.service.d.ts +40 -0
- package/dist/ast/ast-index-watcher.service.d.ts.map +1 -0
- package/dist/ast/ast-index-watcher.service.js +124 -0
- package/dist/ast/ast-index-watcher.service.js.map +1 -0
- package/dist/ast/ast-index.service.d.ts +111 -0
- package/dist/ast/ast-index.service.d.ts.map +1 -0
- package/dist/ast/ast-index.service.js +437 -0
- package/dist/ast/ast-index.service.js.map +1 -0
- package/dist/ast/ast-parser.service.d.ts +31 -0
- package/dist/ast/ast-parser.service.d.ts.map +1 -0
- package/dist/ast/ast-parser.service.js +524 -0
- package/dist/ast/ast-parser.service.js.map +1 -0
- package/dist/ast/ast-query.service.d.ts +34 -0
- package/dist/ast/ast-query.service.d.ts.map +1 -0
- package/dist/ast/ast-query.service.js +203 -0
- package/dist/ast/ast-query.service.js.map +1 -0
- package/dist/ast/ast-tools.service.d.ts +39 -0
- package/dist/ast/ast-tools.service.d.ts.map +1 -0
- package/dist/ast/ast-tools.service.js +187 -0
- package/dist/ast/ast-tools.service.js.map +1 -0
- package/dist/ast/ast.types.d.ts +195 -0
- package/dist/ast/ast.types.d.ts.map +1 -0
- package/dist/ast/ast.types.js +8 -0
- package/dist/ast/ast.types.js.map +1 -0
- package/dist/ast/grammars/grammar-loader.d.ts +23 -0
- package/dist/ast/grammars/grammar-loader.d.ts.map +1 -0
- package/dist/ast/grammars/grammar-loader.js +28 -0
- package/dist/ast/grammars/grammar-loader.js.map +1 -0
- package/dist/ast/grammars/language-map.d.ts +28 -0
- package/dist/ast/grammars/language-map.d.ts.map +1 -0
- package/dist/ast/grammars/language-map.js +65 -0
- package/dist/ast/grammars/language-map.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts +39 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts +84 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js +48 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.js +91 -0
- package/dist/ast/grammars/tree-sitter-adapter.js.map +1 -0
- package/dist/cli/autocomplete.d.ts.map +1 -1
- package/dist/cli/autocomplete.js +6 -6
- package/dist/cli/autocomplete.js.map +1 -1
- package/dist/cli/command-executor.d.ts +10 -0
- package/dist/cli/command-executor.d.ts.map +1 -1
- package/dist/cli/command-executor.js +85 -11
- package/dist/cli/command-executor.js.map +1 -1
- package/dist/cli/command-wizard.d.ts.map +1 -1
- package/dist/cli/command-wizard.js +8 -2
- package/dist/cli/command-wizard.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +5 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/first-run-setup.d.ts.map +1 -1
- package/dist/cli/first-run-setup.js +3 -1
- package/dist/cli/first-run-setup.js.map +1 -1
- package/dist/cli/provider-resolver.d.ts.map +1 -1
- package/dist/cli/provider-resolver.js +11 -0
- package/dist/cli/provider-resolver.js.map +1 -1
- package/dist/config/constants.d.ts +18 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +18 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/interactive-wizard.d.ts +7 -0
- package/dist/config/interactive-wizard.d.ts.map +1 -1
- package/dist/config/interactive-wizard.js +24 -19
- package/dist/config/interactive-wizard.js.map +1 -1
- package/dist/config/loader.d.ts +5 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +24 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/providers.config.d.ts.map +1 -1
- package/dist/config/providers.config.js +17 -1
- package/dist/config/providers.config.js.map +1 -1
- package/dist/config/schema.d.ts +194 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validation-helpers.d.ts.map +1 -1
- package/dist/config/validation-helpers.js +84 -41
- package/dist/config/validation-helpers.js.map +1 -1
- package/dist/di/container.d.ts +5 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +17 -0
- package/dist/di/container.js.map +1 -1
- package/dist/executor/message-builder.service.d.ts +2 -0
- package/dist/executor/message-builder.service.d.ts.map +1 -1
- package/dist/executor/message-builder.service.js +6 -1
- package/dist/executor/message-builder.service.js.map +1 -1
- package/dist/executor/stage-executor.d.ts +15 -5
- package/dist/executor/stage-executor.d.ts.map +1 -1
- package/dist/executor/stage-executor.js +126 -22
- package/dist/executor/stage-executor.js.map +1 -1
- package/dist/executor/stage-output-cache.d.ts +3 -3
- package/dist/executor/stage-output-cache.d.ts.map +1 -1
- package/dist/executor/stage-output-cache.js +6 -6
- package/dist/executor/stage-output-cache.js.map +1 -1
- package/dist/executor/tool-execution.service.d.ts +12 -0
- package/dist/executor/tool-execution.service.d.ts.map +1 -1
- package/dist/executor/tool-execution.service.js +270 -8
- package/dist/executor/tool-execution.service.js.map +1 -1
- package/dist/executor/tools/search-tools.service.d.ts +1 -1
- package/dist/executor/tools/search-tools.service.d.ts.map +1 -1
- package/dist/executor/tools/search-tools.service.js +25 -3
- package/dist/executor/tools/search-tools.service.js.map +1 -1
- package/dist/executor/variables.d.ts.map +1 -1
- package/dist/executor/variables.js +5 -0
- package/dist/executor/variables.js.map +1 -1
- package/dist/llm/model-mapping-registry.d.ts.map +1 -1
- package/dist/llm/model-mapping-registry.js +11 -3
- package/dist/llm/model-mapping-registry.js.map +1 -1
- package/dist/llm/providers/anthropic.provider.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.provider.js +5 -1
- package/dist/llm/providers/anthropic.provider.js.map +1 -1
- package/dist/llm/providers/index.d.ts +2 -0
- package/dist/llm/providers/index.d.ts.map +1 -1
- package/dist/llm/providers/index.js +2 -0
- package/dist/llm/providers/index.js.map +1 -1
- package/dist/llm/providers/local.provider.d.ts +27 -0
- package/dist/llm/providers/local.provider.d.ts.map +1 -0
- package/dist/llm/providers/local.provider.js +179 -0
- package/dist/llm/providers/local.provider.js.map +1 -0
- package/dist/llm/providers/openai.provider.d.ts.map +1 -1
- package/dist/llm/providers/openai.provider.js +1 -0
- package/dist/llm/providers/openai.provider.js.map +1 -1
- package/dist/lsp/lsp-client-manager.service.d.ts +47 -0
- package/dist/lsp/lsp-client-manager.service.d.ts.map +1 -0
- package/dist/lsp/lsp-client-manager.service.js +117 -0
- package/dist/lsp/lsp-client-manager.service.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +45 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +147 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-context-enricher.d.ts +15 -0
- package/dist/lsp/lsp-context-enricher.d.ts.map +1 -0
- package/dist/lsp/lsp-context-enricher.js +72 -0
- package/dist/lsp/lsp-context-enricher.js.map +1 -0
- package/dist/lsp/lsp-language-registry.d.ts +24 -0
- package/dist/lsp/lsp-language-registry.d.ts.map +1 -0
- package/dist/lsp/lsp-language-registry.js +108 -0
- package/dist/lsp/lsp-language-registry.js.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts +34 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.js +57 -0
- package/dist/lsp/lsp-lifecycle.service.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts +32 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts +93 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js +50 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.js +69 -0
- package/dist/lsp/lsp-protocol-adapter.js.map +1 -0
- package/dist/lsp/lsp-result-cache.d.ts +43 -0
- package/dist/lsp/lsp-result-cache.d.ts.map +1 -0
- package/dist/lsp/lsp-result-cache.js +87 -0
- package/dist/lsp/lsp-result-cache.js.map +1 -0
- package/dist/lsp/lsp-tools.service.d.ts +68 -0
- package/dist/lsp/lsp-tools.service.d.ts.map +1 -0
- package/dist/lsp/lsp-tools.service.js +310 -0
- package/dist/lsp/lsp-tools.service.js.map +1 -0
- package/dist/lsp/lsp.types.d.ts +122 -0
- package/dist/lsp/lsp.types.d.ts.map +1 -0
- package/dist/lsp/lsp.types.js +7 -0
- package/dist/lsp/lsp.types.js.map +1 -0
- package/dist/mcp/mcp-client-manager.service.d.ts.map +1 -1
- package/dist/mcp/mcp-client-manager.service.js +32 -6
- package/dist/mcp/mcp-client-manager.service.js.map +1 -1
- package/dist/mcp/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-handler.js +17 -1
- package/dist/mcp/mcp-tool-handler.js.map +1 -1
- package/dist/package.json +4 -1
- package/dist/security/command-guard.d.ts +58 -0
- package/dist/security/command-guard.d.ts.map +1 -0
- package/dist/security/command-guard.js +249 -0
- package/dist/security/command-guard.js.map +1 -0
- package/dist/security/credential-guard.d.ts +42 -0
- package/dist/security/credential-guard.d.ts.map +1 -0
- package/dist/security/credential-guard.js +181 -0
- package/dist/security/credential-guard.js.map +1 -0
- package/dist/security/index.d.ts +22 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +17 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/prompt-injection-detector.d.ts +55 -0
- package/dist/security/prompt-injection-detector.d.ts.map +1 -0
- package/dist/security/prompt-injection-detector.js +233 -0
- package/dist/security/prompt-injection-detector.js.map +1 -0
- package/dist/security/security-event.types.d.ts +19 -0
- package/dist/security/security-event.types.d.ts.map +1 -0
- package/dist/security/security-event.types.js +13 -0
- package/dist/security/security-event.types.js.map +1 -0
- package/dist/security/tool-definition-validator.d.ts +55 -0
- package/dist/security/tool-definition-validator.d.ts.map +1 -0
- package/dist/security/tool-definition-validator.js +221 -0
- package/dist/security/tool-definition-validator.js.map +1 -0
- package/dist/security/tool-integrity-monitor.d.ts +67 -0
- package/dist/security/tool-integrity-monitor.d.ts.map +1 -0
- package/dist/security/tool-integrity-monitor.js +155 -0
- package/dist/security/tool-integrity-monitor.js.map +1 -0
- package/dist/tsconfig.json +3 -0
- package/dist/types/command.types.d.ts +15 -1
- package/dist/types/command.types.d.ts.map +1 -1
- package/dist/types/command.types.js.map +1 -1
- package/dist/types/llm.types.d.ts +2 -0
- package/dist/types/llm.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.d.ts +3 -0
- package/dist/types/provider-names.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.js +3 -0
- package/dist/types/provider-names.types.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.js +8 -3
- package/dist/ui/dashboard/detail-panels/spending-panel.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js +37 -13
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js.map +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js.map +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js.map +1 -1
- package/dist/ui/dashboard/views/performance-view.js +1 -1
- package/dist/ui/dashboard/views/performance-view.js.map +1 -1
- package/dist/utils/spending-tracker.d.ts +22 -0
- package/dist/utils/spending-tracker.d.ts.map +1 -1
- package/dist/utils/spending-tracker.js +33 -1
- package/dist/utils/spending-tracker.js.map +1 -1
- package/dist/utils/token-estimator.d.ts +21 -5
- package/dist/utils/token-estimator.d.ts.map +1 -1
- package/dist/utils/token-estimator.js +74 -28
- package/dist/utils/token-estimator.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client Manager Service
|
|
3
|
+
*
|
|
4
|
+
* Multi-language client pool (singleton). Manages LSP client lifecycle,
|
|
5
|
+
* spawning servers on demand and shutting them down after idle timeout.
|
|
6
|
+
*/
|
|
7
|
+
import { LSPClient } from './lsp-client.js';
|
|
8
|
+
/**
|
|
9
|
+
* LSP Client Manager — manages a pool of language server clients
|
|
10
|
+
*/
|
|
11
|
+
export declare class LSPClientManagerService {
|
|
12
|
+
private readonly clients;
|
|
13
|
+
private readonly projectRoot;
|
|
14
|
+
constructor(projectRoot: string);
|
|
15
|
+
/**
|
|
16
|
+
* Get a client for a file, spawning the server if needed.
|
|
17
|
+
* Returns null if no server is configured for this file type.
|
|
18
|
+
*/
|
|
19
|
+
getClientForFile(filePath: string): Promise<LSPClient | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Shut down all managed clients
|
|
22
|
+
*/
|
|
23
|
+
shutdownAll(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the number of active clients
|
|
26
|
+
*/
|
|
27
|
+
getActiveClientCount(): number;
|
|
28
|
+
/**
|
|
29
|
+
* Get status of all managed clients
|
|
30
|
+
*/
|
|
31
|
+
getStatus(): Array<{
|
|
32
|
+
command: string;
|
|
33
|
+
lastUsed: number;
|
|
34
|
+
state: string;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Update last-used timestamp and reset idle timer
|
|
38
|
+
*/
|
|
39
|
+
private touchClient;
|
|
40
|
+
/**
|
|
41
|
+
* Reset the idle timeout for a client
|
|
42
|
+
*/
|
|
43
|
+
private resetIdleTimer;
|
|
44
|
+
}
|
|
45
|
+
export declare function getLSPClientManager(projectRoot?: string): LSPClientManagerService;
|
|
46
|
+
export declare function resetLSPClientManager(): void;
|
|
47
|
+
//# sourceMappingURL=lsp-client-manager.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-client-manager.service.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-client-manager.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAazC;;GAEG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAqCnE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAQxE;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,cAAc;CAStB;AAOD,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAMjF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client Manager Service
|
|
3
|
+
*
|
|
4
|
+
* Multi-language client pool (singleton). Manages LSP client lifecycle,
|
|
5
|
+
* spawning servers on demand and shutting them down after idle timeout.
|
|
6
|
+
*/
|
|
7
|
+
import { LSPClient } from './lsp-client.js';
|
|
8
|
+
import { getServerForFile } from './lsp-language-registry.js';
|
|
9
|
+
/** Idle timeout before shutting down a server (5 minutes) */
|
|
10
|
+
const IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* LSP Client Manager — manages a pool of language server clients
|
|
13
|
+
*/
|
|
14
|
+
export class LSPClientManagerService {
|
|
15
|
+
clients = new Map();
|
|
16
|
+
projectRoot;
|
|
17
|
+
constructor(projectRoot) {
|
|
18
|
+
this.projectRoot = projectRoot;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get a client for a file, spawning the server if needed.
|
|
22
|
+
* Returns null if no server is configured for this file type.
|
|
23
|
+
*/
|
|
24
|
+
async getClientForFile(filePath) {
|
|
25
|
+
const config = getServerForFile(filePath, this.projectRoot);
|
|
26
|
+
if (!config)
|
|
27
|
+
return null;
|
|
28
|
+
const key = config.command;
|
|
29
|
+
const existing = this.clients.get(key);
|
|
30
|
+
if (existing) {
|
|
31
|
+
this.touchClient(existing);
|
|
32
|
+
if (existing.client.getState() === 'ready') {
|
|
33
|
+
return existing.client;
|
|
34
|
+
}
|
|
35
|
+
// Client exists but not ready — try to restart
|
|
36
|
+
await existing.client.shutdown();
|
|
37
|
+
}
|
|
38
|
+
// Spawn new client
|
|
39
|
+
const client = new LSPClient(config, this.projectRoot);
|
|
40
|
+
const managed = {
|
|
41
|
+
client,
|
|
42
|
+
config,
|
|
43
|
+
idleTimer: null,
|
|
44
|
+
lastUsed: Date.now()
|
|
45
|
+
};
|
|
46
|
+
this.clients.set(key, managed);
|
|
47
|
+
const started = await client.start();
|
|
48
|
+
if (!started) {
|
|
49
|
+
this.clients.delete(key);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
this.resetIdleTimer(managed, key);
|
|
53
|
+
return client;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Shut down all managed clients
|
|
57
|
+
*/
|
|
58
|
+
async shutdownAll() {
|
|
59
|
+
const shutdowns = [];
|
|
60
|
+
for (const [, managed] of this.clients) {
|
|
61
|
+
if (managed.idleTimer)
|
|
62
|
+
clearTimeout(managed.idleTimer);
|
|
63
|
+
shutdowns.push(managed.client.shutdown());
|
|
64
|
+
}
|
|
65
|
+
await Promise.allSettled(shutdowns);
|
|
66
|
+
this.clients.clear();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the number of active clients
|
|
70
|
+
*/
|
|
71
|
+
getActiveClientCount() {
|
|
72
|
+
return this.clients.size;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get status of all managed clients
|
|
76
|
+
*/
|
|
77
|
+
getStatus() {
|
|
78
|
+
return Array.from(this.clients.entries()).map(([key, managed]) => ({
|
|
79
|
+
command: key,
|
|
80
|
+
lastUsed: managed.lastUsed,
|
|
81
|
+
state: managed.client.getState()
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Update last-used timestamp and reset idle timer
|
|
86
|
+
*/
|
|
87
|
+
touchClient(managed) {
|
|
88
|
+
managed.lastUsed = Date.now();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Reset the idle timeout for a client
|
|
92
|
+
*/
|
|
93
|
+
resetIdleTimer(managed, key) {
|
|
94
|
+
if (managed.idleTimer)
|
|
95
|
+
clearTimeout(managed.idleTimer);
|
|
96
|
+
managed.idleTimer = setTimeout(() => {
|
|
97
|
+
void managed.client.shutdown().then(() => {
|
|
98
|
+
this.clients.delete(key);
|
|
99
|
+
});
|
|
100
|
+
}, IDLE_TIMEOUT_MS);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Singleton management
|
|
105
|
+
*/
|
|
106
|
+
let managerInstance = null;
|
|
107
|
+
export function getLSPClientManager(projectRoot) {
|
|
108
|
+
if (!managerInstance && projectRoot) {
|
|
109
|
+
managerInstance = new LSPClientManagerService(projectRoot);
|
|
110
|
+
}
|
|
111
|
+
managerInstance ??= new LSPClientManagerService(process.cwd());
|
|
112
|
+
return managerInstance;
|
|
113
|
+
}
|
|
114
|
+
export function resetLSPClientManager() {
|
|
115
|
+
managerInstance = null;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=lsp-client-manager.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-client-manager.service.js","sourceRoot":"","sources":["../../src/lsp/lsp-client-manager.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client
|
|
3
|
+
*
|
|
4
|
+
* Manages a single language server process: spawning, initialising,
|
|
5
|
+
* request/notification dispatch, and shutdown.
|
|
6
|
+
*
|
|
7
|
+
* Protocol framing (Content-Length / JSON-RPC) is delegated to the
|
|
8
|
+
* LSPProtocolAdapter so that the underlying library can be swapped.
|
|
9
|
+
*/
|
|
10
|
+
import type { LSPClientState, LSPServerConfig } from './lsp.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* LSP Client — manages a single language server process
|
|
13
|
+
*/
|
|
14
|
+
export declare class LSPClient {
|
|
15
|
+
private readonly config;
|
|
16
|
+
private connection;
|
|
17
|
+
private readonly projectRoot;
|
|
18
|
+
private state;
|
|
19
|
+
constructor(config: LSPServerConfig, projectRoot: string);
|
|
20
|
+
/**
|
|
21
|
+
* Get the current client state
|
|
22
|
+
*/
|
|
23
|
+
getState(): LSPClientState;
|
|
24
|
+
/**
|
|
25
|
+
* Start the language server and send initialize request
|
|
26
|
+
*/
|
|
27
|
+
start(): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Send a JSON-RPC request and wait for response
|
|
30
|
+
*/
|
|
31
|
+
sendRequest(method: string, params?: unknown): Promise<unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* Send a JSON-RPC notification (no response expected)
|
|
34
|
+
*/
|
|
35
|
+
sendNotification(method: string, params?: unknown): void;
|
|
36
|
+
/**
|
|
37
|
+
* Graceful shutdown
|
|
38
|
+
*/
|
|
39
|
+
shutdown(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Clean up the connection
|
|
42
|
+
*/
|
|
43
|
+
private cleanup;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=lsp-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-client.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInE;;GAEG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,KAAK,CAA6B;gBAE9B,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM;IAKxD;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAwE/B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAMxD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB/B;;OAEG;IACH,OAAO,CAAC,OAAO;CAYf"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client
|
|
3
|
+
*
|
|
4
|
+
* Manages a single language server process: spawning, initialising,
|
|
5
|
+
* request/notification dispatch, and shutdown.
|
|
6
|
+
*
|
|
7
|
+
* Protocol framing (Content-Length / JSON-RPC) is delegated to the
|
|
8
|
+
* LSPProtocolAdapter so that the underlying library can be swapped.
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'child_process';
|
|
11
|
+
import { getLSPProtocolAdapter } from './lsp-protocol-adapter.interface.js';
|
|
12
|
+
/**
|
|
13
|
+
* LSP Client — manages a single language server process
|
|
14
|
+
*/
|
|
15
|
+
export class LSPClient {
|
|
16
|
+
config;
|
|
17
|
+
connection = null;
|
|
18
|
+
projectRoot;
|
|
19
|
+
state = 'stopped';
|
|
20
|
+
constructor(config, projectRoot) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.projectRoot = projectRoot;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the current client state
|
|
26
|
+
*/
|
|
27
|
+
getState() {
|
|
28
|
+
return this.state;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Start the language server and send initialize request
|
|
32
|
+
*/
|
|
33
|
+
async start() {
|
|
34
|
+
if (this.state === 'ready')
|
|
35
|
+
return true;
|
|
36
|
+
if (this.state === 'starting')
|
|
37
|
+
return false;
|
|
38
|
+
this.state = 'starting';
|
|
39
|
+
try {
|
|
40
|
+
const process = spawn(this.config.command, this.config.args, {
|
|
41
|
+
cwd: this.projectRoot,
|
|
42
|
+
env: { ...globalThis.process.env, ...this.config.env },
|
|
43
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
44
|
+
});
|
|
45
|
+
const adapter = getLSPProtocolAdapter();
|
|
46
|
+
const connection = adapter.createConnection(process);
|
|
47
|
+
if (!connection) {
|
|
48
|
+
this.state = 'error';
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
this.connection = connection;
|
|
52
|
+
connection.onClose(() => {
|
|
53
|
+
this.state = 'stopped';
|
|
54
|
+
});
|
|
55
|
+
connection.onError(() => {
|
|
56
|
+
this.state = 'error';
|
|
57
|
+
});
|
|
58
|
+
process.on('exit', () => {
|
|
59
|
+
this.state = 'stopped';
|
|
60
|
+
});
|
|
61
|
+
process.on('error', () => {
|
|
62
|
+
this.state = 'error';
|
|
63
|
+
});
|
|
64
|
+
connection.listen();
|
|
65
|
+
// Send initialize request
|
|
66
|
+
await connection.sendRequest('initialize', {
|
|
67
|
+
capabilities: {
|
|
68
|
+
textDocument: {
|
|
69
|
+
completion: { completionItem: {} },
|
|
70
|
+
definition: { linkSupport: false },
|
|
71
|
+
hover: { contentFormat: ['plaintext', 'markdown'] },
|
|
72
|
+
publishDiagnostics: {},
|
|
73
|
+
references: {}
|
|
74
|
+
},
|
|
75
|
+
workspace: {
|
|
76
|
+
workspaceFolders: true
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
initializationOptions: this.config.initializationOptions ?? {},
|
|
80
|
+
processId: globalThis.process.pid,
|
|
81
|
+
rootUri: `file://${this.projectRoot}`,
|
|
82
|
+
workspaceFolders: [{ name: 'root', uri: `file://${this.projectRoot}` }]
|
|
83
|
+
});
|
|
84
|
+
// Send initialized notification
|
|
85
|
+
connection.sendNotification('initialized', {});
|
|
86
|
+
this.state = 'ready';
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
this.state = 'error';
|
|
91
|
+
this.cleanup();
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Send a JSON-RPC request and wait for response
|
|
97
|
+
*/
|
|
98
|
+
async sendRequest(method, params) {
|
|
99
|
+
if (!this.connection) {
|
|
100
|
+
throw new Error('LSP client not started');
|
|
101
|
+
}
|
|
102
|
+
return this.connection.sendRequest(method, params);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Send a JSON-RPC notification (no response expected)
|
|
106
|
+
*/
|
|
107
|
+
sendNotification(method, params) {
|
|
108
|
+
if (!this.connection)
|
|
109
|
+
return;
|
|
110
|
+
this.connection.sendNotification(method, params);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Graceful shutdown
|
|
114
|
+
*/
|
|
115
|
+
async shutdown() {
|
|
116
|
+
if (this.state !== 'ready') {
|
|
117
|
+
this.cleanup();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await this.sendRequest('shutdown');
|
|
122
|
+
this.sendNotification('exit');
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Force kill if shutdown fails
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
this.cleanup();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Clean up the connection
|
|
133
|
+
*/
|
|
134
|
+
cleanup() {
|
|
135
|
+
if (this.connection) {
|
|
136
|
+
try {
|
|
137
|
+
this.connection.dispose();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Already disposed
|
|
141
|
+
}
|
|
142
|
+
this.connection = null;
|
|
143
|
+
}
|
|
144
|
+
this.state = 'stopped';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=lsp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-client.js","sourceRoot":"","sources":["../../src/lsp/lsp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Context Enricher
|
|
3
|
+
*
|
|
4
|
+
* Injects diagnostics and type information into message context.
|
|
5
|
+
* Used to provide compiler feedback to the LLM without explicit tool calls.
|
|
6
|
+
*/
|
|
7
|
+
export declare function enrichContextWithDiagnostics(filePaths: string[], projectRoot: string): Promise<null | string>;
|
|
8
|
+
/**
|
|
9
|
+
* Get a quick health check of a file's diagnostic state
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFileDiagnosticSummary(filePath: string, projectRoot: string): Promise<null | {
|
|
12
|
+
errors: number;
|
|
13
|
+
warnings: number;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=lsp-context-enricher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-context-enricher.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-context-enricher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,CAWnH;AAoCD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBtD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Context Enricher
|
|
3
|
+
*
|
|
4
|
+
* Injects diagnostics and type information into message context.
|
|
5
|
+
* Used to provide compiler feedback to the LLM without explicit tool calls.
|
|
6
|
+
*/
|
|
7
|
+
import { getLSPClientManager } from './lsp-client-manager.service.js';
|
|
8
|
+
/** Maximum number of diagnostic items to include in enriched context */
|
|
9
|
+
const MAX_DIAGNOSTIC_ITEMS = 10;
|
|
10
|
+
/** LSP diagnostic severity: Error */
|
|
11
|
+
const LSP_SEVERITY_ERROR = 1;
|
|
12
|
+
/** LSP diagnostic severity: Warning */
|
|
13
|
+
const LSP_SEVERITY_WARNING = 2;
|
|
14
|
+
export async function enrichContextWithDiagnostics(filePaths, projectRoot) {
|
|
15
|
+
const manager = getLSPClientManager(projectRoot);
|
|
16
|
+
const diagnosticLines = [];
|
|
17
|
+
for (const filePath of filePaths) {
|
|
18
|
+
await collectFileDiagnosticLines(manager, filePath, diagnosticLines);
|
|
19
|
+
}
|
|
20
|
+
if (diagnosticLines.length === 0)
|
|
21
|
+
return null;
|
|
22
|
+
return `## Compiler Diagnostics\n\n${diagnosticLines.join('\n')}`;
|
|
23
|
+
}
|
|
24
|
+
async function collectFileDiagnosticLines(manager, filePath, diagnosticLines) {
|
|
25
|
+
const client = await manager.getClientForFile(filePath);
|
|
26
|
+
if (!client)
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
const result = (await client.sendRequest('textDocument/diagnostic', {
|
|
30
|
+
textDocument: { uri: `file://${filePath}` }
|
|
31
|
+
}));
|
|
32
|
+
formatDiagnosticItems(result?.items ?? [], filePath, diagnosticLines);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Server unavailable — skip
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function formatDiagnosticItems(items, filePath, diagnosticLines) {
|
|
39
|
+
const errors = items.filter((d) => d.severity === LSP_SEVERITY_ERROR);
|
|
40
|
+
const warnings = items.filter((d) => d.severity === LSP_SEVERITY_WARNING);
|
|
41
|
+
if (errors.length === 0 && warnings.length === 0)
|
|
42
|
+
return;
|
|
43
|
+
diagnosticLines.push(`### ${filePath}`);
|
|
44
|
+
for (const d of [...errors, ...warnings].slice(0, MAX_DIAGNOSTIC_ITEMS)) {
|
|
45
|
+
const severity = d.severity === LSP_SEVERITY_ERROR ? 'ERROR' : 'WARN';
|
|
46
|
+
const line = (d.range?.start?.line ?? 0) + 1;
|
|
47
|
+
diagnosticLines.push(` ${severity} line ${line}: ${d.message ?? ''}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get a quick health check of a file's diagnostic state
|
|
52
|
+
*/
|
|
53
|
+
export async function getFileDiagnosticSummary(filePath, projectRoot) {
|
|
54
|
+
const manager = getLSPClientManager(projectRoot);
|
|
55
|
+
const client = await manager.getClientForFile(filePath);
|
|
56
|
+
if (!client)
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
const result = (await client.sendRequest('textDocument/diagnostic', {
|
|
60
|
+
textDocument: { uri: `file://${filePath}` }
|
|
61
|
+
}));
|
|
62
|
+
const items = result?.items ?? [];
|
|
63
|
+
return {
|
|
64
|
+
errors: items.filter((d) => d.severity === LSP_SEVERITY_ERROR).length,
|
|
65
|
+
warnings: items.filter((d) => d.severity === LSP_SEVERITY_WARNING).length
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=lsp-context-enricher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-context-enricher.js","sourceRoot":"","sources":["../../src/lsp/lsp-context-enricher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Language Registry
|
|
3
|
+
*
|
|
4
|
+
* Maps file extensions to language server configurations.
|
|
5
|
+
* Servers are configurable via .valora/lsp-servers.json.
|
|
6
|
+
*/
|
|
7
|
+
import type { LSPLanguage, LSPServerConfig } from './lsp.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get the server configuration for a file
|
|
10
|
+
*/
|
|
11
|
+
export declare function getServerForFile(filePath: string, projectRoot?: string): LSPServerConfig | null;
|
|
12
|
+
/**
|
|
13
|
+
* Get the server configuration for a language
|
|
14
|
+
*/
|
|
15
|
+
export declare function getServerForLanguage(language: LSPLanguage, projectRoot?: string): LSPServerConfig | null;
|
|
16
|
+
/**
|
|
17
|
+
* Get all configured server configurations
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAllServers(projectRoot?: string): Record<string, LSPServerConfig>;
|
|
20
|
+
/**
|
|
21
|
+
* Reset cached configurations (for testing)
|
|
22
|
+
*/
|
|
23
|
+
export declare function resetLanguageRegistry(): void;
|
|
24
|
+
//# sourceMappingURL=lsp-language-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-language-registry.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-language-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgFhE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAI/F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGxG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAEnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Language Registry
|
|
3
|
+
*
|
|
4
|
+
* Maps file extensions to language server configurations.
|
|
5
|
+
* Servers are configurable via .valora/lsp-servers.json.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from 'fs';
|
|
8
|
+
import { extname, join } from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Default language server configurations
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_SERVERS = {
|
|
13
|
+
gopls: {
|
|
14
|
+
args: ['serve'],
|
|
15
|
+
command: 'gopls',
|
|
16
|
+
extensions: ['.go'],
|
|
17
|
+
languages: ['go']
|
|
18
|
+
},
|
|
19
|
+
'pyright-langserver': {
|
|
20
|
+
args: ['--stdio'],
|
|
21
|
+
command: 'pyright-langserver',
|
|
22
|
+
extensions: ['.py'],
|
|
23
|
+
languages: ['python']
|
|
24
|
+
},
|
|
25
|
+
'rust-analyzer': {
|
|
26
|
+
args: [],
|
|
27
|
+
command: 'rust-analyzer',
|
|
28
|
+
extensions: ['.rs'],
|
|
29
|
+
languages: ['rust']
|
|
30
|
+
},
|
|
31
|
+
'typescript-language-server': {
|
|
32
|
+
args: ['--stdio'],
|
|
33
|
+
command: 'typescript-language-server',
|
|
34
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs', '.cts', '.cjs'],
|
|
35
|
+
languages: ['typescript', 'javascript']
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Extension-to-server mapping (built lazily)
|
|
40
|
+
*/
|
|
41
|
+
let extensionMap = null;
|
|
42
|
+
let configuredServers = null;
|
|
43
|
+
/**
|
|
44
|
+
* Load server configurations, merging project-level overrides
|
|
45
|
+
*/
|
|
46
|
+
function loadServers(projectRoot) {
|
|
47
|
+
if (configuredServers)
|
|
48
|
+
return configuredServers;
|
|
49
|
+
configuredServers = { ...DEFAULT_SERVERS };
|
|
50
|
+
// Try to load project-level overrides
|
|
51
|
+
if (projectRoot) {
|
|
52
|
+
const configPath = join(projectRoot, '.valora', 'lsp-servers.json');
|
|
53
|
+
if (existsSync(configPath)) {
|
|
54
|
+
try {
|
|
55
|
+
const overrides = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
56
|
+
configuredServers = { ...configuredServers, ...overrides };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Invalid config — use defaults
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return configuredServers;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build the extension-to-server mapping
|
|
67
|
+
*/
|
|
68
|
+
function buildExtensionMap(projectRoot) {
|
|
69
|
+
if (extensionMap)
|
|
70
|
+
return extensionMap;
|
|
71
|
+
extensionMap = new Map();
|
|
72
|
+
const servers = loadServers(projectRoot);
|
|
73
|
+
for (const config of Object.values(servers)) {
|
|
74
|
+
for (const ext of config.extensions) {
|
|
75
|
+
extensionMap.set(ext, config);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return extensionMap;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the server configuration for a file
|
|
82
|
+
*/
|
|
83
|
+
export function getServerForFile(filePath, projectRoot) {
|
|
84
|
+
const ext = extname(filePath).toLowerCase();
|
|
85
|
+
const map = buildExtensionMap(projectRoot);
|
|
86
|
+
return map.get(ext) ?? null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the server configuration for a language
|
|
90
|
+
*/
|
|
91
|
+
export function getServerForLanguage(language, projectRoot) {
|
|
92
|
+
const servers = loadServers(projectRoot);
|
|
93
|
+
return Object.values(servers).find((c) => c.languages.includes(language)) ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all configured server configurations
|
|
97
|
+
*/
|
|
98
|
+
export function getAllServers(projectRoot) {
|
|
99
|
+
return loadServers(projectRoot);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reset cached configurations (for testing)
|
|
103
|
+
*/
|
|
104
|
+
export function resetLanguageRegistry() {
|
|
105
|
+
extensionMap = null;
|
|
106
|
+
configuredServers = null;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=lsp-language-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-language-registry.js","sourceRoot":"","sources":["../../src/lsp/lsp-language-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Lifecycle Service
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of LSP servers within the context of a pipeline run.
|
|
5
|
+
* Handles spawn-on-demand, session scoping, and cleanup.
|
|
6
|
+
*/
|
|
7
|
+
import { type LSPClientManagerService } from './lsp-client-manager.service.js';
|
|
8
|
+
/**
|
|
9
|
+
* LSP Lifecycle Service — coordinates server lifecycle with pipeline execution
|
|
10
|
+
*/
|
|
11
|
+
export declare class LSPLifecycleService {
|
|
12
|
+
private manager;
|
|
13
|
+
private sessionActive;
|
|
14
|
+
constructor(projectRoot: string);
|
|
15
|
+
/**
|
|
16
|
+
* Start a session — allows servers to be spawned
|
|
17
|
+
*/
|
|
18
|
+
startSession(): void;
|
|
19
|
+
/**
|
|
20
|
+
* End a session — shuts down all servers
|
|
21
|
+
*/
|
|
22
|
+
endSession(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a session is active
|
|
25
|
+
*/
|
|
26
|
+
isSessionActive(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get the client manager (for tool handlers to use)
|
|
29
|
+
*/
|
|
30
|
+
getManager(): LSPClientManagerService;
|
|
31
|
+
}
|
|
32
|
+
export declare function getLSPLifecycle(projectRoot?: string): LSPLifecycleService;
|
|
33
|
+
export declare function resetLSPLifecycle(): void;
|
|
34
|
+
//# sourceMappingURL=lsp-lifecycle.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-lifecycle.service.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-lifecycle.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEjG;;GAEG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,UAAU,IAAI,uBAAuB;CAGrC;AAOD,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAMzE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|