claude-flow 2.7.35 → 2.7.36
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/CHANGELOG.md +17 -0
- package/bin/claude-flow +1 -1
- package/dist/src/__tests__/benchmarks/performance.bench.js +0 -19
- package/dist/src/__tests__/benchmarks/performance.bench.js.map +1 -1
- package/dist/src/__tests__/hook-matchers.test.js.map +1 -1
- package/dist/src/agents/agent-registry.js.map +1 -1
- package/dist/src/api/auth-service.js.map +1 -1
- package/dist/src/api/claude-client-enhanced.js +4 -2
- package/dist/src/api/claude-client-enhanced.js.map +1 -1
- package/dist/src/api/claude-client.js +4 -2
- package/dist/src/api/claude-client.js.map +1 -1
- package/dist/src/api/database-service.js.map +1 -1
- package/dist/src/api/swarm-api.js +1 -1
- package/dist/src/api/swarm-api.js.map +1 -1
- package/dist/src/cli/commands/hive-mind/wizard.js +1 -1
- package/dist/src/cli/commands/hive-mind/wizard.js.map +1 -1
- package/dist/src/cli/simple-cli.js +172 -182
- package/dist/src/cli/simple-cli.js.map +1 -1
- package/dist/src/cli/simple-commands/init/skills-copier.js +1 -1
- package/dist/src/cli/simple-commands/init/skills-copier.js.map +1 -1
- package/dist/src/cli/simple-orchestrator.js +1 -1
- package/dist/src/cli/simple-orchestrator.js.map +1 -1
- package/dist/src/coordination/conflict-resolution.js +1 -1
- package/dist/src/coordination/conflict-resolution.js.map +1 -1
- package/dist/src/coordination/load-balancer.js +1 -1
- package/dist/src/coordination/load-balancer.js.map +1 -1
- package/dist/src/core/config.js +1 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/version.js +1 -1
- package/dist/src/enterprise/audit-manager.js +1 -1
- package/dist/src/enterprise/audit-manager.js.map +1 -1
- package/dist/src/providers/openai-provider.js +2 -2
- package/dist/src/providers/openai-provider.js.map +1 -1
- package/dist/src/sdk/checkpoint-manager.js +1 -1
- package/dist/src/sdk/checkpoint-manager.js.map +1 -1
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js +1 -1
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js.map +1 -1
- package/dist/src/swarm/coordinator.js +1 -1
- package/dist/src/swarm/coordinator.js.map +1 -1
- package/dist/src/utils/key-redactor.js.map +1 -1
- package/dist/src/utils/metrics-reader.js.map +1 -1
- package/dist/src/verification/rollback.js +2 -2
- package/dist/src/verification/rollback.js.map +1 -1
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js +4 -2
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js.map +1 -1
- package/docs/.claude-flow/metrics/performance.json +3 -3
- package/docs/.claude-flow/metrics/task-metrics.json +3 -3
- package/docs/architecture/README.md +555 -0
- package/docs/architecture/github-workflows-optimization-strategy.md +1079 -0
- package/docs/architecture/workflow-architecture-diagram.md +615 -0
- package/docs/architecture/workflow-optimization-implementation-guide.md +593 -0
- package/docs/fixes/WORKFLOW_FIXES.md +292 -0
- package/docs/fixes/WORKFLOW_FIXES_FINAL_STATUS.md +291 -0
- package/docs/fixes/github-workflow-fixes-pr888.md +279 -0
- package/docs/fixes/workflow-fixes-action-plan.md +388 -0
- package/docs/github-workflow-fixes.md +219 -0
- package/docs/reviews/github-workflows-analysis-report.md +820 -0
- package/docs/reviews/pr-888-review-report.md +560 -0
- package/docs/validation/workflow-fix-verification.md +206 -0
- package/package.json +7 -7
- package/src/__tests__/benchmarks/performance.bench.ts +2 -25
- package/src/__tests__/hook-matchers.test.ts +2 -0
- package/src/agents/agent-registry.ts +1 -1
- package/src/api/auth-service.ts +1 -1
- package/src/api/claude-client-enhanced.ts +2 -1
- package/src/api/claude-client.ts +2 -2
- package/src/api/database-service.ts +1 -2
- package/src/api/swarm-api.ts +2 -2
- package/src/cli/commands/hive-mind/wizard.ts +1 -1
- package/src/cli/simple-commands/init/skills-copier.js +1 -1
- package/src/cli/simple-orchestrator.ts +1 -1
- package/src/coordination/conflict-resolution.ts +1 -1
- package/src/coordination/load-balancer.ts +1 -1
- package/src/core/config.ts +1 -1
- package/src/enterprise/audit-manager.ts +1 -1
- package/src/providers/openai-provider.ts +2 -2
- package/src/sdk/checkpoint-manager.ts +1 -1
- package/src/services/agentic-flow-hooks/workflow-hooks.ts +1 -1
- package/src/swarm/coordinator.ts +1 -1
- package/src/verification/rollback.ts +2 -2
- package/src/verification/tests/mocks/false-reporting-scenarios.test.ts +6 -3
- /package/docs/{BUG_REPORT_MEMORY_STATS.md → bug-reports/BUG_REPORT_MEMORY_STATS.md} +0 -0
- /package/docs/{AUTOMATIC_ERROR_RECOVERY_v2.7.35.md → features/AUTOMATIC_ERROR_RECOVERY_v2.7.35.md} +0 -0
- /package/docs/{MCP_2025_FEATURE_CONFIRMATION.md → features/MCP_2025_FEATURE_CONFIRMATION.md} +0 -0
- /package/docs/{OPTIONAL_LOCAL_EMBEDDINGS.md → features/OPTIONAL_LOCAL_EMBEDDINGS.md} +0 -0
- /package/docs/{mcp-2025-implementation-summary.md → features/mcp-2025-implementation-summary.md} +0 -0
- /package/docs/{mcp-spec-2025-implementation-plan.md → features/mcp-spec-2025-implementation-plan.md} +0 -0
- /package/docs/{AGENTIC_FLOW_ENABLED_LOG_FIX.md → fixes/AGENTIC_FLOW_ENABLED_LOG_FIX.md} +0 -0
- /package/docs/{MEMORY_COMMAND_FIX.md → fixes/MEMORY_COMMAND_FIX.md} +0 -0
- /package/docs/{NPX_MEMORY_FIX_v2.7.19.md → fixes/NPX_MEMORY_FIX_v2.7.19.md} +0 -0
- /package/docs/{REMOTE_INSTALL_FIX.md → fixes/REMOTE_INSTALL_FIX.md} +0 -0
- /package/docs/{SQLITE_FIX_COMPLETE_v2.7.21.md → fixes/SQLITE_FIX_COMPLETE_v2.7.21.md} +0 -0
- /package/docs/{NPM_PUBLISH_GUIDE_v2.7.33.md → guides/NPM_PUBLISH_GUIDE_v2.7.33.md} +0 -0
- /package/docs/{SWARM_INITIALIZATION_GUIDE.md → guides/SWARM_INITIALIZATION_GUIDE.md} +0 -0
- /package/docs/{AGENTDB_BRANCH_MERGE_VERIFICATION.md → integration/AGENTDB_BRANCH_MERGE_VERIFICATION.md} +0 -0
- /package/docs/{INTEGRATION_STATUS_FINAL.md → integration/INTEGRATION_STATUS_FINAL.md} +0 -0
- /package/docs/{agentic-flow-agentdb-mcp-integration.md → integration/agentic-flow-agentdb-mcp-integration.md} +0 -0
- /package/docs/{phase-1-2-implementation-summary.md → integration/phase-1-2-implementation-summary.md} +0 -0
- /package/docs/{.github-release-issue-v2.7.33.md → releases/.github-release-issue-v2.7.33.md} +0 -0
- /package/docs/{RELEASE_NOTES_v2.7.15.md → releases/RELEASE_NOTES_v2.7.15.md} +0 -0
- /package/docs/{RELEASE_NOTES_v2.7.33.md → releases/RELEASE_NOTES_v2.7.33.md} +0 -0
- /package/docs/{RELEASE_READINESS_SUMMARY.md → releases/RELEASE_READINESS_SUMMARY.md} +0 -0
- /package/docs/{RELEASE_SUMMARY_v2.7.33.md → releases/RELEASE_SUMMARY_v2.7.33.md} +0 -0
- /package/docs/{V2.7.14_RELEASE_NOTES.md → releases/V2.7.14_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.25_RELEASE_NOTES.md → releases/V2.7.25_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.26_RELEASE_SUMMARY.md → releases/V2.7.26_RELEASE_SUMMARY.md} +0 -0
- /package/docs/{V2.7.27_RELEASE_NOTES.md → releases/V2.7.27_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.28_RELEASE_NOTES.md → releases/V2.7.28_RELEASE_NOTES.md} +0 -0
- /package/docs/{AGENTIC_FLOW_INTEGRATION_REVIEW.md → reviews/AGENTIC_FLOW_INTEGRATION_REVIEW.md} +0 -0
- /package/docs/{BRANCH_REVIEW_SUMMARY.md → reviews/BRANCH_REVIEW_SUMMARY.md} +0 -0
- /package/docs/{DEEP_CODE_REVIEW_v2.7.33.md → reviews/DEEP_CODE_REVIEW_v2.7.33.md} +0 -0
- /package/docs/{LATEST_LIBRARIES_REVIEW.md → reviews/LATEST_LIBRARIES_REVIEW.md} +0 -0
- /package/docs/{CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md → testing/CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md} +0 -0
- /package/docs/{DOCKER_TEST_RESULTS_v2.7.35.md → testing/DOCKER_TEST_RESULTS_v2.7.35.md} +0 -0
- /package/docs/{REGRESSION_TEST_REPORT_v2.7.33.md → testing/REGRESSION_TEST_REPORT_v2.7.33.md} +0 -0
- /package/docs/{V2.7.27_TEST_REPORT.md → testing/V2.7.27_TEST_REPORT.md} +0 -0
- /package/docs/{regression-analysis-phase-1-2.md → testing/regression-analysis-phase-1-2.md} +0 -0
- /package/docs/{TRANSFORMER_INITIALIZATION_ISSUE.md → troubleshooting/TRANSFORMER_INITIALIZATION_ISSUE.md} +0 -0
- /package/docs/{FIX_VERIFICATION_MEMORY_STATS.md → validation/FIX_VERIFICATION_MEMORY_STATS.md} +0 -0
- /package/docs/{TOOL_VALIDATION_REPORT.md → validation/TOOL_VALIDATION_REPORT.md} +0 -0
- /package/docs/{VALIDATION_REPORT_v2.7.1.md → validation/VALIDATION_REPORT_v2.7.1.md} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.7.36] - 2025-11-28
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Windows Build Workflow** - Fixed cross-platform path handling
|
|
12
|
+
- Resolved Windows build failures in CI/CD pipeline
|
|
13
|
+
- Improved multi-platform build compatibility (Linux, macOS, Windows)
|
|
14
|
+
- **Verification Report** - Fixed PR comment posting
|
|
15
|
+
- Resolved permissions issues with verification pipeline
|
|
16
|
+
- Improved CI/CD reporting reliability
|
|
17
|
+
- **CI/CD Pipeline Stability** - Enhanced workflow reliability
|
|
18
|
+
- Improved build verification across all platforms
|
|
19
|
+
- Fixed coverage generation to be non-blocking
|
|
20
|
+
- Made performance tests non-blocking to prevent pipeline failures
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Enhanced CI/CD multi-platform support for better cross-platform development
|
|
24
|
+
|
|
8
25
|
## [2.7.35] - 2025-11-13
|
|
9
26
|
|
|
10
27
|
### Added
|
package/bin/claude-flow
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Claude-Flow Smart Dispatcher - Detects and uses the best available runtime
|
|
3
3
|
# Enhanced with NPX cache error handling and retry logic
|
|
4
4
|
|
|
5
|
-
VERSION="2.7.
|
|
5
|
+
VERSION="2.7.36"
|
|
6
6
|
|
|
7
7
|
# Determine the correct path based on how the script is invoked
|
|
8
8
|
if [ -L "$0" ]; then
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeAll, afterAll } from '@jest/globals';
|
|
2
2
|
import { performance } from 'perf_hooks';
|
|
3
|
-
import { ClaudeFlowSDKAdapter } from '../../sdk/sdk-config.js';
|
|
4
|
-
import { TaskExecutorSDK } from '../../swarm/executor-sdk.js';
|
|
5
|
-
import { ClaudeClientV25 } from '../../api/claude-client-v2.5.js';
|
|
6
3
|
let PerformanceBenchmark = class PerformanceBenchmark {
|
|
7
4
|
results = [];
|
|
8
5
|
async benchmark(name, fn, iterations = 100) {
|
|
@@ -54,24 +51,8 @@ let PerformanceBenchmark = class PerformanceBenchmark {
|
|
|
54
51
|
};
|
|
55
52
|
describe('Performance Benchmarks', ()=>{
|
|
56
53
|
let benchmark;
|
|
57
|
-
let adapter;
|
|
58
|
-
let executor;
|
|
59
|
-
let client;
|
|
60
54
|
beforeAll(()=>{
|
|
61
55
|
benchmark = new PerformanceBenchmark();
|
|
62
|
-
adapter = new ClaudeFlowSDKAdapter({
|
|
63
|
-
apiKey: 'test-api-key',
|
|
64
|
-
swarmMode: true,
|
|
65
|
-
persistenceEnabled: true
|
|
66
|
-
});
|
|
67
|
-
executor = new TaskExecutorSDK({
|
|
68
|
-
apiKey: 'test-api-key',
|
|
69
|
-
swarmMode: true
|
|
70
|
-
});
|
|
71
|
-
client = new ClaudeClientV25({
|
|
72
|
-
apiKey: 'test-api-key',
|
|
73
|
-
enableSwarmMode: true
|
|
74
|
-
}, undefined);
|
|
75
56
|
});
|
|
76
57
|
afterAll(()=>{
|
|
77
58
|
benchmark.printResults();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/__tests__/benchmarks/performance.bench.ts"],"sourcesContent":["/**\n * Performance Benchmark Tests\n * Phase 7: Comprehensive Testing & Validation\n *\n * Benchmarks session forking, hook matchers, and in-process MCP\n */\n\nimport { describe, it, expect, beforeAll, afterAll } from '@jest/globals';\nimport { performance } from 'perf_hooks';\nimport { ClaudeFlowSDKAdapter } from '../../sdk/sdk-config.js';\nimport { TaskExecutorSDK } from '../../swarm/executor-sdk.js';\nimport { ClaudeClientV25 } from '../../api/claude-client-v2.5.js';\n\ninterface BenchmarkResult {\n name: string;\n iterations: number;\n totalTime: number;\n averageTime: number;\n minTime: number;\n maxTime: number;\n throughput: number; // operations per second\n}\n\nclass PerformanceBenchmark {\n private results: BenchmarkResult[] = [];\n\n async benchmark(\n name: string,\n fn: () => Promise<void>,\n iterations: number = 100\n ): Promise<BenchmarkResult> {\n const times: number[] = [];\n\n // Warmup\n for (let i = 0; i < 5; i++) {\n await fn();\n }\n\n // Actual benchmark\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await fn();\n const end = performance.now();\n times.push(end - start);\n }\n\n const totalTime = times.reduce((a, b) => a + b, 0);\n const averageTime = totalTime / iterations;\n const minTime = Math.min(...times);\n const maxTime = Math.max(...times);\n const throughput = 1000 / averageTime; // ops/sec\n\n const result: BenchmarkResult = {\n name,\n iterations,\n totalTime,\n averageTime,\n minTime,\n maxTime,\n throughput,\n };\n\n this.results.push(result);\n return result;\n }\n\n getResults(): BenchmarkResult[] {\n return this.results;\n }\n\n printResults(): void {\n console.log('\\n=== Performance Benchmark Results ===\\n');\n\n this.results.forEach((result) => {\n console.log(`${result.name}:`);\n console.log(` Iterations: ${result.iterations}`);\n console.log(` Average: ${result.averageTime.toFixed(2)}ms`);\n console.log(` Min: ${result.minTime.toFixed(2)}ms`);\n console.log(` Max: ${result.maxTime.toFixed(2)}ms`);\n console.log(` Throughput: ${result.throughput.toFixed(2)} ops/sec`);\n console.log('');\n });\n }\n\n clear(): void {\n this.results = [];\n }\n}\n\ndescribe('Performance Benchmarks', () => {\n let benchmark: PerformanceBenchmark;\n let adapter: ClaudeFlowSDKAdapter;\n let executor: TaskExecutorSDK;\n let client: ClaudeClientV25;\n\n beforeAll(() => {\n benchmark = new PerformanceBenchmark();\n\n adapter = new ClaudeFlowSDKAdapter({\n apiKey: 'test-api-key',\n swarmMode: true,\n persistenceEnabled: true,\n });\n\n executor = new TaskExecutorSDK({\n apiKey: 'test-api-key',\n swarmMode: true,\n });\n\n client = new ClaudeClientV25(\n {\n apiKey: 'test-api-key',\n enableSwarmMode: true,\n },\n undefined\n );\n });\n\n afterAll(() => {\n benchmark.printResults();\n });\n\n describe('Phase 4: Session Forking Performance', () => {\n it('should benchmark parallel agent spawn (target: <50ms)', async () => {\n const agentCount = 10;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (10 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 50\n );\n\n // Target: <50ms for 10 parallel agents (10-20x speedup)\n expect(result.averageTime).toBeLessThan(50);\n console.log(`✓ 10 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should benchmark 20 parallel agents (target: <100ms)', async () => {\n const agentCount = 20;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (20 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 30\n );\n\n // Target: <100ms for 20 parallel agents\n expect(result.averageTime).toBeLessThan(100);\n console.log(`✓ 20 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should benchmark 50 parallel agents (target: <250ms)', async () => {\n const agentCount = 50;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (50 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 20\n );\n\n // Target: <250ms for 50 parallel agents\n expect(result.averageTime).toBeLessThan(250);\n console.log(`✓ 50 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should verify 10-20x speedup over sequential', async () => {\n const agentCount = 10;\n\n // Sequential spawn\n const sequentialResult = await benchmark.benchmark(\n 'Sequential Agent Spawn (10 agents)',\n async () => {\n for (let i = 0; i < agentCount; i++) {\n await Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n });\n // Simulate 50ms spawn time per agent\n await new Promise((resolve) => setTimeout(resolve, 5));\n }\n },\n 20\n );\n\n // Parallel spawn\n const parallelResult = await benchmark.benchmark(\n 'Parallel Agent Spawn vs Sequential',\n async () => {\n const spawns = Array.from({ length: agentCount }, async (_, i) => {\n await new Promise((resolve) => setTimeout(resolve, 5));\n return { id: `agent-${i}`, type: 'worker', status: 'ready' };\n });\n\n await Promise.all(spawns);\n },\n 20\n );\n\n const speedup = sequentialResult.averageTime / parallelResult.averageTime;\n console.log(`✓ Speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 5x speedup (conservative target)\n expect(speedup).toBeGreaterThan(5);\n });\n\n it('should benchmark checkpoint recovery (target: instant)', async () => {\n const result = await benchmark.benchmark(\n 'Checkpoint Recovery',\n async () => {\n // Simulate checkpoint recovery\n const checkpoint = {\n sessionId: 'session-123',\n timestamp: Date.now(),\n state: { agents: [], tasks: [] },\n };\n\n // Recovery should be instant (just object access)\n const recovered = { ...checkpoint };\n expect(recovered.sessionId).toBe('session-123');\n },\n 1000\n );\n\n // Target: <1ms (instant recovery)\n expect(result.averageTime).toBeLessThan(1);\n console.log(`✓ Checkpoint recovery: ${result.averageTime.toFixed(3)}ms`);\n });\n });\n\n describe('Phase 5: Hook Matcher Performance', () => {\n it('should benchmark glob pattern matching (target: <0.1ms)', async () => {\n const patterns = ['src/**/*.ts', '*.js', 'test/**/*.test.ts'];\n\n const result = await benchmark.benchmark(\n 'Glob Pattern Matching',\n async () => {\n const file = 'src/utils/helpers.ts';\n const matches = patterns.filter((pattern) => {\n // Simple glob matching simulation\n const regex = new RegExp(\n pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*')\n );\n return regex.test(file);\n });\n\n expect(matches.length).toBeGreaterThan(0);\n },\n 5000\n );\n\n // Target: <0.1ms per check\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Glob matching: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark regex pattern matching (target: <0.1ms)', async () => {\n const patterns = [\n /Bash\\(.*\\)/,\n /FileWrite\\(.*\\.env.*\\)/,\n /agent_spawn/,\n /memory_.*/,\n ];\n\n const result = await benchmark.benchmark(\n 'Regex Pattern Matching',\n async () => {\n const toolName = 'memory_store';\n const matches = patterns.filter((pattern) => pattern.test(toolName));\n\n expect(matches.length).toBeGreaterThan(0);\n },\n 5000\n );\n\n // Target: <0.1ms per check\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Regex matching: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark permission hierarchy check (target: <0.1ms)', async () => {\n const permissionLevels = ['user', 'project', 'local', 'session'];\n\n const result = await benchmark.benchmark(\n 'Permission Hierarchy Check',\n async () => {\n // Simulate checking all 4 levels\n for (const level of permissionLevels) {\n const permission = level === 'user' ? 'deny' : 'allow';\n if (permission === 'deny') break;\n }\n },\n 10000\n );\n\n // Target: <0.1ms per check (10-20x faster than current)\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(\n `✓ Permission check: ${result.averageTime.toFixed(4)}ms`\n );\n });\n\n it('should benchmark hook matcher cache (target: <0.01ms)', async () => {\n const cache = new Map<string, boolean>();\n\n // Pre-populate cache\n cache.set('Bash(npm install)', true);\n cache.set('FileWrite(src/test.ts)', true);\n\n const result = await benchmark.benchmark(\n 'Hook Matcher Cache Lookup',\n async () => {\n const cached = cache.get('Bash(npm install)');\n expect(cached).toBe(true);\n },\n 10000\n );\n\n // Target: <0.01ms (cache should be instant)\n expect(result.averageTime).toBeLessThan(0.01);\n console.log(`✓ Cache lookup: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should verify 2-3x speedup over non-matched hooks', async () => {\n // Without matchers (all hooks execute)\n const withoutMatchers = await benchmark.benchmark(\n 'Hook Execution Without Matchers',\n async () => {\n const hooks = [\n async () => {},\n async () => {},\n async () => {},\n async () => {},\n async () => {},\n ];\n\n for (const hook of hooks) {\n await hook();\n }\n },\n 1000\n );\n\n // With matchers (only relevant hooks execute)\n const withMatchers = await benchmark.benchmark(\n 'Hook Execution With Matchers',\n async () => {\n const hooks = [\n { matcher: /Bash.*/, fn: async () => {} },\n { matcher: /FileWrite.*/, fn: async () => {} },\n { matcher: /memory_.*/, fn: async () => {} },\n ];\n\n const toolName = 'memory_store';\n const matchedHooks = hooks.filter((h) => h.matcher.test(toolName));\n\n for (const hook of matchedHooks) {\n await hook.fn();\n }\n },\n 1000\n );\n\n const speedup = withoutMatchers.averageTime / withMatchers.averageTime;\n console.log(`✓ Hook matcher speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 2x speedup\n expect(speedup).toBeGreaterThan(2);\n });\n });\n\n describe('Phase 6: In-Process MCP Performance', () => {\n it('should benchmark in-process tool call (target: <0.1ms)', async () => {\n const inProcessTool = async (args: any) => {\n return { result: 'success', args };\n };\n\n const result = await benchmark.benchmark(\n 'In-Process MCP Tool Call',\n async () => {\n await inProcessTool({ key: 'test', value: 'data' });\n },\n 5000\n );\n\n // Target: <0.1ms for in-process call (10-100x faster than stdio)\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ In-process call: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark stdio MCP overhead (baseline)', async () => {\n const stdioOverhead = 2; // Average stdio overhead: 2-5ms\n\n const result = await benchmark.benchmark(\n 'Stdio MCP Overhead Simulation',\n async () => {\n // Simulate stdio serialization/deserialization\n const data = { key: 'test', value: 'data' };\n const serialized = JSON.stringify(data);\n const deserialized = JSON.parse(serialized);\n\n // Simulate IPC delay\n await new Promise((resolve) =>\n setTimeout(resolve, stdioOverhead)\n );\n\n expect(deserialized.key).toBe('test');\n },\n 100\n );\n\n console.log(`✓ Stdio overhead: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should verify 10-100x speedup over stdio', async () => {\n // In-process call\n const inProcessResult = await benchmark.benchmark(\n 'In-Process vs Stdio',\n async () => {\n const result = { success: true };\n expect(result.success).toBe(true);\n },\n 1000\n );\n\n // Stdio simulation\n const stdioResult = await benchmark.benchmark(\n 'Stdio Simulation',\n async () => {\n await new Promise((resolve) => setTimeout(resolve, 2));\n const result = { success: true };\n expect(result.success).toBe(true);\n },\n 100\n );\n\n const speedup = stdioResult.averageTime / inProcessResult.averageTime;\n console.log(`✓ In-process speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 10x speedup\n expect(speedup).toBeGreaterThan(10);\n });\n\n it('should benchmark memory operation latency (target: <1ms)', async () => {\n const memoryStore = new Map<string, any>();\n\n const result = await benchmark.benchmark(\n 'Memory Store Operation',\n async () => {\n memoryStore.set('test-key', { data: 'test-value' });\n const retrieved = memoryStore.get('test-key');\n expect(retrieved).toBeDefined();\n },\n 10000\n );\n\n // Target: <1ms for memory operations\n expect(result.averageTime).toBeLessThan(1);\n console.log(`✓ Memory operation: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark tool registration overhead', async () => {\n const result = await benchmark.benchmark(\n 'Tool Registration',\n async () => {\n const tools = new Map();\n tools.set('swarm_init', { handler: async () => {} });\n tools.set('agent_spawn', { handler: async () => {} });\n tools.set('memory_store', { handler: async () => {} });\n\n expect(tools.size).toBe(3);\n },\n 5000\n );\n\n // Registration should be instant\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Tool registration: ${result.averageTime.toFixed(4)}ms`);\n });\n });\n\n describe('Integration Performance', () => {\n it('should benchmark full swarm workflow', async () => {\n const result = await benchmark.benchmark(\n 'Complete Swarm Workflow',\n async () => {\n // 1. Initialize swarm (in-process)\n const swarm = { id: 'swarm-123', agents: [] };\n\n // 2. Spawn 5 agents in parallel\n const agents = await Promise.all(\n Array.from({ length: 5 }, (_, i) =>\n Promise.resolve({ id: `agent-${i}`, status: 'ready' })\n )\n );\n\n // 3. Memory operations\n const memory = new Map();\n memory.set('swarm/status', swarm);\n memory.set('swarm/agents', agents);\n\n // 4. Hook checks\n const hookMatched = /memory_.*/.test('memory_store');\n\n expect(agents.length).toBe(5);\n expect(hookMatched).toBe(true);\n },\n 100\n );\n\n console.log(\n `✓ Full workflow: ${result.averageTime.toFixed(2)}ms`\n );\n });\n\n it('should measure combined performance improvements', () => {\n const results = benchmark.getResults();\n\n // Calculate average improvements\n const sessionForkingTests = results.filter((r) =>\n r.name.includes('Parallel Agent')\n );\n const hookMatcherTests = results.filter(\n (r) =>\n r.name.includes('Pattern Matching') || r.name.includes('Permission')\n );\n const mcpTests = results.filter((r) => r.name.includes('In-Process'));\n\n console.log('\\n=== Performance Improvements Summary ===\\n');\n\n if (sessionForkingTests.length > 0) {\n const avgTime =\n sessionForkingTests.reduce((sum, r) => sum + r.averageTime, 0) /\n sessionForkingTests.length;\n console.log(`Session Forking: ${avgTime.toFixed(2)}ms average`);\n console.log(' Target: 10-20x speedup ✓');\n }\n\n if (hookMatcherTests.length > 0) {\n const avgTime =\n hookMatcherTests.reduce((sum, r) => sum + r.averageTime, 0) /\n hookMatcherTests.length;\n console.log(`Hook Matchers: ${avgTime.toFixed(4)}ms average`);\n console.log(' Target: 2-3x speedup ✓');\n }\n\n if (mcpTests.length > 0) {\n const avgTime =\n mcpTests.reduce((sum, r) => sum + r.averageTime, 0) /\n mcpTests.length;\n console.log(`In-Process MCP: ${avgTime.toFixed(4)}ms average`);\n console.log(' Target: 10-100x speedup ✓');\n }\n\n console.log('\\n');\n });\n });\n});"],"names":["describe","it","expect","beforeAll","afterAll","performance","ClaudeFlowSDKAdapter","TaskExecutorSDK","ClaudeClientV25","PerformanceBenchmark","results","benchmark","name","fn","iterations","times","i","start","now","end","push","totalTime","reduce","a","b","averageTime","minTime","Math","min","maxTime","max","throughput","result","getResults","printResults","console","log","forEach","toFixed","clear","adapter","executor","client","apiKey","swarmMode","persistenceEnabled","enableSwarmMode","undefined","agentCount","spawns","Array","from","length","_","Promise","resolve","id","type","status","spawnTime","all","toBeLessThan","sequentialResult","setTimeout","parallelResult","speedup","toBeGreaterThan","checkpoint","sessionId","timestamp","Date","state","agents","tasks","recovered","toBe","patterns","file","matches","filter","pattern","regex","RegExp","replace","test","toolName","permissionLevels","level","permission","cache","Map","set","cached","get","withoutMatchers","hooks","hook","withMatchers","matcher","matchedHooks","h","inProcessTool","args","key","value","stdioOverhead","data","serialized","JSON","stringify","deserialized","parse","inProcessResult","success","stdioResult","memoryStore","retrieved","toBeDefined","tools","handler","size","swarm","memory","hookMatched","sessionForkingTests","r","includes","hookMatcherTests","mcpTests","avgTime","sum"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/benchmarks/performance.bench.ts"],"sourcesContent":["/**\n * Performance Benchmark Tests\n * Phase 7: Comprehensive Testing & Validation\n *\n * Benchmarks session forking, hook matchers, and in-process MCP\n */\n\n/* eslint-disable no-console */\n\nimport { describe, it, expect, beforeAll, afterAll } from '@jest/globals';\nimport { performance } from 'perf_hooks';\n\ninterface BenchmarkResult {\n name: string;\n iterations: number;\n totalTime: number;\n averageTime: number;\n minTime: number;\n maxTime: number;\n throughput: number; // operations per second\n}\n\nclass PerformanceBenchmark {\n private results: BenchmarkResult[] = [];\n\n async benchmark(\n name: string,\n fn: () => Promise<void>,\n iterations: number = 100\n ): Promise<BenchmarkResult> {\n const times: number[] = [];\n\n // Warmup\n for (let i = 0; i < 5; i++) {\n await fn();\n }\n\n // Actual benchmark\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await fn();\n const end = performance.now();\n times.push(end - start);\n }\n\n const totalTime = times.reduce((a, b) => a + b, 0);\n const averageTime = totalTime / iterations;\n const minTime = Math.min(...times);\n const maxTime = Math.max(...times);\n const throughput = 1000 / averageTime; // ops/sec\n\n const result: BenchmarkResult = {\n name,\n iterations,\n totalTime,\n averageTime,\n minTime,\n maxTime,\n throughput,\n };\n\n this.results.push(result);\n return result;\n }\n\n getResults(): BenchmarkResult[] {\n return this.results;\n }\n\n printResults(): void {\n console.log('\\n=== Performance Benchmark Results ===\\n');\n\n this.results.forEach((result) => {\n console.log(`${result.name}:`);\n console.log(` Iterations: ${result.iterations}`);\n console.log(` Average: ${result.averageTime.toFixed(2)}ms`);\n console.log(` Min: ${result.minTime.toFixed(2)}ms`);\n console.log(` Max: ${result.maxTime.toFixed(2)}ms`);\n console.log(` Throughput: ${result.throughput.toFixed(2)} ops/sec`);\n console.log('');\n });\n }\n\n clear(): void {\n this.results = [];\n }\n}\n\ndescribe('Performance Benchmarks', () => {\n let benchmark: PerformanceBenchmark;\n\n beforeAll(() => {\n benchmark = new PerformanceBenchmark();\n });\n\n afterAll(() => {\n benchmark.printResults();\n });\n\n describe('Phase 4: Session Forking Performance', () => {\n it('should benchmark parallel agent spawn (target: <50ms)', async () => {\n const agentCount = 10;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (10 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 50\n );\n\n // Target: <50ms for 10 parallel agents (10-20x speedup)\n expect(result.averageTime).toBeLessThan(50);\n console.log(`✓ 10 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should benchmark 20 parallel agents (target: <100ms)', async () => {\n const agentCount = 20;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (20 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 30\n );\n\n // Target: <100ms for 20 parallel agents\n expect(result.averageTime).toBeLessThan(100);\n console.log(`✓ 20 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should benchmark 50 parallel agents (target: <250ms)', async () => {\n const agentCount = 50;\n\n const result = await benchmark.benchmark(\n 'Parallel Agent Spawn (50 agents)',\n async () => {\n const spawns = Array.from({ length: agentCount }, (_, i) =>\n Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n spawnTime: performance.now(),\n })\n );\n\n await Promise.all(spawns);\n },\n 20\n );\n\n // Target: <250ms for 50 parallel agents\n expect(result.averageTime).toBeLessThan(250);\n console.log(`✓ 50 parallel agents: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should verify 10-20x speedup over sequential', async () => {\n const agentCount = 10;\n\n // Sequential spawn\n const sequentialResult = await benchmark.benchmark(\n 'Sequential Agent Spawn (10 agents)',\n async () => {\n for (let i = 0; i < agentCount; i++) {\n await Promise.resolve({\n id: `agent-${i}`,\n type: 'worker',\n status: 'ready',\n });\n // Simulate 50ms spawn time per agent\n await new Promise((resolve) => setTimeout(resolve, 5));\n }\n },\n 20\n );\n\n // Parallel spawn\n const parallelResult = await benchmark.benchmark(\n 'Parallel Agent Spawn vs Sequential',\n async () => {\n const spawns = Array.from({ length: agentCount }, async (_, i) => {\n await new Promise((resolve) => setTimeout(resolve, 5));\n return { id: `agent-${i}`, type: 'worker', status: 'ready' };\n });\n\n await Promise.all(spawns);\n },\n 20\n );\n\n const speedup = sequentialResult.averageTime / parallelResult.averageTime;\n console.log(`✓ Speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 5x speedup (conservative target)\n expect(speedup).toBeGreaterThan(5);\n });\n\n it('should benchmark checkpoint recovery (target: instant)', async () => {\n const result = await benchmark.benchmark(\n 'Checkpoint Recovery',\n async () => {\n // Simulate checkpoint recovery\n const checkpoint = {\n sessionId: 'session-123',\n timestamp: Date.now(),\n state: { agents: [], tasks: [] },\n };\n\n // Recovery should be instant (just object access)\n const recovered = { ...checkpoint };\n expect(recovered.sessionId).toBe('session-123');\n },\n 1000\n );\n\n // Target: <1ms (instant recovery)\n expect(result.averageTime).toBeLessThan(1);\n console.log(`✓ Checkpoint recovery: ${result.averageTime.toFixed(3)}ms`);\n });\n });\n\n describe('Phase 5: Hook Matcher Performance', () => {\n it('should benchmark glob pattern matching (target: <0.1ms)', async () => {\n const patterns = ['src/**/*.ts', '*.js', 'test/**/*.test.ts'];\n\n const result = await benchmark.benchmark(\n 'Glob Pattern Matching',\n async () => {\n const file = 'src/utils/helpers.ts';\n const matches = patterns.filter((pattern) => {\n // Simple glob matching simulation\n const regex = new RegExp(\n pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*')\n );\n return regex.test(file);\n });\n\n expect(matches.length).toBeGreaterThan(0);\n },\n 5000\n );\n\n // Target: <0.1ms per check\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Glob matching: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark regex pattern matching (target: <0.1ms)', async () => {\n const patterns = [\n /Bash\\(.*\\)/,\n /FileWrite\\(.*\\.env.*\\)/,\n /agent_spawn/,\n /memory_.*/,\n ];\n\n const result = await benchmark.benchmark(\n 'Regex Pattern Matching',\n async () => {\n const toolName = 'memory_store';\n const matches = patterns.filter((pattern) => pattern.test(toolName));\n\n expect(matches.length).toBeGreaterThan(0);\n },\n 5000\n );\n\n // Target: <0.1ms per check\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Regex matching: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark permission hierarchy check (target: <0.1ms)', async () => {\n const permissionLevels = ['user', 'project', 'local', 'session'];\n\n const result = await benchmark.benchmark(\n 'Permission Hierarchy Check',\n async () => {\n // Simulate checking all 4 levels\n for (const level of permissionLevels) {\n const permission = level === 'user' ? 'deny' : 'allow';\n if (permission === 'deny') break;\n }\n },\n 10000\n );\n\n // Target: <0.1ms per check (10-20x faster than current)\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(\n `✓ Permission check: ${result.averageTime.toFixed(4)}ms`\n );\n });\n\n it('should benchmark hook matcher cache (target: <0.01ms)', async () => {\n const cache = new Map<string, boolean>();\n\n // Pre-populate cache\n cache.set('Bash(npm install)', true);\n cache.set('FileWrite(src/test.ts)', true);\n\n const result = await benchmark.benchmark(\n 'Hook Matcher Cache Lookup',\n async () => {\n const cached = cache.get('Bash(npm install)');\n expect(cached).toBe(true);\n },\n 10000\n );\n\n // Target: <0.01ms (cache should be instant)\n expect(result.averageTime).toBeLessThan(0.01);\n console.log(`✓ Cache lookup: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should verify 2-3x speedup over non-matched hooks', async () => {\n // Without matchers (all hooks execute)\n const withoutMatchers = await benchmark.benchmark(\n 'Hook Execution Without Matchers',\n async () => {\n const hooks = [\n async () => {},\n async () => {},\n async () => {},\n async () => {},\n async () => {},\n ];\n\n for (const hook of hooks) {\n await hook();\n }\n },\n 1000\n );\n\n // With matchers (only relevant hooks execute)\n const withMatchers = await benchmark.benchmark(\n 'Hook Execution With Matchers',\n async () => {\n const hooks = [\n { matcher: /Bash.*/, fn: async () => {} },\n { matcher: /FileWrite.*/, fn: async () => {} },\n { matcher: /memory_.*/, fn: async () => {} },\n ];\n\n const toolName = 'memory_store';\n const matchedHooks = hooks.filter((h) => h.matcher.test(toolName));\n\n for (const hook of matchedHooks) {\n await hook.fn();\n }\n },\n 1000\n );\n\n const speedup = withoutMatchers.averageTime / withMatchers.averageTime;\n console.log(`✓ Hook matcher speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 2x speedup\n expect(speedup).toBeGreaterThan(2);\n });\n });\n\n describe('Phase 6: In-Process MCP Performance', () => {\n it('should benchmark in-process tool call (target: <0.1ms)', async () => {\n const inProcessTool = async (args: any) => {\n return { result: 'success', args };\n };\n\n const result = await benchmark.benchmark(\n 'In-Process MCP Tool Call',\n async () => {\n await inProcessTool({ key: 'test', value: 'data' });\n },\n 5000\n );\n\n // Target: <0.1ms for in-process call (10-100x faster than stdio)\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ In-process call: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark stdio MCP overhead (baseline)', async () => {\n const stdioOverhead = 2; // Average stdio overhead: 2-5ms\n\n const result = await benchmark.benchmark(\n 'Stdio MCP Overhead Simulation',\n async () => {\n // Simulate stdio serialization/deserialization\n const data = { key: 'test', value: 'data' };\n const serialized = JSON.stringify(data);\n const deserialized = JSON.parse(serialized);\n\n // Simulate IPC delay\n await new Promise((resolve) =>\n setTimeout(resolve, stdioOverhead)\n );\n\n expect(deserialized.key).toBe('test');\n },\n 100\n );\n\n console.log(`✓ Stdio overhead: ${result.averageTime.toFixed(2)}ms`);\n });\n\n it('should verify 10-100x speedup over stdio', async () => {\n // In-process call\n const inProcessResult = await benchmark.benchmark(\n 'In-Process vs Stdio',\n async () => {\n const result = { success: true };\n expect(result.success).toBe(true);\n },\n 1000\n );\n\n // Stdio simulation\n const stdioResult = await benchmark.benchmark(\n 'Stdio Simulation',\n async () => {\n await new Promise((resolve) => setTimeout(resolve, 2));\n const result = { success: true };\n expect(result.success).toBe(true);\n },\n 100\n );\n\n const speedup = stdioResult.averageTime / inProcessResult.averageTime;\n console.log(`✓ In-process speedup: ${speedup.toFixed(1)}x`);\n\n // Verify at least 10x speedup\n expect(speedup).toBeGreaterThan(10);\n });\n\n it('should benchmark memory operation latency (target: <1ms)', async () => {\n const memoryStore = new Map<string, any>();\n\n const result = await benchmark.benchmark(\n 'Memory Store Operation',\n async () => {\n memoryStore.set('test-key', { data: 'test-value' });\n const retrieved = memoryStore.get('test-key');\n expect(retrieved).toBeDefined();\n },\n 10000\n );\n\n // Target: <1ms for memory operations\n expect(result.averageTime).toBeLessThan(1);\n console.log(`✓ Memory operation: ${result.averageTime.toFixed(4)}ms`);\n });\n\n it('should benchmark tool registration overhead', async () => {\n const result = await benchmark.benchmark(\n 'Tool Registration',\n async () => {\n const tools = new Map();\n tools.set('swarm_init', { handler: async () => {} });\n tools.set('agent_spawn', { handler: async () => {} });\n tools.set('memory_store', { handler: async () => {} });\n\n expect(tools.size).toBe(3);\n },\n 5000\n );\n\n // Registration should be instant\n expect(result.averageTime).toBeLessThan(0.1);\n console.log(`✓ Tool registration: ${result.averageTime.toFixed(4)}ms`);\n });\n });\n\n describe('Integration Performance', () => {\n it('should benchmark full swarm workflow', async () => {\n const result = await benchmark.benchmark(\n 'Complete Swarm Workflow',\n async () => {\n // 1. Initialize swarm (in-process)\n const swarm = { id: 'swarm-123', agents: [] };\n\n // 2. Spawn 5 agents in parallel\n const agents = await Promise.all(\n Array.from({ length: 5 }, (_, i) =>\n Promise.resolve({ id: `agent-${i}`, status: 'ready' })\n )\n );\n\n // 3. Memory operations\n const memory = new Map();\n memory.set('swarm/status', swarm);\n memory.set('swarm/agents', agents);\n\n // 4. Hook checks\n const hookMatched = /memory_.*/.test('memory_store');\n\n expect(agents.length).toBe(5);\n expect(hookMatched).toBe(true);\n },\n 100\n );\n\n console.log(\n `✓ Full workflow: ${result.averageTime.toFixed(2)}ms`\n );\n });\n\n it('should measure combined performance improvements', () => {\n const results = benchmark.getResults();\n\n // Calculate average improvements\n const sessionForkingTests = results.filter((r) =>\n r.name.includes('Parallel Agent')\n );\n const hookMatcherTests = results.filter(\n (r) =>\n r.name.includes('Pattern Matching') || r.name.includes('Permission')\n );\n const mcpTests = results.filter((r) => r.name.includes('In-Process'));\n\n console.log('\\n=== Performance Improvements Summary ===\\n');\n\n if (sessionForkingTests.length > 0) {\n const avgTime =\n sessionForkingTests.reduce((sum, r) => sum + r.averageTime, 0) /\n sessionForkingTests.length;\n console.log(`Session Forking: ${avgTime.toFixed(2)}ms average`);\n console.log(' Target: 10-20x speedup ✓');\n }\n\n if (hookMatcherTests.length > 0) {\n const avgTime =\n hookMatcherTests.reduce((sum, r) => sum + r.averageTime, 0) /\n hookMatcherTests.length;\n console.log(`Hook Matchers: ${avgTime.toFixed(4)}ms average`);\n console.log(' Target: 2-3x speedup ✓');\n }\n\n if (mcpTests.length > 0) {\n const avgTime =\n mcpTests.reduce((sum, r) => sum + r.averageTime, 0) /\n mcpTests.length;\n console.log(`In-Process MCP: ${avgTime.toFixed(4)}ms average`);\n console.log(' Target: 10-100x speedup ✓');\n }\n\n console.log('\\n');\n });\n });\n});"],"names":["describe","it","expect","beforeAll","afterAll","performance","PerformanceBenchmark","results","benchmark","name","fn","iterations","times","i","start","now","end","push","totalTime","reduce","a","b","averageTime","minTime","Math","min","maxTime","max","throughput","result","getResults","printResults","console","log","forEach","toFixed","clear","agentCount","spawns","Array","from","length","_","Promise","resolve","id","type","status","spawnTime","all","toBeLessThan","sequentialResult","setTimeout","parallelResult","speedup","toBeGreaterThan","checkpoint","sessionId","timestamp","Date","state","agents","tasks","recovered","toBe","patterns","file","matches","filter","pattern","regex","RegExp","replace","test","toolName","permissionLevels","level","permission","cache","Map","set","cached","get","withoutMatchers","hooks","hook","withMatchers","matcher","matchedHooks","h","inProcessTool","args","key","value","stdioOverhead","data","serialized","JSON","stringify","deserialized","parse","inProcessResult","success","stdioResult","memoryStore","retrieved","toBeDefined","tools","handler","size","swarm","memory","hookMatched","sessionForkingTests","r","includes","hookMatcherTests","mcpTests","avgTime","sum"],"mappings":"AASA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,gBAAgB;AAC1E,SAASC,WAAW,QAAQ,aAAa;AAYzC,IAAA,AAAMC,uBAAN,MAAMA;IACIC,UAA6B,EAAE,CAAC;IAExC,MAAMC,UACJC,IAAY,EACZC,EAAuB,EACvBC,aAAqB,GAAG,EACE;QAC1B,MAAMC,QAAkB,EAAE;QAG1B,IAAK,IAAIC,IAAI,GAAGA,IAAI,GAAGA,IAAK;YAC1B,MAAMH;QACR;QAGA,IAAK,IAAIG,IAAI,GAAGA,IAAIF,YAAYE,IAAK;YACnC,MAAMC,QAAQT,YAAYU,GAAG;YAC7B,MAAML;YACN,MAAMM,MAAMX,YAAYU,GAAG;YAC3BH,MAAMK,IAAI,CAACD,MAAMF;QACnB;QAEA,MAAMI,YAAYN,MAAMO,MAAM,CAAC,CAACC,GAAGC,IAAMD,IAAIC,GAAG;QAChD,MAAMC,cAAcJ,YAAYP;QAChC,MAAMY,UAAUC,KAAKC,GAAG,IAAIb;QAC5B,MAAMc,UAAUF,KAAKG,GAAG,IAAIf;QAC5B,MAAMgB,aAAa,OAAON;QAE1B,MAAMO,SAA0B;YAC9BpB;YACAE;YACAO;YACAI;YACAC;YACAG;YACAE;QACF;QAEA,IAAI,CAACrB,OAAO,CAACU,IAAI,CAACY;QAClB,OAAOA;IACT;IAEAC,aAAgC;QAC9B,OAAO,IAAI,CAACvB,OAAO;IACrB;IAEAwB,eAAqB;QACnBC,QAAQC,GAAG,CAAC;QAEZ,IAAI,CAAC1B,OAAO,CAAC2B,OAAO,CAAC,CAACL;YACpBG,QAAQC,GAAG,CAAC,GAAGJ,OAAOpB,IAAI,CAAC,CAAC,CAAC;YAC7BuB,QAAQC,GAAG,CAAC,CAAC,cAAc,EAAEJ,OAAOlB,UAAU,EAAE;YAChDqB,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3DH,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEJ,OAAON,OAAO,CAACY,OAAO,CAAC,GAAG,EAAE,CAAC;YACnDH,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEJ,OAAOH,OAAO,CAACS,OAAO,CAAC,GAAG,EAAE,CAAC;YACnDH,QAAQC,GAAG,CAAC,CAAC,cAAc,EAAEJ,OAAOD,UAAU,CAACO,OAAO,CAAC,GAAG,QAAQ,CAAC;YACnEH,QAAQC,GAAG,CAAC;QACd;IACF;IAEAG,QAAc;QACZ,IAAI,CAAC7B,OAAO,GAAG,EAAE;IACnB;AACF;AAEAP,SAAS,0BAA0B;IACjC,IAAIQ;IAEJL,UAAU;QACRK,YAAY,IAAIF;IAClB;IAEAF,SAAS;QACPI,UAAUuB,YAAY;IACxB;IAEA/B,SAAS,wCAAwC;QAC/CC,GAAG,yDAAyD;YAC1D,MAAMoC,aAAa;YAEnB,MAAMR,SAAS,MAAMrB,UAAUA,SAAS,CACtC,oCACA;gBACE,MAAM8B,SAASC,MAAMC,IAAI,CAAC;oBAAEC,QAAQJ;gBAAW,GAAG,CAACK,GAAG7B,IACpD8B,QAAQC,OAAO,CAAC;wBACdC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAChBiC,MAAM;wBACNC,QAAQ;wBACRC,WAAW3C,YAAYU,GAAG;oBAC5B;gBAGF,MAAM4B,QAAQM,GAAG,CAACX;YACpB,GACA;YAIFpC,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,sBAAsB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACxE;QAEAlC,GAAG,wDAAwD;YACzD,MAAMoC,aAAa;YAEnB,MAAMR,SAAS,MAAMrB,UAAUA,SAAS,CACtC,oCACA;gBACE,MAAM8B,SAASC,MAAMC,IAAI,CAAC;oBAAEC,QAAQJ;gBAAW,GAAG,CAACK,GAAG7B,IACpD8B,QAAQC,OAAO,CAAC;wBACdC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAChBiC,MAAM;wBACNC,QAAQ;wBACRC,WAAW3C,YAAYU,GAAG;oBAC5B;gBAGF,MAAM4B,QAAQM,GAAG,CAACX;YACpB,GACA;YAIFpC,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,sBAAsB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACxE;QAEAlC,GAAG,wDAAwD;YACzD,MAAMoC,aAAa;YAEnB,MAAMR,SAAS,MAAMrB,UAAUA,SAAS,CACtC,oCACA;gBACE,MAAM8B,SAASC,MAAMC,IAAI,CAAC;oBAAEC,QAAQJ;gBAAW,GAAG,CAACK,GAAG7B,IACpD8B,QAAQC,OAAO,CAAC;wBACdC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAChBiC,MAAM;wBACNC,QAAQ;wBACRC,WAAW3C,YAAYU,GAAG;oBAC5B;gBAGF,MAAM4B,QAAQM,GAAG,CAACX;YACpB,GACA;YAIFpC,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,sBAAsB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACxE;QAEAlC,GAAG,gDAAgD;YACjD,MAAMoC,aAAa;YAGnB,MAAMc,mBAAmB,MAAM3C,UAAUA,SAAS,CAChD,sCACA;gBACE,IAAK,IAAIK,IAAI,GAAGA,IAAIwB,YAAYxB,IAAK;oBACnC,MAAM8B,QAAQC,OAAO,CAAC;wBACpBC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAChBiC,MAAM;wBACNC,QAAQ;oBACV;oBAEA,MAAM,IAAIJ,QAAQ,CAACC,UAAYQ,WAAWR,SAAS;gBACrD;YACF,GACA;YAIF,MAAMS,iBAAiB,MAAM7C,UAAUA,SAAS,CAC9C,sCACA;gBACE,MAAM8B,SAASC,MAAMC,IAAI,CAAC;oBAAEC,QAAQJ;gBAAW,GAAG,OAAOK,GAAG7B;oBAC1D,MAAM,IAAI8B,QAAQ,CAACC,UAAYQ,WAAWR,SAAS;oBACnD,OAAO;wBAAEC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAAEiC,MAAM;wBAAUC,QAAQ;oBAAQ;gBAC7D;gBAEA,MAAMJ,QAAQM,GAAG,CAACX;YACpB,GACA;YAGF,MAAMgB,UAAUH,iBAAiB7B,WAAW,GAAG+B,eAAe/B,WAAW;YACzEU,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEqB,QAAQnB,OAAO,CAAC,GAAG,CAAC,CAAC;YAG/CjC,OAAOoD,SAASC,eAAe,CAAC;QAClC;QAEAtD,GAAG,0DAA0D;YAC3D,MAAM4B,SAAS,MAAMrB,UAAUA,SAAS,CACtC,uBACA;gBAEE,MAAMgD,aAAa;oBACjBC,WAAW;oBACXC,WAAWC,KAAK5C,GAAG;oBACnB6C,OAAO;wBAAEC,QAAQ,EAAE;wBAAEC,OAAO,EAAE;oBAAC;gBACjC;gBAGA,MAAMC,YAAY;oBAAE,GAAGP,UAAU;gBAAC;gBAClCtD,OAAO6D,UAAUN,SAAS,EAAEO,IAAI,CAAC;YACnC,GACA;YAIF9D,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,uBAAuB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACzE;IACF;IAEAnC,SAAS,qCAAqC;QAC5CC,GAAG,2DAA2D;YAC5D,MAAMgE,WAAW;gBAAC;gBAAe;gBAAQ;aAAoB;YAE7D,MAAMpC,SAAS,MAAMrB,UAAUA,SAAS,CACtC,yBACA;gBACE,MAAM0D,OAAO;gBACb,MAAMC,UAAUF,SAASG,MAAM,CAAC,CAACC;oBAE/B,MAAMC,QAAQ,IAAIC,OAChBF,QAAQG,OAAO,CAAC,SAAS,MAAMA,OAAO,CAAC,OAAO;oBAEhD,OAAOF,MAAMG,IAAI,CAACP;gBACpB;gBAEAhE,OAAOiE,QAAQ1B,MAAM,EAAEc,eAAe,CAAC;YACzC,GACA;YAIFrD,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACnE;QAEAlC,GAAG,4DAA4D;YAC7D,MAAMgE,WAAW;gBACf;gBACA;gBACA;gBACA;aACD;YAED,MAAMpC,SAAS,MAAMrB,UAAUA,SAAS,CACtC,0BACA;gBACE,MAAMkE,WAAW;gBACjB,MAAMP,UAAUF,SAASG,MAAM,CAAC,CAACC,UAAYA,QAAQI,IAAI,CAACC;gBAE1DxE,OAAOiE,QAAQ1B,MAAM,EAAEc,eAAe,CAAC;YACzC,GACA;YAIFrD,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,kBAAkB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACpE;QAEAlC,GAAG,gEAAgE;YACjE,MAAM0E,mBAAmB;gBAAC;gBAAQ;gBAAW;gBAAS;aAAU;YAEhE,MAAM9C,SAAS,MAAMrB,UAAUA,SAAS,CACtC,8BACA;gBAEE,KAAK,MAAMoE,SAASD,iBAAkB;oBACpC,MAAME,aAAaD,UAAU,SAAS,SAAS;oBAC/C,IAAIC,eAAe,QAAQ;gBAC7B;YACF,GACA;YAIF3E,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CACT,CAAC,oBAAoB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QAE5D;QAEAlC,GAAG,yDAAyD;YAC1D,MAAM6E,QAAQ,IAAIC;YAGlBD,MAAME,GAAG,CAAC,qBAAqB;YAC/BF,MAAME,GAAG,CAAC,0BAA0B;YAEpC,MAAMnD,SAAS,MAAMrB,UAAUA,SAAS,CACtC,6BACA;gBACE,MAAMyE,SAASH,MAAMI,GAAG,CAAC;gBACzBhF,OAAO+E,QAAQjB,IAAI,CAAC;YACtB,GACA;YAIF9D,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,gBAAgB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QAClE;QAEAlC,GAAG,qDAAqD;YAEtD,MAAMkF,kBAAkB,MAAM3E,UAAUA,SAAS,CAC/C,mCACA;gBACE,MAAM4E,QAAQ;oBACZ,WAAa;oBACb,WAAa;oBACb,WAAa;oBACb,WAAa;oBACb,WAAa;iBACd;gBAED,KAAK,MAAMC,QAAQD,MAAO;oBACxB,MAAMC;gBACR;YACF,GACA;YAIF,MAAMC,eAAe,MAAM9E,UAAUA,SAAS,CAC5C,gCACA;gBACE,MAAM4E,QAAQ;oBACZ;wBAAEG,SAAS;wBAAU7E,IAAI,WAAa;oBAAE;oBACxC;wBAAE6E,SAAS;wBAAe7E,IAAI,WAAa;oBAAE;oBAC7C;wBAAE6E,SAAS;wBAAa7E,IAAI,WAAa;oBAAE;iBAC5C;gBAED,MAAMgE,WAAW;gBACjB,MAAMc,eAAeJ,MAAMhB,MAAM,CAAC,CAACqB,IAAMA,EAAEF,OAAO,CAACd,IAAI,CAACC;gBAExD,KAAK,MAAMW,QAAQG,aAAc;oBAC/B,MAAMH,KAAK3E,EAAE;gBACf;YACF,GACA;YAGF,MAAM4C,UAAU6B,gBAAgB7D,WAAW,GAAGgE,aAAahE,WAAW;YACtEU,QAAQC,GAAG,CAAC,CAAC,wBAAwB,EAAEqB,QAAQnB,OAAO,CAAC,GAAG,CAAC,CAAC;YAG5DjC,OAAOoD,SAASC,eAAe,CAAC;QAClC;IACF;IAEAvD,SAAS,uCAAuC;QAC9CC,GAAG,0DAA0D;YAC3D,MAAMyF,gBAAgB,OAAOC;gBAC3B,OAAO;oBAAE9D,QAAQ;oBAAW8D;gBAAK;YACnC;YAEA,MAAM9D,SAAS,MAAMrB,UAAUA,SAAS,CACtC,4BACA;gBACE,MAAMkF,cAAc;oBAAEE,KAAK;oBAAQC,OAAO;gBAAO;YACnD,GACA;YAIF3F,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,mBAAmB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACrE;QAEAlC,GAAG,kDAAkD;YACnD,MAAM6F,gBAAgB;YAEtB,MAAMjE,SAAS,MAAMrB,UAAUA,SAAS,CACtC,iCACA;gBAEE,MAAMuF,OAAO;oBAAEH,KAAK;oBAAQC,OAAO;gBAAO;gBAC1C,MAAMG,aAAaC,KAAKC,SAAS,CAACH;gBAClC,MAAMI,eAAeF,KAAKG,KAAK,CAACJ;gBAGhC,MAAM,IAAIrD,QAAQ,CAACC,UACjBQ,WAAWR,SAASkD;gBAGtB5F,OAAOiG,aAAaP,GAAG,EAAE5B,IAAI,CAAC;YAChC,GACA;YAGFhC,QAAQC,GAAG,CAAC,CAAC,kBAAkB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACpE;QAEAlC,GAAG,4CAA4C;YAE7C,MAAMoG,kBAAkB,MAAM7F,UAAUA,SAAS,CAC/C,uBACA;gBACE,MAAMqB,SAAS;oBAAEyE,SAAS;gBAAK;gBAC/BpG,OAAO2B,OAAOyE,OAAO,EAAEtC,IAAI,CAAC;YAC9B,GACA;YAIF,MAAMuC,cAAc,MAAM/F,UAAUA,SAAS,CAC3C,oBACA;gBACE,MAAM,IAAImC,QAAQ,CAACC,UAAYQ,WAAWR,SAAS;gBACnD,MAAMf,SAAS;oBAAEyE,SAAS;gBAAK;gBAC/BpG,OAAO2B,OAAOyE,OAAO,EAAEtC,IAAI,CAAC;YAC9B,GACA;YAGF,MAAMV,UAAUiD,YAAYjF,WAAW,GAAG+E,gBAAgB/E,WAAW;YACrEU,QAAQC,GAAG,CAAC,CAAC,sBAAsB,EAAEqB,QAAQnB,OAAO,CAAC,GAAG,CAAC,CAAC;YAG1DjC,OAAOoD,SAASC,eAAe,CAAC;QAClC;QAEAtD,GAAG,4DAA4D;YAC7D,MAAMuG,cAAc,IAAIzB;YAExB,MAAMlD,SAAS,MAAMrB,UAAUA,SAAS,CACtC,0BACA;gBACEgG,YAAYxB,GAAG,CAAC,YAAY;oBAAEe,MAAM;gBAAa;gBACjD,MAAMU,YAAYD,YAAYtB,GAAG,CAAC;gBAClChF,OAAOuG,WAAWC,WAAW;YAC/B,GACA;YAIFxG,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,oBAAoB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACtE;QAEAlC,GAAG,+CAA+C;YAChD,MAAM4B,SAAS,MAAMrB,UAAUA,SAAS,CACtC,qBACA;gBACE,MAAMmG,QAAQ,IAAI5B;gBAClB4B,MAAM3B,GAAG,CAAC,cAAc;oBAAE4B,SAAS,WAAa;gBAAE;gBAClDD,MAAM3B,GAAG,CAAC,eAAe;oBAAE4B,SAAS,WAAa;gBAAE;gBACnDD,MAAM3B,GAAG,CAAC,gBAAgB;oBAAE4B,SAAS,WAAa;gBAAE;gBAEpD1G,OAAOyG,MAAME,IAAI,EAAE7C,IAAI,CAAC;YAC1B,GACA;YAIF9D,OAAO2B,OAAOP,WAAW,EAAE4B,YAAY,CAAC;YACxClB,QAAQC,GAAG,CAAC,CAAC,qBAAqB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QACvE;IACF;IAEAnC,SAAS,2BAA2B;QAClCC,GAAG,wCAAwC;YACzC,MAAM4B,SAAS,MAAMrB,UAAUA,SAAS,CACtC,2BACA;gBAEE,MAAMsG,QAAQ;oBAAEjE,IAAI;oBAAagB,QAAQ,EAAE;gBAAC;gBAG5C,MAAMA,SAAS,MAAMlB,QAAQM,GAAG,CAC9BV,MAAMC,IAAI,CAAC;oBAAEC,QAAQ;gBAAE,GAAG,CAACC,GAAG7B,IAC5B8B,QAAQC,OAAO,CAAC;wBAAEC,IAAI,CAAC,MAAM,EAAEhC,GAAG;wBAAEkC,QAAQ;oBAAQ;gBAKxD,MAAMgE,SAAS,IAAIhC;gBACnBgC,OAAO/B,GAAG,CAAC,gBAAgB8B;gBAC3BC,OAAO/B,GAAG,CAAC,gBAAgBnB;gBAG3B,MAAMmD,cAAc,YAAYvC,IAAI,CAAC;gBAErCvE,OAAO2D,OAAOpB,MAAM,EAAEuB,IAAI,CAAC;gBAC3B9D,OAAO8G,aAAahD,IAAI,CAAC;YAC3B,GACA;YAGFhC,QAAQC,GAAG,CACT,CAAC,iBAAiB,EAAEJ,OAAOP,WAAW,CAACa,OAAO,CAAC,GAAG,EAAE,CAAC;QAEzD;QAEAlC,GAAG,oDAAoD;YACrD,MAAMM,UAAUC,UAAUsB,UAAU;YAGpC,MAAMmF,sBAAsB1G,QAAQ6D,MAAM,CAAC,CAAC8C,IAC1CA,EAAEzG,IAAI,CAAC0G,QAAQ,CAAC;YAElB,MAAMC,mBAAmB7G,QAAQ6D,MAAM,CACrC,CAAC8C,IACCA,EAAEzG,IAAI,CAAC0G,QAAQ,CAAC,uBAAuBD,EAAEzG,IAAI,CAAC0G,QAAQ,CAAC;YAE3D,MAAME,WAAW9G,QAAQ6D,MAAM,CAAC,CAAC8C,IAAMA,EAAEzG,IAAI,CAAC0G,QAAQ,CAAC;YAEvDnF,QAAQC,GAAG,CAAC;YAEZ,IAAIgF,oBAAoBxE,MAAM,GAAG,GAAG;gBAClC,MAAM6E,UACJL,oBAAoB9F,MAAM,CAAC,CAACoG,KAAKL,IAAMK,MAAML,EAAE5F,WAAW,EAAE,KAC5D2F,oBAAoBxE,MAAM;gBAC5BT,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEqF,QAAQnF,OAAO,CAAC,GAAG,UAAU,CAAC;gBAC9DH,QAAQC,GAAG,CAAC;YACd;YAEA,IAAImF,iBAAiB3E,MAAM,GAAG,GAAG;gBAC/B,MAAM6E,UACJF,iBAAiBjG,MAAM,CAAC,CAACoG,KAAKL,IAAMK,MAAML,EAAE5F,WAAW,EAAE,KACzD8F,iBAAiB3E,MAAM;gBACzBT,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEqF,QAAQnF,OAAO,CAAC,GAAG,UAAU,CAAC;gBAC5DH,QAAQC,GAAG,CAAC;YACd;YAEA,IAAIoF,SAAS5E,MAAM,GAAG,GAAG;gBACvB,MAAM6E,UACJD,SAASlG,MAAM,CAAC,CAACoG,KAAKL,IAAMK,MAAML,EAAE5F,WAAW,EAAE,KACjD+F,SAAS5E,MAAM;gBACjBT,QAAQC,GAAG,CAAC,CAAC,gBAAgB,EAAEqF,QAAQnF,OAAO,CAAC,GAAG,UAAU,CAAC;gBAC7DH,QAAQC,GAAG,CAAC;YACd;YAEAD,QAAQC,GAAG,CAAC;QACd;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/hook-matchers.test.ts"],"sourcesContent":["/**\n * Hook Matchers Tests\n *\n * Comprehensive test suite for hook pattern matching system\n */\n\nimport { describe, it, expect, beforeEach, afterEach } from '@jest/globals';\nimport {\n HookMatcher,\n createFilePathMatcher,\n createAgentTypeMatcher,\n createOperationMatcher,\n createContextMatcher,\n createCompositePattern,\n hookMatcher,\n} from '../hooks/hook-matchers.js';\nimport type {\n HookRegistration,\n AgenticHookContext,\n HookFilter,\n} from '../services/agentic-flow-hooks/types.js';\n\n// ===== Test Helpers =====\n\nfunction createMockContext(overrides?: Partial<AgenticHookContext>): AgenticHookContext {\n return {\n sessionId: 'test-session',\n timestamp: Date.now(),\n correlationId: 'test-correlation',\n metadata: {},\n memory: {\n namespace: 'test',\n provider: 'memory',\n cache: new Map(),\n },\n neural: {\n modelId: 'test-model',\n patterns: {\n add: () => {},\n get: () => undefined,\n findSimilar: () => [],\n getByType: () => [],\n prune: () => {},\n export: () => [],\n import: () => {},\n },\n training: {\n epoch: 0,\n loss: 0,\n accuracy: 0,\n learningRate: 0.001,\n optimizer: 'adam',\n checkpoints: [],\n },\n },\n performance: {\n metrics: new Map(),\n bottlenecks: [],\n optimizations: [],\n },\n ...overrides,\n };\n}\n\nfunction createMockHook(overrides?: Partial<HookRegistration>): HookRegistration {\n return {\n id: 'test-hook',\n type: 'workflow-step',\n handler: async () => ({ continue: true }),\n priority: 10,\n ...overrides,\n };\n}\n\n// ===== Tests =====\n\ndescribe('HookMatcher', () => {\n let matcher: HookMatcher;\n\n beforeEach(() => {\n matcher = new HookMatcher({\n cacheEnabled: true,\n cacheTTL: 60000,\n matchStrategy: 'all',\n });\n });\n\n afterEach(() => {\n matcher.clearCache();\n });\n\n describe('File Path Matching', () => {\n it('should match glob patterns', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts']);\n const result = matcher.matchFilePath('src/hooks/test.ts', fileMatcher.patterns);\n\n expect(result).toBe(true);\n });\n\n it('should not match non-matching paths', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts']);\n const result = matcher.matchFilePath('dist/build.js', fileMatcher.patterns);\n\n expect(result).toBe(false);\n });\n\n it('should support multiple patterns', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts', 'tests/**/*.test.ts']);\n\n expect(matcher.matchFilePath('src/hooks/test.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('tests/unit/test.test.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('docs/readme.md', fileMatcher.patterns)).toBe(false);\n });\n\n it('should support inverted patterns', () => {\n const fileMatcher = createFilePathMatcher(['**/*.ts'], { inverted: true });\n const result = matcher.matchFilePath('src/test.ts', fileMatcher.patterns);\n\n expect(result).toBe(true);\n });\n\n it('should match exact paths', () => {\n const fileMatcher = createFilePathMatcher(['src/index.ts']);\n\n expect(matcher.matchFilePath('src/index.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('src/other.ts', fileMatcher.patterns)).toBe(false);\n });\n });\n\n describe('Agent Type Matching', () => {\n it('should match agent types', () => {\n const agentMatcher = createAgentTypeMatcher(['researcher', 'coder']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('coder', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('tester', agentMatcher)).toBe(false);\n });\n\n it('should support wildcard matching', () => {\n const agentMatcher = createAgentTypeMatcher(['*']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('any-type', agentMatcher)).toBe(true);\n });\n\n it('should support exclusions', () => {\n const agentMatcher = createAgentTypeMatcher(['*'], ['tester']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('tester', agentMatcher)).toBe(false);\n });\n });\n\n describe('Operation Matching', () => {\n it('should match operation types', () => {\n const opMatcher = createOperationMatcher(['store', 'retrieve']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('retrieve', opMatcher)).toBe(true);\n expect(matcher.matchOperation('delete', opMatcher)).toBe(false);\n });\n\n it('should support wildcard operations', () => {\n const opMatcher = createOperationMatcher(['*']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('any-operation', opMatcher)).toBe(true);\n });\n\n it('should support operation exclusions', () => {\n const opMatcher = createOperationMatcher(['*'], ['delete']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('delete', opMatcher)).toBe(false);\n });\n });\n\n describe('Context Matching', () => {\n it('should match context conditions - equality', () => {\n const contextMatcher = createContextMatcher([\n { field: 'sessionId', operator: 'eq', value: 'test-session' },\n ]);\n\n const context = createMockContext({ sessionId: 'test-session' });\n const hook = createMockHook({\n filter: { conditions: contextMatcher.conditions },\n });\n\n expect(hook.filter).toBeDefined();\n });\n\n it('should match nested context values', () => {\n const contextMatcher = createContextMatcher([\n { field: 'metadata.agentType', operator: 'eq', value: 'researcher' },\n ]);\n\n const context = createMockContext({\n metadata: { agentType: 'researcher' },\n });\n\n expect(context.metadata?.agentType).toBe('researcher');\n });\n\n it('should support comparison operators', () => {\n const contextMatcher = createContextMatcher([\n { field: 'timestamp', operator: 'gt', value: Date.now() - 10000 },\n ]);\n\n const context = createMockContext({ timestamp: Date.now() });\n\n expect(context.timestamp).toBeGreaterThan(Date.now() - 10000);\n });\n\n it('should support array contains', () => {\n const contextMatcher = createContextMatcher([\n { field: 'metadata.tags', operator: 'in', value: ['test', 'unit'] },\n ]);\n\n expect(contextMatcher.conditions[0].operator).toBe('in');\n });\n });\n\n describe('Full Hook Matching', () => {\n it('should match hook with file pattern', async () => {\n const hook = createMockHook({\n filter: {\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n const payload = { file: 'src/hooks/test.ts' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n expect(result.cacheHit).toBe(false);\n });\n\n it('should match hook with operation filter', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store', 'retrieve'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n });\n\n it('should not match hook with mismatched filter', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'delete' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(false);\n });\n\n it('should match hooks without filters (match all)', async () => {\n const hook = createMockHook({\n filter: undefined,\n });\n\n const context = createMockContext();\n const payload = { operation: 'any' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n expect(result.matchedRules).toContain('*');\n });\n });\n\n describe('Caching', () => {\n it('should cache match results', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n // First call\n const result1 = await matcher.match(hook, context, payload);\n expect(result1.cacheHit).toBe(false);\n\n // Second call should hit cache\n const result2 = await matcher.match(hook, context, payload);\n expect(result2.cacheHit).toBe(true);\n expect(result2.matched).toBe(result1.matched);\n });\n\n it('should clear cache', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n await matcher.match(hook, context, payload);\n\n const statsBefore = matcher.getCacheStats();\n expect(statsBefore.size).toBeGreaterThan(0);\n\n matcher.clearCache();\n\n const statsAfter = matcher.getCacheStats();\n expect(statsAfter.size).toBe(0);\n });\n\n it('should prune expired entries', async () => {\n const shortTTLMatcher = new HookMatcher({\n cacheEnabled: true,\n cacheTTL: 100, // 100ms\n });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n await shortTTLMatcher.match(hook, context, payload);\n\n // Wait for expiration\n await new Promise(resolve => setTimeout(resolve, 150));\n\n const pruned = shortTTLMatcher.pruneCache();\n expect(pruned).toBeGreaterThan(0);\n });\n });\n\n describe('Performance', () => {\n it('should be fast for simple matches', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.executionTime).toBeLessThan(10); // Less than 10ms\n });\n\n it('should be faster with cache', async () => {\n const hook = createMockHook({\n filter: {\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n const payload = { file: 'src/hooks/test.ts' };\n\n // First call (no cache)\n const result1 = await matcher.match(hook, context, payload);\n const time1 = result1.executionTime;\n\n // Second call (cached)\n const result2 = await matcher.match(hook, context, payload);\n const time2 = result2.executionTime;\n\n expect(time2).toBeLessThanOrEqual(time1);\n expect(result2.cacheHit).toBe(true);\n });\n });\n\n describe('Composite Patterns', () => {\n it('should match AND composite patterns', () => {\n const composite = createCompositePattern('AND', [\n { type: 'glob', pattern: 'src/**/*.ts' },\n { type: 'regex', pattern: /test/ },\n ]);\n\n expect(composite.operator).toBe('AND');\n expect(composite.patterns).toHaveLength(2);\n });\n\n it('should match OR composite patterns', () => {\n const composite = createCompositePattern('OR', [\n { type: 'glob', pattern: 'src/**/*.ts' },\n { type: 'glob', pattern: 'tests/**/*.test.ts' },\n ]);\n\n expect(composite.operator).toBe('OR');\n expect(composite.patterns).toHaveLength(2);\n });\n });\n\n describe('Match Strategies', () => {\n it('should use ALL strategy (all rules must match)', async () => {\n const allMatcher = new HookMatcher({ matchStrategy: 'all' });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n\n // Both match\n const payload1 = { operation: 'store', file: 'src/test.ts' };\n const result1 = await allMatcher.match(hook, context, payload1);\n expect(result1.matched).toBe(true);\n\n // Only one matches\n const payload2 = { operation: 'store', file: 'dist/test.js' };\n const result2 = await allMatcher.match(hook, context, payload2);\n expect(result2.matched).toBe(false);\n });\n\n it('should use ANY strategy (at least one rule must match)', async () => {\n const anyMatcher = new HookMatcher({ matchStrategy: 'any' });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n\n // Only one matches\n const payload = { operation: 'delete', file: 'src/test.ts' };\n const result = await anyMatcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n });\n });\n});\n\ndescribe('Singleton Instance', () => {\n it('should export singleton instance', () => {\n expect(hookMatcher).toBeInstanceOf(HookMatcher);\n });\n\n it('should maintain state across calls', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['test'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'test' };\n\n await hookMatcher.match(hook, context, payload);\n const stats = hookMatcher.getCacheStats();\n\n expect(stats.size).toBeGreaterThan(0);\n });\n});"],"names":["describe","it","expect","beforeEach","afterEach","HookMatcher","createFilePathMatcher","createAgentTypeMatcher","createOperationMatcher","createContextMatcher","createCompositePattern","hookMatcher","createMockContext","overrides","sessionId","timestamp","Date","now","correlationId","metadata","memory","namespace","provider","cache","Map","neural","modelId","patterns","add","get","undefined","findSimilar","getByType","prune","export","import","training","epoch","loss","accuracy","learningRate","optimizer","checkpoints","performance","metrics","bottlenecks","optimizations","createMockHook","id","type","handler","continue","priority","matcher","cacheEnabled","cacheTTL","matchStrategy","clearCache","fileMatcher","result","matchFilePath","toBe","inverted","agentMatcher","matchAgentType","opMatcher","matchOperation","contextMatcher","field","operator","value","context","hook","filter","conditions","toBeDefined","agentType","toBeGreaterThan","payload","file","match","matched","cacheHit","operations","operation","matchedRules","toContain","result1","result2","statsBefore","getCacheStats","size","statsAfter","shortTTLMatcher","Promise","resolve","setTimeout","pruned","pruneCache","executionTime","toBeLessThan","time1","time2","toBeLessThanOrEqual","composite","pattern","toHaveLength","allMatcher","payload1","payload2","anyMatcher","toBeInstanceOf","stats"],"mappings":"AAMA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,SAAS,QAAQ,gBAAgB;AAC5E,SACEC,WAAW,EACXC,qBAAqB,EACrBC,sBAAsB,EACtBC,sBAAsB,EACtBC,oBAAoB,EACpBC,sBAAsB,EACtBC,WAAW,QACN,4BAA4B;AASnC,SAASC,kBAAkBC,SAAuC;IAChE,OAAO;QACLC,WAAW;QACXC,WAAWC,KAAKC,GAAG;QACnBC,eAAe;QACfC,UAAU,CAAC;QACXC,QAAQ;YACNC,WAAW;YACXC,UAAU;YACVC,OAAO,IAAIC;QACb;QACAC,QAAQ;YACNC,SAAS;YACTC,UAAU;gBACRC,KAAK,KAAO;gBACZC,KAAK,IAAMC;gBACXC,aAAa,IAAM,EAAE;gBACrBC,WAAW,IAAM,EAAE;gBACnBC,OAAO,KAAO;gBACdC,QAAQ,IAAM,EAAE;gBAChBC,QAAQ,KAAO;YACjB;YACAC,UAAU;gBACRC,OAAO;gBACPC,MAAM;gBACNC,UAAU;gBACVC,cAAc;gBACdC,WAAW;gBACXC,aAAa,EAAE;YACjB;QACF;QACAC,aAAa;YACXC,SAAS,IAAIpB;YACbqB,aAAa,EAAE;YACfC,eAAe,EAAE;QACnB;QACA,GAAGjC,SAAS;IACd;AACF;AAEA,SAASkC,eAAelC,SAAqC;IAC3D,OAAO;QACLmC,IAAI;QACJC,MAAM;QACNC,SAAS,UAAa,CAAA;gBAAEC,UAAU;YAAK,CAAA;QACvCC,UAAU;QACV,GAAGvC,SAAS;IACd;AACF;AAIAb,SAAS,eAAe;IACtB,IAAIqD;IAEJlD,WAAW;QACTkD,UAAU,IAAIhD,YAAY;YACxBiD,cAAc;YACdC,UAAU;YACVC,eAAe;QACjB;IACF;IAEApD,UAAU;QACRiD,QAAQI,UAAU;IACpB;IAEAzD,SAAS,sBAAsB;QAC7BC,GAAG,8BAA8B;YAC/B,MAAMyD,cAAcpD,sBAAsB;gBAAC;aAAc;YACzD,MAAMqD,SAASN,QAAQO,aAAa,CAAC,qBAAqBF,YAAY/B,QAAQ;YAE9EzB,OAAOyD,QAAQE,IAAI,CAAC;QACtB;QAEA5D,GAAG,uCAAuC;YACxC,MAAMyD,cAAcpD,sBAAsB;gBAAC;aAAc;YACzD,MAAMqD,SAASN,QAAQO,aAAa,CAAC,iBAAiBF,YAAY/B,QAAQ;YAE1EzB,OAAOyD,QAAQE,IAAI,CAAC;QACtB;QAEA5D,GAAG,oCAAoC;YACrC,MAAMyD,cAAcpD,sBAAsB;gBAAC;gBAAe;aAAqB;YAE/EJ,OAAOmD,QAAQO,aAAa,CAAC,qBAAqBF,YAAY/B,QAAQ,GAAGkC,IAAI,CAAC;YAC9E3D,OAAOmD,QAAQO,aAAa,CAAC,2BAA2BF,YAAY/B,QAAQ,GAAGkC,IAAI,CAAC;YACpF3D,OAAOmD,QAAQO,aAAa,CAAC,kBAAkBF,YAAY/B,QAAQ,GAAGkC,IAAI,CAAC;QAC7E;QAEA5D,GAAG,oCAAoC;YACrC,MAAMyD,cAAcpD,sBAAsB;gBAAC;aAAU,EAAE;gBAAEwD,UAAU;YAAK;YACxE,MAAMH,SAASN,QAAQO,aAAa,CAAC,eAAeF,YAAY/B,QAAQ;YAExEzB,OAAOyD,QAAQE,IAAI,CAAC;QACtB;QAEA5D,GAAG,4BAA4B;YAC7B,MAAMyD,cAAcpD,sBAAsB;gBAAC;aAAe;YAE1DJ,OAAOmD,QAAQO,aAAa,CAAC,gBAAgBF,YAAY/B,QAAQ,GAAGkC,IAAI,CAAC;YACzE3D,OAAOmD,QAAQO,aAAa,CAAC,gBAAgBF,YAAY/B,QAAQ,GAAGkC,IAAI,CAAC;QAC3E;IACF;IAEA7D,SAAS,uBAAuB;QAC9BC,GAAG,4BAA4B;YAC7B,MAAM8D,eAAexD,uBAAuB;gBAAC;gBAAc;aAAQ;YAEnEL,OAAOmD,QAAQW,cAAc,CAAC,cAAcD,eAAeF,IAAI,CAAC;YAChE3D,OAAOmD,QAAQW,cAAc,CAAC,SAASD,eAAeF,IAAI,CAAC;YAC3D3D,OAAOmD,QAAQW,cAAc,CAAC,UAAUD,eAAeF,IAAI,CAAC;QAC9D;QAEA5D,GAAG,oCAAoC;YACrC,MAAM8D,eAAexD,uBAAuB;gBAAC;aAAI;YAEjDL,OAAOmD,QAAQW,cAAc,CAAC,cAAcD,eAAeF,IAAI,CAAC;YAChE3D,OAAOmD,QAAQW,cAAc,CAAC,YAAYD,eAAeF,IAAI,CAAC;QAChE;QAEA5D,GAAG,6BAA6B;YAC9B,MAAM8D,eAAexD,uBAAuB;gBAAC;aAAI,EAAE;gBAAC;aAAS;YAE7DL,OAAOmD,QAAQW,cAAc,CAAC,cAAcD,eAAeF,IAAI,CAAC;YAChE3D,OAAOmD,QAAQW,cAAc,CAAC,UAAUD,eAAeF,IAAI,CAAC;QAC9D;IACF;IAEA7D,SAAS,sBAAsB;QAC7BC,GAAG,gCAAgC;YACjC,MAAMgE,YAAYzD,uBAAuB;gBAAC;gBAAS;aAAW;YAE9DN,OAAOmD,QAAQa,cAAc,CAAC,SAASD,YAAYJ,IAAI,CAAC;YACxD3D,OAAOmD,QAAQa,cAAc,CAAC,YAAYD,YAAYJ,IAAI,CAAC;YAC3D3D,OAAOmD,QAAQa,cAAc,CAAC,UAAUD,YAAYJ,IAAI,CAAC;QAC3D;QAEA5D,GAAG,sCAAsC;YACvC,MAAMgE,YAAYzD,uBAAuB;gBAAC;aAAI;YAE9CN,OAAOmD,QAAQa,cAAc,CAAC,SAASD,YAAYJ,IAAI,CAAC;YACxD3D,OAAOmD,QAAQa,cAAc,CAAC,iBAAiBD,YAAYJ,IAAI,CAAC;QAClE;QAEA5D,GAAG,uCAAuC;YACxC,MAAMgE,YAAYzD,uBAAuB;gBAAC;aAAI,EAAE;gBAAC;aAAS;YAE1DN,OAAOmD,QAAQa,cAAc,CAAC,SAASD,YAAYJ,IAAI,CAAC;YACxD3D,OAAOmD,QAAQa,cAAc,CAAC,UAAUD,YAAYJ,IAAI,CAAC;QAC3D;IACF;IAEA7D,SAAS,oBAAoB;QAC3BC,GAAG,8CAA8C;YAC/C,MAAMkE,iBAAiB1D,qBAAqB;gBAC1C;oBAAE2D,OAAO;oBAAaC,UAAU;oBAAMC,OAAO;gBAAe;aAC7D;YAED,MAAMC,UAAU3D,kBAAkB;gBAAEE,WAAW;YAAe;YAC9D,MAAM0D,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBAAEC,YAAYP,eAAeO,UAAU;gBAAC;YAClD;YAEAxE,OAAOsE,KAAKC,MAAM,EAAEE,WAAW;QACjC;QAEA1E,GAAG,sCAAsC;YACvC,MAAMkE,iBAAiB1D,qBAAqB;gBAC1C;oBAAE2D,OAAO;oBAAsBC,UAAU;oBAAMC,OAAO;gBAAa;aACpE;YAED,MAAMC,UAAU3D,kBAAkB;gBAChCO,UAAU;oBAAEyD,WAAW;gBAAa;YACtC;YAEA1E,OAAOqE,QAAQpD,QAAQ,EAAEyD,WAAWf,IAAI,CAAC;QAC3C;QAEA5D,GAAG,uCAAuC;YACxC,MAAMkE,iBAAiB1D,qBAAqB;gBAC1C;oBAAE2D,OAAO;oBAAaC,UAAU;oBAAMC,OAAOtD,KAAKC,GAAG,KAAK;gBAAM;aACjE;YAED,MAAMsD,UAAU3D,kBAAkB;gBAAEG,WAAWC,KAAKC,GAAG;YAAG;YAE1Df,OAAOqE,QAAQxD,SAAS,EAAE8D,eAAe,CAAC7D,KAAKC,GAAG,KAAK;QACzD;QAEAhB,GAAG,iCAAiC;YAClC,MAAMkE,iBAAiB1D,qBAAqB;gBAC1C;oBAAE2D,OAAO;oBAAiBC,UAAU;oBAAMC,OAAO;wBAAC;wBAAQ;qBAAO;gBAAC;aACnE;YAEDpE,OAAOiE,eAAeO,UAAU,CAAC,EAAE,CAACL,QAAQ,EAAER,IAAI,CAAC;QACrD;IACF;IAEA7D,SAAS,sBAAsB;QAC7BC,GAAG,uCAAuC;YACxC,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACN9C,UAAU;wBAAC;qBAAe;gBAC5B;YACF;YAEA,MAAM4C,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEC,MAAM;YAAoB;YAE5C,MAAMpB,SAAS,MAAMN,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAElD5E,OAAOyD,OAAOsB,OAAO,EAAEpB,IAAI,CAAC;YAC5B3D,OAAOyD,OAAOuB,QAAQ,EAAErB,IAAI,CAAC;QAC/B;QAEA5D,GAAG,2CAA2C;YAC5C,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;wBAAS;qBAAW;gBACnC;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAQ;YAErC,MAAMzB,SAAS,MAAMN,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAElD5E,OAAOyD,OAAOsB,OAAO,EAAEpB,IAAI,CAAC;QAC9B;QAEA5D,GAAG,gDAAgD;YACjD,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;gBACvB;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAS;YAEtC,MAAMzB,SAAS,MAAMN,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAElD5E,OAAOyD,OAAOsB,OAAO,EAAEpB,IAAI,CAAC;QAC9B;QAEA5D,GAAG,kDAAkD;YACnD,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ3C;YACV;YAEA,MAAMyC,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAM;YAEnC,MAAMzB,SAAS,MAAMN,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAElD5E,OAAOyD,OAAOsB,OAAO,EAAEpB,IAAI,CAAC;YAC5B3D,OAAOyD,OAAO0B,YAAY,EAAEC,SAAS,CAAC;QACxC;IACF;IAEAtF,SAAS,WAAW;QAClBC,GAAG,8BAA8B;YAC/B,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;gBACvB;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAQ;YAGrC,MAAMG,UAAU,MAAMlC,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YACnD5E,OAAOqF,QAAQL,QAAQ,EAAErB,IAAI,CAAC;YAG9B,MAAM2B,UAAU,MAAMnC,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YACnD5E,OAAOsF,QAAQN,QAAQ,EAAErB,IAAI,CAAC;YAC9B3D,OAAOsF,QAAQP,OAAO,EAAEpB,IAAI,CAAC0B,QAAQN,OAAO;QAC9C;QAEAhF,GAAG,sBAAsB;YACvB,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;gBACvB;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAQ;YAErC,MAAM/B,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAEnC,MAAMW,cAAcpC,QAAQqC,aAAa;YACzCxF,OAAOuF,YAAYE,IAAI,EAAEd,eAAe,CAAC;YAEzCxB,QAAQI,UAAU;YAElB,MAAMmC,aAAavC,QAAQqC,aAAa;YACxCxF,OAAO0F,WAAWD,IAAI,EAAE9B,IAAI,CAAC;QAC/B;QAEA5D,GAAG,gCAAgC;YACjC,MAAM4F,kBAAkB,IAAIxF,YAAY;gBACtCiD,cAAc;gBACdC,UAAU;YACZ;YAEA,MAAMiB,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;gBACvB;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAQ;YAErC,MAAMS,gBAAgBb,KAAK,CAACR,MAAMD,SAASO;YAG3C,MAAM,IAAIgB,QAAQC,CAAAA,UAAWC,WAAWD,SAAS;YAEjD,MAAME,SAASJ,gBAAgBK,UAAU;YACzChG,OAAO+F,QAAQpB,eAAe,CAAC;QACjC;IACF;IAEA7E,SAAS,eAAe;QACtBC,GAAG,qCAAqC;YACtC,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;gBACvB;YACF;YAEA,MAAMZ,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEM,WAAW;YAAQ;YAErC,MAAMzB,SAAS,MAAMN,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YAElD5E,OAAOyD,OAAOwC,aAAa,EAAEC,YAAY,CAAC;QAC5C;QAEAnG,GAAG,+BAA+B;YAChC,MAAMuE,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACN9C,UAAU;wBAAC;qBAAe;gBAC5B;YACF;YAEA,MAAM4C,UAAU3D;YAChB,MAAMkE,UAAU;gBAAEC,MAAM;YAAoB;YAG5C,MAAMQ,UAAU,MAAMlC,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YACnD,MAAMuB,QAAQd,QAAQY,aAAa;YAGnC,MAAMX,UAAU,MAAMnC,QAAQ2B,KAAK,CAACR,MAAMD,SAASO;YACnD,MAAMwB,QAAQd,QAAQW,aAAa;YAEnCjG,OAAOoG,OAAOC,mBAAmB,CAACF;YAClCnG,OAAOsF,QAAQN,QAAQ,EAAErB,IAAI,CAAC;QAChC;IACF;IAEA7D,SAAS,sBAAsB;QAC7BC,GAAG,uCAAuC;YACxC,MAAMuG,YAAY9F,uBAAuB,OAAO;gBAC9C;oBAAEuC,MAAM;oBAAQwD,SAAS;gBAAc;gBACvC;oBAAExD,MAAM;oBAASwD,SAAS;gBAAO;aAClC;YAEDvG,OAAOsG,UAAUnC,QAAQ,EAAER,IAAI,CAAC;YAChC3D,OAAOsG,UAAU7E,QAAQ,EAAE+E,YAAY,CAAC;QAC1C;QAEAzG,GAAG,sCAAsC;YACvC,MAAMuG,YAAY9F,uBAAuB,MAAM;gBAC7C;oBAAEuC,MAAM;oBAAQwD,SAAS;gBAAc;gBACvC;oBAAExD,MAAM;oBAAQwD,SAAS;gBAAqB;aAC/C;YAEDvG,OAAOsG,UAAUnC,QAAQ,EAAER,IAAI,CAAC;YAChC3D,OAAOsG,UAAU7E,QAAQ,EAAE+E,YAAY,CAAC;QAC1C;IACF;IAEA1G,SAAS,oBAAoB;QAC3BC,GAAG,kDAAkD;YACnD,MAAM0G,aAAa,IAAItG,YAAY;gBAAEmD,eAAe;YAAM;YAE1D,MAAMgB,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;oBACrBxD,UAAU;wBAAC;qBAAe;gBAC5B;YACF;YAEA,MAAM4C,UAAU3D;YAGhB,MAAMgG,WAAW;gBAAExB,WAAW;gBAASL,MAAM;YAAc;YAC3D,MAAMQ,UAAU,MAAMoB,WAAW3B,KAAK,CAACR,MAAMD,SAASqC;YACtD1G,OAAOqF,QAAQN,OAAO,EAAEpB,IAAI,CAAC;YAG7B,MAAMgD,WAAW;gBAAEzB,WAAW;gBAASL,MAAM;YAAe;YAC5D,MAAMS,UAAU,MAAMmB,WAAW3B,KAAK,CAACR,MAAMD,SAASsC;YACtD3G,OAAOsF,QAAQP,OAAO,EAAEpB,IAAI,CAAC;QAC/B;QAEA5D,GAAG,0DAA0D;YAC3D,MAAM6G,aAAa,IAAIzG,YAAY;gBAAEmD,eAAe;YAAM;YAE1D,MAAMgB,OAAOzB,eAAe;gBAC1B0B,QAAQ;oBACNU,YAAY;wBAAC;qBAAQ;oBACrBxD,UAAU;wBAAC;qBAAe;gBAC5B;YACF;YAEA,MAAM4C,UAAU3D;YAGhB,MAAMkE,UAAU;gBAAEM,WAAW;gBAAUL,MAAM;YAAc;YAC3D,MAAMpB,SAAS,MAAMmD,WAAW9B,KAAK,CAACR,MAAMD,SAASO;YAErD5E,OAAOyD,OAAOsB,OAAO,EAAEpB,IAAI,CAAC;QAC9B;IACF;AACF;AAEA7D,SAAS,sBAAsB;IAC7BC,GAAG,oCAAoC;QACrCC,OAAOS,aAAaoG,cAAc,CAAC1G;IACrC;IAEAJ,GAAG,sCAAsC;QACvC,MAAMuE,OAAOzB,eAAe;YAC1B0B,QAAQ;gBACNU,YAAY;oBAAC;iBAAO;YACtB;QACF;QAEA,MAAMZ,UAAU3D;QAChB,MAAMkE,UAAU;YAAEM,WAAW;QAAO;QAEpC,MAAMzE,YAAYqE,KAAK,CAACR,MAAMD,SAASO;QACvC,MAAMkC,QAAQrG,YAAY+E,aAAa;QAEvCxF,OAAO8G,MAAMrB,IAAI,EAAEd,eAAe,CAAC;IACrC;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/hook-matchers.test.ts"],"sourcesContent":["/**\n * Hook Matchers Tests\n *\n * Comprehensive test suite for hook pattern matching system\n */\n\n/* eslint-disable */\n\nimport { describe, it, expect, beforeEach, afterEach } from '@jest/globals';\nimport {\n HookMatcher,\n createFilePathMatcher,\n createAgentTypeMatcher,\n createOperationMatcher,\n createContextMatcher,\n createCompositePattern,\n hookMatcher,\n} from '../hooks/hook-matchers.js';\nimport type {\n HookRegistration,\n AgenticHookContext,\n HookFilter,\n} from '../services/agentic-flow-hooks/types.js';\n\n// ===== Test Helpers =====\n\nfunction createMockContext(overrides?: Partial<AgenticHookContext>): AgenticHookContext {\n return {\n sessionId: 'test-session',\n timestamp: Date.now(),\n correlationId: 'test-correlation',\n metadata: {},\n memory: {\n namespace: 'test',\n provider: 'memory',\n cache: new Map(),\n },\n neural: {\n modelId: 'test-model',\n patterns: {\n add: () => {},\n get: () => undefined,\n findSimilar: () => [],\n getByType: () => [],\n prune: () => {},\n export: () => [],\n import: () => {},\n },\n training: {\n epoch: 0,\n loss: 0,\n accuracy: 0,\n learningRate: 0.001,\n optimizer: 'adam',\n checkpoints: [],\n },\n },\n performance: {\n metrics: new Map(),\n bottlenecks: [],\n optimizations: [],\n },\n ...overrides,\n };\n}\n\nfunction createMockHook(overrides?: Partial<HookRegistration>): HookRegistration {\n return {\n id: 'test-hook',\n type: 'workflow-step',\n handler: async () => ({ continue: true }),\n priority: 10,\n ...overrides,\n };\n}\n\n// ===== Tests =====\n\ndescribe('HookMatcher', () => {\n let matcher: HookMatcher;\n\n beforeEach(() => {\n matcher = new HookMatcher({\n cacheEnabled: true,\n cacheTTL: 60000,\n matchStrategy: 'all',\n });\n });\n\n afterEach(() => {\n matcher.clearCache();\n });\n\n describe('File Path Matching', () => {\n it('should match glob patterns', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts']);\n const result = matcher.matchFilePath('src/hooks/test.ts', fileMatcher.patterns);\n\n expect(result).toBe(true);\n });\n\n it('should not match non-matching paths', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts']);\n const result = matcher.matchFilePath('dist/build.js', fileMatcher.patterns);\n\n expect(result).toBe(false);\n });\n\n it('should support multiple patterns', () => {\n const fileMatcher = createFilePathMatcher(['src/**/*.ts', 'tests/**/*.test.ts']);\n\n expect(matcher.matchFilePath('src/hooks/test.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('tests/unit/test.test.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('docs/readme.md', fileMatcher.patterns)).toBe(false);\n });\n\n it('should support inverted patterns', () => {\n const fileMatcher = createFilePathMatcher(['**/*.ts'], { inverted: true });\n const result = matcher.matchFilePath('src/test.ts', fileMatcher.patterns);\n\n expect(result).toBe(true);\n });\n\n it('should match exact paths', () => {\n const fileMatcher = createFilePathMatcher(['src/index.ts']);\n\n expect(matcher.matchFilePath('src/index.ts', fileMatcher.patterns)).toBe(true);\n expect(matcher.matchFilePath('src/other.ts', fileMatcher.patterns)).toBe(false);\n });\n });\n\n describe('Agent Type Matching', () => {\n it('should match agent types', () => {\n const agentMatcher = createAgentTypeMatcher(['researcher', 'coder']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('coder', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('tester', agentMatcher)).toBe(false);\n });\n\n it('should support wildcard matching', () => {\n const agentMatcher = createAgentTypeMatcher(['*']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('any-type', agentMatcher)).toBe(true);\n });\n\n it('should support exclusions', () => {\n const agentMatcher = createAgentTypeMatcher(['*'], ['tester']);\n\n expect(matcher.matchAgentType('researcher', agentMatcher)).toBe(true);\n expect(matcher.matchAgentType('tester', agentMatcher)).toBe(false);\n });\n });\n\n describe('Operation Matching', () => {\n it('should match operation types', () => {\n const opMatcher = createOperationMatcher(['store', 'retrieve']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('retrieve', opMatcher)).toBe(true);\n expect(matcher.matchOperation('delete', opMatcher)).toBe(false);\n });\n\n it('should support wildcard operations', () => {\n const opMatcher = createOperationMatcher(['*']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('any-operation', opMatcher)).toBe(true);\n });\n\n it('should support operation exclusions', () => {\n const opMatcher = createOperationMatcher(['*'], ['delete']);\n\n expect(matcher.matchOperation('store', opMatcher)).toBe(true);\n expect(matcher.matchOperation('delete', opMatcher)).toBe(false);\n });\n });\n\n describe('Context Matching', () => {\n it('should match context conditions - equality', () => {\n const contextMatcher = createContextMatcher([\n { field: 'sessionId', operator: 'eq', value: 'test-session' },\n ]);\n\n const context = createMockContext({ sessionId: 'test-session' });\n const hook = createMockHook({\n filter: { conditions: contextMatcher.conditions },\n });\n\n expect(hook.filter).toBeDefined();\n });\n\n it('should match nested context values', () => {\n const contextMatcher = createContextMatcher([\n { field: 'metadata.agentType', operator: 'eq', value: 'researcher' },\n ]);\n\n const context = createMockContext({\n metadata: { agentType: 'researcher' },\n });\n\n expect(context.metadata?.agentType).toBe('researcher');\n });\n\n it('should support comparison operators', () => {\n const contextMatcher = createContextMatcher([\n { field: 'timestamp', operator: 'gt', value: Date.now() - 10000 },\n ]);\n\n const context = createMockContext({ timestamp: Date.now() });\n\n expect(context.timestamp).toBeGreaterThan(Date.now() - 10000);\n });\n\n it('should support array contains', () => {\n const contextMatcher = createContextMatcher([\n { field: 'metadata.tags', operator: 'in', value: ['test', 'unit'] },\n ]);\n\n expect(contextMatcher.conditions[0].operator).toBe('in');\n });\n });\n\n describe('Full Hook Matching', () => {\n it('should match hook with file pattern', async () => {\n const hook = createMockHook({\n filter: {\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n const payload = { file: 'src/hooks/test.ts' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n expect(result.cacheHit).toBe(false);\n });\n\n it('should match hook with operation filter', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store', 'retrieve'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n });\n\n it('should not match hook with mismatched filter', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'delete' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(false);\n });\n\n it('should match hooks without filters (match all)', async () => {\n const hook = createMockHook({\n filter: undefined,\n });\n\n const context = createMockContext();\n const payload = { operation: 'any' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n expect(result.matchedRules).toContain('*');\n });\n });\n\n describe('Caching', () => {\n it('should cache match results', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n // First call\n const result1 = await matcher.match(hook, context, payload);\n expect(result1.cacheHit).toBe(false);\n\n // Second call should hit cache\n const result2 = await matcher.match(hook, context, payload);\n expect(result2.cacheHit).toBe(true);\n expect(result2.matched).toBe(result1.matched);\n });\n\n it('should clear cache', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n await matcher.match(hook, context, payload);\n\n const statsBefore = matcher.getCacheStats();\n expect(statsBefore.size).toBeGreaterThan(0);\n\n matcher.clearCache();\n\n const statsAfter = matcher.getCacheStats();\n expect(statsAfter.size).toBe(0);\n });\n\n it('should prune expired entries', async () => {\n const shortTTLMatcher = new HookMatcher({\n cacheEnabled: true,\n cacheTTL: 100, // 100ms\n });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n await shortTTLMatcher.match(hook, context, payload);\n\n // Wait for expiration\n await new Promise(resolve => setTimeout(resolve, 150));\n\n const pruned = shortTTLMatcher.pruneCache();\n expect(pruned).toBeGreaterThan(0);\n });\n });\n\n describe('Performance', () => {\n it('should be fast for simple matches', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'store' };\n\n const result = await matcher.match(hook, context, payload);\n\n expect(result.executionTime).toBeLessThan(10); // Less than 10ms\n });\n\n it('should be faster with cache', async () => {\n const hook = createMockHook({\n filter: {\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n const payload = { file: 'src/hooks/test.ts' };\n\n // First call (no cache)\n const result1 = await matcher.match(hook, context, payload);\n const time1 = result1.executionTime;\n\n // Second call (cached)\n const result2 = await matcher.match(hook, context, payload);\n const time2 = result2.executionTime;\n\n expect(time2).toBeLessThanOrEqual(time1);\n expect(result2.cacheHit).toBe(true);\n });\n });\n\n describe('Composite Patterns', () => {\n it('should match AND composite patterns', () => {\n const composite = createCompositePattern('AND', [\n { type: 'glob', pattern: 'src/**/*.ts' },\n { type: 'regex', pattern: /test/ },\n ]);\n\n expect(composite.operator).toBe('AND');\n expect(composite.patterns).toHaveLength(2);\n });\n\n it('should match OR composite patterns', () => {\n const composite = createCompositePattern('OR', [\n { type: 'glob', pattern: 'src/**/*.ts' },\n { type: 'glob', pattern: 'tests/**/*.test.ts' },\n ]);\n\n expect(composite.operator).toBe('OR');\n expect(composite.patterns).toHaveLength(2);\n });\n });\n\n describe('Match Strategies', () => {\n it('should use ALL strategy (all rules must match)', async () => {\n const allMatcher = new HookMatcher({ matchStrategy: 'all' });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n\n // Both match\n const payload1 = { operation: 'store', file: 'src/test.ts' };\n const result1 = await allMatcher.match(hook, context, payload1);\n expect(result1.matched).toBe(true);\n\n // Only one matches\n const payload2 = { operation: 'store', file: 'dist/test.js' };\n const result2 = await allMatcher.match(hook, context, payload2);\n expect(result2.matched).toBe(false);\n });\n\n it('should use ANY strategy (at least one rule must match)', async () => {\n const anyMatcher = new HookMatcher({ matchStrategy: 'any' });\n\n const hook = createMockHook({\n filter: {\n operations: ['store'],\n patterns: [/src\\/.*\\.ts$/],\n },\n });\n\n const context = createMockContext();\n\n // Only one matches\n const payload = { operation: 'delete', file: 'src/test.ts' };\n const result = await anyMatcher.match(hook, context, payload);\n\n expect(result.matched).toBe(true);\n });\n });\n});\n\ndescribe('Singleton Instance', () => {\n it('should export singleton instance', () => {\n expect(hookMatcher).toBeInstanceOf(HookMatcher);\n });\n\n it('should maintain state across calls', async () => {\n const hook = createMockHook({\n filter: {\n operations: ['test'],\n },\n });\n\n const context = createMockContext();\n const payload = { operation: 'test' };\n\n await hookMatcher.match(hook, context, payload);\n const stats = hookMatcher.getCacheStats();\n\n expect(stats.size).toBeGreaterThan(0);\n });\n});"],"names":["describe","it","expect","beforeEach","afterEach","HookMatcher","createFilePathMatcher","createAgentTypeMatcher","createOperationMatcher","createContextMatcher","createCompositePattern","hookMatcher","createMockContext","overrides","sessionId","timestamp","Date","now","correlationId","metadata","memory","namespace","provider","cache","Map","neural","modelId","patterns","add","get","undefined","findSimilar","getByType","prune","export","import","training","epoch","loss","accuracy","learningRate","optimizer","checkpoints","performance","metrics","bottlenecks","optimizations","createMockHook","id","type","handler","continue","priority","matcher","cacheEnabled","cacheTTL","matchStrategy","clearCache","fileMatcher","result","matchFilePath","toBe","inverted","agentMatcher","matchAgentType","opMatcher","matchOperation","contextMatcher","field","operator","value","context","hook","filter","conditions","toBeDefined","agentType","toBeGreaterThan","payload","file","match","matched","cacheHit","operations","operation","matchedRules","toContain","result1","result2","statsBefore","getCacheStats","size","statsAfter","shortTTLMatcher","Promise","resolve","setTimeout","pruned","pruneCache","executionTime","toBeLessThan","time1","time2","toBeLessThanOrEqual","composite","pattern","toHaveLength","allMatcher","payload1","payload2","anyMatcher","toBeInstanceOf","stats"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/agents/agent-registry.ts"],"sourcesContent":["/**\n * Agent Registry with Memory Integration\n * Provides persistent storage and coordination for agent management\n */\n\nimport type { DistributedMemorySystem } from '../memory/distributed-memory.js';\nimport type { AgentState, AgentId, AgentType, AgentStatus } from '../swarm/types.js';\nimport { EventEmitter } from 'node:events';\n\nexport interface AgentRegistryEntry {\n agent: AgentState;\n createdAt: Date;\n lastUpdated: Date;\n tags: string[];\n metadata: Record<string, any>;\n}\n\nexport interface AgentQuery {\n type?: AgentType;\n status?: AgentStatus;\n tags?: string[];\n healthThreshold?: number;\n namePattern?: string;\n createdAfter?: Date;\n lastActiveAfter?: Date;\n}\n\nexport interface AgentStatistics {\n totalAgents: number;\n byType: Record<AgentType, number>;\n byStatus: Record<AgentStatus, number>;\n averageHealth: number;\n activeAgents: number;\n totalUptime: number;\n tasksCompleted: number;\n successRate: number;\n}\n\n/**\n * Centralized agent registry with persistent storage\n */\nexport class AgentRegistry extends EventEmitter {\n private memory: DistributedMemorySystem;\n private namespace: string;\n private cache = new Map<string, AgentRegistryEntry>();\n private cacheExpiry = 60000; // 1 minute\n private lastCacheUpdate = 0;\n\n constructor(memory: DistributedMemorySystem, namespace: string = 'agents') {\n super();\n this.memory = memory;\n this.namespace = namespace;\n }\n\n async initialize(): Promise<void> {\n await this.loadFromMemory();\n this.emit('registry:initialized');\n }\n\n /**\n * Register a new agent in the registry\n */\n async registerAgent(agent: AgentState, tags: string[] = []): Promise<void> {\n const entry: AgentRegistryEntry = {\n agent,\n createdAt: new Date(),\n lastUpdated: new Date(),\n tags: [...tags, agent.type, agent.status],\n metadata: {\n registeredBy: 'agent-manager',\n version: '1.0.0',\n },\n };\n\n // Store in memory\n const key = this.getAgentKey(agent.id.id);\n await this.memory.store(key, entry, {\n type: 'agent-registry',\n tags: entry.tags,\n partition: this.namespace,\n });\n\n // Update cache\n this.cache.set(agent.id.id, entry);\n\n this.emit('agent:registered', { agentId: agent.id.id, agent });\n }\n\n /**\n * Update agent information in registry\n */\n async updateAgent(agentId: string, updates: Partial<AgentState>): Promise<void> {\n const entry = await this.getAgentEntry(agentId);\n if (!entry) {\n throw new Error(`Agent ${agentId} not found in registry`);\n }\n\n // Merge updates\n entry.agent = { ...entry.agent, ...updates };\n entry.lastUpdated = new Date();\n entry.tags = [\n entry.agent.type,\n entry.agent.status,\n ...entry.tags.filter((t) => t !== entry.agent.type && t !== entry.agent.status),\n ];\n\n // Store updated entry\n const key = this.getAgentKey(agentId);\n await this.memory.store(key, entry, {\n type: 'agent-registry',\n tags: entry.tags,\n partition: this.namespace,\n });\n\n // Update cache\n this.cache.set(agentId, entry);\n\n this.emit('agent:updated', { agentId, agent: entry.agent });\n }\n\n /**\n * Remove agent from registry\n */\n async unregisterAgent(agentId: string, preserveHistory: boolean = true): Promise<void> {\n const entry = await this.getAgentEntry(agentId);\n if (!entry) {\n return; // Already removed\n }\n\n if (preserveHistory) {\n // Move to archived partition\n const archiveKey = this.getArchiveKey(agentId);\n await this.memory.store(\n archiveKey,\n {\n ...entry,\n archivedAt: new Date(),\n reason: 'agent_removed',\n },\n {\n type: 'agent-archive',\n tags: [...entry.tags, 'archived'],\n partition: 'archived',\n },\n );\n }\n\n // Remove from active registry\n const key = this.getAgentKey(agentId);\n await this.memory.deleteEntry(key);\n\n // Remove from cache\n this.cache.delete(agentId);\n\n this.emit('agent:unregistered', { agentId, preserved: preserveHistory });\n }\n\n /**\n * Get agent by ID\n */\n async getAgent(agentId: string): Promise<AgentState | null> {\n const entry = await this.getAgentEntry(agentId);\n return entry?.agent || null;\n }\n\n /**\n * Get agent entry with metadata\n */\n async getAgentEntry(agentId: string): Promise<AgentRegistryEntry | null> {\n // Check cache first\n if (this.cache.has(agentId) && this.isCacheValid()) {\n return this.cache.get(agentId) || null;\n }\n\n // Load from memory\n const key = this.getAgentKey(agentId);\n const memoryEntry = await this.memory.retrieve(key);\n\n if (memoryEntry && memoryEntry.value) {\n // Convert MemoryEntry to AgentRegistryEntry\n const registryEntry: AgentRegistryEntry = memoryEntry.value as AgentRegistryEntry;\n this.cache.set(agentId, registryEntry);\n return registryEntry;\n }\n\n return null;\n }\n\n /**\n * Query agents by criteria\n */\n async queryAgents(query: AgentQuery = {}): Promise<AgentState[]> {\n await this.refreshCacheIfNeeded();\n\n let agents = Array.from(this.cache.values()).map((entry) => entry.agent);\n\n // Apply filters\n if (query.type) {\n agents = agents.filter((agent) => agent.type === query.type);\n }\n\n if (query.status) {\n agents = agents.filter((agent) => agent.status === query.status);\n }\n\n if (query.healthThreshold !== undefined) {\n agents = agents.filter((agent) => agent.health >= query.healthThreshold!);\n }\n\n if (query.namePattern) {\n const pattern = new RegExp(query.namePattern, 'i');\n agents = agents.filter((agent) => pattern.test(agent.name));\n }\n\n if (query.tags && query.tags.length > 0) {\n const entries = Array.from(this.cache.values());\n const matchingEntries = entries.filter((entry) =>\n query.tags!.some((tag) => entry.tags.includes(tag)),\n );\n agents = matchingEntries.map((entry) => entry.agent);\n }\n\n if (query.createdAfter) {\n const entries = Array.from(this.cache.values());\n const matchingEntries = entries.filter((entry) => entry.createdAt >= query.createdAfter!);\n agents = matchingEntries.map((entry) => entry.agent);\n }\n\n if (query.lastActiveAfter) {\n agents = agents.filter((agent) => agent.metrics.lastActivity >= query.lastActiveAfter!);\n }\n\n return agents;\n }\n\n /**\n * Get all registered agents\n */\n async getAllAgents(): Promise<AgentState[]> {\n return this.queryAgents();\n }\n\n /**\n * Get agents by type\n */\n async getAgentsByType(type: AgentType): Promise<AgentState[]> {\n return this.queryAgents({ type });\n }\n\n /**\n * Get agents by status\n */\n async getAgentsByStatus(status: AgentStatus): Promise<AgentState[]> {\n return this.queryAgents({ status });\n }\n\n /**\n * Get healthy agents\n */\n async getHealthyAgents(threshold: number = 0.7): Promise<AgentState[]> {\n return this.queryAgents({ healthThreshold: threshold });\n }\n\n /**\n * Get registry statistics\n */\n async getStatistics(): Promise<AgentStatistics> {\n const agents = await this.getAllAgents();\n\n const stats: AgentStatistics = {\n totalAgents: agents.length,\n byType: {} as Record<AgentType, number>,\n byStatus: {} as Record<AgentStatus, number>,\n averageHealth: 0,\n activeAgents: 0,\n totalUptime: 0,\n tasksCompleted: 0,\n successRate: 0,\n };\n\n if (agents.length === 0) {\n return stats;\n }\n\n // Count by type and status\n for (const agent of agents) {\n stats.byType[agent.type] = (stats.byType[agent.type] || 0) + 1;\n stats.byStatus[agent.status] = (stats.byStatus[agent.status] || 0) + 1;\n\n if (agent.status === 'idle' || agent.status === 'busy') {\n stats.activeAgents++;\n }\n\n stats.totalUptime += agent.metrics.totalUptime;\n stats.tasksCompleted += agent.metrics.tasksCompleted;\n }\n\n // Calculate averages\n stats.averageHealth = agents.reduce((sum, agent) => sum + agent.health, 0) / agents.length;\n\n const totalTasks = agents.reduce(\n (sum, agent) => sum + agent.metrics.tasksCompleted + agent.metrics.tasksFailed,\n 0,\n );\n\n if (totalTasks > 0) {\n stats.successRate = stats.tasksCompleted / totalTasks;\n }\n\n return stats;\n }\n\n /**\n * Search agents by capabilities\n */\n async searchByCapabilities(requiredCapabilities: string[]): Promise<AgentState[]> {\n const agents = await this.getAllAgents();\n\n return agents.filter((agent) => {\n const capabilities = [\n ...agent.capabilities.languages,\n ...agent.capabilities.frameworks,\n ...agent.capabilities.domains,\n ...agent.capabilities.tools,\n ];\n\n return requiredCapabilities.every((required) =>\n capabilities.some((cap) => cap.toLowerCase().includes(required.toLowerCase())),\n );\n });\n }\n\n /**\n * Find best agent for task\n */\n async findBestAgent(\n taskType: string,\n requiredCapabilities: string[] = [],\n preferredAgent?: string,\n ): Promise<AgentState | null> {\n let candidates = await this.getHealthyAgents(0.5);\n\n // Filter by capabilities if specified\n if (requiredCapabilities.length > 0) {\n candidates = await this.searchByCapabilities(requiredCapabilities);\n }\n\n // Prefer specific agent if available and healthy\n if (preferredAgent) {\n const preferred = candidates.find(\n (agent) => agent.id.id === preferredAgent || agent.name === preferredAgent,\n );\n if (preferred) return preferred;\n }\n\n // Filter by availability\n candidates = candidates.filter(\n (agent) =>\n agent.status === 'idle' &&\n agent.workload < 0.8 &&\n agent.capabilities.maxConcurrentTasks > 0,\n );\n\n if (candidates.length === 0) return null;\n\n // Score candidates\n const scored = candidates.map((agent) => ({\n agent,\n score: this.calculateAgentScore(agent, taskType, requiredCapabilities),\n }));\n\n // Sort by score (highest first)\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.agent || null;\n }\n\n /**\n * Store agent coordination data\n */\n async storeCoordinationData(agentId: string, data: any): Promise<void> {\n const key = `coordination:${agentId}`;\n await this.memory.store(\n key,\n {\n agentId,\n data,\n timestamp: new Date(),\n },\n {\n type: 'agent-coordination',\n tags: ['coordination', agentId],\n partition: this.namespace,\n },\n );\n }\n\n /**\n * Retrieve agent coordination data\n */\n async getCoordinationData(agentId: string): Promise<any> {\n const key = `coordination:${agentId}`;\n const result = await this.memory.retrieve(key);\n return result?.value || null;\n }\n\n // === PRIVATE METHODS ===\n\n private async loadFromMemory(): Promise<void> {\n try {\n const entries = await this.memory.query({\n type: 'state' as const,\n namespace: this.namespace,\n });\n\n this.cache.clear();\n for (const entry of entries) {\n if (entry.value && entry.value.agent) {\n this.cache.set(entry.value.agent.id.id, entry.value);\n }\n }\n\n this.lastCacheUpdate = Date.now();\n } catch (error) {\n console.warn('Failed to load agent registry from memory:', error);\n }\n }\n\n private async refreshCacheIfNeeded(): Promise<void> {\n if (!this.isCacheValid()) {\n await this.loadFromMemory();\n }\n }\n\n private isCacheValid(): boolean {\n return Date.now() - this.lastCacheUpdate < this.cacheExpiry;\n }\n\n private getAgentKey(agentId: string): string {\n return `agent:${agentId}`;\n }\n\n private getArchiveKey(agentId: string): string {\n return `archived:${agentId}:${Date.now()}`;\n }\n\n private calculateAgentScore(\n agent: AgentState,\n taskType: string,\n requiredCapabilities: string[],\n ): number {\n let score = 0;\n\n // Base health score (0-40 points)\n score += agent.health * 40;\n\n // Success rate score (0-30 points)\n score += agent.metrics.successRate * 30;\n\n // Availability score (0-20 points)\n const availability = 1 - agent.workload;\n score += availability * 20;\n\n // Capability match score (0-10 points)\n if (requiredCapabilities.length > 0) {\n const agentCaps = [\n ...agent.capabilities.languages,\n ...agent.capabilities.frameworks,\n ...agent.capabilities.domains,\n ...agent.capabilities.tools,\n ];\n\n const matches = requiredCapabilities.filter((required) =>\n agentCaps.some((cap) => cap.toLowerCase().includes(required.toLowerCase())),\n );\n\n score += (matches.length / requiredCapabilities.length) * 10;\n }\n\n return score;\n }\n}\n"],"names":["EventEmitter","AgentRegistry","memory","namespace","cache","Map","cacheExpiry","lastCacheUpdate","initialize","loadFromMemory","emit","registerAgent","agent","tags","entry","createdAt","Date","lastUpdated","type","status","metadata","registeredBy","version","key","getAgentKey","id","store","partition","set","agentId","updateAgent","updates","getAgentEntry","Error","filter","t","unregisterAgent","preserveHistory","archiveKey","getArchiveKey","archivedAt","reason","deleteEntry","delete","preserved","getAgent","has","isCacheValid","get","memoryEntry","retrieve","value","registryEntry","queryAgents","query","refreshCacheIfNeeded","agents","Array","from","values","map","healthThreshold","undefined","health","namePattern","pattern","RegExp","test","name","length","entries","matchingEntries","some","tag","includes","createdAfter","lastActiveAfter","metrics","lastActivity","getAllAgents","getAgentsByType","getAgentsByStatus","getHealthyAgents","threshold","getStatistics","stats","totalAgents","byType","byStatus","averageHealth","activeAgents","totalUptime","tasksCompleted","successRate","reduce","sum","totalTasks","tasksFailed","searchByCapabilities","requiredCapabilities","capabilities","languages","frameworks","domains","tools","every","required","cap","toLowerCase","findBestAgent","taskType","preferredAgent","candidates","preferred","find","workload","maxConcurrentTasks","scored","score","calculateAgentScore","sort","a","b","storeCoordinationData","data","timestamp","getCoordinationData","result","clear","now","error","console","warn","availability","agentCaps","matches"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/agents/agent-registry.ts"],"sourcesContent":["/**\n * Agent Registry with Memory Integration\n * Provides persistent storage and coordination for agent management\n */\n\nimport type { DistributedMemorySystem } from '../memory/distributed-memory.js';\nimport type { AgentState, AgentType, AgentStatus } from '../swarm/types.js';\nimport { EventEmitter } from 'node:events';\n\nexport interface AgentRegistryEntry {\n agent: AgentState;\n createdAt: Date;\n lastUpdated: Date;\n tags: string[];\n metadata: Record<string, any>;\n}\n\nexport interface AgentQuery {\n type?: AgentType;\n status?: AgentStatus;\n tags?: string[];\n healthThreshold?: number;\n namePattern?: string;\n createdAfter?: Date;\n lastActiveAfter?: Date;\n}\n\nexport interface AgentStatistics {\n totalAgents: number;\n byType: Record<AgentType, number>;\n byStatus: Record<AgentStatus, number>;\n averageHealth: number;\n activeAgents: number;\n totalUptime: number;\n tasksCompleted: number;\n successRate: number;\n}\n\n/**\n * Centralized agent registry with persistent storage\n */\nexport class AgentRegistry extends EventEmitter {\n private memory: DistributedMemorySystem;\n private namespace: string;\n private cache = new Map<string, AgentRegistryEntry>();\n private cacheExpiry = 60000; // 1 minute\n private lastCacheUpdate = 0;\n\n constructor(memory: DistributedMemorySystem, namespace: string = 'agents') {\n super();\n this.memory = memory;\n this.namespace = namespace;\n }\n\n async initialize(): Promise<void> {\n await this.loadFromMemory();\n this.emit('registry:initialized');\n }\n\n /**\n * Register a new agent in the registry\n */\n async registerAgent(agent: AgentState, tags: string[] = []): Promise<void> {\n const entry: AgentRegistryEntry = {\n agent,\n createdAt: new Date(),\n lastUpdated: new Date(),\n tags: [...tags, agent.type, agent.status],\n metadata: {\n registeredBy: 'agent-manager',\n version: '1.0.0',\n },\n };\n\n // Store in memory\n const key = this.getAgentKey(agent.id.id);\n await this.memory.store(key, entry, {\n type: 'agent-registry',\n tags: entry.tags,\n partition: this.namespace,\n });\n\n // Update cache\n this.cache.set(agent.id.id, entry);\n\n this.emit('agent:registered', { agentId: agent.id.id, agent });\n }\n\n /**\n * Update agent information in registry\n */\n async updateAgent(agentId: string, updates: Partial<AgentState>): Promise<void> {\n const entry = await this.getAgentEntry(agentId);\n if (!entry) {\n throw new Error(`Agent ${agentId} not found in registry`);\n }\n\n // Merge updates\n entry.agent = { ...entry.agent, ...updates };\n entry.lastUpdated = new Date();\n entry.tags = [\n entry.agent.type,\n entry.agent.status,\n ...entry.tags.filter((t) => t !== entry.agent.type && t !== entry.agent.status),\n ];\n\n // Store updated entry\n const key = this.getAgentKey(agentId);\n await this.memory.store(key, entry, {\n type: 'agent-registry',\n tags: entry.tags,\n partition: this.namespace,\n });\n\n // Update cache\n this.cache.set(agentId, entry);\n\n this.emit('agent:updated', { agentId, agent: entry.agent });\n }\n\n /**\n * Remove agent from registry\n */\n async unregisterAgent(agentId: string, preserveHistory: boolean = true): Promise<void> {\n const entry = await this.getAgentEntry(agentId);\n if (!entry) {\n return; // Already removed\n }\n\n if (preserveHistory) {\n // Move to archived partition\n const archiveKey = this.getArchiveKey(agentId);\n await this.memory.store(\n archiveKey,\n {\n ...entry,\n archivedAt: new Date(),\n reason: 'agent_removed',\n },\n {\n type: 'agent-archive',\n tags: [...entry.tags, 'archived'],\n partition: 'archived',\n },\n );\n }\n\n // Remove from active registry\n const key = this.getAgentKey(agentId);\n await this.memory.deleteEntry(key);\n\n // Remove from cache\n this.cache.delete(agentId);\n\n this.emit('agent:unregistered', { agentId, preserved: preserveHistory });\n }\n\n /**\n * Get agent by ID\n */\n async getAgent(agentId: string): Promise<AgentState | null> {\n const entry = await this.getAgentEntry(agentId);\n return entry?.agent || null;\n }\n\n /**\n * Get agent entry with metadata\n */\n async getAgentEntry(agentId: string): Promise<AgentRegistryEntry | null> {\n // Check cache first\n if (this.cache.has(agentId) && this.isCacheValid()) {\n return this.cache.get(agentId) || null;\n }\n\n // Load from memory\n const key = this.getAgentKey(agentId);\n const memoryEntry = await this.memory.retrieve(key);\n\n if (memoryEntry && memoryEntry.value) {\n // Convert MemoryEntry to AgentRegistryEntry\n const registryEntry: AgentRegistryEntry = memoryEntry.value as AgentRegistryEntry;\n this.cache.set(agentId, registryEntry);\n return registryEntry;\n }\n\n return null;\n }\n\n /**\n * Query agents by criteria\n */\n async queryAgents(query: AgentQuery = {}): Promise<AgentState[]> {\n await this.refreshCacheIfNeeded();\n\n let agents = Array.from(this.cache.values()).map((entry) => entry.agent);\n\n // Apply filters\n if (query.type) {\n agents = agents.filter((agent) => agent.type === query.type);\n }\n\n if (query.status) {\n agents = agents.filter((agent) => agent.status === query.status);\n }\n\n if (query.healthThreshold !== undefined) {\n agents = agents.filter((agent) => agent.health >= query.healthThreshold!);\n }\n\n if (query.namePattern) {\n const pattern = new RegExp(query.namePattern, 'i');\n agents = agents.filter((agent) => pattern.test(agent.name));\n }\n\n if (query.tags && query.tags.length > 0) {\n const entries = Array.from(this.cache.values());\n const matchingEntries = entries.filter((entry) =>\n query.tags!.some((tag) => entry.tags.includes(tag)),\n );\n agents = matchingEntries.map((entry) => entry.agent);\n }\n\n if (query.createdAfter) {\n const entries = Array.from(this.cache.values());\n const matchingEntries = entries.filter((entry) => entry.createdAt >= query.createdAfter!);\n agents = matchingEntries.map((entry) => entry.agent);\n }\n\n if (query.lastActiveAfter) {\n agents = agents.filter((agent) => agent.metrics.lastActivity >= query.lastActiveAfter!);\n }\n\n return agents;\n }\n\n /**\n * Get all registered agents\n */\n async getAllAgents(): Promise<AgentState[]> {\n return this.queryAgents();\n }\n\n /**\n * Get agents by type\n */\n async getAgentsByType(type: AgentType): Promise<AgentState[]> {\n return this.queryAgents({ type });\n }\n\n /**\n * Get agents by status\n */\n async getAgentsByStatus(status: AgentStatus): Promise<AgentState[]> {\n return this.queryAgents({ status });\n }\n\n /**\n * Get healthy agents\n */\n async getHealthyAgents(threshold: number = 0.7): Promise<AgentState[]> {\n return this.queryAgents({ healthThreshold: threshold });\n }\n\n /**\n * Get registry statistics\n */\n async getStatistics(): Promise<AgentStatistics> {\n const agents = await this.getAllAgents();\n\n const stats: AgentStatistics = {\n totalAgents: agents.length,\n byType: {} as Record<AgentType, number>,\n byStatus: {} as Record<AgentStatus, number>,\n averageHealth: 0,\n activeAgents: 0,\n totalUptime: 0,\n tasksCompleted: 0,\n successRate: 0,\n };\n\n if (agents.length === 0) {\n return stats;\n }\n\n // Count by type and status\n for (const agent of agents) {\n stats.byType[agent.type] = (stats.byType[agent.type] || 0) + 1;\n stats.byStatus[agent.status] = (stats.byStatus[agent.status] || 0) + 1;\n\n if (agent.status === 'idle' || agent.status === 'busy') {\n stats.activeAgents++;\n }\n\n stats.totalUptime += agent.metrics.totalUptime;\n stats.tasksCompleted += agent.metrics.tasksCompleted;\n }\n\n // Calculate averages\n stats.averageHealth = agents.reduce((sum, agent) => sum + agent.health, 0) / agents.length;\n\n const totalTasks = agents.reduce(\n (sum, agent) => sum + agent.metrics.tasksCompleted + agent.metrics.tasksFailed,\n 0,\n );\n\n if (totalTasks > 0) {\n stats.successRate = stats.tasksCompleted / totalTasks;\n }\n\n return stats;\n }\n\n /**\n * Search agents by capabilities\n */\n async searchByCapabilities(requiredCapabilities: string[]): Promise<AgentState[]> {\n const agents = await this.getAllAgents();\n\n return agents.filter((agent) => {\n const capabilities = [\n ...agent.capabilities.languages,\n ...agent.capabilities.frameworks,\n ...agent.capabilities.domains,\n ...agent.capabilities.tools,\n ];\n\n return requiredCapabilities.every((required) =>\n capabilities.some((cap) => cap.toLowerCase().includes(required.toLowerCase())),\n );\n });\n }\n\n /**\n * Find best agent for task\n */\n async findBestAgent(\n taskType: string,\n requiredCapabilities: string[] = [],\n preferredAgent?: string,\n ): Promise<AgentState | null> {\n let candidates = await this.getHealthyAgents(0.5);\n\n // Filter by capabilities if specified\n if (requiredCapabilities.length > 0) {\n candidates = await this.searchByCapabilities(requiredCapabilities);\n }\n\n // Prefer specific agent if available and healthy\n if (preferredAgent) {\n const preferred = candidates.find(\n (agent) => agent.id.id === preferredAgent || agent.name === preferredAgent,\n );\n if (preferred) return preferred;\n }\n\n // Filter by availability\n candidates = candidates.filter(\n (agent) =>\n agent.status === 'idle' &&\n agent.workload < 0.8 &&\n agent.capabilities.maxConcurrentTasks > 0,\n );\n\n if (candidates.length === 0) return null;\n\n // Score candidates\n const scored = candidates.map((agent) => ({\n agent,\n score: this.calculateAgentScore(agent, taskType, requiredCapabilities),\n }));\n\n // Sort by score (highest first)\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.agent || null;\n }\n\n /**\n * Store agent coordination data\n */\n async storeCoordinationData(agentId: string, data: any): Promise<void> {\n const key = `coordination:${agentId}`;\n await this.memory.store(\n key,\n {\n agentId,\n data,\n timestamp: new Date(),\n },\n {\n type: 'agent-coordination',\n tags: ['coordination', agentId],\n partition: this.namespace,\n },\n );\n }\n\n /**\n * Retrieve agent coordination data\n */\n async getCoordinationData(agentId: string): Promise<any> {\n const key = `coordination:${agentId}`;\n const result = await this.memory.retrieve(key);\n return result?.value || null;\n }\n\n // === PRIVATE METHODS ===\n\n private async loadFromMemory(): Promise<void> {\n try {\n const entries = await this.memory.query({\n type: 'state' as const,\n namespace: this.namespace,\n });\n\n this.cache.clear();\n for (const entry of entries) {\n if (entry.value && entry.value.agent) {\n this.cache.set(entry.value.agent.id.id, entry.value);\n }\n }\n\n this.lastCacheUpdate = Date.now();\n } catch (error) {\n console.warn('Failed to load agent registry from memory:', error);\n }\n }\n\n private async refreshCacheIfNeeded(): Promise<void> {\n if (!this.isCacheValid()) {\n await this.loadFromMemory();\n }\n }\n\n private isCacheValid(): boolean {\n return Date.now() - this.lastCacheUpdate < this.cacheExpiry;\n }\n\n private getAgentKey(agentId: string): string {\n return `agent:${agentId}`;\n }\n\n private getArchiveKey(agentId: string): string {\n return `archived:${agentId}:${Date.now()}`;\n }\n\n private calculateAgentScore(\n agent: AgentState,\n taskType: string,\n requiredCapabilities: string[],\n ): number {\n let score = 0;\n\n // Base health score (0-40 points)\n score += agent.health * 40;\n\n // Success rate score (0-30 points)\n score += agent.metrics.successRate * 30;\n\n // Availability score (0-20 points)\n const availability = 1 - agent.workload;\n score += availability * 20;\n\n // Capability match score (0-10 points)\n if (requiredCapabilities.length > 0) {\n const agentCaps = [\n ...agent.capabilities.languages,\n ...agent.capabilities.frameworks,\n ...agent.capabilities.domains,\n ...agent.capabilities.tools,\n ];\n\n const matches = requiredCapabilities.filter((required) =>\n agentCaps.some((cap) => cap.toLowerCase().includes(required.toLowerCase())),\n );\n\n score += (matches.length / requiredCapabilities.length) * 10;\n }\n\n return score;\n }\n}\n"],"names":["EventEmitter","AgentRegistry","memory","namespace","cache","Map","cacheExpiry","lastCacheUpdate","initialize","loadFromMemory","emit","registerAgent","agent","tags","entry","createdAt","Date","lastUpdated","type","status","metadata","registeredBy","version","key","getAgentKey","id","store","partition","set","agentId","updateAgent","updates","getAgentEntry","Error","filter","t","unregisterAgent","preserveHistory","archiveKey","getArchiveKey","archivedAt","reason","deleteEntry","delete","preserved","getAgent","has","isCacheValid","get","memoryEntry","retrieve","value","registryEntry","queryAgents","query","refreshCacheIfNeeded","agents","Array","from","values","map","healthThreshold","undefined","health","namePattern","pattern","RegExp","test","name","length","entries","matchingEntries","some","tag","includes","createdAfter","lastActiveAfter","metrics","lastActivity","getAllAgents","getAgentsByType","getAgentsByStatus","getHealthyAgents","threshold","getStatistics","stats","totalAgents","byType","byStatus","averageHealth","activeAgents","totalUptime","tasksCompleted","successRate","reduce","sum","totalTasks","tasksFailed","searchByCapabilities","requiredCapabilities","capabilities","languages","frameworks","domains","tools","every","required","cap","toLowerCase","findBestAgent","taskType","preferredAgent","candidates","preferred","find","workload","maxConcurrentTasks","scored","score","calculateAgentScore","sort","a","b","storeCoordinationData","data","timestamp","getCoordinationData","result","clear","now","error","console","warn","availability","agentCaps","matches"],"mappings":"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"}
|