@windagency/valora 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -19
- package/data/agents/secops-engineer.md +74 -7
- package/data/commands/_meta/schema.json +8 -1
- package/data/commands/assert.md +1 -1
- package/data/commands/generate-all-documentation.md +1 -1
- package/data/commands/generate-docs.md +1 -1
- package/data/commands/implement.md +2 -0
- package/data/commands/plan-architecture.md +1 -1
- package/data/commands/plan-implementation.md +1 -1
- package/data/commands/plan.md +1 -1
- package/data/commands/refine-task.md +1 -1
- package/data/commands/registry.json +11 -11
- package/data/commands/review-code.md +1 -1
- package/data/commands/review-functional.md +1 -1
- package/data/prompts/01_onboard/analyze-patterns.md +1 -0
- package/data/prompts/01_onboard/collect-clarifications.md +1 -0
- package/data/prompts/01_onboard/map-dependencies.md +1 -0
- package/data/prompts/02_context/analyze-change-scope.md +1 -0
- package/data/prompts/02_context/analyze-changes-for-review.md +1 -0
- package/data/prompts/02_context/analyze-codebase-changes.md +1 -0
- package/data/prompts/02_context/analyze-command-execution.md +1 -0
- package/data/prompts/02_context/analyze-commits-for-pr.md +1 -0
- package/data/prompts/02_context/analyze-functional-scope.md +1 -0
- package/data/prompts/02_context/analyze-git-branch.md +1 -0
- package/data/prompts/02_context/analyze-git-status.md +1 -0
- package/data/prompts/02_context/analyze-task-context.md +1 -0
- package/data/prompts/02_context/extract-ticket-info.md +1 -0
- package/data/prompts/02_context/extract-ticket-references.md +1 -0
- package/data/prompts/02_context/gather-git-metrics.md +1 -0
- package/data/prompts/02_context/identify-completed-workflow.md +1 -0
- package/data/prompts/02_context/load-and-analyze-parallel.md +1 -0
- package/data/prompts/02_context/load-commit-template.md +1 -0
- package/data/prompts/02_context/load-implementation-context.md +1 -0
- package/data/prompts/02_context/load-plan-context.md +1 -0
- package/data/prompts/02_context/load-pr-template.md +1 -0
- package/data/prompts/02_context/scan-codebase.md +1 -0
- package/data/prompts/02_context/use-modern-cli-tools.md +1 -0
- package/data/prompts/03_plan/assess-complexity.md +1 -0
- package/data/prompts/03_plan/assess-risks.md +1 -0
- package/data/prompts/03_plan/breakdown-implementation.md +1 -0
- package/data/prompts/03_plan/define-architecture.md +1 -0
- package/data/prompts/03_plan/identify-dependencies.md +1 -0
- package/data/prompts/04_code/calculate-version-bump.md +1 -0
- package/data/prompts/04_code/create-version-tag.md +1 -0
- package/data/prompts/04_code/determine-commit-strategy.md +1 -0
- package/data/prompts/04_code/determine-labels.md +1 -0
- package/data/prompts/04_code/determine-reviewers.md +1 -0
- package/data/prompts/04_code/generate-commit-messages.md +1 -0
- package/data/prompts/04_code/generate-pr-description.md +1 -0
- package/data/prompts/04_code/generate-pr-title.md +1 -0
- package/data/prompts/04_code/implement-changes.md +1 -0
- package/data/prompts/04_code/implement-tests.md +1 -0
- package/data/prompts/04_code/interactive-review.md +1 -0
- package/data/prompts/04_code/push-and-create-pr.md +1 -0
- package/data/prompts/04_code/stage-and-commit.md +1 -0
- package/data/prompts/04_code/validate-prerequisites.md +1 -0
- package/data/prompts/04_code/verify-implementation.md +1 -0
- package/data/prompts/05_review/assess-code-quality.md +1 -0
- package/data/prompts/05_review/assess-constraints.md +1 -0
- package/data/prompts/05_review/evaluate-quality-outcomes.md +1 -0
- package/data/prompts/05_review/generate-commit-insights.md +1 -0
- package/data/prompts/05_review/identify-improvement-areas.md +1 -0
- package/data/prompts/05_review/synthesize-plan-assessment.md +1 -0
- package/data/prompts/05_review/synthesize-validation-report.md +1 -0
- package/data/prompts/05_review/validate-functional-requirements.md +1 -0
- package/data/prompts/05_review/validate-maintainability.md +1 -0
- package/data/prompts/05_review/validate-performance.md +1 -0
- package/data/prompts/05_review/validate-pr-creation.md +1 -0
- package/data/prompts/05_review/validate-pr-readiness.md +1 -0
- package/data/prompts/05_review/validate-risk-coverage.md +1 -0
- package/data/prompts/05_review/validate-step-quality.md +1 -0
- package/data/prompts/05_review/validate-technical-feasibility.md +1 -0
- package/data/prompts/05_review/validate-test-strategy.md +1 -0
- package/data/prompts/05_review/verify-commits.md +1 -0
- package/data/prompts/06_test/analyze-results.md +1 -0
- package/data/prompts/06_test/analyze-test-infrastructure.md +1 -0
- package/data/prompts/06_test/execute-tests.md +1 -0
- package/data/prompts/07_documentation/generate-all-domains-parallel.md +1 -0
- package/data/prompts/07_documentation/generate-code-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-report.md +1 -0
- package/data/prompts/07_documentation/generate-feedback-summary.md +1 -0
- package/data/prompts/07_documentation/generate-functional-review-report.md +1 -0
- package/data/prompts/07_documentation/generate-prd.md +1 -0
- package/data/prompts/07_documentation/review-and-persist-parallel.md +1 -0
- package/data/prompts/07_documentation/update-changelog.md +1 -0
- package/data/prompts/07_documentation/update-inline-docs.md +1 -0
- package/data/prompts/07_documentation/update-knowledge-base.md +1 -0
- package/data/prompts/_meta/schema.json +4 -0
- package/data/prompts/registry.json +72 -72
- package/dist/ast/ast-context.service.d.ts +32 -0
- package/dist/ast/ast-context.service.d.ts.map +1 -0
- package/dist/ast/ast-context.service.js +220 -0
- package/dist/ast/ast-context.service.js.map +1 -0
- package/dist/ast/ast-index-watcher.service.d.ts +40 -0
- package/dist/ast/ast-index-watcher.service.d.ts.map +1 -0
- package/dist/ast/ast-index-watcher.service.js +124 -0
- package/dist/ast/ast-index-watcher.service.js.map +1 -0
- package/dist/ast/ast-index.service.d.ts +111 -0
- package/dist/ast/ast-index.service.d.ts.map +1 -0
- package/dist/ast/ast-index.service.js +437 -0
- package/dist/ast/ast-index.service.js.map +1 -0
- package/dist/ast/ast-parser.service.d.ts +31 -0
- package/dist/ast/ast-parser.service.d.ts.map +1 -0
- package/dist/ast/ast-parser.service.js +524 -0
- package/dist/ast/ast-parser.service.js.map +1 -0
- package/dist/ast/ast-query.service.d.ts +34 -0
- package/dist/ast/ast-query.service.d.ts.map +1 -0
- package/dist/ast/ast-query.service.js +203 -0
- package/dist/ast/ast-query.service.js.map +1 -0
- package/dist/ast/ast-tools.service.d.ts +39 -0
- package/dist/ast/ast-tools.service.d.ts.map +1 -0
- package/dist/ast/ast-tools.service.js +187 -0
- package/dist/ast/ast-tools.service.js.map +1 -0
- package/dist/ast/ast.types.d.ts +195 -0
- package/dist/ast/ast.types.d.ts.map +1 -0
- package/dist/ast/ast.types.js +8 -0
- package/dist/ast/ast.types.js.map +1 -0
- package/dist/ast/grammars/grammar-loader.d.ts +23 -0
- package/dist/ast/grammars/grammar-loader.d.ts.map +1 -0
- package/dist/ast/grammars/grammar-loader.js +28 -0
- package/dist/ast/grammars/grammar-loader.js.map +1 -0
- package/dist/ast/grammars/language-map.d.ts +28 -0
- package/dist/ast/grammars/language-map.d.ts.map +1 -0
- package/dist/ast/grammars/language-map.js +65 -0
- package/dist/ast/grammars/language-map.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts +39 -0
- package/dist/ast/grammars/tree-sitter-adapter.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts +84 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.d.ts.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js +48 -0
- package/dist/ast/grammars/tree-sitter-adapter.interface.js.map +1 -0
- package/dist/ast/grammars/tree-sitter-adapter.js +91 -0
- package/dist/ast/grammars/tree-sitter-adapter.js.map +1 -0
- package/dist/cli/autocomplete.d.ts.map +1 -1
- package/dist/cli/autocomplete.js +6 -6
- package/dist/cli/autocomplete.js.map +1 -1
- package/dist/cli/command-executor.d.ts +10 -0
- package/dist/cli/command-executor.d.ts.map +1 -1
- package/dist/cli/command-executor.js +85 -11
- package/dist/cli/command-executor.js.map +1 -1
- package/dist/cli/command-wizard.d.ts.map +1 -1
- package/dist/cli/command-wizard.js +8 -2
- package/dist/cli/command-wizard.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +5 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/first-run-setup.d.ts.map +1 -1
- package/dist/cli/first-run-setup.js +3 -1
- package/dist/cli/first-run-setup.js.map +1 -1
- package/dist/cli/provider-resolver.d.ts.map +1 -1
- package/dist/cli/provider-resolver.js +11 -0
- package/dist/cli/provider-resolver.js.map +1 -1
- package/dist/config/constants.d.ts +18 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +18 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/interactive-wizard.d.ts +7 -0
- package/dist/config/interactive-wizard.d.ts.map +1 -1
- package/dist/config/interactive-wizard.js +24 -19
- package/dist/config/interactive-wizard.js.map +1 -1
- package/dist/config/loader.d.ts +5 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +24 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/providers.config.d.ts.map +1 -1
- package/dist/config/providers.config.js +17 -1
- package/dist/config/providers.config.js.map +1 -1
- package/dist/config/schema.d.ts +194 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validation-helpers.d.ts.map +1 -1
- package/dist/config/validation-helpers.js +84 -41
- package/dist/config/validation-helpers.js.map +1 -1
- package/dist/di/container.d.ts +5 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +17 -0
- package/dist/di/container.js.map +1 -1
- package/dist/executor/message-builder.service.d.ts +2 -0
- package/dist/executor/message-builder.service.d.ts.map +1 -1
- package/dist/executor/message-builder.service.js +6 -1
- package/dist/executor/message-builder.service.js.map +1 -1
- package/dist/executor/stage-executor.d.ts +15 -5
- package/dist/executor/stage-executor.d.ts.map +1 -1
- package/dist/executor/stage-executor.js +126 -22
- package/dist/executor/stage-executor.js.map +1 -1
- package/dist/executor/stage-output-cache.d.ts +3 -3
- package/dist/executor/stage-output-cache.d.ts.map +1 -1
- package/dist/executor/stage-output-cache.js +6 -6
- package/dist/executor/stage-output-cache.js.map +1 -1
- package/dist/executor/tool-execution.service.d.ts +12 -0
- package/dist/executor/tool-execution.service.d.ts.map +1 -1
- package/dist/executor/tool-execution.service.js +270 -8
- package/dist/executor/tool-execution.service.js.map +1 -1
- package/dist/executor/tools/search-tools.service.d.ts +1 -1
- package/dist/executor/tools/search-tools.service.d.ts.map +1 -1
- package/dist/executor/tools/search-tools.service.js +25 -3
- package/dist/executor/tools/search-tools.service.js.map +1 -1
- package/dist/executor/variables.d.ts.map +1 -1
- package/dist/executor/variables.js +5 -0
- package/dist/executor/variables.js.map +1 -1
- package/dist/llm/model-mapping-registry.d.ts.map +1 -1
- package/dist/llm/model-mapping-registry.js +11 -3
- package/dist/llm/model-mapping-registry.js.map +1 -1
- package/dist/llm/providers/anthropic.provider.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.provider.js +5 -1
- package/dist/llm/providers/anthropic.provider.js.map +1 -1
- package/dist/llm/providers/index.d.ts +2 -0
- package/dist/llm/providers/index.d.ts.map +1 -1
- package/dist/llm/providers/index.js +2 -0
- package/dist/llm/providers/index.js.map +1 -1
- package/dist/llm/providers/local.provider.d.ts +27 -0
- package/dist/llm/providers/local.provider.d.ts.map +1 -0
- package/dist/llm/providers/local.provider.js +179 -0
- package/dist/llm/providers/local.provider.js.map +1 -0
- package/dist/llm/providers/openai.provider.d.ts.map +1 -1
- package/dist/llm/providers/openai.provider.js +1 -0
- package/dist/llm/providers/openai.provider.js.map +1 -1
- package/dist/lsp/lsp-client-manager.service.d.ts +47 -0
- package/dist/lsp/lsp-client-manager.service.d.ts.map +1 -0
- package/dist/lsp/lsp-client-manager.service.js +117 -0
- package/dist/lsp/lsp-client-manager.service.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +45 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +147 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-context-enricher.d.ts +15 -0
- package/dist/lsp/lsp-context-enricher.d.ts.map +1 -0
- package/dist/lsp/lsp-context-enricher.js +72 -0
- package/dist/lsp/lsp-context-enricher.js.map +1 -0
- package/dist/lsp/lsp-language-registry.d.ts +24 -0
- package/dist/lsp/lsp-language-registry.d.ts.map +1 -0
- package/dist/lsp/lsp-language-registry.js +108 -0
- package/dist/lsp/lsp-language-registry.js.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts +34 -0
- package/dist/lsp/lsp-lifecycle.service.d.ts.map +1 -0
- package/dist/lsp/lsp-lifecycle.service.js +57 -0
- package/dist/lsp/lsp-lifecycle.service.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts +32 -0
- package/dist/lsp/lsp-protocol-adapter.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts +93 -0
- package/dist/lsp/lsp-protocol-adapter.interface.d.ts.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js +50 -0
- package/dist/lsp/lsp-protocol-adapter.interface.js.map +1 -0
- package/dist/lsp/lsp-protocol-adapter.js +69 -0
- package/dist/lsp/lsp-protocol-adapter.js.map +1 -0
- package/dist/lsp/lsp-result-cache.d.ts +43 -0
- package/dist/lsp/lsp-result-cache.d.ts.map +1 -0
- package/dist/lsp/lsp-result-cache.js +87 -0
- package/dist/lsp/lsp-result-cache.js.map +1 -0
- package/dist/lsp/lsp-tools.service.d.ts +68 -0
- package/dist/lsp/lsp-tools.service.d.ts.map +1 -0
- package/dist/lsp/lsp-tools.service.js +310 -0
- package/dist/lsp/lsp-tools.service.js.map +1 -0
- package/dist/lsp/lsp.types.d.ts +122 -0
- package/dist/lsp/lsp.types.d.ts.map +1 -0
- package/dist/lsp/lsp.types.js +7 -0
- package/dist/lsp/lsp.types.js.map +1 -0
- package/dist/mcp/mcp-client-manager.service.d.ts.map +1 -1
- package/dist/mcp/mcp-client-manager.service.js +32 -6
- package/dist/mcp/mcp-client-manager.service.js.map +1 -1
- package/dist/mcp/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-handler.js +17 -1
- package/dist/mcp/mcp-tool-handler.js.map +1 -1
- package/dist/package.json +4 -1
- package/dist/security/command-guard.d.ts +58 -0
- package/dist/security/command-guard.d.ts.map +1 -0
- package/dist/security/command-guard.js +249 -0
- package/dist/security/command-guard.js.map +1 -0
- package/dist/security/credential-guard.d.ts +42 -0
- package/dist/security/credential-guard.d.ts.map +1 -0
- package/dist/security/credential-guard.js +181 -0
- package/dist/security/credential-guard.js.map +1 -0
- package/dist/security/index.d.ts +22 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +17 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/prompt-injection-detector.d.ts +55 -0
- package/dist/security/prompt-injection-detector.d.ts.map +1 -0
- package/dist/security/prompt-injection-detector.js +233 -0
- package/dist/security/prompt-injection-detector.js.map +1 -0
- package/dist/security/security-event.types.d.ts +19 -0
- package/dist/security/security-event.types.d.ts.map +1 -0
- package/dist/security/security-event.types.js +13 -0
- package/dist/security/security-event.types.js.map +1 -0
- package/dist/security/tool-definition-validator.d.ts +55 -0
- package/dist/security/tool-definition-validator.d.ts.map +1 -0
- package/dist/security/tool-definition-validator.js +221 -0
- package/dist/security/tool-definition-validator.js.map +1 -0
- package/dist/security/tool-integrity-monitor.d.ts +67 -0
- package/dist/security/tool-integrity-monitor.d.ts.map +1 -0
- package/dist/security/tool-integrity-monitor.js +155 -0
- package/dist/security/tool-integrity-monitor.js.map +1 -0
- package/dist/tsconfig.json +3 -0
- package/dist/types/command.types.d.ts +15 -1
- package/dist/types/command.types.d.ts.map +1 -1
- package/dist/types/command.types.js.map +1 -1
- package/dist/types/llm.types.d.ts +2 -0
- package/dist/types/llm.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.d.ts +3 -0
- package/dist/types/provider-names.types.d.ts.map +1 -1
- package/dist/types/provider-names.types.js +3 -0
- package/dist/types/provider-names.types.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/spending-panel.js +8 -3
- package/dist/ui/dashboard/detail-panels/spending-panel.js.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.d.ts.map +1 -1
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js +37 -13
- package/dist/ui/dashboard/detail-panels/token-usage-panel.js.map +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js +1 -1
- package/dist/ui/dashboard/views/agent-analytics-view.js.map +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js +1 -1
- package/dist/ui/dashboard/views/cache-stats-view.js.map +1 -1
- package/dist/ui/dashboard/views/performance-view.js +1 -1
- package/dist/ui/dashboard/views/performance-view.js.map +1 -1
- package/dist/utils/spending-tracker.d.ts +22 -0
- package/dist/utils/spending-tracker.d.ts.map +1 -1
- package/dist/utils/spending-tracker.js +33 -1
- package/dist/utils/spending-tracker.js.map +1 -1
- package/dist/utils/token-estimator.d.ts +21 -5
- package/dist/utils/token-estimator.d.ts.map +1 -1
- package/dist/utils/token-estimator.js +74 -28
- package/dist/utils/token-estimator.js.map +1 -1
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-handler.js","sourceRoot":"","sources":["../../src/mcp/mcp-tool-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"mcp-tool-handler.js","sourceRoot":"","sources":["../../src/mcp/mcp-tool-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAIhF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAgB,MAAM,qBAAqB,CAAC;AA0BvE;;GAEG;AACH,MAAM,OAAO,cAAc;IAKjB;IACA;IACA;IACA;IACA;IART,8DAA8D;IACtD,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAElD,YACS,aAAsC,EACtC,mBAA2C,EAC3C,aAAsC,EACtC,WAAkC,EAClC,gBAAqC;QAJrC,kBAAa,GAAb,aAAa,CAAyB;QACtC,wBAAmB,GAAnB,mBAAmB,CAAwB;QAC3C,kBAAa,GAAb,aAAa,CAAyB;QACtC,gBAAW,GAAX,WAAW,CAAuB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAqB;IAC3C,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,2BAA2B,CAAC,QAAmB;QACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QAEzC,4CAA4C;QAC5C,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAChB,OAAgB,EAChB,QAAgB,EAChB,IAA6B;QAE7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,mCAAmC;QACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1E,IAAI,CAAC;YACJ,uDAAuD;YACvD,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAErD,mBAAmB;YACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAChD,IAAI;gBACJ,SAAS,EAAE,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;gBAClD,QAAQ;gBACR,QAAQ;aACR,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE1C,qCAAqC;YACrC,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAEzE,mDAAmD;YACnD,IAAI,eAAe,GAAY,MAAM,CAAC,OAAO,CAAC;YAC9C,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAChE,eAAe,GAAG,0BAA0B,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtF,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC9D,MAAM,YAAY,GAAG,0BAA0B,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC3F,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAChC,eAAe,GAAG,YAAY,CAAC;gBAChC,CAAC;YACF,CAAC;YAED,OAAO;gBACN,UAAU;gBACV,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,eAAe;gBACvB,QAAQ;gBACR,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ;aACR,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC1C,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAE9C,oCAAoC;YACpC,QAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAEhE,MAAM,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,EAAE,KAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAErF,OAAO;gBACN,UAAU;gBACV,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,IAAI;gBACZ,QAAQ;gBACR,OAAO,EAAE,KAAK;gBACd,QAAQ;aACR,CAAC;QACH,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,QAAgB;QACrE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,6BAA6B;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO;QACR,CAAC;QAED,6DAA6D;QAC7D,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,4DAA4D;YAC5D,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,mBAAmB,CAAC,CAAC;QACxD,CAAC;QAED,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE1E,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B;gBAChE,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;YACtE,CAAC;QACF,CAAC;QAED,wBAAwB;QACxB,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEpC,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACjH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,MAA+B,EAAE,QAAgB;QAChG,wBAAwB;QACxB,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAE/C,wBAAwB;QACxB,MAAM,aAAa,GAAqB;YACvC,MAAM,EAAE,cAAc,QAAQ,EAAE;YAChC,WAAW,EAAE,kBAAkB;YAC/B,cAAc,EAAE,CAAC,QAAQ,CAAC;YAC1B,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE;SACrB,CAAC;QAEF,mDAAmD;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEnE,oCAAoC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QAElG,mBAAmB;QACnB,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7F,oBAAoB;QACpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAgB;QACjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAgB;QACjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAClB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACD;AAED;;GAEG;AACH,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAChC,aAAsC,EACtC,mBAA2C,EAC3C,aAAsC,EACtC,WAAkC,EAClC,gBAAqC;IAErC,QAAQ,KAAK,IAAI,cAAc,CAAC,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAClH,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAClC,QAAQ,GAAG,IAAI,CAAC;AACjB,CAAC"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windagency/valora",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "VALORA - AI-assisted development workflow orchestration with agnostic multi-LLM support, session-based state, and Cursor MCP integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"valora",
|
|
@@ -140,8 +140,11 @@
|
|
|
140
140
|
"openai": "^4.67.0",
|
|
141
141
|
"ora": "^8.0.0",
|
|
142
142
|
"react": "^19.2.1",
|
|
143
|
+
"tree-sitter-wasms": "0.1.11",
|
|
143
144
|
"undici": "^7.16.0",
|
|
144
145
|
"unzipper": "^0.12.0",
|
|
146
|
+
"vscode-languageserver-protocol": "^3.17.5",
|
|
147
|
+
"web-tree-sitter": "^0.24.7",
|
|
145
148
|
"yaml": "^2.4.0",
|
|
146
149
|
"zod": "^3.22.4"
|
|
147
150
|
},
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Guard
|
|
3
|
+
*
|
|
4
|
+
* Validates terminal commands before execution to prevent:
|
|
5
|
+
* - Data exfiltration via network tools
|
|
6
|
+
* - Arbitrary code execution via eval/exec patterns
|
|
7
|
+
* - Environment variable credential theft
|
|
8
|
+
* - Chained command exploitation
|
|
9
|
+
*/
|
|
10
|
+
import { type SecurityEvent } from './security-event.types.js';
|
|
11
|
+
export interface CommandValidationResult {
|
|
12
|
+
allowed: boolean;
|
|
13
|
+
reason?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class CommandGuard {
|
|
16
|
+
private events;
|
|
17
|
+
/**
|
|
18
|
+
* Validate a command string before execution.
|
|
19
|
+
*/
|
|
20
|
+
validate(command: string): CommandValidationResult;
|
|
21
|
+
/**
|
|
22
|
+
* Get recorded security events.
|
|
23
|
+
*/
|
|
24
|
+
getEvents(): SecurityEvent[];
|
|
25
|
+
/**
|
|
26
|
+
* Clear recorded events.
|
|
27
|
+
*/
|
|
28
|
+
clearEvents(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Split a command string on shell chain operators.
|
|
31
|
+
*/
|
|
32
|
+
private splitCommand;
|
|
33
|
+
/**
|
|
34
|
+
* Check if the character toggles a quote state. Returns null if not a quote.
|
|
35
|
+
*/
|
|
36
|
+
private handleQuote;
|
|
37
|
+
/**
|
|
38
|
+
* Match a chain operator at position i. Returns extra chars to skip, or null.
|
|
39
|
+
*/
|
|
40
|
+
private matchOperator;
|
|
41
|
+
/**
|
|
42
|
+
* Validate a single command segment.
|
|
43
|
+
*/
|
|
44
|
+
private validateSegment;
|
|
45
|
+
/**
|
|
46
|
+
* Check for data exfiltration patterns.
|
|
47
|
+
*/
|
|
48
|
+
private checkExfiltrationPatterns;
|
|
49
|
+
/**
|
|
50
|
+
* Check for environment variable credential access.
|
|
51
|
+
*/
|
|
52
|
+
private block;
|
|
53
|
+
private checkEnvAccess;
|
|
54
|
+
private logEvent;
|
|
55
|
+
}
|
|
56
|
+
export declare function getCommandGuard(): CommandGuard;
|
|
57
|
+
export declare function resetCommandGuard(): void;
|
|
58
|
+
//# sourceMappingURL=command-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-guard.d.ts","sourceRoot":"","sources":["../../src/security/command-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA8DjF,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAuB;IAErC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IA2BlD;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAkDpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IASjC;;OAEG;IACH,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,QAAQ;CAUhB;AAOD,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Guard
|
|
3
|
+
*
|
|
4
|
+
* Validates terminal commands before execution to prevent:
|
|
5
|
+
* - Data exfiltration via network tools
|
|
6
|
+
* - Arbitrary code execution via eval/exec patterns
|
|
7
|
+
* - Environment variable credential theft
|
|
8
|
+
* - Chained command exploitation
|
|
9
|
+
*/
|
|
10
|
+
import { getLogger } from '../output/logger.js';
|
|
11
|
+
import { createSecurityEvent } from './security-event.types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Commands that enable network data exfiltration.
|
|
14
|
+
*/
|
|
15
|
+
const NETWORK_COMMANDS = ['curl', 'wget', 'nc', 'ncat', 'netcat'];
|
|
16
|
+
/**
|
|
17
|
+
* Commands that enable arbitrary remote access.
|
|
18
|
+
*/
|
|
19
|
+
const REMOTE_ACCESS_COMMANDS = ['ssh', 'scp', 'rsync', 'ftp', 'sftp'];
|
|
20
|
+
/**
|
|
21
|
+
* Eval/exec patterns that enable arbitrary code execution.
|
|
22
|
+
*/
|
|
23
|
+
const EVAL_PATTERNS = [
|
|
24
|
+
/\beval\s+/,
|
|
25
|
+
/\bexec\s+/,
|
|
26
|
+
/\bbash\s+-c\b/,
|
|
27
|
+
/\bsh\s+-c\b/,
|
|
28
|
+
/\bzsh\s+-c\b/,
|
|
29
|
+
/\bpython[23]?\s+-c\b/,
|
|
30
|
+
/\bnode\s+-e\b/,
|
|
31
|
+
/\bruby\s+-e\b/,
|
|
32
|
+
/\bperl\s+-e\b/
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Patterns that indicate environment variable credential access in commands.
|
|
36
|
+
*/
|
|
37
|
+
const ENV_ACCESS_PATTERNS = [
|
|
38
|
+
/\$ANTHROPIC_/,
|
|
39
|
+
/\$OPENAI_/,
|
|
40
|
+
/\$GOOGLE_/,
|
|
41
|
+
/\$AWS_/,
|
|
42
|
+
/\$AZURE_/,
|
|
43
|
+
/\$\{?[A-Z_]*API_KEY\}?/,
|
|
44
|
+
/\$\{?[A-Z_]*TOKEN\}?/,
|
|
45
|
+
/\$\{?[A-Z_]*SECRET\}?/,
|
|
46
|
+
/\$\{?[A-Z_]*PASSWORD\}?/,
|
|
47
|
+
/\$\{?DATABASE_URL\}?/,
|
|
48
|
+
/\$\{?REDIS_URL\}?/,
|
|
49
|
+
/\$\{?PRIVATE_KEY\}?/
|
|
50
|
+
];
|
|
51
|
+
/**
|
|
52
|
+
* Exfiltration patterns: data extraction piped to network commands.
|
|
53
|
+
*/
|
|
54
|
+
const EXFILTRATION_PATTERNS = [
|
|
55
|
+
// Reading credentials and piping to network
|
|
56
|
+
/cat\s+.*\.env.*\|/,
|
|
57
|
+
/cat\s+.*id_rsa.*\|/,
|
|
58
|
+
/cat\s+.*\.pem.*\|/,
|
|
59
|
+
// Base64 encoding of credential files
|
|
60
|
+
/base64\s+.*\.env/,
|
|
61
|
+
/base64\s+.*id_rsa/,
|
|
62
|
+
/base64\s+.*\.pem/,
|
|
63
|
+
/base64\s+.*\.key/,
|
|
64
|
+
// Subshell reading env vars
|
|
65
|
+
/\$\(.*\$[A-Z_]*(?:API_KEY|TOKEN|SECRET|PASSWORD)/
|
|
66
|
+
];
|
|
67
|
+
export class CommandGuard {
|
|
68
|
+
events = [];
|
|
69
|
+
/**
|
|
70
|
+
* Validate a command string before execution.
|
|
71
|
+
*/
|
|
72
|
+
validate(command) {
|
|
73
|
+
if (!command || typeof command !== 'string') {
|
|
74
|
+
return { allowed: false, reason: 'Empty or invalid command' };
|
|
75
|
+
}
|
|
76
|
+
// Check exfiltration patterns on the full command first
|
|
77
|
+
const exfilResult = this.checkExfiltrationPatterns(command);
|
|
78
|
+
if (!exfilResult.allowed)
|
|
79
|
+
return exfilResult;
|
|
80
|
+
// Check env var access patterns on the full command
|
|
81
|
+
const envResult = this.checkEnvAccess(command);
|
|
82
|
+
if (!envResult.allowed)
|
|
83
|
+
return envResult;
|
|
84
|
+
// Split on chain operators and validate each segment
|
|
85
|
+
const segments = this.splitCommand(command);
|
|
86
|
+
for (const segment of segments) {
|
|
87
|
+
const trimmed = segment.trim();
|
|
88
|
+
if (!trimmed)
|
|
89
|
+
continue;
|
|
90
|
+
const result = this.validateSegment(trimmed);
|
|
91
|
+
if (!result.allowed)
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
return { allowed: true };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get recorded security events.
|
|
98
|
+
*/
|
|
99
|
+
getEvents() {
|
|
100
|
+
return [...this.events];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Clear recorded events.
|
|
104
|
+
*/
|
|
105
|
+
clearEvents() {
|
|
106
|
+
this.events = [];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Split a command string on shell chain operators.
|
|
110
|
+
*/
|
|
111
|
+
splitCommand(command) {
|
|
112
|
+
const segments = [];
|
|
113
|
+
let current = '';
|
|
114
|
+
let inSingleQuote = false;
|
|
115
|
+
let inDoubleQuote = false;
|
|
116
|
+
let escaped = false;
|
|
117
|
+
for (let i = 0; i < command.length; i++) {
|
|
118
|
+
const char = command[i];
|
|
119
|
+
if (escaped) {
|
|
120
|
+
current += char;
|
|
121
|
+
escaped = false;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (char === '\\') {
|
|
125
|
+
current += char;
|
|
126
|
+
escaped = true;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const quoteResult = this.handleQuote(char, inSingleQuote, inDoubleQuote);
|
|
130
|
+
if (quoteResult !== null) {
|
|
131
|
+
inSingleQuote = quoteResult.inSingleQuote;
|
|
132
|
+
inDoubleQuote = quoteResult.inDoubleQuote;
|
|
133
|
+
current += char;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (!inSingleQuote && !inDoubleQuote) {
|
|
137
|
+
const split = this.matchOperator(command, i);
|
|
138
|
+
if (split !== null) {
|
|
139
|
+
segments.push(current);
|
|
140
|
+
current = '';
|
|
141
|
+
i += split; // skip extra chars for && or ||
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
current += char;
|
|
146
|
+
}
|
|
147
|
+
if (current.trim()) {
|
|
148
|
+
segments.push(current);
|
|
149
|
+
}
|
|
150
|
+
return segments;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if the character toggles a quote state. Returns null if not a quote.
|
|
154
|
+
*/
|
|
155
|
+
handleQuote(char, inSingleQuote, inDoubleQuote) {
|
|
156
|
+
if (char === "'" && !inDoubleQuote) {
|
|
157
|
+
return { inDoubleQuote, inSingleQuote: !inSingleQuote };
|
|
158
|
+
}
|
|
159
|
+
if (char === '"' && !inSingleQuote) {
|
|
160
|
+
return { inDoubleQuote: !inDoubleQuote, inSingleQuote };
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Match a chain operator at position i. Returns extra chars to skip, or null.
|
|
166
|
+
*/
|
|
167
|
+
matchOperator(command, i) {
|
|
168
|
+
const char = command[i];
|
|
169
|
+
if (char === ';')
|
|
170
|
+
return 0;
|
|
171
|
+
if (char === '|' && command[i + 1] === '|')
|
|
172
|
+
return 1;
|
|
173
|
+
if (char === '&' && command[i + 1] === '&')
|
|
174
|
+
return 1;
|
|
175
|
+
if (char === '|')
|
|
176
|
+
return 0;
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate a single command segment.
|
|
181
|
+
*/
|
|
182
|
+
validateSegment(segment) {
|
|
183
|
+
const command = segment.trim();
|
|
184
|
+
// Extract the base command (first word)
|
|
185
|
+
const baseCommand = command.split(/\s+/)[0]?.replace(/^.*\//, '') ?? '';
|
|
186
|
+
// Check network commands
|
|
187
|
+
if (NETWORK_COMMANDS.includes(baseCommand)) {
|
|
188
|
+
return this.block(command, `Network command blocked: ${baseCommand} — potential data exfiltration vector`);
|
|
189
|
+
}
|
|
190
|
+
// Check remote access commands
|
|
191
|
+
if (REMOTE_ACCESS_COMMANDS.includes(baseCommand)) {
|
|
192
|
+
return this.block(command, `Remote access command blocked: ${baseCommand} — potential data exfiltration vector`);
|
|
193
|
+
}
|
|
194
|
+
// Check eval/exec patterns
|
|
195
|
+
for (const pattern of EVAL_PATTERNS) {
|
|
196
|
+
if (pattern.test(command)) {
|
|
197
|
+
return this.block(command, `Arbitrary code execution blocked: matches pattern ${pattern.source}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { allowed: true };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Check for data exfiltration patterns.
|
|
204
|
+
*/
|
|
205
|
+
checkExfiltrationPatterns(command) {
|
|
206
|
+
for (const pattern of EXFILTRATION_PATTERNS) {
|
|
207
|
+
if (pattern.test(command)) {
|
|
208
|
+
return this.block(command, `Exfiltration pattern detected: ${pattern.source}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { allowed: true };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check for environment variable credential access.
|
|
215
|
+
*/
|
|
216
|
+
block(command, reason) {
|
|
217
|
+
this.logEvent(command, reason);
|
|
218
|
+
return { allowed: false, reason };
|
|
219
|
+
}
|
|
220
|
+
checkEnvAccess(command) {
|
|
221
|
+
for (const pattern of ENV_ACCESS_PATTERNS) {
|
|
222
|
+
if (pattern.test(command)) {
|
|
223
|
+
return this.block(command, `Environment variable credential access detected: ${pattern.source}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { allowed: true };
|
|
227
|
+
}
|
|
228
|
+
logEvent(command, reason) {
|
|
229
|
+
const event = createSecurityEvent('command_blocked', 'critical', {
|
|
230
|
+
command: command.slice(0, 200),
|
|
231
|
+
reason
|
|
232
|
+
});
|
|
233
|
+
this.events.push(event);
|
|
234
|
+
const logger = getLogger();
|
|
235
|
+
logger.warn(`[Security] Command blocked`, { command: command.slice(0, 200), reason });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Singleton instance
|
|
240
|
+
*/
|
|
241
|
+
let instance = null;
|
|
242
|
+
export function getCommandGuard() {
|
|
243
|
+
instance ??= new CommandGuard();
|
|
244
|
+
return instance;
|
|
245
|
+
}
|
|
246
|
+
export function resetCommandGuard() {
|
|
247
|
+
instance = null;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=command-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-guard.js","sourceRoot":"","sources":["../../src/security/command-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential Guard
|
|
3
|
+
*
|
|
4
|
+
* Prevents credential leakage through:
|
|
5
|
+
* - Environment sanitisation for terminal commands
|
|
6
|
+
* - Tool output credential scanning
|
|
7
|
+
* - Sensitive file read blocking
|
|
8
|
+
* - ENV variable filtering
|
|
9
|
+
*/
|
|
10
|
+
import { type SecurityEvent } from './security-event.types.js';
|
|
11
|
+
export declare class CredentialGuard {
|
|
12
|
+
private events;
|
|
13
|
+
/**
|
|
14
|
+
* Sanitise environment variables for subprocess execution.
|
|
15
|
+
* Returns a copy with sensitive values replaced by [REDACTED].
|
|
16
|
+
*/
|
|
17
|
+
sanitiseEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
18
|
+
/**
|
|
19
|
+
* Check if an environment variable name matches sensitive patterns.
|
|
20
|
+
*/
|
|
21
|
+
isSensitiveEnvVar(name: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Scan tool output for credentials and redact them.
|
|
24
|
+
*/
|
|
25
|
+
scanOutput(content: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a file path points to a sensitive file.
|
|
28
|
+
*/
|
|
29
|
+
isSensitiveFile(filePath: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get recorded security events (for testing/monitoring).
|
|
32
|
+
*/
|
|
33
|
+
getEvents(): SecurityEvent[];
|
|
34
|
+
/**
|
|
35
|
+
* Clear recorded events.
|
|
36
|
+
*/
|
|
37
|
+
clearEvents(): void;
|
|
38
|
+
private logEvent;
|
|
39
|
+
}
|
|
40
|
+
export declare function getCredentialGuard(): CredentialGuard;
|
|
41
|
+
export declare function resetCredentialGuard(): void;
|
|
42
|
+
//# sourceMappingURL=credential-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-guard.d.ts","sourceRoot":"","sources":["../../src/security/credential-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA0EjF,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAuB;IAErC;;;OAGG;IACH,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;IAe9D;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAsBnC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IA2B1C;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,QAAQ;CAWhB;AAOD,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential Guard
|
|
3
|
+
*
|
|
4
|
+
* Prevents credential leakage through:
|
|
5
|
+
* - Environment sanitisation for terminal commands
|
|
6
|
+
* - Tool output credential scanning
|
|
7
|
+
* - Sensitive file read blocking
|
|
8
|
+
* - ENV variable filtering
|
|
9
|
+
*/
|
|
10
|
+
import { resolve } from 'path';
|
|
11
|
+
import { getLogger } from '../output/logger.js';
|
|
12
|
+
import { createSecurityEvent } from './security-event.types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Glob-style patterns for sensitive environment variables.
|
|
15
|
+
* Matched case-insensitively against variable names.
|
|
16
|
+
*/
|
|
17
|
+
const SENSITIVE_ENV_PATTERNS = [
|
|
18
|
+
/^ANTHROPIC_/i,
|
|
19
|
+
/^OPENAI_/i,
|
|
20
|
+
/^GOOGLE_/i,
|
|
21
|
+
/^AWS_/i,
|
|
22
|
+
/^AZURE_/i,
|
|
23
|
+
/_API_KEY$/i,
|
|
24
|
+
/_TOKEN$/i,
|
|
25
|
+
/_SECRET$/i,
|
|
26
|
+
/_PASSWORD$/i,
|
|
27
|
+
/_CREDENTIAL$/i,
|
|
28
|
+
/^DATABASE_URL$/i,
|
|
29
|
+
/^REDIS_URL$/i,
|
|
30
|
+
/^MONGO_URI$/i,
|
|
31
|
+
/^PRIVATE_KEY$/i,
|
|
32
|
+
/^ENCRYPTION_KEY$/i
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* File path patterns that indicate sensitive files.
|
|
36
|
+
* Checked against the basename and resolved path.
|
|
37
|
+
*/
|
|
38
|
+
const SENSITIVE_FILE_PATTERNS = [
|
|
39
|
+
/^\.env$/,
|
|
40
|
+
/^\.env\..+$/,
|
|
41
|
+
/\.pem$/,
|
|
42
|
+
/\.key$/,
|
|
43
|
+
/^id_rsa$/,
|
|
44
|
+
/^id_ed25519$/,
|
|
45
|
+
/^id_ecdsa$/,
|
|
46
|
+
/^id_dsa$/,
|
|
47
|
+
/^credentials$/,
|
|
48
|
+
/^credentials\.json$/,
|
|
49
|
+
/^token\.json$/,
|
|
50
|
+
/\.keystore$/,
|
|
51
|
+
/\.jks$/,
|
|
52
|
+
/^known_hosts$/,
|
|
53
|
+
/^authorized_keys$/
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Directory paths that are always sensitive.
|
|
57
|
+
* Checked against resolved absolute paths.
|
|
58
|
+
*/
|
|
59
|
+
const SENSITIVE_DIRECTORIES = ['/.ssh/', '/.aws/', '/.gnupg/', '/.config/gcloud/'];
|
|
60
|
+
/**
|
|
61
|
+
* Patterns for detecting credentials in tool output text.
|
|
62
|
+
*/
|
|
63
|
+
const OUTPUT_CREDENTIAL_PATTERNS = [
|
|
64
|
+
// API keys with common prefixes (sk-ant-api03-..., sk-proj-..., etc.)
|
|
65
|
+
/sk-[a-zA-Z0-9_-]{20,}/g,
|
|
66
|
+
/pk-[a-zA-Z0-9_-]{20,}/g,
|
|
67
|
+
/api[_-]?key[=:]\s*["']?[a-zA-Z0-9_-]{16,}/gi,
|
|
68
|
+
// AWS access keys
|
|
69
|
+
/AKIA[0-9A-Z]{16}/g,
|
|
70
|
+
// Bearer tokens
|
|
71
|
+
/Bearer\s+[a-zA-Z0-9_\-.]{20,}/g,
|
|
72
|
+
// Generic long secrets (base64-ish with prefix)
|
|
73
|
+
/(?:token|secret|password|credential)[=:]\s*["']?[a-zA-Z0-9+/=_-]{20,}/gi,
|
|
74
|
+
// Private key blocks
|
|
75
|
+
/-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/g,
|
|
76
|
+
// Connection strings with credentials
|
|
77
|
+
/(?:mongodb|postgres|mysql|redis):\/\/[^:]+:[^@]+@/gi
|
|
78
|
+
];
|
|
79
|
+
const REDACTED = '[REDACTED]';
|
|
80
|
+
export class CredentialGuard {
|
|
81
|
+
events = [];
|
|
82
|
+
/**
|
|
83
|
+
* Sanitise environment variables for subprocess execution.
|
|
84
|
+
* Returns a copy with sensitive values replaced by [REDACTED].
|
|
85
|
+
*/
|
|
86
|
+
sanitiseEnvironment(env) {
|
|
87
|
+
const sanitised = {};
|
|
88
|
+
for (const [key, value] of Object.entries(env)) {
|
|
89
|
+
if (this.isSensitiveEnvVar(key)) {
|
|
90
|
+
sanitised[key] = REDACTED;
|
|
91
|
+
this.logEvent('credential_redacted', 'medium', { source: 'environment', variable: key });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
sanitised[key] = value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return sanitised;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if an environment variable name matches sensitive patterns.
|
|
101
|
+
*/
|
|
102
|
+
isSensitiveEnvVar(name) {
|
|
103
|
+
return SENSITIVE_ENV_PATTERNS.some((pattern) => pattern.test(name));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Scan tool output for credentials and redact them.
|
|
107
|
+
*/
|
|
108
|
+
scanOutput(content) {
|
|
109
|
+
if (!content || typeof content !== 'string')
|
|
110
|
+
return content;
|
|
111
|
+
let result = content;
|
|
112
|
+
let redacted = false;
|
|
113
|
+
for (const pattern of OUTPUT_CREDENTIAL_PATTERNS) {
|
|
114
|
+
// Reset lastIndex for global patterns
|
|
115
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
116
|
+
if (regex.test(result)) {
|
|
117
|
+
redacted = true;
|
|
118
|
+
result = result.replace(new RegExp(pattern.source, pattern.flags), REDACTED);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (redacted) {
|
|
122
|
+
this.logEvent('credential_redacted', 'high', { source: 'tool_output' });
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if a file path points to a sensitive file.
|
|
128
|
+
*/
|
|
129
|
+
isSensitiveFile(filePath) {
|
|
130
|
+
const normalised = filePath.replace(/\\/g, '/');
|
|
131
|
+
const basename = normalised.split('/').pop() ?? '';
|
|
132
|
+
// Check basename against sensitive file patterns
|
|
133
|
+
if (SENSITIVE_FILE_PATTERNS.some((pattern) => pattern.test(basename))) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
// Check resolved path against sensitive directories
|
|
137
|
+
const resolvedPath = resolve(filePath).replace(/\\/g, '/');
|
|
138
|
+
const homedir = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '';
|
|
139
|
+
const normalisedHome = homedir.replace(/\\/g, '/');
|
|
140
|
+
for (const dir of SENSITIVE_DIRECTORIES) {
|
|
141
|
+
if (resolvedPath.includes(`${normalisedHome}${dir}`)) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
// Also match the directory pattern without home prefix
|
|
145
|
+
if (resolvedPath.includes(dir)) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get recorded security events (for testing/monitoring).
|
|
153
|
+
*/
|
|
154
|
+
getEvents() {
|
|
155
|
+
return [...this.events];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Clear recorded events.
|
|
159
|
+
*/
|
|
160
|
+
clearEvents() {
|
|
161
|
+
this.events = [];
|
|
162
|
+
}
|
|
163
|
+
logEvent(type, severity, details) {
|
|
164
|
+
const event = createSecurityEvent(type, severity, details);
|
|
165
|
+
this.events.push(event);
|
|
166
|
+
const logger = getLogger();
|
|
167
|
+
logger.warn(`[Security] ${type}`, details);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Singleton instance
|
|
172
|
+
*/
|
|
173
|
+
let instance = null;
|
|
174
|
+
export function getCredentialGuard() {
|
|
175
|
+
instance ??= new CredentialGuard();
|
|
176
|
+
return instance;
|
|
177
|
+
}
|
|
178
|
+
export function resetCredentialGuard() {
|
|
179
|
+
instance = null;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=credential-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-guard.js","sourceRoot":"","sources":["../../src/security/credential-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Module
|
|
3
|
+
*
|
|
4
|
+
* Agentic AI security services for detection and prevention of:
|
|
5
|
+
* - Credential leakage
|
|
6
|
+
* - Command injection / exfiltration
|
|
7
|
+
* - Prompt injection via tool results
|
|
8
|
+
* - MCP tool poisoning
|
|
9
|
+
* - Tool-set drift (rug pull attacks)
|
|
10
|
+
*/
|
|
11
|
+
export { CommandGuard, getCommandGuard, resetCommandGuard } from './command-guard.js';
|
|
12
|
+
export type { CommandValidationResult } from './command-guard.js';
|
|
13
|
+
export { CredentialGuard, getCredentialGuard, resetCredentialGuard } from './credential-guard.js';
|
|
14
|
+
export { getPromptInjectionDetector, PromptInjectionDetector, resetPromptInjectionDetector } from './prompt-injection-detector.js';
|
|
15
|
+
export type { InjectionScanResult } from './prompt-injection-detector.js';
|
|
16
|
+
export type { SecurityEvent, SecurityEventType, SecuritySeverity } from './security-event.types.js';
|
|
17
|
+
export { createSecurityEvent } from './security-event.types.js';
|
|
18
|
+
export { getToolDefinitionValidator, resetToolDefinitionValidator, ToolDefinitionValidator } from './tool-definition-validator.js';
|
|
19
|
+
export type { ToolValidationResult } from './tool-definition-validator.js';
|
|
20
|
+
export { getToolIntegrityMonitor, resetToolIntegrityMonitor, ToolIntegrityMonitor } from './tool-integrity-monitor.js';
|
|
21
|
+
export type { IntegrityCheckResult, ToolSetDiff } from './tool-integrity-monitor.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnF,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EACN,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACN,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACpH,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Module
|
|
3
|
+
*
|
|
4
|
+
* Agentic AI security services for detection and prevention of:
|
|
5
|
+
* - Credential leakage
|
|
6
|
+
* - Command injection / exfiltration
|
|
7
|
+
* - Prompt injection via tool results
|
|
8
|
+
* - MCP tool poisoning
|
|
9
|
+
* - Tool-set drift (rug pull attacks)
|
|
10
|
+
*/
|
|
11
|
+
export { CommandGuard, getCommandGuard, resetCommandGuard } from './command-guard.js';
|
|
12
|
+
export { CredentialGuard, getCredentialGuard, resetCredentialGuard } from './credential-guard.js';
|
|
13
|
+
export { getPromptInjectionDetector, PromptInjectionDetector, resetPromptInjectionDetector } from './prompt-injection-detector.js';
|
|
14
|
+
export { createSecurityEvent } from './security-event.types.js';
|
|
15
|
+
export { getToolDefinitionValidator, resetToolDefinitionValidator, ToolDefinitionValidator } from './tool-definition-validator.js';
|
|
16
|
+
export { getToolIntegrityMonitor, resetToolIntegrityMonitor, ToolIntegrityMonitor } from './tool-integrity-monitor.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EACN,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACN,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|