@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.
Files changed (324) hide show
  1. package/README.md +45 -19
  2. package/data/agents/secops-engineer.md +74 -7
  3. package/data/commands/_meta/schema.json +8 -1
  4. package/data/commands/assert.md +1 -1
  5. package/data/commands/generate-all-documentation.md +1 -1
  6. package/data/commands/generate-docs.md +1 -1
  7. package/data/commands/implement.md +2 -0
  8. package/data/commands/plan-architecture.md +1 -1
  9. package/data/commands/plan-implementation.md +1 -1
  10. package/data/commands/plan.md +1 -1
  11. package/data/commands/refine-task.md +1 -1
  12. package/data/commands/registry.json +11 -11
  13. package/data/commands/review-code.md +1 -1
  14. package/data/commands/review-functional.md +1 -1
  15. package/data/prompts/01_onboard/analyze-patterns.md +1 -0
  16. package/data/prompts/01_onboard/collect-clarifications.md +1 -0
  17. package/data/prompts/01_onboard/map-dependencies.md +1 -0
  18. package/data/prompts/02_context/analyze-change-scope.md +1 -0
  19. package/data/prompts/02_context/analyze-changes-for-review.md +1 -0
  20. package/data/prompts/02_context/analyze-codebase-changes.md +1 -0
  21. package/data/prompts/02_context/analyze-command-execution.md +1 -0
  22. package/data/prompts/02_context/analyze-commits-for-pr.md +1 -0
  23. package/data/prompts/02_context/analyze-functional-scope.md +1 -0
  24. package/data/prompts/02_context/analyze-git-branch.md +1 -0
  25. package/data/prompts/02_context/analyze-git-status.md +1 -0
  26. package/data/prompts/02_context/analyze-task-context.md +1 -0
  27. package/data/prompts/02_context/extract-ticket-info.md +1 -0
  28. package/data/prompts/02_context/extract-ticket-references.md +1 -0
  29. package/data/prompts/02_context/gather-git-metrics.md +1 -0
  30. package/data/prompts/02_context/identify-completed-workflow.md +1 -0
  31. package/data/prompts/02_context/load-and-analyze-parallel.md +1 -0
  32. package/data/prompts/02_context/load-commit-template.md +1 -0
  33. package/data/prompts/02_context/load-implementation-context.md +1 -0
  34. package/data/prompts/02_context/load-plan-context.md +1 -0
  35. package/data/prompts/02_context/load-pr-template.md +1 -0
  36. package/data/prompts/02_context/scan-codebase.md +1 -0
  37. package/data/prompts/02_context/use-modern-cli-tools.md +1 -0
  38. package/data/prompts/03_plan/assess-complexity.md +1 -0
  39. package/data/prompts/03_plan/assess-risks.md +1 -0
  40. package/data/prompts/03_plan/breakdown-implementation.md +1 -0
  41. package/data/prompts/03_plan/define-architecture.md +1 -0
  42. package/data/prompts/03_plan/identify-dependencies.md +1 -0
  43. package/data/prompts/04_code/calculate-version-bump.md +1 -0
  44. package/data/prompts/04_code/create-version-tag.md +1 -0
  45. package/data/prompts/04_code/determine-commit-strategy.md +1 -0
  46. package/data/prompts/04_code/determine-labels.md +1 -0
  47. package/data/prompts/04_code/determine-reviewers.md +1 -0
  48. package/data/prompts/04_code/generate-commit-messages.md +1 -0
  49. package/data/prompts/04_code/generate-pr-description.md +1 -0
  50. package/data/prompts/04_code/generate-pr-title.md +1 -0
  51. package/data/prompts/04_code/implement-changes.md +1 -0
  52. package/data/prompts/04_code/implement-tests.md +1 -0
  53. package/data/prompts/04_code/interactive-review.md +1 -0
  54. package/data/prompts/04_code/push-and-create-pr.md +1 -0
  55. package/data/prompts/04_code/stage-and-commit.md +1 -0
  56. package/data/prompts/04_code/validate-prerequisites.md +1 -0
  57. package/data/prompts/04_code/verify-implementation.md +1 -0
  58. package/data/prompts/05_review/assess-code-quality.md +1 -0
  59. package/data/prompts/05_review/assess-constraints.md +1 -0
  60. package/data/prompts/05_review/evaluate-quality-outcomes.md +1 -0
  61. package/data/prompts/05_review/generate-commit-insights.md +1 -0
  62. package/data/prompts/05_review/identify-improvement-areas.md +1 -0
  63. package/data/prompts/05_review/synthesize-plan-assessment.md +1 -0
  64. package/data/prompts/05_review/synthesize-validation-report.md +1 -0
  65. package/data/prompts/05_review/validate-functional-requirements.md +1 -0
  66. package/data/prompts/05_review/validate-maintainability.md +1 -0
  67. package/data/prompts/05_review/validate-performance.md +1 -0
  68. package/data/prompts/05_review/validate-pr-creation.md +1 -0
  69. package/data/prompts/05_review/validate-pr-readiness.md +1 -0
  70. package/data/prompts/05_review/validate-risk-coverage.md +1 -0
  71. package/data/prompts/05_review/validate-step-quality.md +1 -0
  72. package/data/prompts/05_review/validate-technical-feasibility.md +1 -0
  73. package/data/prompts/05_review/validate-test-strategy.md +1 -0
  74. package/data/prompts/05_review/verify-commits.md +1 -0
  75. package/data/prompts/06_test/analyze-results.md +1 -0
  76. package/data/prompts/06_test/analyze-test-infrastructure.md +1 -0
  77. package/data/prompts/06_test/execute-tests.md +1 -0
  78. package/data/prompts/07_documentation/generate-all-domains-parallel.md +1 -0
  79. package/data/prompts/07_documentation/generate-code-review-report.md +1 -0
  80. package/data/prompts/07_documentation/generate-feedback-report.md +1 -0
  81. package/data/prompts/07_documentation/generate-feedback-summary.md +1 -0
  82. package/data/prompts/07_documentation/generate-functional-review-report.md +1 -0
  83. package/data/prompts/07_documentation/generate-prd.md +1 -0
  84. package/data/prompts/07_documentation/review-and-persist-parallel.md +1 -0
  85. package/data/prompts/07_documentation/update-changelog.md +1 -0
  86. package/data/prompts/07_documentation/update-inline-docs.md +1 -0
  87. package/data/prompts/07_documentation/update-knowledge-base.md +1 -0
  88. package/data/prompts/_meta/schema.json +4 -0
  89. package/data/prompts/registry.json +72 -72
  90. package/dist/ast/ast-context.service.d.ts +32 -0
  91. package/dist/ast/ast-context.service.d.ts.map +1 -0
  92. package/dist/ast/ast-context.service.js +220 -0
  93. package/dist/ast/ast-context.service.js.map +1 -0
  94. package/dist/ast/ast-index-watcher.service.d.ts +40 -0
  95. package/dist/ast/ast-index-watcher.service.d.ts.map +1 -0
  96. package/dist/ast/ast-index-watcher.service.js +124 -0
  97. package/dist/ast/ast-index-watcher.service.js.map +1 -0
  98. package/dist/ast/ast-index.service.d.ts +111 -0
  99. package/dist/ast/ast-index.service.d.ts.map +1 -0
  100. package/dist/ast/ast-index.service.js +437 -0
  101. package/dist/ast/ast-index.service.js.map +1 -0
  102. package/dist/ast/ast-parser.service.d.ts +31 -0
  103. package/dist/ast/ast-parser.service.d.ts.map +1 -0
  104. package/dist/ast/ast-parser.service.js +524 -0
  105. package/dist/ast/ast-parser.service.js.map +1 -0
  106. package/dist/ast/ast-query.service.d.ts +34 -0
  107. package/dist/ast/ast-query.service.d.ts.map +1 -0
  108. package/dist/ast/ast-query.service.js +203 -0
  109. package/dist/ast/ast-query.service.js.map +1 -0
  110. package/dist/ast/ast-tools.service.d.ts +39 -0
  111. package/dist/ast/ast-tools.service.d.ts.map +1 -0
  112. package/dist/ast/ast-tools.service.js +187 -0
  113. package/dist/ast/ast-tools.service.js.map +1 -0
  114. package/dist/ast/ast.types.d.ts +195 -0
  115. package/dist/ast/ast.types.d.ts.map +1 -0
  116. package/dist/ast/ast.types.js +8 -0
  117. package/dist/ast/ast.types.js.map +1 -0
  118. package/dist/ast/grammars/grammar-loader.d.ts +23 -0
  119. package/dist/ast/grammars/grammar-loader.d.ts.map +1 -0
  120. package/dist/ast/grammars/grammar-loader.js +28 -0
  121. package/dist/ast/grammars/grammar-loader.js.map +1 -0
  122. package/dist/ast/grammars/language-map.d.ts +28 -0
  123. package/dist/ast/grammars/language-map.d.ts.map +1 -0
  124. package/dist/ast/grammars/language-map.js +65 -0
  125. package/dist/ast/grammars/language-map.js.map +1 -0
  126. package/dist/ast/grammars/tree-sitter-adapter.d.ts +39 -0
  127. package/dist/ast/grammars/tree-sitter-adapter.d.ts.map +1 -0
  128. package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts +84 -0
  129. package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts.map +1 -0
  130. package/dist/ast/grammars/tree-sitter-adapter.interface.js +48 -0
  131. package/dist/ast/grammars/tree-sitter-adapter.interface.js.map +1 -0
  132. package/dist/ast/grammars/tree-sitter-adapter.js +91 -0
  133. package/dist/ast/grammars/tree-sitter-adapter.js.map +1 -0
  134. package/dist/cli/autocomplete.d.ts.map +1 -1
  135. package/dist/cli/autocomplete.js +6 -6
  136. package/dist/cli/autocomplete.js.map +1 -1
  137. package/dist/cli/command-executor.d.ts +10 -0
  138. package/dist/cli/command-executor.d.ts.map +1 -1
  139. package/dist/cli/command-executor.js +85 -11
  140. package/dist/cli/command-executor.js.map +1 -1
  141. package/dist/cli/command-wizard.d.ts.map +1 -1
  142. package/dist/cli/command-wizard.js +8 -2
  143. package/dist/cli/command-wizard.js.map +1 -1
  144. package/dist/cli/commands/config.d.ts.map +1 -1
  145. package/dist/cli/commands/config.js +5 -2
  146. package/dist/cli/commands/config.js.map +1 -1
  147. package/dist/cli/first-run-setup.d.ts.map +1 -1
  148. package/dist/cli/first-run-setup.js +3 -1
  149. package/dist/cli/first-run-setup.js.map +1 -1
  150. package/dist/cli/provider-resolver.d.ts.map +1 -1
  151. package/dist/cli/provider-resolver.js +11 -0
  152. package/dist/cli/provider-resolver.js.map +1 -1
  153. package/dist/config/constants.d.ts +18 -0
  154. package/dist/config/constants.d.ts.map +1 -1
  155. package/dist/config/constants.js +18 -0
  156. package/dist/config/constants.js.map +1 -1
  157. package/dist/config/interactive-wizard.d.ts +7 -0
  158. package/dist/config/interactive-wizard.d.ts.map +1 -1
  159. package/dist/config/interactive-wizard.js +24 -19
  160. package/dist/config/interactive-wizard.js.map +1 -1
  161. package/dist/config/loader.d.ts +5 -0
  162. package/dist/config/loader.d.ts.map +1 -1
  163. package/dist/config/loader.js +24 -0
  164. package/dist/config/loader.js.map +1 -1
  165. package/dist/config/providers.config.d.ts.map +1 -1
  166. package/dist/config/providers.config.js +17 -1
  167. package/dist/config/providers.config.js.map +1 -1
  168. package/dist/config/schema.d.ts +194 -6
  169. package/dist/config/schema.d.ts.map +1 -1
  170. package/dist/config/schema.js +1 -0
  171. package/dist/config/schema.js.map +1 -1
  172. package/dist/config/validation-helpers.d.ts.map +1 -1
  173. package/dist/config/validation-helpers.js +84 -41
  174. package/dist/config/validation-helpers.js.map +1 -1
  175. package/dist/di/container.d.ts +5 -0
  176. package/dist/di/container.d.ts.map +1 -1
  177. package/dist/di/container.js +17 -0
  178. package/dist/di/container.js.map +1 -1
  179. package/dist/executor/message-builder.service.d.ts +2 -0
  180. package/dist/executor/message-builder.service.d.ts.map +1 -1
  181. package/dist/executor/message-builder.service.js +6 -1
  182. package/dist/executor/message-builder.service.js.map +1 -1
  183. package/dist/executor/stage-executor.d.ts +15 -5
  184. package/dist/executor/stage-executor.d.ts.map +1 -1
  185. package/dist/executor/stage-executor.js +126 -22
  186. package/dist/executor/stage-executor.js.map +1 -1
  187. package/dist/executor/stage-output-cache.d.ts +3 -3
  188. package/dist/executor/stage-output-cache.d.ts.map +1 -1
  189. package/dist/executor/stage-output-cache.js +6 -6
  190. package/dist/executor/stage-output-cache.js.map +1 -1
  191. package/dist/executor/tool-execution.service.d.ts +12 -0
  192. package/dist/executor/tool-execution.service.d.ts.map +1 -1
  193. package/dist/executor/tool-execution.service.js +270 -8
  194. package/dist/executor/tool-execution.service.js.map +1 -1
  195. package/dist/executor/tools/search-tools.service.d.ts +1 -1
  196. package/dist/executor/tools/search-tools.service.d.ts.map +1 -1
  197. package/dist/executor/tools/search-tools.service.js +25 -3
  198. package/dist/executor/tools/search-tools.service.js.map +1 -1
  199. package/dist/executor/variables.d.ts.map +1 -1
  200. package/dist/executor/variables.js +5 -0
  201. package/dist/executor/variables.js.map +1 -1
  202. package/dist/llm/model-mapping-registry.d.ts.map +1 -1
  203. package/dist/llm/model-mapping-registry.js +11 -3
  204. package/dist/llm/model-mapping-registry.js.map +1 -1
  205. package/dist/llm/providers/anthropic.provider.d.ts.map +1 -1
  206. package/dist/llm/providers/anthropic.provider.js +5 -1
  207. package/dist/llm/providers/anthropic.provider.js.map +1 -1
  208. package/dist/llm/providers/index.d.ts +2 -0
  209. package/dist/llm/providers/index.d.ts.map +1 -1
  210. package/dist/llm/providers/index.js +2 -0
  211. package/dist/llm/providers/index.js.map +1 -1
  212. package/dist/llm/providers/local.provider.d.ts +27 -0
  213. package/dist/llm/providers/local.provider.d.ts.map +1 -0
  214. package/dist/llm/providers/local.provider.js +179 -0
  215. package/dist/llm/providers/local.provider.js.map +1 -0
  216. package/dist/llm/providers/openai.provider.d.ts.map +1 -1
  217. package/dist/llm/providers/openai.provider.js +1 -0
  218. package/dist/llm/providers/openai.provider.js.map +1 -1
  219. package/dist/lsp/lsp-client-manager.service.d.ts +47 -0
  220. package/dist/lsp/lsp-client-manager.service.d.ts.map +1 -0
  221. package/dist/lsp/lsp-client-manager.service.js +117 -0
  222. package/dist/lsp/lsp-client-manager.service.js.map +1 -0
  223. package/dist/lsp/lsp-client.d.ts +45 -0
  224. package/dist/lsp/lsp-client.d.ts.map +1 -0
  225. package/dist/lsp/lsp-client.js +147 -0
  226. package/dist/lsp/lsp-client.js.map +1 -0
  227. package/dist/lsp/lsp-context-enricher.d.ts +15 -0
  228. package/dist/lsp/lsp-context-enricher.d.ts.map +1 -0
  229. package/dist/lsp/lsp-context-enricher.js +72 -0
  230. package/dist/lsp/lsp-context-enricher.js.map +1 -0
  231. package/dist/lsp/lsp-language-registry.d.ts +24 -0
  232. package/dist/lsp/lsp-language-registry.d.ts.map +1 -0
  233. package/dist/lsp/lsp-language-registry.js +108 -0
  234. package/dist/lsp/lsp-language-registry.js.map +1 -0
  235. package/dist/lsp/lsp-lifecycle.service.d.ts +34 -0
  236. package/dist/lsp/lsp-lifecycle.service.d.ts.map +1 -0
  237. package/dist/lsp/lsp-lifecycle.service.js +57 -0
  238. package/dist/lsp/lsp-lifecycle.service.js.map +1 -0
  239. package/dist/lsp/lsp-protocol-adapter.d.ts +32 -0
  240. package/dist/lsp/lsp-protocol-adapter.d.ts.map +1 -0
  241. package/dist/lsp/lsp-protocol-adapter.interface.d.ts +93 -0
  242. package/dist/lsp/lsp-protocol-adapter.interface.d.ts.map +1 -0
  243. package/dist/lsp/lsp-protocol-adapter.interface.js +50 -0
  244. package/dist/lsp/lsp-protocol-adapter.interface.js.map +1 -0
  245. package/dist/lsp/lsp-protocol-adapter.js +69 -0
  246. package/dist/lsp/lsp-protocol-adapter.js.map +1 -0
  247. package/dist/lsp/lsp-result-cache.d.ts +43 -0
  248. package/dist/lsp/lsp-result-cache.d.ts.map +1 -0
  249. package/dist/lsp/lsp-result-cache.js +87 -0
  250. package/dist/lsp/lsp-result-cache.js.map +1 -0
  251. package/dist/lsp/lsp-tools.service.d.ts +68 -0
  252. package/dist/lsp/lsp-tools.service.d.ts.map +1 -0
  253. package/dist/lsp/lsp-tools.service.js +310 -0
  254. package/dist/lsp/lsp-tools.service.js.map +1 -0
  255. package/dist/lsp/lsp.types.d.ts +122 -0
  256. package/dist/lsp/lsp.types.d.ts.map +1 -0
  257. package/dist/lsp/lsp.types.js +7 -0
  258. package/dist/lsp/lsp.types.js.map +1 -0
  259. package/dist/mcp/mcp-client-manager.service.d.ts.map +1 -1
  260. package/dist/mcp/mcp-client-manager.service.js +32 -6
  261. package/dist/mcp/mcp-client-manager.service.js.map +1 -1
  262. package/dist/mcp/mcp-tool-handler.d.ts.map +1 -1
  263. package/dist/mcp/mcp-tool-handler.js +17 -1
  264. package/dist/mcp/mcp-tool-handler.js.map +1 -1
  265. package/dist/package.json +4 -1
  266. package/dist/security/command-guard.d.ts +58 -0
  267. package/dist/security/command-guard.d.ts.map +1 -0
  268. package/dist/security/command-guard.js +249 -0
  269. package/dist/security/command-guard.js.map +1 -0
  270. package/dist/security/credential-guard.d.ts +42 -0
  271. package/dist/security/credential-guard.d.ts.map +1 -0
  272. package/dist/security/credential-guard.js +181 -0
  273. package/dist/security/credential-guard.js.map +1 -0
  274. package/dist/security/index.d.ts +22 -0
  275. package/dist/security/index.d.ts.map +1 -0
  276. package/dist/security/index.js +17 -0
  277. package/dist/security/index.js.map +1 -0
  278. package/dist/security/prompt-injection-detector.d.ts +55 -0
  279. package/dist/security/prompt-injection-detector.d.ts.map +1 -0
  280. package/dist/security/prompt-injection-detector.js +233 -0
  281. package/dist/security/prompt-injection-detector.js.map +1 -0
  282. package/dist/security/security-event.types.d.ts +19 -0
  283. package/dist/security/security-event.types.d.ts.map +1 -0
  284. package/dist/security/security-event.types.js +13 -0
  285. package/dist/security/security-event.types.js.map +1 -0
  286. package/dist/security/tool-definition-validator.d.ts +55 -0
  287. package/dist/security/tool-definition-validator.d.ts.map +1 -0
  288. package/dist/security/tool-definition-validator.js +221 -0
  289. package/dist/security/tool-definition-validator.js.map +1 -0
  290. package/dist/security/tool-integrity-monitor.d.ts +67 -0
  291. package/dist/security/tool-integrity-monitor.d.ts.map +1 -0
  292. package/dist/security/tool-integrity-monitor.js +155 -0
  293. package/dist/security/tool-integrity-monitor.js.map +1 -0
  294. package/dist/tsconfig.json +3 -0
  295. package/dist/types/command.types.d.ts +15 -1
  296. package/dist/types/command.types.d.ts.map +1 -1
  297. package/dist/types/command.types.js.map +1 -1
  298. package/dist/types/llm.types.d.ts +2 -0
  299. package/dist/types/llm.types.d.ts.map +1 -1
  300. package/dist/types/provider-names.types.d.ts +3 -0
  301. package/dist/types/provider-names.types.d.ts.map +1 -1
  302. package/dist/types/provider-names.types.js +3 -0
  303. package/dist/types/provider-names.types.js.map +1 -1
  304. package/dist/ui/dashboard/detail-panels/spending-panel.d.ts.map +1 -1
  305. package/dist/ui/dashboard/detail-panels/spending-panel.js +8 -3
  306. package/dist/ui/dashboard/detail-panels/spending-panel.js.map +1 -1
  307. package/dist/ui/dashboard/detail-panels/token-usage-panel.d.ts.map +1 -1
  308. package/dist/ui/dashboard/detail-panels/token-usage-panel.js +37 -13
  309. package/dist/ui/dashboard/detail-panels/token-usage-panel.js.map +1 -1
  310. package/dist/ui/dashboard/views/agent-analytics-view.js +1 -1
  311. package/dist/ui/dashboard/views/agent-analytics-view.js.map +1 -1
  312. package/dist/ui/dashboard/views/cache-stats-view.js +1 -1
  313. package/dist/ui/dashboard/views/cache-stats-view.js.map +1 -1
  314. package/dist/ui/dashboard/views/performance-view.js +1 -1
  315. package/dist/ui/dashboard/views/performance-view.js.map +1 -1
  316. package/dist/utils/spending-tracker.d.ts +22 -0
  317. package/dist/utils/spending-tracker.d.ts.map +1 -1
  318. package/dist/utils/spending-tracker.js +33 -1
  319. package/dist/utils/spending-tracker.js.map +1 -1
  320. package/dist/utils/token-estimator.d.ts +21 -5
  321. package/dist/utils/token-estimator.d.ts.map +1 -1
  322. package/dist/utils/token-estimator.js +74 -28
  323. package/dist/utils/token-estimator.js.map +1 -1
  324. 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,qCAAqC;AACrC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,uCAAuC;AACvC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAW/B,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,SAAmB,EAAE,WAAmB;IAC1F,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,0BAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,OAAO,8BAA8B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,OAA+C,EAC/C,QAAgB,EAChB,eAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,yBAAyB,EAAE;YACnE,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,QAAQ,EAAE,EAAE;SAC3C,CAAC,CAAwC,CAAC;QAE3C,qBAAqB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACR,4BAA4B;IAC7B,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAuB,EAAE,QAAgB,EAAE,eAAyB;IAClG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,oBAAoB,CAAC,CAAC;IAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEzD,eAAe,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAExC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,eAAe,CAAC,IAAI,CAAC,KAAK,QAAQ,SAAS,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,QAAgB,EAChB,WAAmB;IAEnB,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,yBAAyB,EAAE;YACnE,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,QAAQ,EAAE,EAAE;SAC3C,CAAC,CAAoD,CAAC;QAEvD,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAClC,OAAO;YACN,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,CAAC,MAAM;YACrE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,oBAAoB,CAAC,CAAC,MAAM;SACzE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}
@@ -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"}