@windagency/valora 2.2.1 → 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 (322) hide show
  1. package/README.md +45 -19
  2. package/data/agents/secops-engineer.md +74 -7
  3. package/data/commands/_meta/schema.json +3 -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/plan-architecture.md +1 -1
  8. package/data/commands/plan-implementation.md +1 -1
  9. package/data/commands/plan.md +1 -1
  10. package/data/commands/refine-task.md +1 -1
  11. package/data/commands/registry.json +11 -11
  12. package/data/commands/review-code.md +1 -1
  13. package/data/commands/review-functional.md +1 -1
  14. package/data/prompts/01_onboard/analyze-patterns.md +1 -0
  15. package/data/prompts/01_onboard/collect-clarifications.md +1 -0
  16. package/data/prompts/01_onboard/map-dependencies.md +1 -0
  17. package/data/prompts/02_context/analyze-change-scope.md +1 -0
  18. package/data/prompts/02_context/analyze-changes-for-review.md +1 -0
  19. package/data/prompts/02_context/analyze-codebase-changes.md +1 -0
  20. package/data/prompts/02_context/analyze-command-execution.md +1 -0
  21. package/data/prompts/02_context/analyze-commits-for-pr.md +1 -0
  22. package/data/prompts/02_context/analyze-functional-scope.md +1 -0
  23. package/data/prompts/02_context/analyze-git-branch.md +1 -0
  24. package/data/prompts/02_context/analyze-git-status.md +1 -0
  25. package/data/prompts/02_context/analyze-task-context.md +1 -0
  26. package/data/prompts/02_context/extract-ticket-info.md +1 -0
  27. package/data/prompts/02_context/extract-ticket-references.md +1 -0
  28. package/data/prompts/02_context/gather-git-metrics.md +1 -0
  29. package/data/prompts/02_context/identify-completed-workflow.md +1 -0
  30. package/data/prompts/02_context/load-and-analyze-parallel.md +1 -0
  31. package/data/prompts/02_context/load-commit-template.md +1 -0
  32. package/data/prompts/02_context/load-implementation-context.md +1 -0
  33. package/data/prompts/02_context/load-plan-context.md +1 -0
  34. package/data/prompts/02_context/load-pr-template.md +1 -0
  35. package/data/prompts/02_context/scan-codebase.md +1 -0
  36. package/data/prompts/02_context/use-modern-cli-tools.md +1 -0
  37. package/data/prompts/03_plan/assess-complexity.md +1 -0
  38. package/data/prompts/03_plan/assess-risks.md +1 -0
  39. package/data/prompts/03_plan/breakdown-implementation.md +1 -0
  40. package/data/prompts/03_plan/define-architecture.md +1 -0
  41. package/data/prompts/03_plan/identify-dependencies.md +1 -0
  42. package/data/prompts/04_code/calculate-version-bump.md +1 -0
  43. package/data/prompts/04_code/create-version-tag.md +1 -0
  44. package/data/prompts/04_code/determine-commit-strategy.md +1 -0
  45. package/data/prompts/04_code/determine-labels.md +1 -0
  46. package/data/prompts/04_code/determine-reviewers.md +1 -0
  47. package/data/prompts/04_code/generate-commit-messages.md +1 -0
  48. package/data/prompts/04_code/generate-pr-description.md +1 -0
  49. package/data/prompts/04_code/generate-pr-title.md +1 -0
  50. package/data/prompts/04_code/implement-changes.md +1 -0
  51. package/data/prompts/04_code/implement-tests.md +1 -0
  52. package/data/prompts/04_code/interactive-review.md +1 -0
  53. package/data/prompts/04_code/push-and-create-pr.md +1 -0
  54. package/data/prompts/04_code/stage-and-commit.md +1 -0
  55. package/data/prompts/04_code/validate-prerequisites.md +1 -0
  56. package/data/prompts/04_code/verify-implementation.md +1 -0
  57. package/data/prompts/05_review/assess-code-quality.md +1 -0
  58. package/data/prompts/05_review/assess-constraints.md +1 -0
  59. package/data/prompts/05_review/evaluate-quality-outcomes.md +1 -0
  60. package/data/prompts/05_review/generate-commit-insights.md +1 -0
  61. package/data/prompts/05_review/identify-improvement-areas.md +1 -0
  62. package/data/prompts/05_review/synthesize-plan-assessment.md +1 -0
  63. package/data/prompts/05_review/synthesize-validation-report.md +1 -0
  64. package/data/prompts/05_review/validate-functional-requirements.md +1 -0
  65. package/data/prompts/05_review/validate-maintainability.md +1 -0
  66. package/data/prompts/05_review/validate-performance.md +1 -0
  67. package/data/prompts/05_review/validate-pr-creation.md +1 -0
  68. package/data/prompts/05_review/validate-pr-readiness.md +1 -0
  69. package/data/prompts/05_review/validate-risk-coverage.md +1 -0
  70. package/data/prompts/05_review/validate-step-quality.md +1 -0
  71. package/data/prompts/05_review/validate-technical-feasibility.md +1 -0
  72. package/data/prompts/05_review/validate-test-strategy.md +1 -0
  73. package/data/prompts/05_review/verify-commits.md +1 -0
  74. package/data/prompts/06_test/analyze-results.md +1 -0
  75. package/data/prompts/06_test/analyze-test-infrastructure.md +1 -0
  76. package/data/prompts/06_test/execute-tests.md +1 -0
  77. package/data/prompts/07_documentation/generate-all-domains-parallel.md +1 -0
  78. package/data/prompts/07_documentation/generate-code-review-report.md +1 -0
  79. package/data/prompts/07_documentation/generate-feedback-report.md +1 -0
  80. package/data/prompts/07_documentation/generate-feedback-summary.md +1 -0
  81. package/data/prompts/07_documentation/generate-functional-review-report.md +1 -0
  82. package/data/prompts/07_documentation/generate-prd.md +1 -0
  83. package/data/prompts/07_documentation/review-and-persist-parallel.md +1 -0
  84. package/data/prompts/07_documentation/update-changelog.md +1 -0
  85. package/data/prompts/07_documentation/update-inline-docs.md +1 -0
  86. package/data/prompts/07_documentation/update-knowledge-base.md +1 -0
  87. package/data/prompts/_meta/schema.json +4 -0
  88. package/data/prompts/registry.json +72 -72
  89. package/dist/ast/ast-context.service.d.ts +32 -0
  90. package/dist/ast/ast-context.service.d.ts.map +1 -0
  91. package/dist/ast/ast-context.service.js +220 -0
  92. package/dist/ast/ast-context.service.js.map +1 -0
  93. package/dist/ast/ast-index-watcher.service.d.ts +40 -0
  94. package/dist/ast/ast-index-watcher.service.d.ts.map +1 -0
  95. package/dist/ast/ast-index-watcher.service.js +124 -0
  96. package/dist/ast/ast-index-watcher.service.js.map +1 -0
  97. package/dist/ast/ast-index.service.d.ts +111 -0
  98. package/dist/ast/ast-index.service.d.ts.map +1 -0
  99. package/dist/ast/ast-index.service.js +437 -0
  100. package/dist/ast/ast-index.service.js.map +1 -0
  101. package/dist/ast/ast-parser.service.d.ts +31 -0
  102. package/dist/ast/ast-parser.service.d.ts.map +1 -0
  103. package/dist/ast/ast-parser.service.js +524 -0
  104. package/dist/ast/ast-parser.service.js.map +1 -0
  105. package/dist/ast/ast-query.service.d.ts +34 -0
  106. package/dist/ast/ast-query.service.d.ts.map +1 -0
  107. package/dist/ast/ast-query.service.js +203 -0
  108. package/dist/ast/ast-query.service.js.map +1 -0
  109. package/dist/ast/ast-tools.service.d.ts +39 -0
  110. package/dist/ast/ast-tools.service.d.ts.map +1 -0
  111. package/dist/ast/ast-tools.service.js +187 -0
  112. package/dist/ast/ast-tools.service.js.map +1 -0
  113. package/dist/ast/ast.types.d.ts +195 -0
  114. package/dist/ast/ast.types.d.ts.map +1 -0
  115. package/dist/ast/ast.types.js +8 -0
  116. package/dist/ast/ast.types.js.map +1 -0
  117. package/dist/ast/grammars/grammar-loader.d.ts +23 -0
  118. package/dist/ast/grammars/grammar-loader.d.ts.map +1 -0
  119. package/dist/ast/grammars/grammar-loader.js +28 -0
  120. package/dist/ast/grammars/grammar-loader.js.map +1 -0
  121. package/dist/ast/grammars/language-map.d.ts +28 -0
  122. package/dist/ast/grammars/language-map.d.ts.map +1 -0
  123. package/dist/ast/grammars/language-map.js +65 -0
  124. package/dist/ast/grammars/language-map.js.map +1 -0
  125. package/dist/ast/grammars/tree-sitter-adapter.d.ts +39 -0
  126. package/dist/ast/grammars/tree-sitter-adapter.d.ts.map +1 -0
  127. package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts +84 -0
  128. package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts.map +1 -0
  129. package/dist/ast/grammars/tree-sitter-adapter.interface.js +48 -0
  130. package/dist/ast/grammars/tree-sitter-adapter.interface.js.map +1 -0
  131. package/dist/ast/grammars/tree-sitter-adapter.js +91 -0
  132. package/dist/ast/grammars/tree-sitter-adapter.js.map +1 -0
  133. package/dist/cli/autocomplete.d.ts.map +1 -1
  134. package/dist/cli/autocomplete.js +6 -6
  135. package/dist/cli/autocomplete.js.map +1 -1
  136. package/dist/cli/command-executor.d.ts +10 -0
  137. package/dist/cli/command-executor.d.ts.map +1 -1
  138. package/dist/cli/command-executor.js +85 -11
  139. package/dist/cli/command-executor.js.map +1 -1
  140. package/dist/cli/command-wizard.d.ts.map +1 -1
  141. package/dist/cli/command-wizard.js +8 -2
  142. package/dist/cli/command-wizard.js.map +1 -1
  143. package/dist/cli/commands/config.d.ts.map +1 -1
  144. package/dist/cli/commands/config.js +5 -2
  145. package/dist/cli/commands/config.js.map +1 -1
  146. package/dist/cli/first-run-setup.d.ts.map +1 -1
  147. package/dist/cli/first-run-setup.js +3 -1
  148. package/dist/cli/first-run-setup.js.map +1 -1
  149. package/dist/cli/provider-resolver.d.ts.map +1 -1
  150. package/dist/cli/provider-resolver.js +11 -0
  151. package/dist/cli/provider-resolver.js.map +1 -1
  152. package/dist/config/constants.d.ts +18 -0
  153. package/dist/config/constants.d.ts.map +1 -1
  154. package/dist/config/constants.js +18 -0
  155. package/dist/config/constants.js.map +1 -1
  156. package/dist/config/interactive-wizard.d.ts +7 -0
  157. package/dist/config/interactive-wizard.d.ts.map +1 -1
  158. package/dist/config/interactive-wizard.js +24 -19
  159. package/dist/config/interactive-wizard.js.map +1 -1
  160. package/dist/config/loader.d.ts +5 -0
  161. package/dist/config/loader.d.ts.map +1 -1
  162. package/dist/config/loader.js +24 -0
  163. package/dist/config/loader.js.map +1 -1
  164. package/dist/config/providers.config.d.ts.map +1 -1
  165. package/dist/config/providers.config.js +17 -1
  166. package/dist/config/providers.config.js.map +1 -1
  167. package/dist/config/schema.d.ts +194 -6
  168. package/dist/config/schema.d.ts.map +1 -1
  169. package/dist/config/schema.js +1 -0
  170. package/dist/config/schema.js.map +1 -1
  171. package/dist/config/validation-helpers.d.ts.map +1 -1
  172. package/dist/config/validation-helpers.js +84 -41
  173. package/dist/config/validation-helpers.js.map +1 -1
  174. package/dist/di/container.d.ts +5 -0
  175. package/dist/di/container.d.ts.map +1 -1
  176. package/dist/di/container.js +17 -0
  177. package/dist/di/container.js.map +1 -1
  178. package/dist/executor/message-builder.service.d.ts +2 -0
  179. package/dist/executor/message-builder.service.d.ts.map +1 -1
  180. package/dist/executor/message-builder.service.js +6 -1
  181. package/dist/executor/message-builder.service.js.map +1 -1
  182. package/dist/executor/stage-executor.d.ts.map +1 -1
  183. package/dist/executor/stage-executor.js +35 -8
  184. package/dist/executor/stage-executor.js.map +1 -1
  185. package/dist/executor/stage-output-cache.d.ts +3 -3
  186. package/dist/executor/stage-output-cache.d.ts.map +1 -1
  187. package/dist/executor/stage-output-cache.js +6 -6
  188. package/dist/executor/stage-output-cache.js.map +1 -1
  189. package/dist/executor/tool-execution.service.d.ts +2 -0
  190. package/dist/executor/tool-execution.service.d.ts.map +1 -1
  191. package/dist/executor/tool-execution.service.js +230 -2
  192. package/dist/executor/tool-execution.service.js.map +1 -1
  193. package/dist/executor/tools/search-tools.service.d.ts +1 -1
  194. package/dist/executor/tools/search-tools.service.d.ts.map +1 -1
  195. package/dist/executor/tools/search-tools.service.js +25 -3
  196. package/dist/executor/tools/search-tools.service.js.map +1 -1
  197. package/dist/executor/variables.d.ts.map +1 -1
  198. package/dist/executor/variables.js +5 -0
  199. package/dist/executor/variables.js.map +1 -1
  200. package/dist/llm/model-mapping-registry.d.ts.map +1 -1
  201. package/dist/llm/model-mapping-registry.js +11 -3
  202. package/dist/llm/model-mapping-registry.js.map +1 -1
  203. package/dist/llm/providers/anthropic.provider.d.ts.map +1 -1
  204. package/dist/llm/providers/anthropic.provider.js +5 -1
  205. package/dist/llm/providers/anthropic.provider.js.map +1 -1
  206. package/dist/llm/providers/index.d.ts +2 -0
  207. package/dist/llm/providers/index.d.ts.map +1 -1
  208. package/dist/llm/providers/index.js +2 -0
  209. package/dist/llm/providers/index.js.map +1 -1
  210. package/dist/llm/providers/local.provider.d.ts +27 -0
  211. package/dist/llm/providers/local.provider.d.ts.map +1 -0
  212. package/dist/llm/providers/local.provider.js +179 -0
  213. package/dist/llm/providers/local.provider.js.map +1 -0
  214. package/dist/llm/providers/openai.provider.d.ts.map +1 -1
  215. package/dist/llm/providers/openai.provider.js +1 -0
  216. package/dist/llm/providers/openai.provider.js.map +1 -1
  217. package/dist/lsp/lsp-client-manager.service.d.ts +47 -0
  218. package/dist/lsp/lsp-client-manager.service.d.ts.map +1 -0
  219. package/dist/lsp/lsp-client-manager.service.js +117 -0
  220. package/dist/lsp/lsp-client-manager.service.js.map +1 -0
  221. package/dist/lsp/lsp-client.d.ts +45 -0
  222. package/dist/lsp/lsp-client.d.ts.map +1 -0
  223. package/dist/lsp/lsp-client.js +147 -0
  224. package/dist/lsp/lsp-client.js.map +1 -0
  225. package/dist/lsp/lsp-context-enricher.d.ts +15 -0
  226. package/dist/lsp/lsp-context-enricher.d.ts.map +1 -0
  227. package/dist/lsp/lsp-context-enricher.js +72 -0
  228. package/dist/lsp/lsp-context-enricher.js.map +1 -0
  229. package/dist/lsp/lsp-language-registry.d.ts +24 -0
  230. package/dist/lsp/lsp-language-registry.d.ts.map +1 -0
  231. package/dist/lsp/lsp-language-registry.js +108 -0
  232. package/dist/lsp/lsp-language-registry.js.map +1 -0
  233. package/dist/lsp/lsp-lifecycle.service.d.ts +34 -0
  234. package/dist/lsp/lsp-lifecycle.service.d.ts.map +1 -0
  235. package/dist/lsp/lsp-lifecycle.service.js +57 -0
  236. package/dist/lsp/lsp-lifecycle.service.js.map +1 -0
  237. package/dist/lsp/lsp-protocol-adapter.d.ts +32 -0
  238. package/dist/lsp/lsp-protocol-adapter.d.ts.map +1 -0
  239. package/dist/lsp/lsp-protocol-adapter.interface.d.ts +93 -0
  240. package/dist/lsp/lsp-protocol-adapter.interface.d.ts.map +1 -0
  241. package/dist/lsp/lsp-protocol-adapter.interface.js +50 -0
  242. package/dist/lsp/lsp-protocol-adapter.interface.js.map +1 -0
  243. package/dist/lsp/lsp-protocol-adapter.js +69 -0
  244. package/dist/lsp/lsp-protocol-adapter.js.map +1 -0
  245. package/dist/lsp/lsp-result-cache.d.ts +43 -0
  246. package/dist/lsp/lsp-result-cache.d.ts.map +1 -0
  247. package/dist/lsp/lsp-result-cache.js +87 -0
  248. package/dist/lsp/lsp-result-cache.js.map +1 -0
  249. package/dist/lsp/lsp-tools.service.d.ts +68 -0
  250. package/dist/lsp/lsp-tools.service.d.ts.map +1 -0
  251. package/dist/lsp/lsp-tools.service.js +310 -0
  252. package/dist/lsp/lsp-tools.service.js.map +1 -0
  253. package/dist/lsp/lsp.types.d.ts +122 -0
  254. package/dist/lsp/lsp.types.d.ts.map +1 -0
  255. package/dist/lsp/lsp.types.js +7 -0
  256. package/dist/lsp/lsp.types.js.map +1 -0
  257. package/dist/mcp/mcp-client-manager.service.d.ts.map +1 -1
  258. package/dist/mcp/mcp-client-manager.service.js +32 -6
  259. package/dist/mcp/mcp-client-manager.service.js.map +1 -1
  260. package/dist/mcp/mcp-tool-handler.d.ts.map +1 -1
  261. package/dist/mcp/mcp-tool-handler.js +17 -1
  262. package/dist/mcp/mcp-tool-handler.js.map +1 -1
  263. package/dist/package.json +4 -1
  264. package/dist/security/command-guard.d.ts +58 -0
  265. package/dist/security/command-guard.d.ts.map +1 -0
  266. package/dist/security/command-guard.js +249 -0
  267. package/dist/security/command-guard.js.map +1 -0
  268. package/dist/security/credential-guard.d.ts +42 -0
  269. package/dist/security/credential-guard.d.ts.map +1 -0
  270. package/dist/security/credential-guard.js +181 -0
  271. package/dist/security/credential-guard.js.map +1 -0
  272. package/dist/security/index.d.ts +22 -0
  273. package/dist/security/index.d.ts.map +1 -0
  274. package/dist/security/index.js +17 -0
  275. package/dist/security/index.js.map +1 -0
  276. package/dist/security/prompt-injection-detector.d.ts +55 -0
  277. package/dist/security/prompt-injection-detector.d.ts.map +1 -0
  278. package/dist/security/prompt-injection-detector.js +233 -0
  279. package/dist/security/prompt-injection-detector.js.map +1 -0
  280. package/dist/security/security-event.types.d.ts +19 -0
  281. package/dist/security/security-event.types.d.ts.map +1 -0
  282. package/dist/security/security-event.types.js +13 -0
  283. package/dist/security/security-event.types.js.map +1 -0
  284. package/dist/security/tool-definition-validator.d.ts +55 -0
  285. package/dist/security/tool-definition-validator.d.ts.map +1 -0
  286. package/dist/security/tool-definition-validator.js +221 -0
  287. package/dist/security/tool-definition-validator.js.map +1 -0
  288. package/dist/security/tool-integrity-monitor.d.ts +67 -0
  289. package/dist/security/tool-integrity-monitor.d.ts.map +1 -0
  290. package/dist/security/tool-integrity-monitor.js +155 -0
  291. package/dist/security/tool-integrity-monitor.js.map +1 -0
  292. package/dist/tsconfig.json +3 -0
  293. package/dist/types/command.types.d.ts +3 -1
  294. package/dist/types/command.types.d.ts.map +1 -1
  295. package/dist/types/command.types.js.map +1 -1
  296. package/dist/types/llm.types.d.ts +2 -0
  297. package/dist/types/llm.types.d.ts.map +1 -1
  298. package/dist/types/provider-names.types.d.ts +3 -0
  299. package/dist/types/provider-names.types.d.ts.map +1 -1
  300. package/dist/types/provider-names.types.js +3 -0
  301. package/dist/types/provider-names.types.js.map +1 -1
  302. package/dist/ui/dashboard/detail-panels/spending-panel.d.ts.map +1 -1
  303. package/dist/ui/dashboard/detail-panels/spending-panel.js +8 -3
  304. package/dist/ui/dashboard/detail-panels/spending-panel.js.map +1 -1
  305. package/dist/ui/dashboard/detail-panels/token-usage-panel.d.ts.map +1 -1
  306. package/dist/ui/dashboard/detail-panels/token-usage-panel.js +37 -13
  307. package/dist/ui/dashboard/detail-panels/token-usage-panel.js.map +1 -1
  308. package/dist/ui/dashboard/views/agent-analytics-view.js +1 -1
  309. package/dist/ui/dashboard/views/agent-analytics-view.js.map +1 -1
  310. package/dist/ui/dashboard/views/cache-stats-view.js +1 -1
  311. package/dist/ui/dashboard/views/cache-stats-view.js.map +1 -1
  312. package/dist/ui/dashboard/views/performance-view.js +1 -1
  313. package/dist/ui/dashboard/views/performance-view.js.map +1 -1
  314. package/dist/utils/spending-tracker.d.ts +22 -0
  315. package/dist/utils/spending-tracker.d.ts.map +1 -1
  316. package/dist/utils/spending-tracker.js +33 -1
  317. package/dist/utils/spending-tracker.js.map +1 -1
  318. package/dist/utils/token-estimator.d.ts +21 -5
  319. package/dist/utils/token-estimator.d.ts.map +1 -1
  320. package/dist/utils/token-estimator.js +74 -28
  321. package/dist/utils/token-estimator.js.map +1 -1
  322. package/package.json +4 -1
