@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,220 @@
1
+ /**
2
+ * AST Context Service
3
+ *
4
+ * Smart context extraction for token reduction.
5
+ * Provides budget-aware context assembly at different extraction levels.
6
+ */
7
+ import { getASTIndexService } from './ast-index.service.js';
8
+ import { estimateTokens } from './ast-parser.service.js';
9
+ import { searchSymbols } from './ast-query.service.js';
10
+ /**
11
+ * Default token budget (leaves room for system message + output)
12
+ */
13
+ const DEFAULT_BUDGET = 50_000;
14
+ /** Fraction of budget allocated for dependency context */
15
+ const DEPENDENCY_BUDGET_RATIO = 0.9;
16
+ /** Maximum results when searching for focal symbols */
17
+ const FOCAL_SYMBOL_SEARCH_LIMIT = 5;
18
+ /** Maximum number of focal files to consider */
19
+ const MAX_FOCAL_FILES = 10;
20
+ /** Minimum word length for task word extraction */
21
+ const MIN_WORD_LENGTH = 3;
22
+ /**
23
+ * Extract smart context for a task
24
+ */
25
+ export function extractSmartContext(options) {
26
+ const indexService = getASTIndexService();
27
+ const index = indexService.getIndex();
28
+ const budget = options.budget ?? DEFAULT_BUDGET;
29
+ const includedFiles = [];
30
+ const focalSymbols = [];
31
+ const contentParts = [];
32
+ let totalTokens = 0;
33
+ // Step 1: Identify focal files
34
+ const focalFiles = options.files ?? identifyFocalFiles(options.task, index);
35
+ // Step 2: Identify focal symbols from task text
36
+ const taskSymbols = identifyFocalSymbols(options.task);
37
+ // Step 3: Add focal file symbols at Level 2 (full body)
38
+ totalTokens = addFocalFileContext(focalFiles, taskSymbols, budget, indexService, contentParts, includedFiles, focalSymbols, totalTokens);
39
+ // Step 4: Add dependency signatures at Level 1
40
+ addDependencyContext(focalFiles, index, budget, indexService, contentParts, includedFiles, totalTokens);
41
+ return {
42
+ content: contentParts.join('\n\n'),
43
+ focalSymbols,
44
+ includedFiles,
45
+ tokenEstimate: totalTokens
46
+ };
47
+ }
48
+ /**
49
+ * Add focal file symbols at Level 2
50
+ */
51
+ function addFocalFileContext(focalFiles, taskSymbols, budget, indexService, contentParts, includedFiles, focalSymbols, totalTokens) {
52
+ for (const filePath of focalFiles) {
53
+ if (totalTokens >= budget)
54
+ break;
55
+ const fileSymbols = indexService.lookupByFile(filePath);
56
+ if (fileSymbols.length === 0)
57
+ continue;
58
+ const relevantSymbols = fileSymbols.filter((s) => s.exported || taskSymbols.includes(s.name));
59
+ let fileTokens = 0;
60
+ const symbolParts = [`// File: ${filePath}`];
61
+ for (const sym of relevantSymbols) {
62
+ if (totalTokens + fileTokens + sym.tokenEstimate > budget)
63
+ break;
64
+ symbolParts.push(formatSymbolAtLevel(sym, 2));
65
+ fileTokens += sym.tokenEstimate;
66
+ focalSymbols.push(sym.name);
67
+ }
68
+ if (symbolParts.length > 1) {
69
+ contentParts.push(symbolParts.join('\n'));
70
+ totalTokens += fileTokens;
71
+ includedFiles.push({ filePath, level: 2, tokenEstimate: fileTokens });
72
+ }
73
+ }
74
+ return totalTokens;
75
+ }
76
+ /**
77
+ * Add dependency signatures at Level 1
78
+ */
79
+ function addDependencyContext(focalFiles, index, budget, indexService, contentParts, includedFiles, totalTokens) {
80
+ const dependencyFiles = getDependencyFiles(focalFiles, index);
81
+ for (const filePath of dependencyFiles) {
82
+ if (totalTokens >= budget * DEPENDENCY_BUDGET_RATIO)
83
+ break;
84
+ if (focalFiles.includes(filePath))
85
+ continue;
86
+ const fileSymbols = indexService.lookupByFile(filePath);
87
+ const exportedSymbols = fileSymbols.filter((s) => s.exported);
88
+ if (exportedSymbols.length === 0)
89
+ continue;
90
+ let fileTokens = 0;
91
+ const symbolParts = [`// File: ${filePath} (signatures only)`];
92
+ for (const sym of exportedSymbols) {
93
+ const sigTokens = estimateTokens(sym.signature);
94
+ if (totalTokens + fileTokens + sigTokens > budget * DEPENDENCY_BUDGET_RATIO)
95
+ break;
96
+ symbolParts.push(formatSymbolAtLevel(sym, 1));
97
+ fileTokens += sigTokens;
98
+ }
99
+ if (symbolParts.length > 1) {
100
+ contentParts.push(symbolParts.join('\n'));
101
+ totalTokens += fileTokens;
102
+ includedFiles.push({ filePath, level: 1, tokenEstimate: fileTokens });
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Format a symbol at a given extraction level
108
+ */
109
+ function formatSymbolAtLevel(sym, level) {
110
+ switch (level) {
111
+ case 0:
112
+ return ` ${sym.kind} ${sym.name}`;
113
+ case 1:
114
+ return sym.docComment ? `/** ${sym.docComment.split('\n')[0]} */\n${sym.signature}` : sym.signature;
115
+ case 2:
116
+ case 3:
117
+ return sym.docComment
118
+ ? `/** ${sym.docComment} */\n${sym.signature} // lines ${sym.startLine}-${sym.endLine}`
119
+ : `${sym.signature} // lines ${sym.startLine}-${sym.endLine}`;
120
+ }
121
+ }
122
+ /**
123
+ * Identify focal files from task description
124
+ */
125
+ function identifyFocalFiles(task, index) {
126
+ const files = [];
127
+ const filePathPattern = /(?:[\w-]+\/)*[\w-]+\.\w+/g;
128
+ const matches = task.match(filePathPattern) ?? [];
129
+ for (const match of matches) {
130
+ if (index.files[match]) {
131
+ files.push(match);
132
+ }
133
+ }
134
+ const symbolResults = searchSymbols(task.split(/\s+/).filter((w) => w.length > MIN_WORD_LENGTH)[0] ?? '', {
135
+ limit: FOCAL_SYMBOL_SEARCH_LIMIT
136
+ });
137
+ for (const result of symbolResults) {
138
+ if (!files.includes(result.symbol.filePath)) {
139
+ files.push(result.symbol.filePath);
140
+ }
141
+ }
142
+ return files.slice(0, MAX_FOCAL_FILES);
143
+ }
144
+ /**
145
+ * Identify symbol names mentioned in task text
146
+ */
147
+ function identifyFocalSymbols(task) {
148
+ const identifiers = task.match(/\b[A-Z][a-zA-Z0-9]+\b/g) ?? [];
149
+ return [...new Set(identifiers)];
150
+ }
151
+ /**
152
+ * Get files that focal files depend on (via imports)
153
+ */
154
+ function getDependencyFiles(focalFiles, index) {
155
+ const deps = new Set();
156
+ for (const filePath of focalFiles) {
157
+ const fileEntry = index.files[filePath];
158
+ if (!fileEntry)
159
+ continue;
160
+ for (const imp of fileEntry.imports) {
161
+ for (const indexedFilePath of Object.keys(index.files)) {
162
+ if (indexedFilePath.includes(imp.source.replace(/^\.\//, ''))) {
163
+ deps.add(indexedFilePath);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ return Array.from(deps);
169
+ }
170
+ /**
171
+ * Context Deduplicator — tracks what was sent across pipeline stages
172
+ */
173
+ export class ContextDeduplicator {
174
+ state = {
175
+ sentFiles: new Map(),
176
+ sentSymbols: new Map()
177
+ };
178
+ getBackReference(symbolId) {
179
+ const entry = this.state.sentSymbols.get(symbolId);
180
+ if (!entry)
181
+ return null;
182
+ const sym = getASTIndexService().getSymbol(symbolId);
183
+ const name = sym?.name ?? symbolId;
184
+ return `[Previously provided: ${name} — see stage "${entry.stage}"]`;
185
+ }
186
+ recordFileSent(filePath, stage, level) {
187
+ this.state.sentFiles.set(filePath, { level, stage });
188
+ }
189
+ recordSymbolSent(symbolId, stage, level) {
190
+ this.state.sentSymbols.set(symbolId, { level, stage });
191
+ }
192
+ reset() {
193
+ this.state.sentFiles.clear();
194
+ this.state.sentSymbols.clear();
195
+ }
196
+ wasFileSent(filePath, minLevel) {
197
+ const entry = this.state.sentFiles.get(filePath);
198
+ if (entry && entry.level >= minLevel)
199
+ return entry;
200
+ return null;
201
+ }
202
+ wasSymbolSent(symbolId, minLevel) {
203
+ const entry = this.state.sentSymbols.get(symbolId);
204
+ if (entry && entry.level >= minLevel)
205
+ return entry;
206
+ return null;
207
+ }
208
+ }
209
+ /**
210
+ * Singleton
211
+ */
212
+ let deduplicatorInstance = null;
213
+ export function getContextDeduplicator() {
214
+ deduplicatorInstance ??= new ContextDeduplicator();
215
+ return deduplicatorInstance;
216
+ }
217
+ export function resetContextDeduplicator() {
218
+ deduplicatorInstance = null;
219
+ }
220
+ //# sourceMappingURL=ast-context.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-context.service.js","sourceRoot":"","sources":["../../src/ast/ast-context.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * AST Index Watcher Service
3
+ *
4
+ * Watches the file system for changes and triggers incremental index updates.
5
+ * Uses polling-based approach for broad compatibility.
6
+ */
7
+ /**
8
+ * AST Index Watcher — triggers incremental updates on file changes
9
+ */
10
+ export declare class ASTIndexWatcherService {
11
+ private debounceTimer;
12
+ private pendingChanges;
13
+ private readonly projectRoot;
14
+ private running;
15
+ private watcher;
16
+ constructor(projectRoot: string);
17
+ /**
18
+ * Start watching for file changes
19
+ */
20
+ start(): void;
21
+ /**
22
+ * Stop watching
23
+ */
24
+ stop(): void;
25
+ /**
26
+ * Check if the watcher is running
27
+ */
28
+ isRunning(): boolean;
29
+ /**
30
+ * Handle a file change event
31
+ */
32
+ private handleFileChange;
33
+ /**
34
+ * Flush pending changes and trigger incremental update
35
+ */
36
+ private flushChanges;
37
+ }
38
+ export declare function getASTIndexWatcher(projectRoot?: string): ASTIndexWatcherService;
39
+ export declare function resetASTIndexWatcher(): void;
40
+ //# sourceMappingURL=ast-index-watcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-index-watcher.service.d.ts","sourceRoot":"","sources":["../../src/ast/ast-index-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;GAEG;AACH,qBAAa,sBAAsB;IAClC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA0B;gBAE7B,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;YACW,YAAY;CAa1B;AAOD,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAM/E;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * AST Index Watcher Service
3
+ *
4
+ * Watches the file system for changes and triggers incremental index updates.
5
+ * Uses polling-based approach for broad compatibility.
6
+ */
7
+ import { watch } from 'fs';
8
+ import { extname } from 'path';
9
+ import { EXCLUDED_DIRS, getASTIndexService } from './ast-index.service.js';
10
+ import { isSupportedExtension } from './grammars/language-map.js';
11
+ /** Debounce interval for re-indexing (ms) */
12
+ const DEBOUNCE_MS = 500;
13
+ /**
14
+ * AST Index Watcher — triggers incremental updates on file changes
15
+ */
16
+ export class ASTIndexWatcherService {
17
+ debounceTimer = null;
18
+ pendingChanges = new Set();
19
+ projectRoot;
20
+ running = false;
21
+ watcher = null;
22
+ constructor(projectRoot) {
23
+ this.projectRoot = projectRoot;
24
+ }
25
+ /**
26
+ * Start watching for file changes
27
+ */
28
+ start() {
29
+ if (this.running)
30
+ return;
31
+ try {
32
+ this.watcher = watch(this.projectRoot, { recursive: true }, (_eventType, filename) => {
33
+ if (!filename)
34
+ return;
35
+ this.handleFileChange(filename);
36
+ });
37
+ this.watcher.on('error', () => {
38
+ // Watcher error — stop gracefully
39
+ this.stop();
40
+ });
41
+ this.running = true;
42
+ }
43
+ catch {
44
+ // Watching not supported or failed — degrade gracefully
45
+ this.running = false;
46
+ }
47
+ }
48
+ /**
49
+ * Stop watching
50
+ */
51
+ stop() {
52
+ if (this.debounceTimer) {
53
+ clearTimeout(this.debounceTimer);
54
+ this.debounceTimer = null;
55
+ }
56
+ if (this.watcher) {
57
+ this.watcher.close();
58
+ this.watcher = null;
59
+ }
60
+ this.pendingChanges.clear();
61
+ this.running = false;
62
+ }
63
+ /**
64
+ * Check if the watcher is running
65
+ */
66
+ isRunning() {
67
+ return this.running;
68
+ }
69
+ /**
70
+ * Handle a file change event
71
+ */
72
+ handleFileChange(filename) {
73
+ // Skip non-supported files
74
+ const ext = extname(filename);
75
+ if (!isSupportedExtension(ext))
76
+ return;
77
+ // Skip excluded directories
78
+ const parts = filename.split('/');
79
+ if (parts.some((p) => EXCLUDED_DIRS.has(p)))
80
+ return;
81
+ this.pendingChanges.add(filename);
82
+ // Debounce: wait for changes to settle
83
+ if (this.debounceTimer) {
84
+ clearTimeout(this.debounceTimer);
85
+ }
86
+ this.debounceTimer = setTimeout(() => {
87
+ void this.flushChanges();
88
+ }, DEBOUNCE_MS);
89
+ }
90
+ /**
91
+ * Flush pending changes and trigger incremental update
92
+ */
93
+ async flushChanges() {
94
+ if (this.pendingChanges.size === 0)
95
+ return;
96
+ const changedFiles = Array.from(this.pendingChanges);
97
+ this.pendingChanges.clear();
98
+ try {
99
+ const indexService = getASTIndexService(this.projectRoot);
100
+ await indexService.incrementalUpdate(changedFiles);
101
+ }
102
+ catch {
103
+ // Non-fatal: index update failure shouldn't crash anything
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Singleton management
109
+ */
110
+ let watcherInstance = null;
111
+ export function getASTIndexWatcher(projectRoot) {
112
+ if (!watcherInstance && projectRoot) {
113
+ watcherInstance = new ASTIndexWatcherService(projectRoot);
114
+ }
115
+ watcherInstance ??= new ASTIndexWatcherService(process.cwd());
116
+ return watcherInstance;
117
+ }
118
+ export function resetASTIndexWatcher() {
119
+ if (watcherInstance) {
120
+ watcherInstance.stop();
121
+ }
122
+ watcherInstance = null;
123
+ }
124
+ //# sourceMappingURL=ast-index-watcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-index-watcher.service.js","sourceRoot":"","sources":["../../src/ast/ast-index-watcher.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
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 type { CodebaseIndex, IndexedFile, IndexedSymbol } from './ast.types.js';
8
+ /** Directories always excluded from indexing */
9
+ export declare const EXCLUDED_DIRS: Set<string>;
10
+ /**
11
+ * AST Index Service — singleton that manages the codebase index
12
+ */
13
+ export declare class ASTIndexService {
14
+ private building;
15
+ private built;
16
+ private index;
17
+ private readonly indexDir;
18
+ private readonly projectRoot;
19
+ constructor(projectRoot: string);
20
+ /**
21
+ * Check if the index has been built
22
+ */
23
+ isBuilt(): boolean;
24
+ /**
25
+ * Check if the index is currently building
26
+ */
27
+ isBuilding(): boolean;
28
+ /**
29
+ * Get the current index (may be empty if not built)
30
+ */
31
+ getIndex(): CodebaseIndex;
32
+ /**
33
+ * Build the index from scratch
34
+ */
35
+ buildIndex(): Promise<CodebaseIndex>;
36
+ /**
37
+ * Incremental update: re-index only changed files
38
+ */
39
+ incrementalUpdate(changedFiles?: string[]): Promise<number>;
40
+ /**
41
+ * Load a previously persisted index from disk
42
+ */
43
+ loadIndex(): boolean;
44
+ /**
45
+ * Clear the index (in-memory and on disk)
46
+ */
47
+ clearIndex(): void;
48
+ /**
49
+ * Get index statistics
50
+ */
51
+ getStats(): {
52
+ fileCount: number;
53
+ symbolCount: number;
54
+ updatedAt: string;
55
+ };
56
+ /**
57
+ * Look up symbols by name
58
+ */
59
+ lookupByName(name: string): IndexedSymbol[];
60
+ /**
61
+ * Look up symbols in a file
62
+ */
63
+ lookupByFile(filePath: string): IndexedSymbol[];
64
+ /**
65
+ * Get a specific symbol by ID
66
+ */
67
+ getSymbol(id: string): IndexedSymbol | undefined;
68
+ /**
69
+ * Get a file's index entry
70
+ */
71
+ getFile(filePath: string): IndexedFile | undefined;
72
+ private createEmptyIndex;
73
+ /**
74
+ * Discover all indexable files in the project
75
+ */
76
+ private discoverFiles;
77
+ private processDirectoryEntry;
78
+ /**
79
+ * Fallback directory walker when git is unavailable
80
+ */
81
+ private walkDirectory;
82
+ /**
83
+ * Check if a file path should be excluded
84
+ */
85
+ private isExcluded;
86
+ /**
87
+ * Index a batch of files
88
+ */
89
+ private indexFiles;
90
+ /**
91
+ * Index a single file, updating the index in place
92
+ */
93
+ private indexSingleFile;
94
+ /**
95
+ * Remove a file and its symbols from the index
96
+ */
97
+ private addToFileIndex;
98
+ private addToNameIndex;
99
+ private removeFileFromIndex;
100
+ /**
101
+ * Get files changed since last index
102
+ */
103
+ private getChangedFiles;
104
+ /**
105
+ * Persist the index to disk in sharded format
106
+ */
107
+ private persistIndex;
108
+ }
109
+ export declare function getASTIndexService(projectRoot?: string): ASTIndexService;
110
+ export declare function resetASTIndexService(): void;
111
+ //# sourceMappingURL=ast-index.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-index.service.d.ts","sourceRoot":"","sources":["../../src/ast/ast-index.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAmB5F,gDAAgD;AAChD,eAAO,MAAM,aAAa,aAaxB,CAAC;AAEH;;GAEG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,QAAQ,IAAI,aAAa;IAIzB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAgB1C;;OAEG;IACG,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA2CjE;;OAEG;IACH,SAAS,IAAI,OAAO;IAyCpB;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAQzE;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAM3C;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAM/C;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMlD,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;YACW,aAAa;IA0B3B,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;YACW,UAAU;IAkBxB;;OAEG;YACW,eAAe;IAyB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;YACW,eAAe;IAW7B;;OAEG;IACH,OAAO,CAAC,YAAY;CAqCpB;AAOD,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CAMxE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}