agentic-qe 1.1.0 → 1.2.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/.claude/agents/qe-coverage-analyzer.md +8 -0
- package/.claude/agents/qe-flaky-test-hunter.md +9 -1
- package/.claude/agents/qe-test-generator.md +7 -0
- package/.claude/agents/reasoning/agent.md +816 -0
- package/.claude/agents/reasoning/goal-planner.md +73 -0
- package/.claude/settings.json +21 -20
- package/.claude/skills/README.md +124 -0
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -0
- package/.claude/skills/agentdb-learning/SKILL.md +545 -0
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -0
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -0
- package/.claude/skills/agentic-quality-engineering/SKILL.md +604 -0
- package/.claude/skills/api-testing-patterns/SKILL.md +686 -0
- package/.claude/skills/bug-reporting-excellence/SKILL.md +632 -0
- package/.claude/skills/code-review-quality/SKILL.md +683 -0
- package/.claude/skills/consultancy-practices/SKILL.md +540 -0
- package/.claude/skills/context-driven-testing/SKILL.md +466 -0
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +676 -0
- package/.claude/skills/flow-nexus-neural/SKILL.md +738 -0
- package/.claude/skills/flow-nexus-platform/SKILL.md +1157 -0
- package/.claude/skills/flow-nexus-swarm/SKILL.md +610 -0
- package/.claude/skills/github-code-review/SKILL.md +1140 -0
- package/.claude/skills/github-multi-repo/SKILL.md +874 -0
- package/.claude/skills/github-project-management/SKILL.md +1277 -0
- package/.claude/skills/github-release-management/SKILL.md +1081 -0
- package/.claude/skills/github-workflow-automation/SKILL.md +1065 -0
- package/.claude/skills/hive-mind-advanced/SKILL.md +712 -0
- package/.claude/skills/holistic-testing-pact/SKILL.md +225 -0
- package/.claude/skills/hooks-automation/SKILL.md +1201 -0
- package/.claude/skills/pair-programming/SKILL.md +1202 -0
- package/.claude/skills/performance-analysis/SKILL.md +563 -0
- package/.claude/skills/performance-testing/SKILL.md +662 -0
- package/.claude/skills/quality-metrics/SKILL.md +592 -0
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/.claude/skills/refactoring-patterns/SKILL.md +778 -0
- package/.claude/skills/risk-based-testing/SKILL.md +721 -0
- package/.claude/skills/security-testing/SKILL.md +651 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/.claude/skills/sparc-methodology/SKILL.md +1115 -0
- package/.claude/skills/stream-chain/SKILL.md +563 -0
- package/.claude/skills/swarm-advanced/SKILL.md +973 -0
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -0
- package/.claude/skills/tdd-london-chicago/SKILL.md +567 -0
- package/.claude/skills/technical-writing/SKILL.md +235 -0
- package/.claude/skills/test-automation-strategy/SKILL.md +842 -0
- package/.claude/skills/verification-quality/SKILL.md +649 -0
- package/.claude/skills/xp-practices/SKILL.md +671 -0
- package/.claude/statusline-command.sh +176 -0
- package/CHANGELOG.md +536 -1
- package/README.md +92 -3
- package/config/improvement-loop.config.ts +323 -0
- package/config/neural-agent.config.ts +197 -0
- package/dist/adapters/MemoryStoreAdapter.d.ts +16 -16
- package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryStoreAdapter.js +16 -16
- package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
- package/dist/agents/BaseAgent.d.ts +69 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +382 -1
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +13 -2
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +105 -6
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/DeploymentReadinessAgent.d.ts.map +1 -1
- package/dist/agents/DeploymentReadinessAgent.js +13 -13
- package/dist/agents/DeploymentReadinessAgent.js.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.d.ts +28 -0
- package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.js +159 -4
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
- package/dist/agents/FleetCommanderAgent.d.ts.map +1 -1
- package/dist/agents/FleetCommanderAgent.js +2 -2
- package/dist/agents/FleetCommanderAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +14 -5
- package/dist/agents/LearningAgent.d.ts.map +1 -1
- package/dist/agents/LearningAgent.js +36 -16
- package/dist/agents/LearningAgent.js.map +1 -1
- package/dist/agents/NeuralAgentExtension.d.ts +117 -0
- package/dist/agents/NeuralAgentExtension.d.ts.map +1 -0
- package/dist/agents/NeuralAgentExtension.js +288 -0
- package/dist/agents/NeuralAgentExtension.js.map +1 -0
- package/dist/agents/PerformanceTesterAgent.d.ts.map +1 -1
- package/dist/agents/PerformanceTesterAgent.js +4 -3
- package/dist/agents/PerformanceTesterAgent.js.map +1 -1
- package/dist/agents/ProductionIntelligenceAgent.js +7 -7
- package/dist/agents/ProductionIntelligenceAgent.js.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.js +2 -2
- package/dist/agents/QualityAnalyzerAgent.js.map +1 -1
- package/dist/agents/QualityGateAgent.js +5 -5
- package/dist/agents/QualityGateAgent.js.map +1 -1
- package/dist/agents/RegressionRiskAnalyzerAgent.js +7 -7
- package/dist/agents/RegressionRiskAnalyzerAgent.js.map +1 -1
- package/dist/agents/RequirementsValidatorAgent.d.ts.map +1 -1
- package/dist/agents/RequirementsValidatorAgent.js +1 -1
- package/dist/agents/RequirementsValidatorAgent.js.map +1 -1
- package/dist/agents/SecurityScannerAgent.js +6 -6
- package/dist/agents/SecurityScannerAgent.js.map +1 -1
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
- package/dist/agents/TestExecutorAgent.js +1 -3
- package/dist/agents/TestExecutorAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +15 -4
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +165 -43
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/mixins/NeuralCapableMixin.d.ts +130 -0
- package/dist/agents/mixins/NeuralCapableMixin.d.ts.map +1 -0
- package/dist/agents/mixins/NeuralCapableMixin.js +358 -0
- package/dist/agents/mixins/NeuralCapableMixin.js.map +1 -0
- package/dist/agents/mixins/QUICCapableMixin.d.ts +34 -0
- package/dist/agents/mixins/QUICCapableMixin.d.ts.map +1 -0
- package/dist/agents/mixins/QUICCapableMixin.js +346 -0
- package/dist/agents/mixins/QUICCapableMixin.js.map +1 -0
- package/dist/cli/commands/agent/index.d.ts +5 -0
- package/dist/cli/commands/agent/index.d.ts.map +1 -1
- package/dist/cli/commands/agent/index.js +11 -6
- package/dist/cli/commands/agent/index.js.map +1 -1
- package/dist/cli/commands/agent/kill.d.ts +13 -0
- package/dist/cli/commands/agent/kill.d.ts.map +1 -0
- package/dist/cli/commands/agent/kill.js +65 -0
- package/dist/cli/commands/agent/kill.js.map +1 -0
- package/dist/cli/commands/agent/list.d.ts +19 -0
- package/dist/cli/commands/agent/list.d.ts.map +1 -0
- package/dist/cli/commands/agent/list.js +92 -0
- package/dist/cli/commands/agent/list.js.map +1 -0
- package/dist/cli/commands/agent/logs.d.ts +14 -0
- package/dist/cli/commands/agent/logs.d.ts.map +1 -0
- package/dist/cli/commands/agent/logs.js +77 -0
- package/dist/cli/commands/agent/logs.js.map +1 -0
- package/dist/cli/commands/agent/metrics.d.ts +21 -0
- package/dist/cli/commands/agent/metrics.d.ts.map +1 -0
- package/dist/cli/commands/agent/metrics.js +87 -0
- package/dist/cli/commands/agent/metrics.js.map +1 -0
- package/dist/cli/commands/agent/spawn.d.ts +28 -0
- package/dist/cli/commands/agent/spawn.d.ts.map +1 -0
- package/dist/cli/commands/agent/spawn.js +83 -0
- package/dist/cli/commands/agent/spawn.js.map +1 -0
- package/dist/cli/commands/init.d.ts +24 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +475 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/skills/index.d.ts +51 -0
- package/dist/cli/commands/skills/index.d.ts.map +1 -0
- package/dist/cli/commands/skills/index.js +364 -0
- package/dist/cli/commands/skills/index.js.map +1 -0
- package/dist/cli/index.js +92 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/EventBus.d.ts +38 -0
- package/dist/core/EventBus.d.ts.map +1 -1
- package/dist/core/EventBus.js +176 -31
- package/dist/core/EventBus.js.map +1 -1
- package/dist/core/FleetManager.d.ts +35 -1
- package/dist/core/FleetManager.d.ts.map +1 -1
- package/dist/core/FleetManager.js +121 -45
- package/dist/core/FleetManager.js.map +1 -1
- package/dist/core/MemoryManager.d.ts +19 -1
- package/dist/core/MemoryManager.d.ts.map +1 -1
- package/dist/core/MemoryManager.js +25 -1
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/embeddings/EmbeddingCache.d.ts +134 -0
- package/dist/core/embeddings/EmbeddingCache.d.ts.map +1 -0
- package/dist/core/embeddings/EmbeddingCache.js +239 -0
- package/dist/core/embeddings/EmbeddingCache.js.map +1 -0
- package/dist/core/embeddings/EmbeddingGenerator.d.ts +224 -0
- package/dist/core/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/core/embeddings/EmbeddingGenerator.js +459 -0
- package/dist/core/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/core/embeddings/index.d.ts +15 -0
- package/dist/core/embeddings/index.d.ts.map +1 -0
- package/dist/core/embeddings/index.js +22 -0
- package/dist/core/embeddings/index.js.map +1 -0
- package/dist/core/memory/AgentDBIntegration.d.ts +35 -0
- package/dist/core/memory/AgentDBIntegration.d.ts.map +1 -0
- package/dist/core/memory/AgentDBIntegration.js +75 -0
- package/dist/core/memory/AgentDBIntegration.js.map +1 -0
- package/dist/core/memory/AgentDBManager.d.ts +200 -0
- package/dist/core/memory/AgentDBManager.d.ts.map +1 -0
- package/dist/core/memory/AgentDBManager.js +263 -0
- package/dist/core/memory/AgentDBManager.js.map +1 -0
- package/dist/core/memory/AgentDBService.d.ts +160 -0
- package/dist/core/memory/AgentDBService.d.ts.map +1 -0
- package/dist/core/memory/AgentDBService.js +450 -0
- package/dist/core/memory/AgentDBService.js.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts +51 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.js +230 -0
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -0
- package/dist/core/memory/ReasoningBankAdapter.d.ts +58 -0
- package/dist/core/memory/ReasoningBankAdapter.d.ts.map +1 -0
- package/dist/core/memory/ReasoningBankAdapter.js +80 -0
- package/dist/core/memory/ReasoningBankAdapter.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +75 -3
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +236 -52
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +4 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +9 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/neural/NeuralTrainer.d.ts +137 -0
- package/dist/core/neural/NeuralTrainer.d.ts.map +1 -0
- package/dist/core/neural/NeuralTrainer.js +543 -0
- package/dist/core/neural/NeuralTrainer.js.map +1 -0
- package/dist/core/neural/index.d.ts +8 -0
- package/dist/core/neural/index.d.ts.map +1 -0
- package/dist/core/neural/index.js +24 -0
- package/dist/core/neural/index.js.map +1 -0
- package/dist/core/neural/types.d.ts +216 -0
- package/dist/core/neural/types.d.ts.map +1 -0
- package/dist/core/neural/types.js +8 -0
- package/dist/core/neural/types.js.map +1 -0
- package/dist/core/security/CertificateValidator.d.ts +130 -0
- package/dist/core/security/CertificateValidator.d.ts.map +1 -0
- package/dist/core/security/CertificateValidator.js +376 -0
- package/dist/core/security/CertificateValidator.js.map +1 -0
- package/dist/core/transport/QUICTransport.d.ts +62 -0
- package/dist/core/transport/QUICTransport.d.ts.map +1 -0
- package/dist/core/transport/QUICTransport.js +381 -0
- package/dist/core/transport/QUICTransport.js.map +1 -0
- package/dist/core/transport/SecureQUICTransport.d.ts +71 -0
- package/dist/core/transport/SecureQUICTransport.d.ts.map +1 -0
- package/dist/core/transport/SecureQUICTransport.js +253 -0
- package/dist/core/transport/SecureQUICTransport.js.map +1 -0
- package/dist/learning/AdvancedFeatureExtractor.d.ts +123 -0
- package/dist/learning/AdvancedFeatureExtractor.d.ts.map +1 -0
- package/dist/learning/AdvancedFeatureExtractor.js +423 -0
- package/dist/learning/AdvancedFeatureExtractor.js.map +1 -0
- package/dist/learning/FlakyPredictionModel.d.ts +11 -1
- package/dist/learning/FlakyPredictionModel.d.ts.map +1 -1
- package/dist/learning/FlakyPredictionModel.js +82 -35
- package/dist/learning/FlakyPredictionModel.js.map +1 -1
- package/dist/learning/FlakyTestDetector.d.ts +9 -0
- package/dist/learning/FlakyTestDetector.d.ts.map +1 -1
- package/dist/learning/FlakyTestDetector.js +28 -6
- package/dist/learning/FlakyTestDetector.js.map +1 -1
- package/dist/learning/ImprovementLoop.d.ts +16 -2
- package/dist/learning/ImprovementLoop.d.ts.map +1 -1
- package/dist/learning/ImprovementLoop.js +67 -8
- package/dist/learning/ImprovementLoop.js.map +1 -1
- package/dist/learning/ImprovementWorker.d.ts +83 -0
- package/dist/learning/ImprovementWorker.d.ts.map +1 -0
- package/dist/learning/ImprovementWorker.js +164 -0
- package/dist/learning/ImprovementWorker.js.map +1 -0
- package/dist/learning/NeuralPatternMatcher.d.ts +184 -0
- package/dist/learning/NeuralPatternMatcher.d.ts.map +1 -0
- package/dist/learning/NeuralPatternMatcher.js +702 -0
- package/dist/learning/NeuralPatternMatcher.js.map +1 -0
- package/dist/learning/NeuralTrainer.d.ts +209 -0
- package/dist/learning/NeuralTrainer.d.ts.map +1 -0
- package/dist/learning/NeuralTrainer.js +478 -0
- package/dist/learning/NeuralTrainer.js.map +1 -0
- package/dist/learning/index.d.ts +13 -7
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +27 -11
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +1 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/learning/types.js +16 -0
- package/dist/learning/types.js.map +1 -1
- package/dist/mcp/MCPToolRegistry.d.ts +34 -0
- package/dist/mcp/MCPToolRegistry.d.ts.map +1 -0
- package/dist/mcp/MCPToolRegistry.js +48 -0
- package/dist/mcp/MCPToolRegistry.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -4
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +7 -1
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/transport/QUICTransport.d.ts +340 -0
- package/dist/transport/QUICTransport.d.ts.map +1 -0
- package/dist/transport/QUICTransport.js +814 -0
- package/dist/transport/QUICTransport.js.map +1 -0
- package/dist/transport/UDPTransport.d.ts +348 -0
- package/dist/transport/UDPTransport.d.ts.map +1 -0
- package/dist/transport/UDPTransport.js +820 -0
- package/dist/transport/UDPTransport.js.map +1 -0
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/quic.d.ts +339 -0
- package/dist/types/quic.d.ts.map +1 -0
- package/dist/types/quic.js +48 -0
- package/dist/types/quic.js.map +1 -0
- package/dist/utils/Config.js +1 -1
- package/dist/utils/Config.js.map +1 -1
- package/dist/utils/Database.d.ts +14 -0
- package/dist/utils/Database.d.ts.map +1 -1
- package/dist/utils/Database.js +51 -4
- package/dist/utils/Database.js.map +1 -1
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +111 -26
- package/dist/utils/Logger.js.map +1 -1
- package/package.json +30 -7
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Certificate Validation and Pinning for QUIC Transport
|
|
4
|
+
*
|
|
5
|
+
* Provides comprehensive certificate validation, pinning, and security checks
|
|
6
|
+
* to prevent man-in-the-middle attacks and ensure secure communication.
|
|
7
|
+
*
|
|
8
|
+
* @module CertificateValidator
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.CertificateValidator = void 0;
|
|
45
|
+
exports.loadSecurityConfig = loadSecurityConfig;
|
|
46
|
+
const crypto = __importStar(require("crypto"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const tls = __importStar(require("tls"));
|
|
49
|
+
const Logger_1 = require("../../utils/Logger");
|
|
50
|
+
/**
|
|
51
|
+
* Certificate Validator
|
|
52
|
+
*
|
|
53
|
+
* Handles certificate validation, pinning, and security checks for QUIC transport.
|
|
54
|
+
* Prevents common TLS/QUIC security vulnerabilities.
|
|
55
|
+
*/
|
|
56
|
+
class CertificateValidator {
|
|
57
|
+
constructor(validationOptions, pinningOptions, environment = 'production') {
|
|
58
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
59
|
+
this.validationOptions = validationOptions;
|
|
60
|
+
this.pinningOptions = pinningOptions;
|
|
61
|
+
this.environment = environment;
|
|
62
|
+
// CRITICAL: Never allow self-signed certificates in production
|
|
63
|
+
if (environment === 'production' && validationOptions.allowSelfSigned) {
|
|
64
|
+
throw new Error('SECURITY ERROR: Self-signed certificates are not allowed in production. ' +
|
|
65
|
+
'Use CA-signed certificates from Let\'s Encrypt or your organization\'s CA.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate certificate file paths
|
|
70
|
+
*/
|
|
71
|
+
validateCertificatePaths(certPath, keyPath, caPath) {
|
|
72
|
+
const errors = [];
|
|
73
|
+
const warnings = [];
|
|
74
|
+
// Check certificate file exists
|
|
75
|
+
if (!fs.existsSync(certPath)) {
|
|
76
|
+
errors.push(`Certificate file not found: ${certPath}`);
|
|
77
|
+
}
|
|
78
|
+
// Check private key file exists
|
|
79
|
+
if (!fs.existsSync(keyPath)) {
|
|
80
|
+
errors.push(`Private key file not found: ${keyPath}`);
|
|
81
|
+
}
|
|
82
|
+
// Check CA file if provided
|
|
83
|
+
if (caPath && !fs.existsSync(caPath)) {
|
|
84
|
+
errors.push(`CA certificate file not found: ${caPath}`);
|
|
85
|
+
}
|
|
86
|
+
// Verify file permissions (should be readable only by owner)
|
|
87
|
+
try {
|
|
88
|
+
if (fs.existsSync(keyPath)) {
|
|
89
|
+
const stats = fs.statSync(keyPath);
|
|
90
|
+
const mode = stats.mode & parseInt('777', 8);
|
|
91
|
+
// Private key should be 0600 (readable/writable by owner only)
|
|
92
|
+
if (mode !== parseInt('600', 8)) {
|
|
93
|
+
warnings.push(`Private key file has insecure permissions: ${mode.toString(8)}. ` +
|
|
94
|
+
'Recommended: 0600 (chmod 600 keyfile.pem)');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
warnings.push(`Could not check file permissions: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
if (errors.length > 0) {
|
|
102
|
+
this.logger.error('Certificate path validation failed', { errors, warnings });
|
|
103
|
+
return { valid: false, errors, warnings };
|
|
104
|
+
}
|
|
105
|
+
if (warnings.length > 0) {
|
|
106
|
+
this.logger.warn('Certificate path validation warnings', { warnings });
|
|
107
|
+
}
|
|
108
|
+
return { valid: true, errors: [], warnings };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Load and validate certificate
|
|
112
|
+
*/
|
|
113
|
+
loadCertificate(certPath) {
|
|
114
|
+
const certPem = fs.readFileSync(certPath, 'utf8');
|
|
115
|
+
const cert = this.parseCertificate(certPem);
|
|
116
|
+
return {
|
|
117
|
+
subject: cert.subject.CN || 'Unknown',
|
|
118
|
+
issuer: cert.issuer.CN || 'Unknown',
|
|
119
|
+
validFrom: new Date(cert.valid_from),
|
|
120
|
+
validTo: new Date(cert.valid_to),
|
|
121
|
+
fingerprint: this.calculateFingerprint(certPem),
|
|
122
|
+
isSelfSigned: this.isSelfSigned(cert),
|
|
123
|
+
isExpired: this.isExpired(cert),
|
|
124
|
+
isCAVerified: !this.isSelfSigned(cert),
|
|
125
|
+
commonName: cert.subject.CN || '',
|
|
126
|
+
subjectAltNames: cert.subjectaltname ? cert.subjectaltname.split(', ') : []
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Validate certificate against security requirements
|
|
131
|
+
*/
|
|
132
|
+
validateCertificate(certInfo) {
|
|
133
|
+
const errors = [];
|
|
134
|
+
const warnings = [];
|
|
135
|
+
// Check if certificate is expired
|
|
136
|
+
if (this.validationOptions.checkExpiry && certInfo.isExpired) {
|
|
137
|
+
errors.push('Certificate has expired');
|
|
138
|
+
}
|
|
139
|
+
// Check if certificate is self-signed
|
|
140
|
+
if (certInfo.isSelfSigned) {
|
|
141
|
+
if (this.environment === 'production' || !this.validationOptions.allowSelfSigned) {
|
|
142
|
+
errors.push('Self-signed certificates are not allowed. Use CA-signed certificates from ' +
|
|
143
|
+
'Let\'s Encrypt (free) or your organization\'s Certificate Authority.');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
warnings.push('Using self-signed certificate (DEVELOPMENT ONLY)');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Check certificate validity period
|
|
150
|
+
const now = new Date();
|
|
151
|
+
if (now < certInfo.validFrom) {
|
|
152
|
+
errors.push('Certificate is not yet valid');
|
|
153
|
+
}
|
|
154
|
+
// Warn if certificate expires soon (within 30 days)
|
|
155
|
+
const daysUntilExpiry = Math.floor((certInfo.validTo.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
|
|
156
|
+
if (daysUntilExpiry <= 30 && daysUntilExpiry > 0) {
|
|
157
|
+
warnings.push(`Certificate expires in ${daysUntilExpiry} days. Consider renewal.`);
|
|
158
|
+
}
|
|
159
|
+
// Check certificate pinning if enabled
|
|
160
|
+
if (this.pinningOptions.enabled) {
|
|
161
|
+
const pinningResult = this.validateCertificatePinning(certInfo.fingerprint);
|
|
162
|
+
if (!pinningResult.valid) {
|
|
163
|
+
errors.push(...pinningResult.errors);
|
|
164
|
+
}
|
|
165
|
+
warnings.push(...pinningResult.warnings);
|
|
166
|
+
}
|
|
167
|
+
if (errors.length > 0) {
|
|
168
|
+
this.logger.error('Certificate validation failed', {
|
|
169
|
+
errors,
|
|
170
|
+
warnings,
|
|
171
|
+
subject: certInfo.subject,
|
|
172
|
+
issuer: certInfo.issuer,
|
|
173
|
+
validTo: certInfo.validTo
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
valid: errors.length === 0,
|
|
178
|
+
errors,
|
|
179
|
+
warnings,
|
|
180
|
+
certificateInfo: certInfo
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Validate certificate pinning
|
|
185
|
+
*/
|
|
186
|
+
validateCertificatePinning(fingerprint) {
|
|
187
|
+
const errors = [];
|
|
188
|
+
const warnings = [];
|
|
189
|
+
if (!this.pinningOptions.enabled) {
|
|
190
|
+
return { valid: true, errors: [], warnings: [] };
|
|
191
|
+
}
|
|
192
|
+
if (this.pinningOptions.fingerprints.length === 0) {
|
|
193
|
+
warnings.push('Certificate pinning enabled but no fingerprints configured');
|
|
194
|
+
return { valid: true, errors: [], warnings };
|
|
195
|
+
}
|
|
196
|
+
// Normalize fingerprints for comparison (remove colons, convert to lowercase)
|
|
197
|
+
const normalizedFingerprint = fingerprint.toLowerCase().replace(/:/g, '');
|
|
198
|
+
const normalizedExpected = this.pinningOptions.fingerprints.map(fp => fp.toLowerCase().replace(/:/g, ''));
|
|
199
|
+
if (!normalizedExpected.includes(normalizedFingerprint)) {
|
|
200
|
+
errors.push('Certificate fingerprint does not match pinned fingerprints. ' +
|
|
201
|
+
'This could indicate a man-in-the-middle attack or certificate change.');
|
|
202
|
+
this.logger.error('Certificate pinning validation failed', {
|
|
203
|
+
received: fingerprint,
|
|
204
|
+
expected: this.pinningOptions.fingerprints
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
valid: errors.length === 0,
|
|
209
|
+
errors,
|
|
210
|
+
warnings
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create TLS options for secure connections
|
|
215
|
+
*/
|
|
216
|
+
createTLSOptions(certPath, keyPath, caPath) {
|
|
217
|
+
// Validate paths first
|
|
218
|
+
const pathValidation = this.validateCertificatePaths(certPath, keyPath, caPath);
|
|
219
|
+
if (!pathValidation.valid) {
|
|
220
|
+
throw new Error(`Certificate path validation failed: ${pathValidation.errors.join(', ')}`);
|
|
221
|
+
}
|
|
222
|
+
// Load and validate certificate
|
|
223
|
+
const certInfo = this.loadCertificate(certPath);
|
|
224
|
+
const certValidation = this.validateCertificate(certInfo);
|
|
225
|
+
if (!certValidation.valid) {
|
|
226
|
+
throw new Error(`Certificate validation failed: ${certValidation.errors.join(', ')}`);
|
|
227
|
+
}
|
|
228
|
+
// Log warnings
|
|
229
|
+
if (certValidation.warnings.length > 0) {
|
|
230
|
+
this.logger.warn('Certificate validation warnings', {
|
|
231
|
+
warnings: certValidation.warnings
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Create TLS options
|
|
235
|
+
const tlsOptions = {
|
|
236
|
+
// CRITICAL: Always verify certificates in production
|
|
237
|
+
rejectUnauthorized: this.validationOptions.rejectUnauthorized,
|
|
238
|
+
// Certificate and key
|
|
239
|
+
cert: fs.readFileSync(certPath),
|
|
240
|
+
key: fs.readFileSync(keyPath),
|
|
241
|
+
// Minimum TLS version (TLS 1.3 recommended)
|
|
242
|
+
minVersion: this.validationOptions.minTLSVersion,
|
|
243
|
+
maxVersion: 'TLSv1.3',
|
|
244
|
+
// Allowed cipher suites (strong ciphers only)
|
|
245
|
+
ciphers: this.validationOptions.allowedCipherSuites?.join(':'),
|
|
246
|
+
// Prefer server cipher order
|
|
247
|
+
honorCipherOrder: true,
|
|
248
|
+
// Request certificate from peer (for mutual TLS)
|
|
249
|
+
requestCert: this.validationOptions.requireValidCertificates,
|
|
250
|
+
};
|
|
251
|
+
// Add CA if provided
|
|
252
|
+
if (caPath) {
|
|
253
|
+
tlsOptions.ca = fs.readFileSync(caPath);
|
|
254
|
+
}
|
|
255
|
+
// Add custom certificate validation if pinning is enabled
|
|
256
|
+
if (this.pinningOptions.enabled) {
|
|
257
|
+
tlsOptions.checkServerIdentity = (hostname, cert) => {
|
|
258
|
+
const fingerprint = this.calculateCertificateFingerprint(cert);
|
|
259
|
+
const pinningResult = this.validateCertificatePinning(fingerprint);
|
|
260
|
+
if (!pinningResult.valid) {
|
|
261
|
+
return new Error(pinningResult.errors.join(', '));
|
|
262
|
+
}
|
|
263
|
+
// Also perform standard hostname verification
|
|
264
|
+
return tls.checkServerIdentity(hostname, cert);
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return tlsOptions;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Calculate certificate fingerprint
|
|
271
|
+
*/
|
|
272
|
+
calculateFingerprint(certPem) {
|
|
273
|
+
const cert = certPem.replace(/-----BEGIN CERTIFICATE-----/, '')
|
|
274
|
+
.replace(/-----END CERTIFICATE-----/, '')
|
|
275
|
+
.replace(/\s/g, '');
|
|
276
|
+
const certBuffer = Buffer.from(cert, 'base64');
|
|
277
|
+
const hash = crypto.createHash(this.pinningOptions.algorithm);
|
|
278
|
+
hash.update(certBuffer);
|
|
279
|
+
return hash.digest('hex').toUpperCase().match(/.{2}/g).join(':');
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Calculate certificate fingerprint from certificate object
|
|
283
|
+
*/
|
|
284
|
+
calculateCertificateFingerprint(cert) {
|
|
285
|
+
const certDer = cert.raw;
|
|
286
|
+
const hash = crypto.createHash(this.pinningOptions.algorithm);
|
|
287
|
+
hash.update(certDer);
|
|
288
|
+
return hash.digest('hex').toUpperCase().match(/.{2}/g).join(':');
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Parse PEM certificate
|
|
292
|
+
*/
|
|
293
|
+
parseCertificate(certPem) {
|
|
294
|
+
// This is a simplified parser. In production, use a proper X.509 parser
|
|
295
|
+
// or Node.js built-in certificate parsing
|
|
296
|
+
const cert = tls.createSecureContext({ cert: certPem }).context.getCertificate();
|
|
297
|
+
return cert || {};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Check if certificate is self-signed
|
|
301
|
+
*/
|
|
302
|
+
isSelfSigned(cert) {
|
|
303
|
+
return cert.issuer?.CN === cert.subject?.CN;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Check if certificate is expired
|
|
307
|
+
*/
|
|
308
|
+
isExpired(cert) {
|
|
309
|
+
const validTo = new Date(cert.valid_to);
|
|
310
|
+
return new Date() > validTo;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Generate security audit log entry
|
|
314
|
+
*/
|
|
315
|
+
auditLog(event, details) {
|
|
316
|
+
this.logger.info(`[SECURITY AUDIT] ${event}`, {
|
|
317
|
+
timestamp: new Date().toISOString(),
|
|
318
|
+
environment: this.environment,
|
|
319
|
+
...details
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
exports.CertificateValidator = CertificateValidator;
|
|
324
|
+
/**
|
|
325
|
+
* Load security configuration from file
|
|
326
|
+
*/
|
|
327
|
+
function loadSecurityConfig(configPath = '.agentic-qe/config/security.json') {
|
|
328
|
+
const logger = Logger_1.Logger.getInstance();
|
|
329
|
+
try {
|
|
330
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
331
|
+
const env = process.env.NODE_ENV === 'production' ? 'production' : 'development';
|
|
332
|
+
// Use environment-specific settings
|
|
333
|
+
const envConfig = env === 'production' ? config.production : config.development;
|
|
334
|
+
return {
|
|
335
|
+
validation: {
|
|
336
|
+
requireValidCertificates: config.tls.requireValidCertificates,
|
|
337
|
+
rejectUnauthorized: config.tls.rejectUnauthorized,
|
|
338
|
+
checkExpiry: config.tls.certificateValidation.checkExpiry,
|
|
339
|
+
checkRevocation: config.tls.certificateValidation.checkRevocation,
|
|
340
|
+
allowSelfSigned: env === 'development' && envConfig.allowSelfSignedCerts,
|
|
341
|
+
minTLSVersion: config.tls.minVersion,
|
|
342
|
+
allowedCipherSuites: config.quic.security.allowedCipherSuites
|
|
343
|
+
},
|
|
344
|
+
pinning: {
|
|
345
|
+
enabled: config.tls.certificatePinning.enabled,
|
|
346
|
+
fingerprints: config.tls.certificatePinning.fingerprints,
|
|
347
|
+
algorithm: config.tls.certificatePinning.algorithm
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
logger.warn('Could not load security config, using secure defaults', { error });
|
|
353
|
+
// Return secure defaults
|
|
354
|
+
return {
|
|
355
|
+
validation: {
|
|
356
|
+
requireValidCertificates: true,
|
|
357
|
+
rejectUnauthorized: true,
|
|
358
|
+
checkExpiry: true,
|
|
359
|
+
checkRevocation: true,
|
|
360
|
+
allowSelfSigned: false,
|
|
361
|
+
minTLSVersion: 'TLSv1.3',
|
|
362
|
+
allowedCipherSuites: [
|
|
363
|
+
'TLS_AES_256_GCM_SHA384',
|
|
364
|
+
'TLS_CHACHA20_POLY1305_SHA256',
|
|
365
|
+
'TLS_AES_128_GCM_SHA256'
|
|
366
|
+
]
|
|
367
|
+
},
|
|
368
|
+
pinning: {
|
|
369
|
+
enabled: false,
|
|
370
|
+
fingerprints: [],
|
|
371
|
+
algorithm: 'sha256'
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=CertificateValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CertificateValidator.js","sourceRoot":"","sources":["../../../src/core/security/CertificateValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QUIC Transport Implementation
|
|
3
|
+
*
|
|
4
|
+
* Fallback implementation using EventBus when QUIC library is not available.
|
|
5
|
+
* In production, this would be replaced with a real QUIC implementation
|
|
6
|
+
* using libraries like @fails-components/webtransport or node-quic.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { IQUICTransport, QUICConfig, QUICPeerInfo, QUICMessage, QUICBroadcastOptions, QUICRequestOptions, QUICStreamOptions, QUICStreamData, QUICConnectionStats, QUICHealthCheck, QUICDiscoveryOptions } from '../../types/quic';
|
|
10
|
+
/**
|
|
11
|
+
* EventBus-based QUIC Transport Fallback
|
|
12
|
+
*
|
|
13
|
+
* This implementation provides QUIC-like semantics using EventBus.
|
|
14
|
+
* It's designed to be replaced with a real QUIC transport in production.
|
|
15
|
+
*/
|
|
16
|
+
export declare class QUICTransport extends EventEmitter implements IQUICTransport {
|
|
17
|
+
private config?;
|
|
18
|
+
private peers;
|
|
19
|
+
private streams;
|
|
20
|
+
private pendingRequests;
|
|
21
|
+
private stats;
|
|
22
|
+
private isInitialized;
|
|
23
|
+
private readonly logger;
|
|
24
|
+
private eventBus?;
|
|
25
|
+
private discoveryInterval?;
|
|
26
|
+
constructor();
|
|
27
|
+
initialize(config: QUICConfig): Promise<void>;
|
|
28
|
+
connect(peer: string, port: number): Promise<QUICPeerInfo>;
|
|
29
|
+
disconnect(peerId: string): Promise<void>;
|
|
30
|
+
send(to: string, message: QUICMessage): Promise<void>;
|
|
31
|
+
broadcast(message: QUICMessage, options?: QUICBroadcastOptions): Promise<void>;
|
|
32
|
+
request(to: string, message: QUICMessage, options?: QUICRequestOptions): Promise<QUICMessage>;
|
|
33
|
+
private sendRequestWithRetry;
|
|
34
|
+
private sendRequest;
|
|
35
|
+
openStream(streamId: string, options?: QUICStreamOptions): Promise<void>;
|
|
36
|
+
writeStream(streamId: string, data: QUICStreamData): Promise<void>;
|
|
37
|
+
closeStream(streamId: string): Promise<void>;
|
|
38
|
+
discoverPeers(options?: QUICDiscoveryOptions): Promise<QUICPeerInfo[]>;
|
|
39
|
+
getPeers(): QUICPeerInfo[];
|
|
40
|
+
getPeer(peerId: string): QUICPeerInfo | undefined;
|
|
41
|
+
getStats(): QUICConnectionStats;
|
|
42
|
+
getHealth(): QUICHealthCheck;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
private ensureInitialized;
|
|
45
|
+
private getBroadcastTargets;
|
|
46
|
+
private generateRequestId;
|
|
47
|
+
private estimateMessageSize;
|
|
48
|
+
private simulateNetworkDelay;
|
|
49
|
+
private delay;
|
|
50
|
+
private createError;
|
|
51
|
+
private startDiscovery;
|
|
52
|
+
/**
|
|
53
|
+
* Handle incoming response message
|
|
54
|
+
* Called by external message handler
|
|
55
|
+
*/
|
|
56
|
+
handleResponse(message: QUICMessage): void;
|
|
57
|
+
/**
|
|
58
|
+
* Set EventBus for fallback communication
|
|
59
|
+
*/
|
|
60
|
+
setEventBus(eventBus: EventEmitter): void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=QUICTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QUICTransport.d.ts","sourceRoot":"","sources":["../../../src/core/transport/QUICTransport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,eAAe,EAEf,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAG1B;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,YAAa,YAAW,cAAc;IACvE,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,eAAe,CAIR;IACf,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,iBAAiB,CAAC,CAAiB;;IAwBrC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCrD,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;YAarF,oBAAoB;IAkBlC,OAAO,CAAC,WAAW;IAsBb,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBxE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAY5E,QAAQ,IAAI,YAAY,EAAE;IAK1B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD,QAAQ,IAAI,mBAAmB;IAW/B,SAAS,IAAI,eAAe;IAmCtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD5B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,mBAAmB;YAIb,oBAAoB;IAMlC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAYtB;;;OAGG;IACI,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAgBjD;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;CAGjD"}
|