agentic-qe 3.3.2 → 3.3.3
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/helpers/statusline-v3.cjs +96 -27
- package/README.md +6 -3
- package/package.json +1 -1
- package/scripts/sync-claude-flow.cjs +99 -0
- package/v3/CHANGELOG.md +87 -0
- package/v3/README.md +9 -5
- package/v3/dist/cli/bundle.js +43386 -37651
- package/v3/dist/coordination/consensus/domain-findings.d.ts +202 -0
- package/v3/dist/coordination/consensus/domain-findings.d.ts.map +1 -0
- package/v3/dist/coordination/consensus/domain-findings.js +66 -0
- package/v3/dist/coordination/consensus/domain-findings.js.map +1 -0
- package/v3/dist/coordination/consensus/index.d.ts +2 -0
- package/v3/dist/coordination/consensus/index.d.ts.map +1 -1
- package/v3/dist/coordination/consensus/index.js +4 -0
- package/v3/dist/coordination/consensus/index.js.map +1 -1
- package/v3/dist/coordination/index.d.ts +1 -0
- package/v3/dist/coordination/index.d.ts.map +1 -1
- package/v3/dist/coordination/index.js +4 -0
- package/v3/dist/coordination/index.js.map +1 -1
- package/v3/dist/coordination/mixins/consensus-enabled-domain.d.ts +225 -0
- package/v3/dist/coordination/mixins/consensus-enabled-domain.d.ts.map +1 -0
- package/v3/dist/coordination/mixins/consensus-enabled-domain.js +466 -0
- package/v3/dist/coordination/mixins/consensus-enabled-domain.js.map +1 -0
- package/v3/dist/coordination/mixins/index.d.ts +14 -0
- package/v3/dist/coordination/mixins/index.d.ts.map +1 -0
- package/v3/dist/coordination/mixins/index.js +28 -0
- package/v3/dist/coordination/mixins/index.js.map +1 -0
- package/v3/dist/coordination/mixins/mincut-aware-domain.d.ts +227 -0
- package/v3/dist/coordination/mixins/mincut-aware-domain.d.ts.map +1 -0
- package/v3/dist/coordination/mixins/mincut-aware-domain.js +368 -0
- package/v3/dist/coordination/mixins/mincut-aware-domain.js.map +1 -0
- package/v3/dist/coordination/queen-coordinator.d.ts +10 -0
- package/v3/dist/coordination/queen-coordinator.d.ts.map +1 -1
- package/v3/dist/coordination/queen-coordinator.js +40 -0
- package/v3/dist/coordination/queen-coordinator.js.map +1 -1
- package/v3/dist/coordination/task-executor.d.ts +21 -1
- package/v3/dist/coordination/task-executor.d.ts.map +1 -1
- package/v3/dist/coordination/task-executor.js +222 -5
- package/v3/dist/coordination/task-executor.js.map +1 -1
- package/v3/dist/domains/chaos-resilience/coordinator.d.ts +92 -0
- package/v3/dist/domains/chaos-resilience/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/chaos-resilience/coordinator.js +241 -1
- package/v3/dist/domains/chaos-resilience/coordinator.js.map +1 -1
- package/v3/dist/domains/chaos-resilience/plugin.js +1 -1
- package/v3/dist/domains/chaos-resilience/plugin.js.map +1 -1
- package/v3/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +29 -2
- package/v3/dist/domains/chaos-resilience/services/chaos-engineer.d.ts.map +1 -1
- package/v3/dist/domains/chaos-resilience/services/chaos-engineer.js +62 -3
- package/v3/dist/domains/chaos-resilience/services/chaos-engineer.js.map +1 -1
- package/v3/dist/domains/code-intelligence/coordinator.d.ts +112 -0
- package/v3/dist/domains/code-intelligence/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/code-intelligence/coordinator.js +221 -0
- package/v3/dist/domains/code-intelligence/coordinator.js.map +1 -1
- package/v3/dist/domains/code-intelligence/services/knowledge-graph.d.ts +66 -2
- package/v3/dist/domains/code-intelligence/services/knowledge-graph.d.ts.map +1 -1
- package/v3/dist/domains/code-intelligence/services/knowledge-graph.js +253 -3
- package/v3/dist/domains/code-intelligence/services/knowledge-graph.js.map +1 -1
- package/v3/dist/domains/contract-testing/coordinator.d.ts +89 -1
- package/v3/dist/domains/contract-testing/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/contract-testing/coordinator.js +222 -1
- package/v3/dist/domains/contract-testing/coordinator.js.map +1 -1
- package/v3/dist/domains/contract-testing/interfaces.d.ts +29 -1
- package/v3/dist/domains/contract-testing/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/contract-testing/plugin.js +1 -1
- package/v3/dist/domains/contract-testing/plugin.js.map +1 -1
- package/v3/dist/domains/contract-testing/services/contract-validator.d.ts +29 -2
- package/v3/dist/domains/contract-testing/services/contract-validator.d.ts.map +1 -1
- package/v3/dist/domains/contract-testing/services/contract-validator.js +58 -3
- package/v3/dist/domains/contract-testing/services/contract-validator.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts +95 -2
- package/v3/dist/domains/coverage-analysis/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/coordinator.js +274 -6
- package/v3/dist/domains/coverage-analysis/coordinator.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +119 -3
- package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.js +267 -5
- package/v3/dist/domains/coverage-analysis/services/coverage-analyzer.js.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/gap-detector.d.ts +111 -2
- package/v3/dist/domains/coverage-analysis/services/gap-detector.d.ts.map +1 -1
- package/v3/dist/domains/coverage-analysis/services/gap-detector.js +231 -3
- package/v3/dist/domains/coverage-analysis/services/gap-detector.js.map +1 -1
- package/v3/dist/domains/defect-intelligence/coordinator.d.ts +80 -1
- package/v3/dist/domains/defect-intelligence/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/defect-intelligence/coordinator.js +262 -7
- package/v3/dist/domains/defect-intelligence/coordinator.js.map +1 -1
- package/v3/dist/domains/defect-intelligence/interfaces.d.ts +17 -0
- package/v3/dist/domains/defect-intelligence/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/defect-intelligence/services/defect-predictor.d.ts +91 -2
- package/v3/dist/domains/defect-intelligence/services/defect-predictor.d.ts.map +1 -1
- package/v3/dist/domains/defect-intelligence/services/defect-predictor.js +274 -7
- package/v3/dist/domains/defect-intelligence/services/defect-predictor.js.map +1 -1
- package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.d.ts +79 -2
- package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.d.ts.map +1 -1
- package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.js +259 -3
- package/v3/dist/domains/defect-intelligence/services/root-cause-analyzer.js.map +1 -1
- package/v3/dist/domains/domain-interface.d.ts +155 -0
- package/v3/dist/domains/domain-interface.d.ts.map +1 -1
- package/v3/dist/domains/domain-interface.js +140 -0
- package/v3/dist/domains/domain-interface.js.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.d.ts +88 -0
- package/v3/dist/domains/learning-optimization/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/coordinator.js +227 -1
- package/v3/dist/domains/learning-optimization/coordinator.js.map +1 -1
- package/v3/dist/domains/learning-optimization/index.d.ts +1 -1
- package/v3/dist/domains/learning-optimization/index.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/index.js.map +1 -1
- package/v3/dist/domains/learning-optimization/interfaces.d.ts +4 -0
- package/v3/dist/domains/learning-optimization/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/plugin.js +1 -1
- package/v3/dist/domains/learning-optimization/plugin.js.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts +54 -2
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts.map +1 -1
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js +90 -3
- package/v3/dist/domains/learning-optimization/services/learning-coordinator.js.map +1 -1
- package/v3/dist/domains/quality-assessment/coordinator.d.ts +104 -0
- package/v3/dist/domains/quality-assessment/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/quality-assessment/coordinator.js +354 -6
- package/v3/dist/domains/quality-assessment/coordinator.js.map +1 -1
- package/v3/dist/domains/quality-assessment/interfaces.d.ts +22 -0
- package/v3/dist/domains/quality-assessment/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/quality-assessment/services/deployment-advisor.d.ts +61 -2
- package/v3/dist/domains/quality-assessment/services/deployment-advisor.d.ts.map +1 -1
- package/v3/dist/domains/quality-assessment/services/deployment-advisor.js +213 -5
- package/v3/dist/domains/quality-assessment/services/deployment-advisor.js.map +1 -1
- package/v3/dist/domains/quality-assessment/services/quality-analyzer.d.ts +59 -4
- package/v3/dist/domains/quality-assessment/services/quality-analyzer.d.ts.map +1 -1
- package/v3/dist/domains/quality-assessment/services/quality-analyzer.js +195 -3
- package/v3/dist/domains/quality-assessment/services/quality-analyzer.js.map +1 -1
- package/v3/dist/domains/requirements-validation/coordinator.d.ts +78 -0
- package/v3/dist/domains/requirements-validation/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/requirements-validation/coordinator.js +189 -0
- package/v3/dist/domains/requirements-validation/coordinator.js.map +1 -1
- package/v3/dist/domains/requirements-validation/interfaces.d.ts +4 -0
- package/v3/dist/domains/requirements-validation/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/requirements-validation/services/requirements-validator.d.ts +106 -2
- package/v3/dist/domains/requirements-validation/services/requirements-validator.d.ts.map +1 -1
- package/v3/dist/domains/requirements-validation/services/requirements-validator.js +263 -3
- package/v3/dist/domains/requirements-validation/services/requirements-validator.js.map +1 -1
- package/v3/dist/domains/security-compliance/coordinator.d.ts +56 -1
- package/v3/dist/domains/security-compliance/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/security-compliance/coordinator.js +241 -17
- package/v3/dist/domains/security-compliance/coordinator.js.map +1 -1
- package/v3/dist/domains/security-compliance/interfaces.d.ts +2 -0
- package/v3/dist/domains/security-compliance/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/security-compliance/services/security-scanner.d.ts +33 -2
- package/v3/dist/domains/security-compliance/services/security-scanner.d.ts.map +1 -1
- package/v3/dist/domains/security-compliance/services/security-scanner.js +107 -3
- package/v3/dist/domains/security-compliance/services/security-scanner.js.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.d.ts +89 -0
- package/v3/dist/domains/test-execution/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/test-execution/coordinator.js +259 -2
- package/v3/dist/domains/test-execution/coordinator.js.map +1 -1
- package/v3/dist/domains/test-execution/services/test-executor.d.ts +30 -2
- package/v3/dist/domains/test-execution/services/test-executor.d.ts.map +1 -1
- package/v3/dist/domains/test-execution/services/test-executor.js +64 -3
- package/v3/dist/domains/test-execution/services/test-executor.js.map +1 -1
- package/v3/dist/domains/test-generation/coordinator.d.ts +97 -0
- package/v3/dist/domains/test-generation/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/test-generation/coordinator.js +237 -0
- package/v3/dist/domains/test-generation/coordinator.js.map +1 -1
- package/v3/dist/domains/test-generation/interfaces.d.ts +2 -0
- package/v3/dist/domains/test-generation/interfaces.d.ts.map +1 -1
- package/v3/dist/domains/test-generation/services/test-generator.d.ts +32 -0
- package/v3/dist/domains/test-generation/services/test-generator.d.ts.map +1 -1
- package/v3/dist/domains/test-generation/services/test-generator.js +158 -3
- package/v3/dist/domains/test-generation/services/test-generator.js.map +1 -1
- package/v3/dist/domains/visual-accessibility/coordinator.d.ts +77 -0
- package/v3/dist/domains/visual-accessibility/coordinator.d.ts.map +1 -1
- package/v3/dist/domains/visual-accessibility/coordinator.js +210 -2
- package/v3/dist/domains/visual-accessibility/coordinator.js.map +1 -1
- package/v3/dist/domains/visual-accessibility/plugin.d.ts.map +1 -1
- package/v3/dist/domains/visual-accessibility/plugin.js +3 -3
- package/v3/dist/domains/visual-accessibility/plugin.js.map +1 -1
- package/v3/dist/domains/visual-accessibility/services/visual-tester.d.ts +47 -2
- package/v3/dist/domains/visual-accessibility/services/visual-tester.d.ts.map +1 -1
- package/v3/dist/domains/visual-accessibility/services/visual-tester.js +87 -3
- package/v3/dist/domains/visual-accessibility/services/visual-tester.js.map +1 -1
- package/v3/dist/learning/experience-capture-middleware.d.ts +119 -0
- package/v3/dist/learning/experience-capture-middleware.d.ts.map +1 -0
- package/v3/dist/learning/experience-capture-middleware.js +416 -0
- package/v3/dist/learning/experience-capture-middleware.js.map +1 -0
- package/v3/dist/mcp/bundle.js +60723 -54421
- package/v3/dist/mcp/handlers/domain-handlers.d.ts +12 -13
- package/v3/dist/mcp/handlers/domain-handlers.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/index.d.ts +1 -1
- package/v3/dist/mcp/handlers/index.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/index.js +2 -2
- package/v3/dist/mcp/handlers/index.js.map +1 -1
- package/v3/dist/mcp/handlers/wrapped-domain-handlers.d.ts +30 -0
- package/v3/dist/mcp/handlers/wrapped-domain-handlers.d.ts.map +1 -0
- package/v3/dist/mcp/handlers/wrapped-domain-handlers.js +75 -0
- package/v3/dist/mcp/handlers/wrapped-domain-handlers.js.map +1 -0
- package/v3/dist/mcp/tools/chaos-resilience/inject.js +1 -1
- package/v3/dist/mcp/tools/chaos-resilience/inject.js.map +1 -1
- package/v3/dist/mcp/tools/contract-testing/validate.js +1 -1
- package/v3/dist/mcp/tools/contract-testing/validate.js.map +1 -1
- package/v3/dist/mcp/tools/learning-optimization/optimize.js +1 -1
- package/v3/dist/mcp/tools/learning-optimization/optimize.js.map +1 -1
- package/v3/dist/mcp/tools/visual-accessibility/index.js +2 -2
- package/v3/dist/mcp/tools/visual-accessibility/index.js.map +1 -1
- package/v3/dist/routing/qe-agent-registry.d.ts +1 -1
- package/v3/dist/routing/qe-agent-registry.d.ts.map +1 -1
- package/v3/dist/routing/qe-agent-registry.js +20 -1
- package/v3/dist/routing/qe-agent-registry.js.map +1 -1
- package/v3/dist/sync/claude-flow-bridge.d.ts +63 -0
- package/v3/dist/sync/claude-flow-bridge.d.ts.map +1 -0
- package/v3/dist/sync/claude-flow-bridge.js +320 -0
- package/v3/dist/sync/claude-flow-bridge.js.map +1 -0
- package/v3/package.json +1 -1
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experience Capture Middleware
|
|
3
|
+
*
|
|
4
|
+
* Wraps domain task execution to automatically capture experiences
|
|
5
|
+
* to the V3 database for cross-session learning.
|
|
6
|
+
*
|
|
7
|
+
* This middleware ensures ALL invocation paths (MCP, CLI, direct) capture learning:
|
|
8
|
+
* - Starts experience tracking before execution
|
|
9
|
+
* - Records steps during execution
|
|
10
|
+
* - Persists outcome to V3 database after completion
|
|
11
|
+
*
|
|
12
|
+
* ADR-051: Unified learning capture across all execution paths
|
|
13
|
+
*/
|
|
14
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
+
import { getUnifiedMemory } from '../kernel/unified-memory.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Active Experience Tracking
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/** Maximum time an experience can be active before cleanup (10 minutes) */
|
|
20
|
+
const EXPERIENCE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
21
|
+
/** Interval for cleanup checks (2 minutes) */
|
|
22
|
+
const CLEANUP_INTERVAL_MS = 2 * 60 * 1000;
|
|
23
|
+
/** Maximum size for JSON serialization (1MB) to prevent DoS via large payloads */
|
|
24
|
+
const MAX_JSON_SIZE_BYTES = 1024 * 1024;
|
|
25
|
+
/**
|
|
26
|
+
* Safely stringify JSON with size limit to prevent memory exhaustion
|
|
27
|
+
* Returns null if serialization fails or exceeds size limit
|
|
28
|
+
*/
|
|
29
|
+
function safeJsonStringify(value, maxSize = MAX_JSON_SIZE_BYTES) {
|
|
30
|
+
if (value === undefined || value === null) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const json = JSON.stringify(value);
|
|
35
|
+
if (json.length > maxSize) {
|
|
36
|
+
console.warn(`[ExperienceCaptureMiddleware] JSON payload exceeds size limit ` +
|
|
37
|
+
`(${json.length} > ${maxSize} bytes), truncating`);
|
|
38
|
+
// Return truncated version with marker
|
|
39
|
+
return JSON.stringify({
|
|
40
|
+
_truncated: true,
|
|
41
|
+
_originalSize: json.length,
|
|
42
|
+
_preview: typeof value === 'object' ? Object.keys(value).slice(0, 10) : String(value).slice(0, 100),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return json;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.warn('[ExperienceCaptureMiddleware] Failed to serialize JSON:', error);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const activeExperiences = new Map();
|
|
53
|
+
let cleanupTimer = null;
|
|
54
|
+
/**
|
|
55
|
+
* Clean up stale experiences that have been active longer than EXPERIENCE_TIMEOUT_MS
|
|
56
|
+
* This prevents memory leaks from experiences that were started but never completed.
|
|
57
|
+
*/
|
|
58
|
+
export function cleanupStaleExperiences() {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
let cleaned = 0;
|
|
61
|
+
for (const [id, experience] of activeExperiences) {
|
|
62
|
+
const ageMs = now - experience.context.startedAt.getTime();
|
|
63
|
+
if (ageMs > EXPERIENCE_TIMEOUT_MS) {
|
|
64
|
+
console.warn(`[ExperienceCaptureMiddleware] Cleaning up stale experience: ${id} ` +
|
|
65
|
+
`(age=${Math.round(ageMs / 1000)}s, domain=${experience.context.domain})`);
|
|
66
|
+
activeExperiences.delete(id);
|
|
67
|
+
cleaned++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (cleaned > 0) {
|
|
71
|
+
console.log(`[ExperienceCaptureMiddleware] Cleaned ${cleaned} stale experiences`);
|
|
72
|
+
}
|
|
73
|
+
return cleaned;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Start periodic cleanup of stale experiences
|
|
77
|
+
*/
|
|
78
|
+
function startCleanupTimer() {
|
|
79
|
+
if (cleanupTimer)
|
|
80
|
+
return;
|
|
81
|
+
cleanupTimer = setInterval(() => {
|
|
82
|
+
cleanupStaleExperiences();
|
|
83
|
+
}, CLEANUP_INTERVAL_MS);
|
|
84
|
+
// Don't keep the process alive just for cleanup
|
|
85
|
+
cleanupTimer.unref();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Stop the cleanup timer (for testing or shutdown)
|
|
89
|
+
*/
|
|
90
|
+
export function stopCleanupTimer() {
|
|
91
|
+
if (cleanupTimer) {
|
|
92
|
+
clearInterval(cleanupTimer);
|
|
93
|
+
cleanupTimer = null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// Middleware Implementation
|
|
98
|
+
// ============================================================================
|
|
99
|
+
let memoryManager = null;
|
|
100
|
+
// Promise-based lock to prevent initialization race conditions
|
|
101
|
+
let initPromise = null;
|
|
102
|
+
/**
|
|
103
|
+
* Initialize the experience capture middleware
|
|
104
|
+
*/
|
|
105
|
+
export async function initializeExperienceCapture() {
|
|
106
|
+
// Use promise-based lock to prevent concurrent initialization
|
|
107
|
+
if (initPromise) {
|
|
108
|
+
return initPromise;
|
|
109
|
+
}
|
|
110
|
+
initPromise = doInitialize();
|
|
111
|
+
return initPromise;
|
|
112
|
+
}
|
|
113
|
+
async function doInitialize() {
|
|
114
|
+
try {
|
|
115
|
+
memoryManager = getUnifiedMemory();
|
|
116
|
+
await memoryManager.initialize();
|
|
117
|
+
// Ensure experience tables exist
|
|
118
|
+
const db = memoryManager.getDatabase();
|
|
119
|
+
if (db) {
|
|
120
|
+
db.exec(`
|
|
121
|
+
CREATE TABLE IF NOT EXISTS captured_experiences (
|
|
122
|
+
id TEXT PRIMARY KEY,
|
|
123
|
+
task TEXT NOT NULL,
|
|
124
|
+
agent TEXT NOT NULL,
|
|
125
|
+
domain TEXT NOT NULL,
|
|
126
|
+
success INTEGER NOT NULL DEFAULT 0,
|
|
127
|
+
quality REAL NOT NULL DEFAULT 0.5,
|
|
128
|
+
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
129
|
+
model_tier INTEGER,
|
|
130
|
+
routing_json TEXT,
|
|
131
|
+
steps_json TEXT,
|
|
132
|
+
result_json TEXT,
|
|
133
|
+
error TEXT,
|
|
134
|
+
started_at TEXT NOT NULL,
|
|
135
|
+
completed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
136
|
+
source TEXT DEFAULT 'middleware'
|
|
137
|
+
);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_captured_exp_domain ON captured_experiences(domain);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_captured_exp_success ON captured_experiences(success);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_captured_exp_agent ON captured_experiences(agent);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_captured_exp_completed ON captured_experiences(completed_at DESC);
|
|
142
|
+
`);
|
|
143
|
+
}
|
|
144
|
+
// Start periodic cleanup of stale experiences
|
|
145
|
+
startCleanupTimer();
|
|
146
|
+
console.log('[ExperienceCaptureMiddleware] Initialized');
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
console.error('[ExperienceCaptureMiddleware] Failed to initialize:', error);
|
|
150
|
+
// Reset promise to allow retry on next call
|
|
151
|
+
initPromise = null;
|
|
152
|
+
// Don't throw - allow system to continue without capture
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Start capturing an experience
|
|
157
|
+
*/
|
|
158
|
+
export function startExperience(task, agent, domain, options) {
|
|
159
|
+
const id = `exp-${uuidv4()}`;
|
|
160
|
+
const context = {
|
|
161
|
+
id,
|
|
162
|
+
task,
|
|
163
|
+
agent,
|
|
164
|
+
domain,
|
|
165
|
+
startedAt: new Date(),
|
|
166
|
+
modelTier: options?.modelTier,
|
|
167
|
+
routing: options?.routing,
|
|
168
|
+
};
|
|
169
|
+
activeExperiences.set(id, {
|
|
170
|
+
context,
|
|
171
|
+
steps: [],
|
|
172
|
+
});
|
|
173
|
+
return id;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Record a step in an active experience
|
|
177
|
+
*/
|
|
178
|
+
export function recordExperienceStep(experienceId, step) {
|
|
179
|
+
const experience = activeExperiences.get(experienceId);
|
|
180
|
+
if (!experience) {
|
|
181
|
+
console.warn(`[ExperienceCaptureMiddleware] Unknown experience: ${experienceId}`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
experience.steps.push(step);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Complete an experience and persist to database
|
|
188
|
+
*/
|
|
189
|
+
export async function completeExperience(experienceId, success, result, error) {
|
|
190
|
+
const experience = activeExperiences.get(experienceId);
|
|
191
|
+
if (!experience) {
|
|
192
|
+
console.warn(`[ExperienceCaptureMiddleware] Unknown experience: ${experienceId}`);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const { context, steps } = experience;
|
|
196
|
+
const endedAt = new Date();
|
|
197
|
+
const durationMs = endedAt.getTime() - context.startedAt.getTime();
|
|
198
|
+
// Calculate quality from steps or default
|
|
199
|
+
const quality = steps.length > 0
|
|
200
|
+
? steps.reduce((sum, s) => sum + s.quality, 0) / steps.length
|
|
201
|
+
: (success ? 0.7 : 0.3);
|
|
202
|
+
const outcome = {
|
|
203
|
+
id: experienceId,
|
|
204
|
+
success,
|
|
205
|
+
quality,
|
|
206
|
+
durationMs,
|
|
207
|
+
error,
|
|
208
|
+
steps,
|
|
209
|
+
result,
|
|
210
|
+
};
|
|
211
|
+
// Remove from active tracking
|
|
212
|
+
activeExperiences.delete(experienceId);
|
|
213
|
+
// Persist to database
|
|
214
|
+
await persistExperience(context, outcome);
|
|
215
|
+
// Also persist to sona_patterns for learning
|
|
216
|
+
await persistToSonaPatterns(context, outcome);
|
|
217
|
+
console.log(`[ExperienceCaptureMiddleware] Captured: ${context.domain}/${context.agent} ` +
|
|
218
|
+
`success=${success} quality=${quality.toFixed(2)} duration=${durationMs}ms ` +
|
|
219
|
+
`steps=${steps.length}`);
|
|
220
|
+
return outcome;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Persist experience to captured_experiences table
|
|
224
|
+
*/
|
|
225
|
+
async function persistExperience(context, outcome) {
|
|
226
|
+
// Ensure initialized (idempotent - returns immediately if already initialized)
|
|
227
|
+
await initializeExperienceCapture();
|
|
228
|
+
if (!memoryManager) {
|
|
229
|
+
console.warn('[ExperienceCaptureMiddleware] Memory manager not available');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const db = memoryManager.getDatabase();
|
|
234
|
+
if (!db)
|
|
235
|
+
return;
|
|
236
|
+
const stmt = db.prepare(`
|
|
237
|
+
INSERT OR REPLACE INTO captured_experiences
|
|
238
|
+
(id, task, agent, domain, success, quality, duration_ms, model_tier,
|
|
239
|
+
routing_json, steps_json, result_json, error, started_at, completed_at, source)
|
|
240
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), ?)
|
|
241
|
+
`);
|
|
242
|
+
stmt.run(outcome.id, context.task, context.agent, context.domain, outcome.success ? 1 : 0, outcome.quality, outcome.durationMs, context.modelTier || null, safeJsonStringify(context.routing), safeJsonStringify(outcome.steps), safeJsonStringify(outcome.result), outcome.error || null, context.startedAt.toISOString(), 'middleware');
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error('[ExperienceCaptureMiddleware] Failed to persist experience:', error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Persist to sona_patterns for learning integration
|
|
250
|
+
*/
|
|
251
|
+
async function persistToSonaPatterns(context, outcome) {
|
|
252
|
+
if (!memoryManager)
|
|
253
|
+
return;
|
|
254
|
+
try {
|
|
255
|
+
const db = memoryManager.getDatabase();
|
|
256
|
+
if (!db)
|
|
257
|
+
return;
|
|
258
|
+
// Only store successful patterns with decent quality
|
|
259
|
+
if (!outcome.success || outcome.quality < 0.5)
|
|
260
|
+
return;
|
|
261
|
+
const stmt = db.prepare(`
|
|
262
|
+
INSERT OR REPLACE INTO sona_patterns
|
|
263
|
+
(id, type, domain, action_type, action_value,
|
|
264
|
+
outcome_reward, outcome_success, outcome_quality,
|
|
265
|
+
confidence, usage_count, metadata, created_at, updated_at)
|
|
266
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))
|
|
267
|
+
`);
|
|
268
|
+
stmt.run(`sona-${outcome.id}`, 'task-execution', context.domain, context.agent, safeJsonStringify({ task: context.task.slice(0, 200) }), outcome.quality, 1, outcome.quality, outcome.quality, 1, safeJsonStringify({
|
|
269
|
+
experienceId: outcome.id,
|
|
270
|
+
durationMs: outcome.durationMs,
|
|
271
|
+
stepsCount: outcome.steps.length,
|
|
272
|
+
modelTier: context.modelTier,
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
// Log but don't fail - sona_patterns might not exist
|
|
277
|
+
console.warn('[ExperienceCaptureMiddleware] Failed to persist to sona_patterns:', error);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Handler Wrapper
|
|
282
|
+
// ============================================================================
|
|
283
|
+
/**
|
|
284
|
+
* Wrap an async handler function to capture experiences
|
|
285
|
+
*
|
|
286
|
+
* Usage:
|
|
287
|
+
* ```typescript
|
|
288
|
+
* const wrappedHandler = wrapWithExperienceCapture(
|
|
289
|
+
* handleTestGenerate,
|
|
290
|
+
* 'test-generation',
|
|
291
|
+
* 'test-generator'
|
|
292
|
+
* );
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
export function wrapWithExperienceCapture(handler, domain, agent) {
|
|
296
|
+
return async (params) => {
|
|
297
|
+
// Ensure initialized (idempotent - returns immediately if already initialized)
|
|
298
|
+
await initializeExperienceCapture();
|
|
299
|
+
// Extract task description from params if available
|
|
300
|
+
const task = extractTaskDescription(params, domain);
|
|
301
|
+
// Extract routing info if available
|
|
302
|
+
const routing = extractRouting(params);
|
|
303
|
+
// Start experience capture
|
|
304
|
+
const expId = startExperience(task, agent, domain, {
|
|
305
|
+
modelTier: routing?.tier,
|
|
306
|
+
routing,
|
|
307
|
+
});
|
|
308
|
+
const startTime = Date.now();
|
|
309
|
+
try {
|
|
310
|
+
// Execute the handler
|
|
311
|
+
const result = await handler(params);
|
|
312
|
+
const durationMs = Date.now() - startTime;
|
|
313
|
+
// Record execution step
|
|
314
|
+
recordExperienceStep(expId, {
|
|
315
|
+
action: `execute-${domain}`,
|
|
316
|
+
result: result.success ? 'success' : 'failure',
|
|
317
|
+
quality: result.success ? 0.8 : 0.2,
|
|
318
|
+
durationMs,
|
|
319
|
+
data: result.data ? { hasData: true } : undefined,
|
|
320
|
+
});
|
|
321
|
+
// Complete experience
|
|
322
|
+
await completeExperience(expId, result.success, result.data, result.error);
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
const durationMs = Date.now() - startTime;
|
|
327
|
+
// Record failure step
|
|
328
|
+
recordExperienceStep(expId, {
|
|
329
|
+
action: `execute-${domain}`,
|
|
330
|
+
result: 'failure',
|
|
331
|
+
quality: 0.0,
|
|
332
|
+
durationMs,
|
|
333
|
+
});
|
|
334
|
+
// Complete with error
|
|
335
|
+
await completeExperience(expId, false, undefined, error instanceof Error ? error.message : String(error));
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// ============================================================================
|
|
341
|
+
// Helper Functions
|
|
342
|
+
// ============================================================================
|
|
343
|
+
function extractTaskDescription(params, domain) {
|
|
344
|
+
if (!params || typeof params !== 'object') {
|
|
345
|
+
return `Execute ${domain} task`;
|
|
346
|
+
}
|
|
347
|
+
const p = params;
|
|
348
|
+
// Try common task description fields
|
|
349
|
+
if (typeof p.task === 'string')
|
|
350
|
+
return p.task;
|
|
351
|
+
if (typeof p.description === 'string')
|
|
352
|
+
return p.description;
|
|
353
|
+
if (typeof p.sourceCode === 'string')
|
|
354
|
+
return `Generate tests for code (${p.sourceCode.length} chars)`;
|
|
355
|
+
if (typeof p.target === 'string')
|
|
356
|
+
return `Analyze ${p.target}`;
|
|
357
|
+
if (typeof p.url === 'string')
|
|
358
|
+
return `Test accessibility for ${p.url}`;
|
|
359
|
+
if (Array.isArray(p.testFiles))
|
|
360
|
+
return `Execute ${p.testFiles.length} test files`;
|
|
361
|
+
return `Execute ${domain} task`;
|
|
362
|
+
}
|
|
363
|
+
function extractRouting(params) {
|
|
364
|
+
if (!params || typeof params !== 'object')
|
|
365
|
+
return undefined;
|
|
366
|
+
const p = params;
|
|
367
|
+
const routing = p.routing;
|
|
368
|
+
if (!routing)
|
|
369
|
+
return undefined;
|
|
370
|
+
return {
|
|
371
|
+
tier: typeof routing.tier === 'number' ? routing.tier : 0,
|
|
372
|
+
modelId: typeof routing.modelId === 'string' ? routing.modelId : 'unknown',
|
|
373
|
+
useAgentBooster: !!routing.useAgentBooster,
|
|
374
|
+
complexity: typeof routing.complexity === 'number' ? routing.complexity : 0,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
export async function getCaptureStats() {
|
|
378
|
+
const stats = {
|
|
379
|
+
activeExperiences: activeExperiences.size,
|
|
380
|
+
totalCaptured: 0,
|
|
381
|
+
byDomain: {},
|
|
382
|
+
bySuccess: { success: 0, failure: 0 },
|
|
383
|
+
avgQuality: 0,
|
|
384
|
+
};
|
|
385
|
+
if (!memoryManager)
|
|
386
|
+
return stats;
|
|
387
|
+
try {
|
|
388
|
+
const db = memoryManager.getDatabase();
|
|
389
|
+
if (!db)
|
|
390
|
+
return stats;
|
|
391
|
+
// Total captured
|
|
392
|
+
const total = db.prepare('SELECT COUNT(*) as count FROM captured_experiences').get();
|
|
393
|
+
stats.totalCaptured = total?.count || 0;
|
|
394
|
+
// By domain
|
|
395
|
+
const byDomain = db.prepare('SELECT domain, COUNT(*) as count FROM captured_experiences GROUP BY domain').all();
|
|
396
|
+
for (const row of byDomain) {
|
|
397
|
+
stats.byDomain[row.domain] = row.count;
|
|
398
|
+
}
|
|
399
|
+
// By success
|
|
400
|
+
const bySuccess = db.prepare('SELECT success, COUNT(*) as count FROM captured_experiences GROUP BY success').all();
|
|
401
|
+
for (const row of bySuccess) {
|
|
402
|
+
if (row.success === 1)
|
|
403
|
+
stats.bySuccess.success = row.count;
|
|
404
|
+
else
|
|
405
|
+
stats.bySuccess.failure = row.count;
|
|
406
|
+
}
|
|
407
|
+
// Average quality
|
|
408
|
+
const avgQuality = db.prepare('SELECT AVG(quality) as avg FROM captured_experiences WHERE success = 1').get();
|
|
409
|
+
stats.avgQuality = avgQuality?.avg || 0;
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
console.error('[ExperienceCaptureMiddleware] Failed to get stats:', error);
|
|
413
|
+
}
|
|
414
|
+
return stats;
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=experience-capture-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience-capture-middleware.js","sourceRoot":"","sources":["../../src/learning/experience-capture-middleware.ts"],"names":[],"mappings":"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"}
|