agentic-qe 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/.claude-flow/metrics/agent-metrics.json +1 -0
- package/.claude/agents/.claude-flow/metrics/performance.json +87 -0
- package/.claude/agents/.claude-flow/metrics/task-metrics.json +10 -0
- package/.claude/agents/qe-api-contract-validator.md +118 -0
- package/.claude/agents/qe-chaos-engineer.md +320 -5
- package/.claude/agents/qe-code-complexity.md +360 -0
- package/.claude/agents/qe-coverage-analyzer.md +112 -0
- package/.claude/agents/qe-deployment-readiness.md +322 -6
- package/.claude/agents/qe-flaky-test-hunter.md +115 -0
- package/.claude/agents/qe-fleet-commander.md +319 -6
- package/.claude/agents/qe-performance-tester.md +234 -0
- package/.claude/agents/qe-production-intelligence.md +114 -0
- package/.claude/agents/qe-quality-analyzer.md +126 -0
- package/.claude/agents/qe-quality-gate.md +119 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +114 -0
- package/.claude/agents/qe-requirements-validator.md +114 -0
- package/.claude/agents/qe-security-scanner.md +118 -0
- package/.claude/agents/qe-test-data-architect.md +234 -0
- package/.claude/agents/qe-test-executor.md +115 -0
- package/.claude/agents/qe-test-generator.md +114 -0
- package/.claude/agents/qe-visual-tester.md +305 -6
- package/.claude/agents/subagents/qe-code-reviewer.md +0 -4
- package/.claude/agents/subagents/qe-data-generator.md +0 -16
- package/.claude/agents/subagents/qe-integration-tester.md +0 -17
- package/.claude/agents/subagents/qe-performance-validator.md +0 -16
- package/.claude/agents/subagents/qe-security-auditor.md +0 -16
- package/.claude/agents/subagents/qe-test-implementer.md +0 -17
- package/.claude/agents/subagents/qe-test-refactorer.md +0 -17
- package/.claude/agents/subagents/qe-test-writer.md +0 -19
- package/CHANGELOG.md +290 -0
- package/README.md +37 -5
- package/dist/adapters/MemoryStoreAdapter.d.ts +38 -0
- package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryStoreAdapter.js +22 -0
- package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +13 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +32 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/memory/AgentDBService.d.ts +33 -28
- package/dist/core/memory/AgentDBService.d.ts.map +1 -1
- package/dist/core/memory/AgentDBService.js +233 -290
- package/dist/core/memory/AgentDBService.js.map +1 -1
- package/dist/core/memory/EnhancedAgentDBService.d.ts.map +1 -1
- package/dist/core/memory/EnhancedAgentDBService.js +5 -3
- package/dist/core/memory/EnhancedAgentDBService.js.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.d.ts +9 -2
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +126 -100
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +58 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +176 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +2 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts +14 -27
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +57 -119
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/index.d.ts +0 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +0 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/mcp/handlers/learning/learning-query.d.ts +34 -0
- package/dist/mcp/handlers/learning/learning-query.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-query.js +156 -0
- package/dist/mcp/handlers/learning/learning-query.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-experience.d.ts +30 -0
- package/dist/mcp/handlers/learning/learning-store-experience.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-experience.js +86 -0
- package/dist/mcp/handlers/learning/learning-store-experience.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.d.ts +31 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.js +126 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts +30 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.js +100 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +98 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services/LearningEventListener.d.ts +123 -0
- package/dist/mcp/services/LearningEventListener.d.ts.map +1 -0
- package/dist/mcp/services/LearningEventListener.js +322 -0
- package/dist/mcp/services/LearningEventListener.js.map +1 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts.map +1 -1
- package/dist/mcp/tools/qe/security/scan-comprehensive.js +40 -18
- package/dist/mcp/tools/qe/security/scan-comprehensive.js.map +1 -1
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +179 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/types/memory-interfaces.d.ts +71 -0
- package/dist/types/memory-interfaces.d.ts.map +1 -1
- package/dist/utils/Calculator.d.ts +35 -0
- package/dist/utils/Calculator.d.ts.map +1 -0
- package/dist/utils/Calculator.js +50 -0
- package/dist/utils/Calculator.js.map +1 -0
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +4 -1
- package/dist/utils/Logger.js.map +1 -1
- package/package.json +7 -5
- package/.claude/agents/qe-api-contract-validator.md.backup +0 -1148
- package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +0 -1148
- package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +0 -1123
- package/.claude/agents/qe-chaos-engineer.md.backup +0 -808
- package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +0 -808
- package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +0 -787
- package/.claude/agents/qe-code-complexity.md.backup +0 -291
- package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +0 -291
- package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +0 -286
- package/.claude/agents/qe-coverage-analyzer.md.backup +0 -467
- package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +0 -467
- package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +0 -438
- package/.claude/agents/qe-deployment-readiness.md.backup +0 -1166
- package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +0 -1166
- package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +0 -1140
- package/.claude/agents/qe-flaky-test-hunter.md.backup +0 -1195
- package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +0 -1195
- package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +0 -1162
- package/.claude/agents/qe-fleet-commander.md.backup +0 -718
- package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +0 -718
- package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +0 -697
- package/.claude/agents/qe-performance-tester.md.backup +0 -428
- package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +0 -428
- package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +0 -372
- package/.claude/agents/qe-production-intelligence.md.backup +0 -1219
- package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +0 -1219
- package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +0 -1194
- package/.claude/agents/qe-quality-analyzer.md.backup +0 -425
- package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +0 -425
- package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +0 -394
- package/.claude/agents/qe-quality-gate.md.backup +0 -446
- package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +0 -446
- package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +0 -415
- package/.claude/agents/qe-regression-risk-analyzer.md.backup +0 -1009
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +0 -1009
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +0 -984
- package/.claude/agents/qe-requirements-validator.md.backup +0 -748
- package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +0 -748
- package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +0 -723
- package/.claude/agents/qe-security-scanner.md.backup +0 -634
- package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +0 -634
- package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +0 -573
- package/.claude/agents/qe-test-data-architect.md.backup +0 -1064
- package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +0 -1064
- package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +0 -1040
- package/.claude/agents/qe-test-executor.md.backup +0 -389
- package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +0 -389
- package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +0 -369
- package/.claude/agents/qe-test-generator.md.backup +0 -997
- package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +0 -997
- package/.claude/agents/qe-visual-tester.md.backup +0 -777
- package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +0 -777
- package/.claude/agents/qe-visual-tester.md.backup-phase2-20251107-140039 +0 -756
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: learning_store_experience
|
|
3
|
+
*
|
|
4
|
+
* Stores a learning experience for an agent. This includes task execution
|
|
5
|
+
* details, reward assessment, and outcome data.
|
|
6
|
+
*
|
|
7
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
8
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
9
|
+
*/
|
|
10
|
+
import { BaseHandler, HandlerResponse } from '../base-handler';
|
|
11
|
+
import type { SwarmMemoryManager } from '../../../core/memory/SwarmMemoryManager';
|
|
12
|
+
import type { AgentRegistry } from '../../services/AgentRegistry';
|
|
13
|
+
import type { HookExecutor } from '../../services/HookExecutor';
|
|
14
|
+
export interface LearningExperience {
|
|
15
|
+
agentId: string;
|
|
16
|
+
taskType: string;
|
|
17
|
+
reward: number;
|
|
18
|
+
outcome: Record<string, any>;
|
|
19
|
+
timestamp?: number;
|
|
20
|
+
metadata?: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export declare class LearningStoreExperienceHandler extends BaseHandler {
|
|
23
|
+
private registry?;
|
|
24
|
+
private hookExecutor?;
|
|
25
|
+
private memoryManager?;
|
|
26
|
+
private eventBus?;
|
|
27
|
+
constructor(registry?: AgentRegistry | undefined, hookExecutor?: HookExecutor | undefined, memoryManager?: SwarmMemoryManager | undefined, eventBus?: import("events").EventEmitter | undefined);
|
|
28
|
+
handle(args: LearningExperience): Promise<HandlerResponse>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=learning-store-experience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-experience.d.ts","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-experience.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,qBAAa,8BAA+B,SAAQ,WAAW;IAE3D,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC;gBAHT,QAAQ,CAAC,EAAE,aAAa,YAAA,EACxB,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,aAAa,CAAC,EAAE,kBAAkB,YAAA,EAClC,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,YAAY,YAAA;IAK5C,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;CAsFjE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool: learning_store_experience
|
|
4
|
+
*
|
|
5
|
+
* Stores a learning experience for an agent. This includes task execution
|
|
6
|
+
* details, reward assessment, and outcome data.
|
|
7
|
+
*
|
|
8
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
9
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LearningStoreExperienceHandler = void 0;
|
|
13
|
+
const base_handler_1 = require("../base-handler");
|
|
14
|
+
class LearningStoreExperienceHandler extends base_handler_1.BaseHandler {
|
|
15
|
+
constructor(registry, hookExecutor, memoryManager, eventBus) {
|
|
16
|
+
super();
|
|
17
|
+
this.registry = registry;
|
|
18
|
+
this.hookExecutor = hookExecutor;
|
|
19
|
+
this.memoryManager = memoryManager;
|
|
20
|
+
this.eventBus = eventBus;
|
|
21
|
+
}
|
|
22
|
+
async handle(args) {
|
|
23
|
+
return this.safeHandle(async () => {
|
|
24
|
+
const requestId = this.generateRequestId();
|
|
25
|
+
const { agentId, taskType, reward, outcome, timestamp = Date.now(), metadata = {} } = args;
|
|
26
|
+
// Validate inputs
|
|
27
|
+
this.validateRequired(args, ['agentId', 'taskType', 'reward', 'outcome']);
|
|
28
|
+
if (typeof reward !== 'number' || reward < 0 || reward > 1) {
|
|
29
|
+
throw new Error('reward must be a number between 0 and 1');
|
|
30
|
+
}
|
|
31
|
+
if (typeof outcome !== 'object') {
|
|
32
|
+
throw new Error('outcome must be an object');
|
|
33
|
+
}
|
|
34
|
+
// Get memory manager
|
|
35
|
+
if (!this.memoryManager) {
|
|
36
|
+
throw new Error('SwarmMemoryManager not initialized');
|
|
37
|
+
}
|
|
38
|
+
// Store experience in learning_experiences table
|
|
39
|
+
// Note: metadata and created_at columns added via migration
|
|
40
|
+
const experienceData = {
|
|
41
|
+
agent_id: agentId,
|
|
42
|
+
task_id: `task-${Date.now()}`, // Generate task ID
|
|
43
|
+
task_type: taskType,
|
|
44
|
+
state: JSON.stringify({ type: taskType, timestamp }),
|
|
45
|
+
action: JSON.stringify(outcome),
|
|
46
|
+
reward,
|
|
47
|
+
next_state: JSON.stringify({ completed: true, timestamp }),
|
|
48
|
+
episode_id: null, // Optional episode grouping
|
|
49
|
+
timestamp, // Uses existing timestamp column (DATETIME)
|
|
50
|
+
metadata: JSON.stringify(metadata),
|
|
51
|
+
created_at: timestamp
|
|
52
|
+
};
|
|
53
|
+
// Use direct database access
|
|
54
|
+
const db = this.memoryManager.db;
|
|
55
|
+
if (!db) {
|
|
56
|
+
throw new Error('Database connection not available');
|
|
57
|
+
}
|
|
58
|
+
const stmt = db.prepare(`
|
|
59
|
+
INSERT INTO learning_experiences (
|
|
60
|
+
agent_id, task_id, task_type, state, action, reward, next_state,
|
|
61
|
+
episode_id, timestamp, metadata, created_at
|
|
62
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
63
|
+
`);
|
|
64
|
+
const result = stmt.run(experienceData.agent_id, experienceData.task_id, experienceData.task_type, experienceData.state, experienceData.action, experienceData.reward, experienceData.next_state, experienceData.episode_id, experienceData.timestamp, experienceData.metadata, experienceData.created_at);
|
|
65
|
+
const experienceId = `exp-${result.lastInsertRowid}`;
|
|
66
|
+
this.log('info', `Learning experience stored: ${experienceId}`, {
|
|
67
|
+
agentId,
|
|
68
|
+
taskType,
|
|
69
|
+
reward
|
|
70
|
+
});
|
|
71
|
+
// Emit event to track explicit learning (prevents duplicate auto-storage)
|
|
72
|
+
if (this.eventBus) {
|
|
73
|
+
this.eventBus.emit('learning:experience:stored', {
|
|
74
|
+
agentId,
|
|
75
|
+
type: 'experience'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return this.createSuccessResponse({
|
|
79
|
+
experienceId,
|
|
80
|
+
message: `Learning experience stored successfully for ${agentId}`
|
|
81
|
+
}, requestId);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.LearningStoreExperienceHandler = LearningStoreExperienceHandler;
|
|
86
|
+
//# sourceMappingURL=learning-store-experience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-experience.js","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-experience.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: learning_store_pattern
|
|
3
|
+
*
|
|
4
|
+
* Stores a successful pattern for an agent. Patterns capture proven approaches,
|
|
5
|
+
* strategies, and techniques that worked well and should be reused.
|
|
6
|
+
*
|
|
7
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
8
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
9
|
+
*/
|
|
10
|
+
import { BaseHandler, HandlerResponse } from '../base-handler';
|
|
11
|
+
import type { SwarmMemoryManager } from '../../../core/memory/SwarmMemoryManager';
|
|
12
|
+
import type { AgentRegistry } from '../../services/AgentRegistry';
|
|
13
|
+
import type { HookExecutor } from '../../services/HookExecutor';
|
|
14
|
+
export interface LearningPattern {
|
|
15
|
+
agentId?: string;
|
|
16
|
+
pattern: string;
|
|
17
|
+
confidence: number;
|
|
18
|
+
domain?: string;
|
|
19
|
+
usageCount?: number;
|
|
20
|
+
successRate?: number;
|
|
21
|
+
metadata?: Record<string, any>;
|
|
22
|
+
}
|
|
23
|
+
export declare class LearningStorePatternHandler extends BaseHandler {
|
|
24
|
+
private registry?;
|
|
25
|
+
private hookExecutor?;
|
|
26
|
+
private memoryManager?;
|
|
27
|
+
private eventBus?;
|
|
28
|
+
constructor(registry?: AgentRegistry | undefined, hookExecutor?: HookExecutor | undefined, memoryManager?: SwarmMemoryManager | undefined, eventBus?: import("events").EventEmitter | undefined);
|
|
29
|
+
handle(args: LearningPattern): Promise<HandlerResponse>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=learning-store-pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-pattern.d.ts","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,qBAAa,2BAA4B,SAAQ,WAAW;IAExD,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC;gBAHT,QAAQ,CAAC,EAAE,aAAa,YAAA,EACxB,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,aAAa,CAAC,EAAE,kBAAkB,YAAA,EAClC,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,YAAY,YAAA;IAK5C,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;CA+I9D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool: learning_store_pattern
|
|
4
|
+
*
|
|
5
|
+
* Stores a successful pattern for an agent. Patterns capture proven approaches,
|
|
6
|
+
* strategies, and techniques that worked well and should be reused.
|
|
7
|
+
*
|
|
8
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
9
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LearningStorePatternHandler = void 0;
|
|
13
|
+
const base_handler_1 = require("../base-handler");
|
|
14
|
+
class LearningStorePatternHandler extends base_handler_1.BaseHandler {
|
|
15
|
+
constructor(registry, hookExecutor, memoryManager, eventBus) {
|
|
16
|
+
super();
|
|
17
|
+
this.registry = registry;
|
|
18
|
+
this.hookExecutor = hookExecutor;
|
|
19
|
+
this.memoryManager = memoryManager;
|
|
20
|
+
this.eventBus = eventBus;
|
|
21
|
+
}
|
|
22
|
+
async handle(args) {
|
|
23
|
+
return this.safeHandle(async () => {
|
|
24
|
+
const requestId = this.generateRequestId();
|
|
25
|
+
const { agentId, pattern, confidence, domain = 'general', usageCount = 1, successRate = 1.0, metadata = {} } = args;
|
|
26
|
+
// Validate inputs
|
|
27
|
+
this.validateRequired(args, ['pattern', 'confidence']);
|
|
28
|
+
if (typeof confidence !== 'number' || confidence < 0 || confidence > 1) {
|
|
29
|
+
throw new Error('confidence must be a number between 0 and 1');
|
|
30
|
+
}
|
|
31
|
+
if (typeof pattern !== 'string' || pattern.trim().length === 0) {
|
|
32
|
+
throw new Error('pattern must be a non-empty string');
|
|
33
|
+
}
|
|
34
|
+
// Get memory manager
|
|
35
|
+
if (!this.memoryManager) {
|
|
36
|
+
throw new Error('SwarmMemoryManager not initialized');
|
|
37
|
+
}
|
|
38
|
+
const db = this.memoryManager.db;
|
|
39
|
+
if (!db) {
|
|
40
|
+
throw new Error('Database connection not available');
|
|
41
|
+
}
|
|
42
|
+
// Use existing patterns table instead of creating test_patterns
|
|
43
|
+
// Note: patterns table should have agent_id, domain, success_rate columns (added via migration)
|
|
44
|
+
// Generate unique pattern ID
|
|
45
|
+
const patternId = `pattern-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
46
|
+
// Check if pattern already exists (for the same agent + pattern text)
|
|
47
|
+
const existing = agentId ? db.prepare(`
|
|
48
|
+
SELECT id, usage_count, success_rate, confidence FROM patterns
|
|
49
|
+
WHERE agent_id = ? AND pattern = ?
|
|
50
|
+
`).get(agentId, pattern) : undefined;
|
|
51
|
+
if (existing) {
|
|
52
|
+
// Update existing pattern (weighted average for confidence and success rate)
|
|
53
|
+
const newUsageCount = existing.usage_count + usageCount;
|
|
54
|
+
const weightedConfidence = (existing.confidence * existing.usage_count + confidence * usageCount) / newUsageCount;
|
|
55
|
+
const weightedSuccessRate = (existing.success_rate * existing.usage_count + successRate * usageCount) / newUsageCount;
|
|
56
|
+
db.prepare(`
|
|
57
|
+
UPDATE patterns
|
|
58
|
+
SET usage_count = ?, confidence = ?, success_rate = ?, metadata = ?
|
|
59
|
+
WHERE id = ?
|
|
60
|
+
`).run(newUsageCount, weightedConfidence, weightedSuccessRate, JSON.stringify(metadata), existing.id);
|
|
61
|
+
this.log('info', `Pattern updated: ${existing.id}`, {
|
|
62
|
+
agentId,
|
|
63
|
+
domain,
|
|
64
|
+
usageCount: newUsageCount,
|
|
65
|
+
confidence: weightedConfidence,
|
|
66
|
+
successRate: weightedSuccessRate
|
|
67
|
+
});
|
|
68
|
+
// Emit event to track explicit learning (prevents duplicate auto-storage)
|
|
69
|
+
if (this.eventBus) {
|
|
70
|
+
this.eventBus.emit('learning:pattern:stored', {
|
|
71
|
+
agentId,
|
|
72
|
+
type: 'pattern'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return this.createSuccessResponse({
|
|
76
|
+
patternId: existing.id,
|
|
77
|
+
message: `Pattern updated successfully${agentId ? ` for ${agentId}` : ''}`,
|
|
78
|
+
pattern: {
|
|
79
|
+
id: existing.id,
|
|
80
|
+
domain,
|
|
81
|
+
confidence: weightedConfidence,
|
|
82
|
+
usageCount: newUsageCount,
|
|
83
|
+
successRate: weightedSuccessRate
|
|
84
|
+
}
|
|
85
|
+
}, requestId);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Insert new pattern into patterns table
|
|
89
|
+
db.prepare(`
|
|
90
|
+
INSERT INTO patterns (
|
|
91
|
+
id, pattern, confidence, usage_count, agent_id, domain, success_rate,
|
|
92
|
+
metadata, ttl, created_at, expires_at
|
|
93
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
94
|
+
`).run(patternId, pattern, confidence, usageCount, agentId || null, domain, successRate, JSON.stringify(metadata), 0, // ttl (0 = no expiry)
|
|
95
|
+
Date.now(), null // expires_at
|
|
96
|
+
);
|
|
97
|
+
this.log('info', `Pattern stored: ${patternId}`, {
|
|
98
|
+
agentId,
|
|
99
|
+
domain,
|
|
100
|
+
confidence,
|
|
101
|
+
usageCount,
|
|
102
|
+
successRate
|
|
103
|
+
});
|
|
104
|
+
// Emit event to track explicit learning (prevents duplicate auto-storage)
|
|
105
|
+
if (this.eventBus) {
|
|
106
|
+
this.eventBus.emit('learning:pattern:stored', {
|
|
107
|
+
agentId,
|
|
108
|
+
type: 'pattern'
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return this.createSuccessResponse({
|
|
112
|
+
patternId,
|
|
113
|
+
message: `Pattern stored successfully${agentId ? ` for ${agentId}` : ''}`,
|
|
114
|
+
pattern: {
|
|
115
|
+
id: patternId,
|
|
116
|
+
domain,
|
|
117
|
+
confidence,
|
|
118
|
+
usageCount
|
|
119
|
+
}
|
|
120
|
+
}, requestId);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.LearningStorePatternHandler = LearningStorePatternHandler;
|
|
126
|
+
//# sourceMappingURL=learning-store-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-pattern.js","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-pattern.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: learning_store_qvalue
|
|
3
|
+
*
|
|
4
|
+
* Stores or updates a Q-value for a state-action pair. Q-values represent
|
|
5
|
+
* the expected reward for taking a specific action in a given state.
|
|
6
|
+
*
|
|
7
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
8
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
9
|
+
*/
|
|
10
|
+
import { BaseHandler, HandlerResponse } from '../base-handler';
|
|
11
|
+
import type { SwarmMemoryManager } from '../../../core/memory/SwarmMemoryManager';
|
|
12
|
+
import type { AgentRegistry } from '../../services/AgentRegistry';
|
|
13
|
+
import type { HookExecutor } from '../../services/HookExecutor';
|
|
14
|
+
export interface QValueData {
|
|
15
|
+
agentId: string;
|
|
16
|
+
stateKey: string;
|
|
17
|
+
actionKey: string;
|
|
18
|
+
qValue: number;
|
|
19
|
+
updateCount?: number;
|
|
20
|
+
metadata?: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export declare class LearningStoreQValueHandler extends BaseHandler {
|
|
23
|
+
private registry?;
|
|
24
|
+
private hookExecutor?;
|
|
25
|
+
private memoryManager?;
|
|
26
|
+
private eventBus?;
|
|
27
|
+
constructor(registry?: AgentRegistry | undefined, hookExecutor?: HookExecutor | undefined, memoryManager?: SwarmMemoryManager | undefined, eventBus?: import("events").EventEmitter | undefined);
|
|
28
|
+
handle(args: QValueData): Promise<HandlerResponse>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=learning-store-qvalue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-qvalue.d.ts","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-qvalue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,qBAAa,0BAA2B,SAAQ,WAAW;IAEvD,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC;gBAHT,QAAQ,CAAC,EAAE,aAAa,YAAA,EACxB,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,aAAa,CAAC,EAAE,kBAAkB,YAAA,EAClC,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,YAAY,YAAA;IAK5C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;CA6GzD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool: learning_store_qvalue
|
|
4
|
+
*
|
|
5
|
+
* Stores or updates a Q-value for a state-action pair. Q-values represent
|
|
6
|
+
* the expected reward for taking a specific action in a given state.
|
|
7
|
+
*
|
|
8
|
+
* Part of Phase 1 implementation of Option C (Hybrid Approach) for
|
|
9
|
+
* enabling learning persistence with Claude Code Task tool.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LearningStoreQValueHandler = void 0;
|
|
13
|
+
const base_handler_1 = require("../base-handler");
|
|
14
|
+
class LearningStoreQValueHandler extends base_handler_1.BaseHandler {
|
|
15
|
+
constructor(registry, hookExecutor, memoryManager, eventBus) {
|
|
16
|
+
super();
|
|
17
|
+
this.registry = registry;
|
|
18
|
+
this.hookExecutor = hookExecutor;
|
|
19
|
+
this.memoryManager = memoryManager;
|
|
20
|
+
this.eventBus = eventBus;
|
|
21
|
+
}
|
|
22
|
+
async handle(args) {
|
|
23
|
+
return this.safeHandle(async () => {
|
|
24
|
+
const requestId = this.generateRequestId();
|
|
25
|
+
const { agentId, stateKey, actionKey, qValue, updateCount = 1, metadata = {} } = args;
|
|
26
|
+
// Validate inputs
|
|
27
|
+
this.validateRequired(args, ['agentId', 'stateKey', 'actionKey', 'qValue']);
|
|
28
|
+
if (typeof qValue !== 'number') {
|
|
29
|
+
throw new Error('qValue must be a number');
|
|
30
|
+
}
|
|
31
|
+
// Get memory manager
|
|
32
|
+
if (!this.memoryManager) {
|
|
33
|
+
throw new Error('SwarmMemoryManager not initialized');
|
|
34
|
+
}
|
|
35
|
+
const db = this.memoryManager.db;
|
|
36
|
+
if (!db) {
|
|
37
|
+
throw new Error('Database connection not available');
|
|
38
|
+
}
|
|
39
|
+
// Check if Q-value already exists
|
|
40
|
+
const existing = db.prepare(`
|
|
41
|
+
SELECT id, q_value, update_count FROM q_values
|
|
42
|
+
WHERE agent_id = ? AND state_key = ? AND action_key = ?
|
|
43
|
+
`).get(agentId, stateKey, actionKey);
|
|
44
|
+
let qValueId;
|
|
45
|
+
if (existing) {
|
|
46
|
+
// Update existing Q-value (weighted average)
|
|
47
|
+
const newUpdateCount = existing.update_count + updateCount;
|
|
48
|
+
const weightedQValue = (existing.q_value * existing.update_count + qValue * updateCount) / newUpdateCount;
|
|
49
|
+
// Note: Schema uses last_updated (DATETIME), not updated_at
|
|
50
|
+
// Note: metadata column added via migration
|
|
51
|
+
db.prepare(`
|
|
52
|
+
UPDATE q_values
|
|
53
|
+
SET q_value = ?, update_count = ?, metadata = ?, last_updated = datetime('now')
|
|
54
|
+
WHERE id = ?
|
|
55
|
+
`).run(weightedQValue, newUpdateCount, JSON.stringify(metadata), existing.id);
|
|
56
|
+
qValueId = `qval-${existing.id}`;
|
|
57
|
+
this.log('info', `Q-value updated: ${qValueId}`, {
|
|
58
|
+
agentId,
|
|
59
|
+
stateKey,
|
|
60
|
+
actionKey,
|
|
61
|
+
oldValue: existing.q_value,
|
|
62
|
+
newValue: weightedQValue,
|
|
63
|
+
updateCount: newUpdateCount
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Insert new Q-value
|
|
68
|
+
// Note: Schema uses created_at and last_updated (DATETIME)
|
|
69
|
+
// Note: metadata column added via migration
|
|
70
|
+
const result = db.prepare(`
|
|
71
|
+
INSERT INTO q_values (
|
|
72
|
+
agent_id, state_key, action_key, q_value, update_count,
|
|
73
|
+
metadata, created_at, last_updated
|
|
74
|
+
) VALUES (?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))
|
|
75
|
+
`).run(agentId, stateKey, actionKey, qValue, updateCount, JSON.stringify(metadata));
|
|
76
|
+
qValueId = `qval-${result.lastInsertRowid}`;
|
|
77
|
+
this.log('info', `Q-value stored: ${qValueId}`, {
|
|
78
|
+
agentId,
|
|
79
|
+
stateKey,
|
|
80
|
+
actionKey,
|
|
81
|
+
qValue,
|
|
82
|
+
updateCount
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Emit event to track explicit learning (prevents duplicate auto-storage)
|
|
86
|
+
if (this.eventBus) {
|
|
87
|
+
this.eventBus.emit('learning:qvalue:stored', {
|
|
88
|
+
agentId,
|
|
89
|
+
type: 'qvalue'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return this.createSuccessResponse({
|
|
93
|
+
qValueId,
|
|
94
|
+
message: `Q-value ${existing ? 'updated' : 'stored'} successfully for ${agentId}`
|
|
95
|
+
}, requestId);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.LearningStoreQValueHandler = LearningStoreQValueHandler;
|
|
100
|
+
//# sourceMappingURL=learning-store-qvalue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-store-qvalue.js","sourceRoot":"","sources":["../../../../src/mcp/handlers/learning/learning-store-qvalue.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,kDAA+D;AAc/D,MAAa,0BAA2B,SAAQ,0BAAW;IACzD,YACU,QAAwB,EACxB,YAA2B,EAC3B,aAAkC,EAClC,QAAwC;QAEhD,KAAK,EAAE,CAAC;QALA,aAAQ,GAAR,QAAQ,CAAgB;QACxB,iBAAY,GAAZ,YAAY,CAAe;QAC3B,kBAAa,GAAb,aAAa,CAAqB;QAClC,aAAQ,GAAR,QAAQ,CAAgC;IAGlD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,MAAM,EACJ,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAAW,GAAG,CAAC,EACf,QAAQ,GAAG,EAAE,EACd,GAAG,IAAI,CAAC;YAET,kBAAkB;YAClB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;YAE5E,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,qBAAqB;YACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,EAAE,GAAI,IAAI,CAAC,aAAqB,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,kCAAkC;YAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAG3B,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAsE,CAAC;YAE1G,IAAI,QAAgB,CAAC;YAErB,IAAI,QAAQ,EAAE,CAAC;gBACb,6CAA6C;gBAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,GAAG,WAAW,CAAC;gBAC3D,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,cAAc,CAAC;gBAE1G,4DAA4D;gBAC5D,4CAA4C;gBAC5C,EAAE,CAAC,OAAO,CAAC;;;;SAIV,CAAC,CAAC,GAAG,CACJ,cAAc,EACd,cAAc,EACd,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,QAAQ,CAAC,EAAE,CACZ,CAAC;gBAEF,QAAQ,GAAG,QAAQ,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAEjC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,QAAQ,EAAE,EAAE;oBAC/C,OAAO;oBACP,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,CAAC,OAAO;oBAC1B,QAAQ,EAAE,cAAc;oBACxB,WAAW,EAAE,cAAc;iBAC5B,CAAC,CAAC;YAEL,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,2DAA2D;gBAC3D,4CAA4C;gBAC5C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;SAKzB,CAAC,CAAC,GAAG,CACJ,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAAW,EACX,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAC;gBAEF,QAAQ,GAAG,QAAQ,MAAM,CAAC,eAAe,EAAE,CAAC;gBAE5C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,QAAQ,EAAE,EAAE;oBAC9C,OAAO;oBACP,QAAQ;oBACR,SAAS;oBACT,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,0EAA0E;YAC1E,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,EAAE;oBAC3C,OAAO;oBACP,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC,qBAAqB,CAAC;gBAChC,QAAQ;gBACR,OAAO,EAAE,WAAW,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,qBAAqB,OAAO,EAAE;aAClF,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvHD,gEAuHC"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -24,11 +24,22 @@ export declare class AgenticQEMCPServer {
|
|
|
24
24
|
private memoryStore;
|
|
25
25
|
private blackboard;
|
|
26
26
|
private proposals;
|
|
27
|
+
private eventBus;
|
|
28
|
+
private learningListener;
|
|
27
29
|
constructor();
|
|
28
30
|
/**
|
|
29
31
|
* Initialize tool handlers
|
|
30
32
|
*/
|
|
31
33
|
private initializeHandlers;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize Learning Event Listener (Phase 6 - Hybrid Approach)
|
|
36
|
+
*
|
|
37
|
+
* This sets up automatic learning persistence as a safety net when agents
|
|
38
|
+
* don't explicitly call MCP learning tools. It's part of our hybrid approach:
|
|
39
|
+
* - PRIMARY: Agents call MCP tools explicitly (Claude Flow's pattern)
|
|
40
|
+
* - FALLBACK: Event listener auto-stores (our innovation)
|
|
41
|
+
*/
|
|
42
|
+
private initializeLearningListener;
|
|
32
43
|
/**
|
|
33
44
|
* Setup MCP request handlers
|
|
34
45
|
*/
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAiGjF;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,gBAAgB,CAA+B;;IAgDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsJ1B;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuW5B;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIR;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAIzE;AAED;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB1C"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -8,6 +8,39 @@
|
|
|
8
8
|
* @version 1.0.0
|
|
9
9
|
* @author Agentic QE Team
|
|
10
10
|
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
11
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
45
|
exports.AgenticQEMCPServer = void 0;
|
|
13
46
|
exports.createAgenticQEServer = createAgenticQEServer;
|
|
@@ -15,6 +48,7 @@ exports.main = main;
|
|
|
15
48
|
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
16
49
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
17
50
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
51
|
+
const path = __importStar(require("path"));
|
|
18
52
|
const tools_js_1 = require("./tools.js");
|
|
19
53
|
const fleet_init_js_1 = require("./handlers/fleet-init.js");
|
|
20
54
|
const agent_spawn_js_1 = require("./handlers/agent-spawn.js");
|
|
@@ -70,6 +104,11 @@ const CoverageAnalyzeStreamHandler_js_1 = require("./streaming/CoverageAnalyzeSt
|
|
|
70
104
|
const Phase2Tools_js_1 = require("./handlers/phase2/Phase2Tools.js");
|
|
71
105
|
const Phase3DomainTools_js_1 = require("./handlers/phase3/Phase3DomainTools.js");
|
|
72
106
|
const events_1 = require("events");
|
|
107
|
+
const learning_store_experience_js_1 = require("./handlers/learning/learning-store-experience.js");
|
|
108
|
+
const learning_store_qvalue_js_1 = require("./handlers/learning/learning-store-qvalue.js");
|
|
109
|
+
const learning_query_js_1 = require("./handlers/learning/learning-query.js");
|
|
110
|
+
const learning_store_pattern_js_1 = require("./handlers/learning/learning-store-pattern.js");
|
|
111
|
+
const LearningEventListener_js_1 = require("./services/LearningEventListener.js");
|
|
73
112
|
// Phase 3: Domain-specific tool functions
|
|
74
113
|
const index_js_2 = require("./tools/qe/api-contract/index.js");
|
|
75
114
|
const index_js_3 = require("./tools/qe/test-data/index.js");
|
|
@@ -106,12 +145,19 @@ class AgenticQEMCPServer {
|
|
|
106
145
|
timeout: 30000
|
|
107
146
|
});
|
|
108
147
|
// Initialize shared memory structures for coordination
|
|
109
|
-
|
|
148
|
+
// Use persistent database for learning data (matches AgentRegistry path)
|
|
149
|
+
const dbPath = path.join(process.cwd(), '.agentic-qe', 'memory.db');
|
|
150
|
+
this.memory = new SwarmMemoryManager_js_1.SwarmMemoryManager(dbPath);
|
|
110
151
|
this.memoryStore = new Map();
|
|
111
152
|
this.blackboard = new Map();
|
|
112
153
|
this.proposals = new Map();
|
|
154
|
+
// Initialize event bus for learning event coordination
|
|
155
|
+
this.eventBus = new events_1.EventEmitter();
|
|
156
|
+
this.eventBus.setMaxListeners(100); // Support many concurrent agents
|
|
157
|
+
this.learningListener = null; // Will be initialized after handlers
|
|
113
158
|
this.handlers = new Map();
|
|
114
159
|
this.initializeHandlers();
|
|
160
|
+
this.initializeLearningListener(); // Initialize learning listener after handlers
|
|
115
161
|
this.setupRequestHandlers();
|
|
116
162
|
}
|
|
117
163
|
/**
|
|
@@ -200,6 +246,13 @@ class AgenticQEMCPServer {
|
|
|
200
246
|
this.handlers.set(tools_js_1.TOOL_NAMES.IMPROVEMENT_AB_TEST, phase2Handler);
|
|
201
247
|
this.handlers.set(tools_js_1.TOOL_NAMES.IMPROVEMENT_FAILURES, phase2Handler);
|
|
202
248
|
this.handlers.set(tools_js_1.TOOL_NAMES.PERFORMANCE_TRACK, phase2Handler);
|
|
249
|
+
// Phase 6: Learning Service Tools (Hybrid Approach - Option C)
|
|
250
|
+
// These tools enable learning persistence when using Claude Code Task tool
|
|
251
|
+
// Pass eventBus to enable explicit learning tracking (prevents duplicate auto-storage)
|
|
252
|
+
this.handlers.set(tools_js_1.TOOL_NAMES.LEARNING_STORE_EXPERIENCE, new learning_store_experience_js_1.LearningStoreExperienceHandler(this.registry, this.hookExecutor, this.memory, this.eventBus));
|
|
253
|
+
this.handlers.set(tools_js_1.TOOL_NAMES.LEARNING_STORE_QVALUE, new learning_store_qvalue_js_1.LearningStoreQValueHandler(this.registry, this.hookExecutor, this.memory, this.eventBus));
|
|
254
|
+
this.handlers.set(tools_js_1.TOOL_NAMES.LEARNING_STORE_PATTERN, new learning_store_pattern_js_1.LearningStorePatternHandler(this.registry, this.hookExecutor, this.memory, this.eventBus));
|
|
255
|
+
this.handlers.set(tools_js_1.TOOL_NAMES.LEARNING_QUERY, new learning_query_js_1.LearningQueryHandler(this.registry, this.hookExecutor, this.memory));
|
|
203
256
|
// Phase 3 Domain-Specific Tools Handler
|
|
204
257
|
const phase3Handler = new Phase3DomainTools_js_1.Phase3DomainToolsHandler(this.registry, this.hookExecutor);
|
|
205
258
|
// Coverage Domain Tools
|
|
@@ -240,6 +293,40 @@ class AgenticQEMCPServer {
|
|
|
240
293
|
this.handlers.set(tools_js_1.TOOL_NAMES.QE_QUALITYGATE_VALIDATE_METRICS, phase3Handler);
|
|
241
294
|
this.handlers.set(tools_js_1.TOOL_NAMES.QE_QUALITYGATE_GENERATE_REPORT, phase3Handler);
|
|
242
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* Initialize Learning Event Listener (Phase 6 - Hybrid Approach)
|
|
298
|
+
*
|
|
299
|
+
* This sets up automatic learning persistence as a safety net when agents
|
|
300
|
+
* don't explicitly call MCP learning tools. It's part of our hybrid approach:
|
|
301
|
+
* - PRIMARY: Agents call MCP tools explicitly (Claude Flow's pattern)
|
|
302
|
+
* - FALLBACK: Event listener auto-stores (our innovation)
|
|
303
|
+
*/
|
|
304
|
+
initializeLearningListener() {
|
|
305
|
+
try {
|
|
306
|
+
const storeExperienceHandler = this.handlers.get(tools_js_1.TOOL_NAMES.LEARNING_STORE_EXPERIENCE);
|
|
307
|
+
const storeQValueHandler = this.handlers.get(tools_js_1.TOOL_NAMES.LEARNING_STORE_QVALUE);
|
|
308
|
+
const storePatternHandler = this.handlers.get(tools_js_1.TOOL_NAMES.LEARNING_STORE_PATTERN);
|
|
309
|
+
if (!storeExperienceHandler || !storeQValueHandler || !storePatternHandler) {
|
|
310
|
+
console.warn('[AgenticQEMCPServer] Learning handlers not initialized - skipping event listener');
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
this.learningListener = (0, LearningEventListener_js_1.initLearningEventListener)(this.eventBus, this.memory, {
|
|
314
|
+
storeExperienceHandler,
|
|
315
|
+
storeQValueHandler,
|
|
316
|
+
storePatternHandler
|
|
317
|
+
}, {
|
|
318
|
+
enabled: true,
|
|
319
|
+
autoStore: true
|
|
320
|
+
});
|
|
321
|
+
console.log('[AgenticQEMCPServer] ✅ Learning Event Listener initialized (Hybrid Approach)');
|
|
322
|
+
console.log('[AgenticQEMCPServer] PRIMARY: Explicit MCP tool calls');
|
|
323
|
+
console.log('[AgenticQEMCPServer] FALLBACK: Automatic event-based persistence');
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
console.error('[AgenticQEMCPServer] Failed to initialize learning listener:', error);
|
|
327
|
+
this.learningListener = null;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
243
330
|
/**
|
|
244
331
|
* Setup MCP request handlers
|
|
245
332
|
*/
|
|
@@ -260,6 +347,14 @@ class AgenticQEMCPServer {
|
|
|
260
347
|
}
|
|
261
348
|
// Get handler
|
|
262
349
|
const handler = this.handlers.get(name);
|
|
350
|
+
// Phase 6 learning tools have dedicated handlers - call them directly
|
|
351
|
+
if (name === tools_js_1.TOOL_NAMES.LEARNING_STORE_EXPERIENCE ||
|
|
352
|
+
name === tools_js_1.TOOL_NAMES.LEARNING_STORE_QVALUE ||
|
|
353
|
+
name === tools_js_1.TOOL_NAMES.LEARNING_STORE_PATTERN ||
|
|
354
|
+
name === tools_js_1.TOOL_NAMES.LEARNING_QUERY) {
|
|
355
|
+
const result = await handler.handle(args || {});
|
|
356
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
357
|
+
}
|
|
263
358
|
// Special handling for Phase 2 tools - route to specific methods
|
|
264
359
|
if (name.startsWith('mcp__agentic_qe__learning_')) {
|
|
265
360
|
const phase2Handler = handler;
|
|
@@ -600,6 +695,8 @@ class AgenticQEMCPServer {
|
|
|
600
695
|
* Start the MCP server
|
|
601
696
|
*/
|
|
602
697
|
async start(transport) {
|
|
698
|
+
// Initialize database before starting server
|
|
699
|
+
await this.memory.initialize();
|
|
603
700
|
const serverTransport = transport || new stdio_js_1.StdioServerTransport();
|
|
604
701
|
await this.server.connect(serverTransport);
|
|
605
702
|
// Log to stderr to not interfere with MCP stdio protocol
|