@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.
- package/README.md +45 -19
- package/data/agents/secops-engineer.md +74 -7
- package/data/commands/_meta/schema.json +3 -1
- package/data/commands/assert.md +1 -1
- package/data/commands/generate-all-documentation.md +1 -1
- package/data/commands/generate-docs.md +1 -1
- package/data/commands/plan-architecture.md +1 -1
- package/data/commands/plan-implementation.md +1 -1
- package/data/commands/plan.md +1 -1
- package/data/commands/refine-task.md +1 -1
- package/data/commands/registry.json +11 -11
- package/data/commands/review-code.md +1 -1
- package/data/commands/review-functional.md +1 -1
- package/data/prompts/01_onboard/analyze-patterns.md +1 -0
- package/data/prompts/01_onboard/collect-clarifications.md +1 -0
- package/data/prompts/01_onboard/map-dependencies.md +1 -0
- package/data/prompts/02_context/analyze-change-scope.md +1 -0
- package/data/prompts/02_context/analyze-changes-for-review.md +1 -0
- package/data/prompts/02_context/analyze-codebase-changes.md +1 -0
- package/data/prompts/02_context/analyze-command-execution.md +1 -0
- package/data/prompts/02_context/analyze-commits-for-pr.md +1 -0
- package/data/prompts/02_context/analyze-functional-scope.md +1 -0
- package/data/prompts/02_context/analyze-git-branch.md +1 -0
- package/data/prompts/02_context/analyze-git-status.md +1 -0
- package/data/prompts/02_context/analyze-task-context.md +1 -0
- package/data/prompts/02_context/extract-ticket-info.md +1 -0
- package/data/prompts/02_context/extract-ticket-references.md +1 -0
- package/data/prompts/02_context/gather-git-metrics.md +1 -0
- package/data/prompts/02_context/identify-completed-workflow.md +1 -0
- package/data/prompts/02_context/load-and-analyze-parallel.md +1 -0
- package/data/prompts/02_context/load-commit-template.md +1 -0
- package/data/prompts/02_context/load-implementation-context.md +1 -0
- package/data/prompts/02_context/load-plan-context.md +1 -0
- package/data/prompts/02_context/load-pr-template.md +1 -0
- package/data/prompts/02_context/scan-codebase.md +1 -0
- package/data/prompts/02_context/use-modern-cli-tools.md +1 -0
- package/data/prompts/03_plan/assess-complexity.md +1 -0
- package/data/prompts/03_plan/assess-risks.md +1 -0
- package/data/prompts/03_plan/breakdown-implementation.md +1 -0
- package/data/prompts/03_plan/define-architecture.md +1 -0
- package/data/prompts/03_plan/identify-dependencies.md +1 -0
- package/data/prompts/04_code/calculate-version-bump.md +1 -0
- package/data/prompts/04_code/create-version-tag.md +1 -0
- package/data/prompts/04_code/determine-commit-strategy.md +1 -0
- package/data/prompts/04_code/determine-labels.md +1 -0
- package/data/prompts/04_code/determine-reviewers.md +1 -0
- package/data/prompts/04_code/generate-commit-messages.md +1 -0
- package/data/prompts/04_code/generate-pr-description.md +1 -0
- package/data/prompts/04_code/generate-pr-title.md +1 -0
- package/data/prompts/04_code/implement-changes.md +1 -0
- package/data/prompts/04_code/implement-tests.md +1 -0
- package/data/prompts/04_code/interactive-review.md +1 -0
- package/data/prompts/04_code/push-and-create-pr.md +1 -0
- package/data/prompts/04_code/stage-and-commit.md +1 -0
- package/data/prompts/04_code/validate-prerequisites.md +1 -0
- package/data/prompts/04_code/verify-implementation.md +1 -0
- package/data/prompts/05_review/assess-code-quality.md +1 -0
- package/data/prompts/05_review/assess-constraints.md +1 -0
- package/data/prompts/05_review/evaluate-quality-outcomes.md +1 -0
- package/data/prompts/05_review/generate-commit-insights.md +1 -0
- package/data/prompts/05_review/identify-improvement-areas.md +1 -0
- package/data/prompts/05_review/synthesize-plan-assessment.md +1 -0
- package/data/prompts/05_review/synthesize-validation-report.md +1 -0
- package/data/prompts/05_review/validate-functional-requirements.md +1 -0
- package/data/prompts/05_review/validate-maintainability.md +1 -0
- package/data/prompts/05_review/validate-performance.md +1 -0
- package/data/prompts/05_review/validate-pr-creation.md +1 -0
- package/data/prompts/05_review/validate-pr-readiness.md +1 -0
- package/data/prompts/05_review/validate-risk-coverage.md +1 -0
- package/data/prompts/05_review/validate-step-quality.md +1 -0
- package/data/prompts/05_review/validate-technical-feasibility.md +1 -0
- package/data/prompts/05_review/validate-test-strategy.md +1 -0
- package/data/prompts/05_review/verify-commits.md +1 -0
- package/data/prompts/06_test/analyze-results.md +1 -0
- package/data/prompts/06_test/analyze-test-infrastructure.md +1 -0
- package/data/prompts/06_test/execute-tests.md +1 -0
- package/data/prompts/07_documentation/generate-all-domains-parallel.md +1 -0
- package/data/prompts/07_documentation/generate-code-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-summary.md +1 -0
- package/data/prompts/07_documentation/generate-functional-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-prd.md +1 -0
- package/data/prompts/07_documentation/review-and-persist-parallel.md +1 -0
- package/data/prompts/07_documentation/update-changelog.md +1 -0
- package/data/prompts/07_documentation/update-inline-docs.md +1 -0
- package/data/prompts/07_documentation/update-knowledge-base.md +1 -0
- package/data/prompts/_meta/schema.json +4 -0
- package/data/prompts/registry.json +72 -72
- package/dist/ast/ast-context.service.d.ts +32 -0
- package/dist/ast/ast-context.service.d.ts.map +1 -0
- package/dist/ast/ast-context.service.js +220 -0
- package/dist/ast/ast-context.service.js.map +1 -0
- package/dist/ast/ast-index-watcher.service.d.ts +40 -0
- package/dist/ast/ast-index-watcher.service.d.ts.map +1 -0
- package/dist/ast/ast-index-watcher.service.js +124 -0
- package/dist/ast/ast-index-watcher.service.js.map +1 -0
- package/dist/ast/ast-index.service.d.ts +111 -0
- package/dist/ast/ast-index.service.d.ts.map +1 -0
- package/dist/ast/ast-index.service.js +437 -0
- package/dist/ast/ast-index.service.js.map +1 -0
- package/dist/ast/ast-parser.service.d.ts +31 -0
- package/dist/ast/ast-parser.service.d.ts.map +1 -0
- package/dist/ast/ast-parser.service.js +524 -0
- package/dist/ast/ast-parser.service.js.map +1 -0
- package/dist/ast/ast-query.service.d.ts +34 -0
- package/dist/ast/ast-query.service.d.ts.map +1 -0
- package/dist/ast/ast-query.service.js +203 -0
- package/dist/ast/ast-query.service.js.map +1 -0
- package/dist/ast/ast-tools.service.d.ts +39 -0
- package/dist/ast/ast-tools.service.d.ts.map +1 -0
- package/dist/ast/ast-tools.service.js +187 -0
- package/dist/ast/ast-tools.service.js.map +1 -0
- package/dist/ast/ast.types.d.ts +195 -0
- package/dist/ast/ast.types.d.ts.map +1 -0
- package/dist/ast/ast.types.js +8 -0
- package/dist/ast/ast.types.js.map +1 -0
- package/dist/ast/grammars/grammar-loader.d.ts +23 -0
- package/dist/ast/grammars/grammar-loader.d.ts.map +1 -0
- package/dist/ast/grammars/grammar-loader.js +28 -0
- package/dist/ast/grammars/grammar-loader.js.map +1 -0
- package/dist/ast/grammars/language-map.d.ts +28 -0
- package/dist/ast/grammars/language-map.d.ts.map +1 -0
- package/dist/ast/grammars/language-map.js +65 -0
- package/dist/ast/grammars/language-map.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts +39 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts +84 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js +48 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.js +91 -0
- package/dist/ast/grammars/tree-sitter-adapter.js.map +1 -0
- package/dist/cli/autocomplete.d.ts.map +1 -1
- package/dist/cli/autocomplete.js +6 -6
- package/dist/cli/autocomplete.js.map +1 -1
- package/dist/cli/command-executor.d.ts +10 -0
- package/dist/cli/command-executor.d.ts.map +1 -1
- package/dist/cli/command-executor.js +85 -11
- package/dist/cli/command-executor.js.map +1 -1
- package/dist/cli/command-wizard.d.ts.map +1 -1
- package/dist/cli/command-wizard.js +8 -2
- package/dist/cli/command-wizard.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +5 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/first-run-setup.d.ts.map +1 -1
- package/dist/cli/first-run-setup.js +3 -1
- package/dist/cli/first-run-setup.js.map +1 -1
- package/dist/cli/provider-resolver.d.ts.map +1 -1
- package/dist/cli/provider-resolver.js +11 -0
- package/dist/cli/provider-resolver.js.map +1 -1
- package/dist/config/constants.d.ts +18 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +18 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/interactive-wizard.d.ts +7 -0
- package/dist/config/interactive-wizard.d.ts.map +1 -1
- package/dist/config/interactive-wizard.js +24 -19
- package/dist/config/interactive-wizard.js.map +1 -1
- package/dist/config/loader.d.ts +5 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +24 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/providers.config.d.ts.map +1 -1
- package/dist/config/providers.config.js +17 -1
- package/dist/config/providers.config.js.map +1 -1
- package/dist/config/schema.d.ts +194 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validation-helpers.d.ts.map +1 -1
- package/dist/config/validation-helpers.js +84 -41
- package/dist/config/validation-helpers.js.map +1 -1
- package/dist/di/container.d.ts +5 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +17 -0
- package/dist/di/container.js.map +1 -1
- package/dist/executor/message-builder.service.d.ts +2 -0
- package/dist/executor/message-builder.service.d.ts.map +1 -1
- package/dist/executor/message-builder.service.js +6 -1
- package/dist/executor/message-builder.service.js.map +1 -1
- package/dist/executor/stage-executor.d.ts.map +1 -1
- package/dist/executor/stage-executor.js +35 -8
- package/dist/executor/stage-executor.js.map +1 -1
- package/dist/executor/stage-output-cache.d.ts +3 -3
- package/dist/executor/stage-output-cache.d.ts.map +1 -1
- package/dist/executor/stage-output-cache.js +6 -6
- package/dist/executor/stage-output-cache.js.map +1 -1
- package/dist/executor/tool-execution.service.d.ts +2 -0
- package/dist/executor/tool-execution.service.d.ts.map +1 -1
- package/dist/executor/tool-execution.service.js +230 -2
- package/dist/executor/tool-execution.service.js.map +1 -1
- package/dist/executor/tools/search-tools.service.d.ts +1 -1
- package/dist/executor/tools/search-tools.service.d.ts.map +1 -1
- package/dist/executor/tools/search-tools.service.js +25 -3
- package/dist/executor/tools/search-tools.service.js.map +1 -1
- package/dist/executor/variables.d.ts.map +1 -1
- package/dist/executor/variables.js +5 -0
- package/dist/executor/variables.js.map +1 -1
- package/dist/llm/model-mapping-registry.d.ts.map +1 -1
- package/dist/llm/model-mapping-registry.js +11 -3
- package/dist/llm/model-mapping-registry.js.map +1 -1
- package/dist/llm/providers/anthropic.provider.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.provider.js +5 -1
- package/dist/llm/providers/anthropic.provider.js.map +1 -1
- package/dist/llm/providers/index.d.ts +2 -0
- package/dist/llm/providers/index.d.ts.map +1 -1
- package/dist/llm/providers/index.js +2 -0
- package/dist/llm/providers/index.js.map +1 -1
- package/dist/llm/providers/local.provider.d.ts +27 -0
- package/dist/llm/providers/local.provider.d.ts.map +1 -0
- package/dist/llm/providers/local.provider.js +179 -0
- package/dist/llm/providers/local.provider.js.map +1 -0
- package/dist/llm/providers/openai.provider.d.ts.map +1 -1
- package/dist/llm/providers/openai.provider.js +1 -0
- package/dist/llm/providers/openai.provider.js.map +1 -1
- package/dist/lsp/lsp-client-manager.service.d.ts +47 -0
- package/dist/lsp/lsp-client-manager.service.d.ts.map +1 -0
- package/dist/lsp/lsp-client-manager.service.js +117 -0
- package/dist/lsp/lsp-client-manager.service.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +45 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +147 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-context-enricher.d.ts +15 -0
- package/dist/lsp/lsp-context-enricher.d.ts.map +1 -0
- package/dist/lsp/lsp-context-enricher.js +72 -0
- package/dist/lsp/lsp-context-enricher.js.map +1 -0
- package/dist/lsp/lsp-language-registry.d.ts +24 -0
- package/dist/lsp/lsp-language-registry.d.ts.map +1 -0
- package/dist/lsp/lsp-language-registry.js +108 -0
- package/dist/lsp/lsp-language-registry.js.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts +34 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.js +57 -0
- package/dist/lsp/lsp-lifecycle.service.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts +32 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts +93 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js +50 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.js +69 -0
- package/dist/lsp/lsp-protocol-adapter.js.map +1 -0
- package/dist/lsp/lsp-result-cache.d.ts +43 -0
- package/dist/lsp/lsp-result-cache.d.ts.map +1 -0
- package/dist/lsp/lsp-result-cache.js +87 -0
- package/dist/lsp/lsp-result-cache.js.map +1 -0
- package/dist/lsp/lsp-tools.service.d.ts +68 -0
- package/dist/lsp/lsp-tools.service.d.ts.map +1 -0
- package/dist/lsp/lsp-tools.service.js +310 -0
- package/dist/lsp/lsp-tools.service.js.map +1 -0
- package/dist/lsp/lsp.types.d.ts +122 -0
- package/dist/lsp/lsp.types.d.ts.map +1 -0
- package/dist/lsp/lsp.types.js +7 -0
- package/dist/lsp/lsp.types.js.map +1 -0
- package/dist/mcp/mcp-client-manager.service.d.ts.map +1 -1
- package/dist/mcp/mcp-client-manager.service.js +32 -6
- package/dist/mcp/mcp-client-manager.service.js.map +1 -1
- package/dist/mcp/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-handler.js +17 -1
- package/dist/mcp/mcp-tool-handler.js.map +1 -1
- package/dist/package.json +4 -1
- package/dist/security/command-guard.d.ts +58 -0
- package/dist/security/command-guard.d.ts.map +1 -0
- package/dist/security/command-guard.js +249 -0
- package/dist/security/command-guard.js.map +1 -0
- package/dist/security/credential-guard.d.ts +42 -0
- package/dist/security/credential-guard.d.ts.map +1 -0
- package/dist/security/credential-guard.js +181 -0
- package/dist/security/credential-guard.js.map +1 -0
- package/dist/security/index.d.ts +22 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +17 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/prompt-injection-detector.d.ts +55 -0
- package/dist/security/prompt-injection-detector.d.ts.map +1 -0
- package/dist/security/prompt-injection-detector.js +233 -0
- package/dist/security/prompt-injection-detector.js.map +1 -0
- package/dist/security/security-event.types.d.ts +19 -0
- package/dist/security/security-event.types.d.ts.map +1 -0
- package/dist/security/security-event.types.js +13 -0
- package/dist/security/security-event.types.js.map +1 -0
- package/dist/security/tool-definition-validator.d.ts +55 -0
- package/dist/security/tool-definition-validator.d.ts.map +1 -0
- package/dist/security/tool-definition-validator.js +221 -0
- package/dist/security/tool-definition-validator.js.map +1 -0
- package/dist/security/tool-integrity-monitor.d.ts +67 -0
- package/dist/security/tool-integrity-monitor.d.ts.map +1 -0
- package/dist/security/tool-integrity-monitor.js +155 -0
- package/dist/security/tool-integrity-monitor.js.map +1 -0
- package/dist/tsconfig.json +3 -0
- package/dist/types/command.types.d.ts +3 -1
- package/dist/types/command.types.d.ts.map +1 -1
- package/dist/types/command.types.js.map +1 -1
- package/dist/types/llm.types.d.ts +2 -0
- package/dist/types/llm.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.d.ts +3 -0
- package/dist/types/provider-names.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.js +3 -0
- package/dist/types/provider-names.types.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.js +8 -3
- package/dist/ui/dashboard/detail-panels/spending-panel.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js +37 -13
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js.map +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js.map +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js.map +1 -1
- package/dist/ui/dashboard/views/performance-view.js +1 -1
- package/dist/ui/dashboard/views/performance-view.js.map +1 -1
- package/dist/utils/spending-tracker.d.ts +22 -0
- package/dist/utils/spending-tracker.d.ts.map +1 -1
- package/dist/utils/spending-tracker.js +33 -1
- package/dist/utils/spending-tracker.js.map +1 -1
- package/dist/utils/token-estimator.d.ts +21 -5
- package/dist/utils/token-estimator.d.ts.map +1 -1
- package/dist/utils/token-estimator.js +74 -28
- package/dist/utils/token-estimator.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,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"}
|