@@ -0,0 +1,437 @@
1
+ /**
2
+ * AST Index Service
3
+ *
4
+ * Builds, persists, loads, and queries the codebase symbol index.
5
+ * Uses sharded persistence to avoid loading the entire index for queries.
6
+ */
7
+ import { exec } from 'child_process';
8
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
9
+ import { readFile as readFileAsync } from 'fs/promises';
10
+ import { extname, join, relative } from 'path';
11
+ import { promisify } from 'util';
12
+ import { computeContentHash, parseFile } from './ast-parser.service.js';
13
+ import { isSupportedExtension } from './grammars/language-map.js';
14
+ const execAsync = promisify(exec);
15
+ /** Maximum buffer size for exec commands (10 MB) */
16
+ const MAX_EXEC_BUFFER = 10 * 1024 * 1024;
17
+ /** Current index schema version */
18
+ const INDEX_VERSION = 1;
19
+ /** Maximum files to index (safety limit) */
20
+ const MAX_FILES = 50_000;
21
+ /** Number of files indexed concurrently per batch */
22
+ const INDEX_BATCH_SIZE = 100;
23
+ /** Directories always excluded from indexing */
24
+ export const EXCLUDED_DIRS = new Set([
25
+ '.cache',
26
+ '.git',
27
+ '.next',
28
+ '.output',
29
+ '.valora',
30
+ '__pycache__',
31
+ 'build',
32
+ 'coverage',
33
+ 'dist',
34
+ 'node_modules',
35
+ 'target',
36
+ 'vendor'
37
+ ]);
38
+ /**
39
+ * AST Index Service — singleton that manages the codebase index
40
+ */
41
+ export class ASTIndexService {
42
+ building = false;
43
+ built = false;
44
+ index;
45
+ indexDir;
46
+ projectRoot;
47
+ constructor(projectRoot) {
48
+ this.projectRoot = projectRoot;
49
+ this.indexDir = join(projectRoot, '.valora', 'index');
50
+ this.index = this.createEmptyIndex();
51
+ }
52
+ /**
53
+ * Check if the index has been built
54
+ */
55
+ isBuilt() {
56
+ return this.built;
57
+ }
58
+ /**
59
+ * Check if the index is currently building
60
+ */
61
+ isBuilding() {
62
+ return this.building;
63
+ }
64
+ /**
65
+ * Get the current index (may be empty if not built)
66
+ */
67
+ getIndex() {
68
+ return this.index;
69
+ }
70
+ /**
71
+ * Build the index from scratch
72
+ */
73
+ async buildIndex() {
74
+ if (this.building)
75
+ return this.index;
76
+ this.building = true;
77
+ try {
78
+ const filePaths = await this.discoverFiles();
79
+ await this.indexFiles(filePaths);
80
+ this.index.updatedAt = new Date().toISOString();
81
+ this.persistIndex();
82
+ this.built = true;
83
+ return this.index;
84
+ }
85
+ finally {
86
+ this.building = false;
87
+ }
88
+ }
89
+ /**
90
+ * Incremental update: re-index only changed files
91
+ */
92
+ async incrementalUpdate(changedFiles) {
93
+ const files = changedFiles ?? (await this.getChangedFiles());
94
+ if (files.length === 0)
95
+ return 0;
96
+ let updatedCount = 0;
97
+ for (const filePath of files) {
98
+ const relPath = relative(this.projectRoot, filePath.startsWith('/') ? filePath : join(this.projectRoot, filePath));
99
+ const absPath = join(this.projectRoot, relPath);
100
+ if (!existsSync(absPath)) {
101
+ // File was deleted — remove from index
102
+ this.removeFileFromIndex(relPath);
103
+ updatedCount++;
104
+ continue;
105
+ }
106
+ try {
107
+ const content = await readFileAsync(absPath, 'utf-8');
108
+ const hash = computeContentHash(content);
109
+ // Skip if unchanged
110
+ const existing = this.index.files[relPath];
111
+ if (existing?.contentHash === hash)
112
+ continue;
113
+ // Re-parse
114
+ await this.indexSingleFile(relPath, content);
115
+ updatedCount++;
116
+ }
117
+ catch {
118
+ // Skip unreadable files
119
+ }
120
+ }
121
+ if (updatedCount > 0) {
122
+ this.index.updatedAt = new Date().toISOString();
123
+ this.persistIndex();
124
+ }
125
+ return updatedCount;
126
+ }
127
+ /**
128
+ * Load a previously persisted index from disk
129
+ */
130
+ loadIndex() {
131
+ const manifestPath = join(this.indexDir, 'manifest.json');
132
+ if (!existsSync(manifestPath))
133
+ return false;
134
+ try {
135
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
136
+ if (manifest.version !== INDEX_VERSION)
137
+ return false;
138
+ // Load files
139
+ const filesPath = join(this.indexDir, 'files.json');
140
+ if (existsSync(filesPath)) {
141
+ this.index.files = JSON.parse(readFileSync(filesPath, 'utf-8'));
142
+ }
143
+ // Load symbol shards
144
+ this.index.symbols = {};
145
+ this.index.nameIndex = {};
146
+ this.index.fileIndex = {};
147
+ for (const shardFile of manifest.shards) {
148
+ const shardPath = join(this.indexDir, shardFile);
149
+ if (!existsSync(shardPath))
150
+ continue;
151
+ const symbols = JSON.parse(readFileSync(shardPath, 'utf-8'));
152
+ for (const [id, sym] of Object.entries(symbols)) {
153
+ this.index.symbols[id] = sym;
154
+ this.addToNameIndex(sym.name, id);
155
+ this.addToFileIndex(sym.filePath, id);
156
+ }
157
+ }
158
+ this.index.version = manifest.version;
159
+ this.index.projectRoot = manifest.projectRoot;
160
+ this.index.updatedAt = manifest.updatedAt;
161
+ this.built = true;
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Clear the index (in-memory and on disk)
170
+ */
171
+ clearIndex() {
172
+ this.index = this.createEmptyIndex();
173
+ this.built = false;
174
+ if (existsSync(this.indexDir)) {
175
+ rmSync(this.indexDir, { force: true, recursive: true });
176
+ }
177
+ }
178
+ /**
179
+ * Get index statistics
180
+ */
181
+ getStats() {
182
+ return {
183
+ fileCount: Object.keys(this.index.files).length,
184
+ symbolCount: Object.keys(this.index.symbols).length,
185
+ updatedAt: this.index.updatedAt
186
+ };
187
+ }
188
+ /**
189
+ * Look up symbols by name
190
+ */
191
+ lookupByName(name) {
192
+ const ids = this.index.nameIndex[name];
193
+ if (!ids)
194
+ return [];
195
+ return ids.map((id) => this.index.symbols[id]).filter(Boolean);
196
+ }
197
+ /**
198
+ * Look up symbols in a file
199
+ */
200
+ lookupByFile(filePath) {
201
+ const ids = this.index.fileIndex[filePath];
202
+ if (!ids)
203
+ return [];
204
+ return ids.map((id) => this.index.symbols[id]).filter(Boolean);
205
+ }
206
+ /**
207
+ * Get a specific symbol by ID
208
+ */
209
+ getSymbol(id) {
210
+ return this.index.symbols[id];
211
+ }
212
+ /**
213
+ * Get a file's index entry
214
+ */
215
+ getFile(filePath) {
216
+ return this.index.files[filePath];
217
+ }
218
+ // --- Private methods ---
219
+ createEmptyIndex() {
220
+ return {
221
+ fileIndex: {},
222
+ files: {},
223
+ nameIndex: {},
224
+ projectRoot: this.projectRoot,
225
+ symbols: {},
226
+ updatedAt: new Date().toISOString(),
227
+ version: INDEX_VERSION
228
+ };
229
+ }
230
+ /**
231
+ * Discover all indexable files in the project
232
+ */
233
+ async discoverFiles() {
234
+ const files = [];
235
+ try {
236
+ // Use git ls-files for best performance and .gitignore awareness
237
+ const { stdout } = await execAsync('git ls-files --cached --others --exclude-standard', {
238
+ cwd: this.projectRoot,
239
+ maxBuffer: MAX_EXEC_BUFFER
240
+ });
241
+ const allFiles = stdout.trim().split('\n').filter(Boolean);
242
+ for (const file of allFiles) {
243
+ if (files.length >= MAX_FILES)
244
+ break;
245
+ const ext = extname(file);
246
+ if (isSupportedExtension(ext) && !this.isExcluded(file)) {
247
+ files.push(file);
248
+ }
249
+ }
250
+ }
251
+ catch {
252
+ // Fallback: walk directory tree
253
+ this.walkDirectory(this.projectRoot, '', files);
254
+ }
255
+ return files;
256
+ }
257
+ processDirectoryEntry(entry, absDir, relDir, files) {
258
+ const name = entry.name;
259
+ const relPath = relDir ? `${relDir}/${name}` : name;
260
+ if (entry.isDirectory()) {
261
+ if (!EXCLUDED_DIRS.has(name) && !name.startsWith('.')) {
262
+ this.walkDirectory(join(absDir, name), relPath, files);
263
+ }
264
+ }
265
+ else if (entry.isFile() && isSupportedExtension(extname(name))) {
266
+ files.push(relPath);
267
+ }
268
+ }
269
+ /**
270
+ * Fallback directory walker when git is unavailable
271
+ */
272
+ walkDirectory(absDir, relDir, files) {
273
+ if (files.length >= MAX_FILES)
274
+ return;
275
+ try {
276
+ const entries = readdirSync(absDir, { withFileTypes: true });
277
+ for (const entry of entries) {
278
+ if (files.length >= MAX_FILES)
279
+ return;
280
+ this.processDirectoryEntry(entry, absDir, relDir, files);
281
+ }
282
+ }
283
+ catch {
284
+ // Skip unreadable directories
285
+ }
286
+ }
287
+ /**
288
+ * Check if a file path should be excluded
289
+ */
290
+ isExcluded(filePath) {
291
+ const parts = filePath.split('/');
292
+ return parts.some((p) => EXCLUDED_DIRS.has(p));
293
+ }
294
+ /**
295
+ * Index a batch of files
296
+ */
297
+ async indexFiles(filePaths) {
298
+ // Process in batches for memory efficiency
299
+ for (let i = 0; i < filePaths.length; i += INDEX_BATCH_SIZE) {
300
+ const batch = filePaths.slice(i, i + INDEX_BATCH_SIZE);
301
+ await Promise.all(batch.map(async (relPath) => {
302
+ try {
303
+ const absPath = join(this.projectRoot, relPath);
304
+ const content = await readFileAsync(absPath, 'utf-8');
305
+ await this.indexSingleFile(relPath, content);
306
+ }
307
+ catch {
308
+ // Skip unreadable files
309
+ }
310
+ }));
311
+ }
312
+ }
313
+ /**
314
+ * Index a single file, updating the index in place
315
+ */
316
+ async indexSingleFile(relPath, content) {
317
+ // Remove old symbols for this file
318
+ this.removeFileFromIndex(relPath);
319
+ const result = await parseFile(relPath, content);
320
+ if (!result)
321
+ return;
322
+ const fileEntry = {
323
+ contentHash: result.contentHash,
324
+ filePath: relPath,
325
+ imports: result.imports,
326
+ indexedAt: Date.now(),
327
+ language: result.language,
328
+ symbolIds: result.symbols.map((s) => s.id)
329
+ };
330
+ this.index.files[relPath] = fileEntry;
331
+ for (const sym of result.symbols) {
332
+ this.index.symbols[sym.id] = sym;
333
+ this.addToNameIndex(sym.name, sym.id);
334
+ this.addToFileIndex(relPath, sym.id);
335
+ }
336
+ }
337
+ /**
338
+ * Remove a file and its symbols from the index
339
+ */
340
+ addToFileIndex(filePath, id) {
341
+ this.index.fileIndex[filePath] ??= [];
342
+ this.index.fileIndex[filePath].push(id);
343
+ }
344
+ addToNameIndex(name, id) {
345
+ this.index.nameIndex[name] ??= [];
346
+ this.index.nameIndex[name].push(id);
347
+ }
348
+ removeFileFromIndex(filePath) {
349
+ const existing = this.index.files[filePath];
350
+ if (!existing)
351
+ return;
352
+ for (const symId of existing.symbolIds) {
353
+ const sym = this.index.symbols[symId];
354
+ if (sym) {
355
+ // Remove from name index
356
+ const nameIds = this.index.nameIndex[sym.name];
357
+ if (nameIds) {
358
+ this.index.nameIndex[sym.name] = nameIds.filter((id) => id !== symId);
359
+ if (this.index.nameIndex[sym.name].length === 0) {
360
+ delete this.index.nameIndex[sym.name];
361
+ }
362
+ }
363
+ }
364
+ delete this.index.symbols[symId];
365
+ }
366
+ // Remove from file index
367
+ delete this.index.fileIndex[filePath];
368
+ delete this.index.files[filePath];
369
+ }
370
+ /**
371
+ * Get files changed since last index
372
+ */
373
+ async getChangedFiles() {
374
+ try {
375
+ const { stdout } = await execAsync('git diff --name-only HEAD', {
376
+ cwd: this.projectRoot
377
+ });
378
+ return stdout.trim().split('\n').filter(Boolean);
379
+ }
380
+ catch {
381
+ return [];
382
+ }
383
+ }
384
+ /**
385
+ * Persist the index to disk in sharded format
386
+ */
387
+ persistIndex() {
388
+ try {
389
+ mkdirSync(this.indexDir, { recursive: true });
390
+ // Write files.json
391
+ writeFileSync(join(this.indexDir, 'files.json'), JSON.stringify(this.index.files, null, 2));
392
+ // Shard symbols by first character of name (a-z + _other)
393
+ const shards = new Map();
394
+ for (const [id, sym] of Object.entries(this.index.symbols)) {
395
+ const firstChar = sym.name[0]?.toLowerCase() ?? '_';
396
+ const shardKey = /[a-z]/.test(firstChar) ? firstChar : '_other';
397
+ if (!shards.has(shardKey))
398
+ shards.set(shardKey, {});
399
+ shards.get(shardKey)[id] = sym;
400
+ }
401
+ const shardFiles = [];
402
+ for (const [key, symbols] of shards) {
403
+ const filename = `symbols-${key}.json`;
404
+ writeFileSync(join(this.indexDir, filename), JSON.stringify(symbols, null, 2));
405
+ shardFiles.push(filename);
406
+ }
407
+ // Write manifest
408
+ const manifest = {
409
+ fileCount: Object.keys(this.index.files).length,
410
+ projectRoot: this.projectRoot,
411
+ shards: shardFiles,
412
+ symbolCount: Object.keys(this.index.symbols).length,
413
+ updatedAt: this.index.updatedAt,
414
+ version: INDEX_VERSION
415
+ };
416
+ writeFileSync(join(this.indexDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
417
+ }
418
+ catch {
419
+ // Non-fatal: index persistence failure shouldn't crash the pipeline
420
+ }
421
+ }
422
+ }
423
+ /**
424
+ * Singleton management
425
+ */
426
+ let indexServiceInstance = null;
427
+ export function getASTIndexService(projectRoot) {
428
+ if (!indexServiceInstance && projectRoot) {
429
+ indexServiceInstance = new ASTIndexService(projectRoot);
430
+ }
431
+ indexServiceInstance ??= new ASTIndexService(process.cwd());
432
+ return indexServiceInstance;
433
+ }
434
+ export function resetASTIndexService() {
435
+ indexServiceInstance = null;
436
+ }
437
+ //# sourceMappingURL=ast-index.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-index.service.js","sourceRoot":"","sources":["../../src/ast/ast-index.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAe,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1G,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,oDAAoD;AACpD,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,mCAAmC;AACnC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,4CAA4C;AAC5C,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACpC,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,SAAS;IACT,aAAa;IACb,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,QAAQ;IACR,QAAQ;CACR,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,OAAO,eAAe;IACnB,QAAQ,GAAG,KAAK,CAAC;IACjB,KAAK,GAAG,KAAK,CAAC;IACd,KAAK,CAAgB;IACZ,QAAQ,CAAS;IACjB,WAAW,CAAS;IAErC,YAAY,WAAmB;QAC9B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,OAAO;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,UAAU;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACf,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,YAAuB;QAC9C,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEjC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,QAAQ,CACvB,IAAI,CAAC,WAAW,EAChB,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CACtE,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,uCAAuC;gBACvC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBAClC,YAAY,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBAEzC,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,QAAQ,EAAE,WAAW,KAAK,IAAI;oBAAE,SAAS;gBAE7C,WAAW;gBACX,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7C,YAAY,EAAE,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACR,wBAAwB;YACzB,CAAC;QACF,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,YAAY,EAAE,CAAC;QACrB,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,SAAS;QACR,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,KAAK,CAAC;QAE5C,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAkB,CAAC;YAClF,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;YAErD,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAgC,CAAC;YAChG,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YAE1B,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,SAAS;gBAErC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAkC,CAAC;gBAC9F,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;oBAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACvC,CAAC;YACF,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,QAAQ;QACP,OAAO;YACN,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;YAC/C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM;YACnD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;SAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAoB,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAoB,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,0BAA0B;IAElB,gBAAgB;QACvB,OAAO;YACN,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,aAAa;SACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,CAAC;YACJ,iEAAiE;YACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,mDAAmD,EAAE;gBACvF,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,SAAS,EAAE,eAAe;aAC1B,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE3D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;oBAAE,MAAM;gBACrC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,gCAAgC;YAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,KAAa,EAAE,MAAc,EAAE,MAAc,EAAE,KAAe;QAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;QACF,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACF,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAAc,EAAE,MAAc,EAAE,KAAe;QACpE,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;YAAE,OAAO;QAEtC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;oBAAE,OAAO;gBACtC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,8BAA8B;QAC/B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,QAAgB;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,SAAmB;QAC3C,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAChD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACtD,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC;gBAAC,MAAM,CAAC;oBACR,wBAAwB;gBACzB,CAAC;YACF,CAAC,CAAC,CACF,CAAC;QACH,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,OAAe;QAC7D,mCAAmC;QACnC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,SAAS,GAAgB;YAC9B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;QAEtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;IACF,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,QAAgB,EAAE,EAAU;QAClD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,cAAc,CAAC,IAAY,EAAE,EAAU;QAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,GAAG,EAAE,CAAC;gBACT,yBAAyB;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;oBACtE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAClD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACvC,CAAC;gBACF,CAAC;YACF,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC5B,IAAI,CAAC;YACJ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,2BAA2B,EAAE;gBAC/D,GAAG,EAAE,IAAI,CAAC,WAAW;aACrB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED;;OAEG;IACK,YAAY;QACnB,IAAI,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9C,mBAAmB;YACnB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5F,0DAA0D;YAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyC,CAAC;YAChE,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC;gBACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACjC,CAAC;YAED,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;gBACvC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/E,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;YAED,iBAAiB;YACjB,MAAM,QAAQ,GAAkB;gBAC/B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;gBAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM;gBACnD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAC/B,OAAO,EAAE,aAAa;aACtB,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACR,oEAAoE;QACrE,CAAC;IACF,CAAC;CACD;AAED;;GAEG;AACH,IAAI,oBAAoB,GAA2B,IAAI,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,WAAoB;IACtD,IAAI,CAAC,oBAAoB,IAAI,WAAW,EAAE,CAAC;QAC1C,oBAAoB,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IACD,oBAAoB,KAAK,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,OAAO,oBAAoB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,oBAAoB,GAAG,IAAI,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * AST Parser Service
3
+ *
4
+ * Wraps tree-sitter to parse source files and extract symbols, imports,
5
+ * and structural information.
6
+ *
7
+ * Tree-sitter nodes are dynamically typed through WASM — ESLint unsafe
8
+ * rules are suppressed where node property access is unavoidable.
9
+ */
10
+ import type { ASTLanguage, ImportInfo, IndexedSymbol } from './ast.types.js';
11
+ /** Approximate number of characters per token for rough estimation */
12
+ export declare const CHARS_PER_TOKEN = 4;
13
+ /**
14
+ * Result of parsing a single file
15
+ */
16
+ export interface ParseResult {
17
+ contentHash: string;
18
+ imports: ImportInfo[];
19
+ language: ASTLanguage;
20
+ symbols: IndexedSymbol[];
21
+ }
22
+ /**
23
+ * Estimate tokens from text (rough: ~4 chars per token)
24
+ */
25
+ export declare function estimateTokens(text: string): number;
26
+ /**
27
+ * Parse a source file and extract symbols and imports
28
+ */
29
+ export declare function parseFile(filePath: string, content: string): Promise<null | ParseResult>;
30
+ export declare function computeContentHash(content: string): string;
31
+ //# sourceMappingURL=ast-parser.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.service.d.ts","sourceRoot":"","sources":["../../src/ast/ast-parser.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAKtF,sEAAsE;AACtE,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AASD;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,CAqB9F;AAQD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D"}