agentic-qe 2.3.3 → 2.3.5

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.
Files changed (255) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +1 -1
  3. package/dist/agents/ApiContractValidatorAgent.d.ts +5 -0
  4. package/dist/agents/ApiContractValidatorAgent.d.ts.map +1 -1
  5. package/dist/agents/ApiContractValidatorAgent.js +41 -0
  6. package/dist/agents/ApiContractValidatorAgent.js.map +1 -1
  7. package/dist/agents/BaseAgent.d.ts +10 -0
  8. package/dist/agents/BaseAgent.d.ts.map +1 -1
  9. package/dist/agents/BaseAgent.js +113 -0
  10. package/dist/agents/BaseAgent.js.map +1 -1
  11. package/dist/agents/CodeComplexityAnalyzerAgent.d.ts +5 -0
  12. package/dist/agents/CodeComplexityAnalyzerAgent.d.ts.map +1 -1
  13. package/dist/agents/CodeComplexityAnalyzerAgent.js +47 -0
  14. package/dist/agents/CodeComplexityAnalyzerAgent.js.map +1 -1
  15. package/dist/agents/CoverageAnalyzerAgent.d.ts +26 -0
  16. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  17. package/dist/agents/CoverageAnalyzerAgent.js +149 -1
  18. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  19. package/dist/agents/DeploymentReadinessAgent.d.ts +5 -0
  20. package/dist/agents/DeploymentReadinessAgent.d.ts.map +1 -1
  21. package/dist/agents/DeploymentReadinessAgent.js +41 -0
  22. package/dist/agents/DeploymentReadinessAgent.js.map +1 -1
  23. package/dist/agents/FlakyTestHunterAgent.d.ts +5 -0
  24. package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
  25. package/dist/agents/FlakyTestHunterAgent.js +40 -0
  26. package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
  27. package/dist/agents/FleetCommanderAgent.d.ts +5 -0
  28. package/dist/agents/FleetCommanderAgent.d.ts.map +1 -1
  29. package/dist/agents/FleetCommanderAgent.js +51 -0
  30. package/dist/agents/FleetCommanderAgent.js.map +1 -1
  31. package/dist/agents/PerformanceTesterAgent.d.ts +5 -0
  32. package/dist/agents/PerformanceTesterAgent.d.ts.map +1 -1
  33. package/dist/agents/PerformanceTesterAgent.js +44 -0
  34. package/dist/agents/PerformanceTesterAgent.js.map +1 -1
  35. package/dist/agents/ProductionIntelligenceAgent.d.ts +5 -0
  36. package/dist/agents/ProductionIntelligenceAgent.d.ts.map +1 -1
  37. package/dist/agents/ProductionIntelligenceAgent.js +46 -0
  38. package/dist/agents/ProductionIntelligenceAgent.js.map +1 -1
  39. package/dist/agents/QXPartnerAgent.js +52 -0
  40. package/dist/agents/QXPartnerAgent.js.map +1 -1
  41. package/dist/agents/QualityAnalyzerAgent.d.ts +5 -0
  42. package/dist/agents/QualityAnalyzerAgent.d.ts.map +1 -1
  43. package/dist/agents/QualityAnalyzerAgent.js +45 -0
  44. package/dist/agents/QualityAnalyzerAgent.js.map +1 -1
  45. package/dist/agents/QualityGateAgent.d.ts +40 -0
  46. package/dist/agents/QualityGateAgent.d.ts.map +1 -1
  47. package/dist/agents/QualityGateAgent.js +227 -1
  48. package/dist/agents/QualityGateAgent.js.map +1 -1
  49. package/dist/agents/RegressionRiskAnalyzerAgent.d.ts +5 -0
  50. package/dist/agents/RegressionRiskAnalyzerAgent.d.ts.map +1 -1
  51. package/dist/agents/RegressionRiskAnalyzerAgent.js +46 -0
  52. package/dist/agents/RegressionRiskAnalyzerAgent.js.map +1 -1
  53. package/dist/agents/RequirementsValidatorAgent.d.ts +5 -0
  54. package/dist/agents/RequirementsValidatorAgent.d.ts.map +1 -1
  55. package/dist/agents/RequirementsValidatorAgent.js +42 -0
  56. package/dist/agents/RequirementsValidatorAgent.js.map +1 -1
  57. package/dist/agents/SecurityScannerAgent.d.ts +5 -0
  58. package/dist/agents/SecurityScannerAgent.d.ts.map +1 -1
  59. package/dist/agents/SecurityScannerAgent.js +39 -0
  60. package/dist/agents/SecurityScannerAgent.js.map +1 -1
  61. package/dist/agents/TestDataArchitectAgent.d.ts +5 -0
  62. package/dist/agents/TestDataArchitectAgent.d.ts.map +1 -1
  63. package/dist/agents/TestDataArchitectAgent.js +46 -0
  64. package/dist/agents/TestDataArchitectAgent.js.map +1 -1
  65. package/dist/agents/TestExecutorAgent.d.ts +5 -0
  66. package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
  67. package/dist/agents/TestExecutorAgent.js +48 -0
  68. package/dist/agents/TestExecutorAgent.js.map +1 -1
  69. package/dist/agents/TestGeneratorAgent.d.ts +5 -0
  70. package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
  71. package/dist/agents/TestGeneratorAgent.js +36 -0
  72. package/dist/agents/TestGeneratorAgent.js.map +1 -1
  73. package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
  74. package/dist/agents/lifecycle/AgentLifecycleManager.js +5 -2
  75. package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
  76. package/dist/cli/commands/dream/index.d.ts +50 -0
  77. package/dist/cli/commands/dream/index.d.ts.map +1 -0
  78. package/dist/cli/commands/dream/index.js +282 -0
  79. package/dist/cli/commands/dream/index.js.map +1 -0
  80. package/dist/cli/commands/learn/index.d.ts +31 -5
  81. package/dist/cli/commands/learn/index.d.ts.map +1 -1
  82. package/dist/cli/commands/learn/index.js +183 -50
  83. package/dist/cli/commands/learn/index.js.map +1 -1
  84. package/dist/cli/commands/transfer/index.d.ts +55 -0
  85. package/dist/cli/commands/transfer/index.d.ts.map +1 -0
  86. package/dist/cli/commands/transfer/index.js +317 -0
  87. package/dist/cli/commands/transfer/index.js.map +1 -0
  88. package/dist/cli/index.js +224 -3
  89. package/dist/cli/index.js.map +1 -1
  90. package/dist/cli/init/index.d.ts.map +1 -1
  91. package/dist/cli/init/index.js +12 -4
  92. package/dist/cli/init/index.js.map +1 -1
  93. package/dist/cli/init/learning-init.d.ts +39 -0
  94. package/dist/cli/init/learning-init.d.ts.map +1 -0
  95. package/dist/cli/init/learning-init.js +239 -0
  96. package/dist/cli/init/learning-init.js.map +1 -0
  97. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  98. package/dist/learning/baselines/BaselineCollector.d.ts +178 -0
  99. package/dist/learning/baselines/BaselineCollector.d.ts.map +1 -0
  100. package/dist/learning/baselines/BaselineCollector.js +398 -0
  101. package/dist/learning/baselines/BaselineCollector.js.map +1 -0
  102. package/dist/learning/baselines/StandardTaskSuite.d.ts +88 -0
  103. package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -0
  104. package/dist/learning/baselines/StandardTaskSuite.js +801 -0
  105. package/dist/learning/baselines/StandardTaskSuite.js.map +1 -0
  106. package/dist/learning/baselines/index.d.ts +10 -0
  107. package/dist/learning/baselines/index.d.ts.map +1 -0
  108. package/dist/learning/baselines/index.js +15 -0
  109. package/dist/learning/baselines/index.js.map +1 -0
  110. package/dist/learning/capture/ExecutionRecorder.d.ts +97 -0
  111. package/dist/learning/capture/ExecutionRecorder.d.ts.map +1 -0
  112. package/dist/learning/capture/ExecutionRecorder.js +195 -0
  113. package/dist/learning/capture/ExecutionRecorder.js.map +1 -0
  114. package/dist/learning/capture/ExperienceCapture.d.ts +177 -0
  115. package/dist/learning/capture/ExperienceCapture.d.ts.map +1 -0
  116. package/dist/learning/capture/ExperienceCapture.js +432 -0
  117. package/dist/learning/capture/ExperienceCapture.js.map +1 -0
  118. package/dist/learning/capture/ExperienceExtractor.d.ts +219 -0
  119. package/dist/learning/capture/ExperienceExtractor.d.ts.map +1 -0
  120. package/dist/learning/capture/ExperienceExtractor.js +536 -0
  121. package/dist/learning/capture/ExperienceExtractor.js.map +1 -0
  122. package/dist/learning/capture/ExperienceStore.d.ts +196 -0
  123. package/dist/learning/capture/ExperienceStore.d.ts.map +1 -0
  124. package/dist/learning/capture/ExperienceStore.js +453 -0
  125. package/dist/learning/capture/ExperienceStore.js.map +1 -0
  126. package/dist/learning/capture/index.d.ts +12 -0
  127. package/dist/learning/capture/index.d.ts.map +1 -0
  128. package/dist/learning/capture/index.js +17 -0
  129. package/dist/learning/capture/index.js.map +1 -0
  130. package/dist/learning/dashboard/MetricsDashboard.d.ts +63 -0
  131. package/dist/learning/dashboard/MetricsDashboard.d.ts.map +1 -0
  132. package/dist/learning/dashboard/MetricsDashboard.js +230 -0
  133. package/dist/learning/dashboard/MetricsDashboard.js.map +1 -0
  134. package/dist/learning/dashboard/index.d.ts +7 -0
  135. package/dist/learning/dashboard/index.d.ts.map +1 -0
  136. package/dist/learning/dashboard/index.js +23 -0
  137. package/dist/learning/dashboard/index.js.map +1 -0
  138. package/dist/learning/dream/ConceptGraph.d.ts +160 -0
  139. package/dist/learning/dream/ConceptGraph.d.ts.map +1 -0
  140. package/dist/learning/dream/ConceptGraph.js +445 -0
  141. package/dist/learning/dream/ConceptGraph.js.map +1 -0
  142. package/dist/learning/dream/DreamEngine.d.ts +150 -0
  143. package/dist/learning/dream/DreamEngine.d.ts.map +1 -0
  144. package/dist/learning/dream/DreamEngine.js +551 -0
  145. package/dist/learning/dream/DreamEngine.js.map +1 -0
  146. package/dist/learning/dream/InsightGenerator.d.ts +152 -0
  147. package/dist/learning/dream/InsightGenerator.d.ts.map +1 -0
  148. package/dist/learning/dream/InsightGenerator.js +463 -0
  149. package/dist/learning/dream/InsightGenerator.js.map +1 -0
  150. package/dist/learning/dream/SpreadingActivation.d.ts +138 -0
  151. package/dist/learning/dream/SpreadingActivation.d.ts.map +1 -0
  152. package/dist/learning/dream/SpreadingActivation.js +320 -0
  153. package/dist/learning/dream/SpreadingActivation.js.map +1 -0
  154. package/dist/learning/dream/index.d.ts +14 -0
  155. package/dist/learning/dream/index.d.ts.map +1 -0
  156. package/dist/learning/dream/index.js +22 -0
  157. package/dist/learning/dream/index.js.map +1 -0
  158. package/dist/learning/metrics/AlertManager.d.ts +107 -0
  159. package/dist/learning/metrics/AlertManager.d.ts.map +1 -0
  160. package/dist/learning/metrics/AlertManager.js +246 -0
  161. package/dist/learning/metrics/AlertManager.js.map +1 -0
  162. package/dist/learning/metrics/LearningMetrics.d.ts +184 -0
  163. package/dist/learning/metrics/LearningMetrics.d.ts.map +1 -0
  164. package/dist/learning/metrics/LearningMetrics.js +754 -0
  165. package/dist/learning/metrics/LearningMetrics.js.map +1 -0
  166. package/dist/learning/metrics/MetricsCollector.d.ts +108 -0
  167. package/dist/learning/metrics/MetricsCollector.d.ts.map +1 -0
  168. package/dist/learning/metrics/MetricsCollector.js +240 -0
  169. package/dist/learning/metrics/MetricsCollector.js.map +1 -0
  170. package/dist/learning/metrics/MetricsStore.d.ts +149 -0
  171. package/dist/learning/metrics/MetricsStore.d.ts.map +1 -0
  172. package/dist/learning/metrics/MetricsStore.js +502 -0
  173. package/dist/learning/metrics/MetricsStore.js.map +1 -0
  174. package/dist/learning/metrics/TrendAnalyzer.d.ts +85 -0
  175. package/dist/learning/metrics/TrendAnalyzer.d.ts.map +1 -0
  176. package/dist/learning/metrics/TrendAnalyzer.js +210 -0
  177. package/dist/learning/metrics/TrendAnalyzer.js.map +1 -0
  178. package/dist/learning/metrics/index.d.ts +13 -0
  179. package/dist/learning/metrics/index.d.ts.map +1 -0
  180. package/dist/learning/metrics/index.js +39 -0
  181. package/dist/learning/metrics/index.js.map +1 -0
  182. package/dist/learning/scheduler/IdleDetector.d.ts +126 -0
  183. package/dist/learning/scheduler/IdleDetector.d.ts.map +1 -0
  184. package/dist/learning/scheduler/IdleDetector.js +281 -0
  185. package/dist/learning/scheduler/IdleDetector.js.map +1 -0
  186. package/dist/learning/scheduler/SleepCycle.d.ts +150 -0
  187. package/dist/learning/scheduler/SleepCycle.d.ts.map +1 -0
  188. package/dist/learning/scheduler/SleepCycle.js +506 -0
  189. package/dist/learning/scheduler/SleepCycle.js.map +1 -0
  190. package/dist/learning/scheduler/SleepScheduler.d.ts +133 -0
  191. package/dist/learning/scheduler/SleepScheduler.d.ts.map +1 -0
  192. package/dist/learning/scheduler/SleepScheduler.js +301 -0
  193. package/dist/learning/scheduler/SleepScheduler.js.map +1 -0
  194. package/dist/learning/scheduler/TimeBasedTrigger.d.ts +108 -0
  195. package/dist/learning/scheduler/TimeBasedTrigger.d.ts.map +1 -0
  196. package/dist/learning/scheduler/TimeBasedTrigger.js +222 -0
  197. package/dist/learning/scheduler/TimeBasedTrigger.js.map +1 -0
  198. package/dist/learning/scheduler/index.d.ts +16 -0
  199. package/dist/learning/scheduler/index.d.ts.map +1 -0
  200. package/dist/learning/scheduler/index.js +23 -0
  201. package/dist/learning/scheduler/index.js.map +1 -0
  202. package/dist/learning/synthesis/ClusteringEngine.d.ts +122 -0
  203. package/dist/learning/synthesis/ClusteringEngine.d.ts.map +1 -0
  204. package/dist/learning/synthesis/ClusteringEngine.js +356 -0
  205. package/dist/learning/synthesis/ClusteringEngine.js.map +1 -0
  206. package/dist/learning/synthesis/PatternSynthesis.d.ts +162 -0
  207. package/dist/learning/synthesis/PatternSynthesis.d.ts.map +1 -0
  208. package/dist/learning/synthesis/PatternSynthesis.js +479 -0
  209. package/dist/learning/synthesis/PatternSynthesis.js.map +1 -0
  210. package/dist/learning/synthesis/index.d.ts +10 -0
  211. package/dist/learning/synthesis/index.d.ts.map +1 -0
  212. package/dist/learning/synthesis/index.js +14 -0
  213. package/dist/learning/synthesis/index.js.map +1 -0
  214. package/dist/learning/transfer/CompatibilityScorer.d.ts +115 -0
  215. package/dist/learning/transfer/CompatibilityScorer.d.ts.map +1 -0
  216. package/dist/learning/transfer/CompatibilityScorer.js +319 -0
  217. package/dist/learning/transfer/CompatibilityScorer.js.map +1 -0
  218. package/dist/learning/transfer/TransferProtocol.d.ts +172 -0
  219. package/dist/learning/transfer/TransferProtocol.d.ts.map +1 -0
  220. package/dist/learning/transfer/TransferProtocol.js +611 -0
  221. package/dist/learning/transfer/TransferProtocol.js.map +1 -0
  222. package/dist/learning/transfer/TransferPrototype.d.ts +93 -0
  223. package/dist/learning/transfer/TransferPrototype.d.ts.map +1 -0
  224. package/dist/learning/transfer/TransferPrototype.js +433 -0
  225. package/dist/learning/transfer/TransferPrototype.js.map +1 -0
  226. package/dist/learning/transfer/TransferRegistry.d.ts +245 -0
  227. package/dist/learning/transfer/TransferRegistry.d.ts.map +1 -0
  228. package/dist/learning/transfer/TransferRegistry.js +410 -0
  229. package/dist/learning/transfer/TransferRegistry.js.map +1 -0
  230. package/dist/learning/transfer/TransferValidator.d.ts +140 -0
  231. package/dist/learning/transfer/TransferValidator.d.ts.map +1 -0
  232. package/dist/learning/transfer/TransferValidator.js +413 -0
  233. package/dist/learning/transfer/TransferValidator.js.map +1 -0
  234. package/dist/learning/transfer/index.d.ts +14 -0
  235. package/dist/learning/transfer/index.d.ts.map +1 -0
  236. package/dist/learning/transfer/index.js +22 -0
  237. package/dist/learning/transfer/index.js.map +1 -0
  238. package/dist/mcp/handlers/task-orchestrate.d.ts +11 -0
  239. package/dist/mcp/handlers/task-orchestrate.d.ts.map +1 -1
  240. package/dist/mcp/handlers/task-orchestrate.js +297 -4
  241. package/dist/mcp/handlers/task-orchestrate.js.map +1 -1
  242. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts +26 -2
  243. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts.map +1 -1
  244. package/dist/mcp/handlers/test/test-generate-enhanced.js +159 -27
  245. package/dist/mcp/handlers/test/test-generate-enhanced.js.map +1 -1
  246. package/dist/mcp/server-instructions.d.ts +1 -1
  247. package/dist/mcp/server-instructions.js +1 -1
  248. package/dist/mcp/server.d.ts.map +1 -1
  249. package/dist/mcp/server.js +2 -1
  250. package/dist/mcp/server.js.map +1 -1
  251. package/dist/mcp/services/AgentRegistry.d.ts +6 -1
  252. package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
  253. package/dist/mcp/services/AgentRegistry.js +34 -3
  254. package/dist/mcp/services/AgentRegistry.js.map +1 -1
  255. package/package.json +5 -2
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ /**
3
+ * ExperienceCapture - Captures agent executions for learning
4
+ *
5
+ * Automatically captures agent execution data and stores it for later
6
+ * pattern synthesis during sleep cycles.
7
+ *
8
+ * Part of the Nightly-Learner Phase 1 implementation.
9
+ *
10
+ * @version 1.0.0
11
+ * @module src/learning/capture/ExperienceCapture
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.ExperienceCapture = void 0;
51
+ const events_1 = require("events");
52
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
53
+ const path = __importStar(require("path"));
54
+ const fs = __importStar(require("fs"));
55
+ const Logger_1 = require("../../utils/Logger");
56
+ const SecureRandom_1 = require("../../utils/SecureRandom");
57
+ /**
58
+ * ExperienceCapture captures and stores agent execution experiences
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const capture = new ExperienceCapture({ bufferSize: 50 });
63
+ * await capture.start();
64
+ *
65
+ * // Capture an execution
66
+ * await capture.captureExecution({
67
+ * agentId: 'agent-123',
68
+ * agentType: 'test-generator',
69
+ * taskType: 'unit-test-generation',
70
+ * // ...
71
+ * });
72
+ * ```
73
+ */
74
+ class ExperienceCapture extends events_1.EventEmitter {
75
+ /**
76
+ * Get or create the shared ExperienceCapture instance
77
+ * Uses singleton pattern to ensure all agents share the same capture buffer
78
+ */
79
+ static async getSharedInstance(config) {
80
+ if (ExperienceCapture.instance && ExperienceCapture.instance.isRunning) {
81
+ return ExperienceCapture.instance;
82
+ }
83
+ // Handle concurrent initialization
84
+ if (ExperienceCapture.instancePromise) {
85
+ return ExperienceCapture.instancePromise;
86
+ }
87
+ ExperienceCapture.instancePromise = (async () => {
88
+ if (!ExperienceCapture.instance) {
89
+ ExperienceCapture.instance = new ExperienceCapture(config);
90
+ }
91
+ if (!ExperienceCapture.instance.isRunning) {
92
+ await ExperienceCapture.instance.start();
93
+ }
94
+ return ExperienceCapture.instance;
95
+ })();
96
+ const instance = await ExperienceCapture.instancePromise;
97
+ ExperienceCapture.instancePromise = null;
98
+ return instance;
99
+ }
100
+ /**
101
+ * Reset the shared instance (for testing)
102
+ */
103
+ static resetInstance() {
104
+ if (ExperienceCapture.instance) {
105
+ ExperienceCapture.instance.stop().catch(() => { });
106
+ ExperienceCapture.instance = null;
107
+ }
108
+ ExperienceCapture.instancePromise = null;
109
+ }
110
+ constructor(config) {
111
+ super();
112
+ this.buffer = [];
113
+ this.flushTimer = null;
114
+ this.isRunning = false;
115
+ // Stats tracking
116
+ this.totalCaptured = 0;
117
+ this.totalFlushed = 0;
118
+ this.lastFlush = null;
119
+ this.byAgentType = {};
120
+ this.byTaskType = {};
121
+ this.successCount = 0;
122
+ this.logger = Logger_1.Logger.getInstance();
123
+ this.config = {
124
+ dbPath: config?.dbPath || path.join(process.cwd(), '.agentic-qe', 'memory.db'),
125
+ bufferSize: config?.bufferSize ?? 100,
126
+ flushInterval: config?.flushInterval ?? 30000,
127
+ debug: config?.debug ?? false,
128
+ };
129
+ // Ensure the directory exists before opening the database
130
+ const dbDir = path.dirname(this.config.dbPath);
131
+ if (!fs.existsSync(dbDir)) {
132
+ fs.mkdirSync(dbDir, { recursive: true });
133
+ }
134
+ this.db = new better_sqlite3_1.default(this.config.dbPath);
135
+ this.initializeSchema();
136
+ }
137
+ /**
138
+ * Initialize database schema for experience storage
139
+ */
140
+ initializeSchema() {
141
+ this.db.exec(`
142
+ CREATE TABLE IF NOT EXISTS captured_experiences (
143
+ id TEXT PRIMARY KEY,
144
+ agent_id TEXT NOT NULL,
145
+ agent_type TEXT NOT NULL,
146
+ task_type TEXT NOT NULL,
147
+ execution TEXT NOT NULL,
148
+ context TEXT NOT NULL,
149
+ outcome TEXT NOT NULL,
150
+ embedding BLOB,
151
+ created_at INTEGER NOT NULL,
152
+ processed INTEGER DEFAULT 0
153
+ );
154
+
155
+ CREATE INDEX IF NOT EXISTS idx_exp_agent_type ON captured_experiences(agent_type);
156
+ CREATE INDEX IF NOT EXISTS idx_exp_task_type ON captured_experiences(task_type);
157
+ CREATE INDEX IF NOT EXISTS idx_exp_created_at ON captured_experiences(created_at);
158
+ CREATE INDEX IF NOT EXISTS idx_exp_processed ON captured_experiences(processed);
159
+ `);
160
+ }
161
+ /**
162
+ * Start capturing experiences
163
+ */
164
+ async start() {
165
+ if (this.isRunning) {
166
+ this.logger.warn('[ExperienceCapture] Already running');
167
+ return;
168
+ }
169
+ this.isRunning = true;
170
+ // Start periodic flush
171
+ this.flushTimer = setInterval(() => this.flush(), this.config.flushInterval);
172
+ this.logger.info('[ExperienceCapture] Started', {
173
+ bufferSize: this.config.bufferSize,
174
+ flushInterval: this.config.flushInterval,
175
+ });
176
+ this.emit('started');
177
+ }
178
+ /**
179
+ * Stop capturing and flush remaining buffer
180
+ */
181
+ async stop() {
182
+ if (!this.isRunning)
183
+ return;
184
+ this.isRunning = false;
185
+ if (this.flushTimer) {
186
+ clearInterval(this.flushTimer);
187
+ this.flushTimer = null;
188
+ }
189
+ // Final flush
190
+ await this.flush();
191
+ this.logger.info('[ExperienceCapture] Stopped', {
192
+ totalCaptured: this.totalCaptured,
193
+ totalFlushed: this.totalFlushed,
194
+ });
195
+ this.emit('stopped');
196
+ }
197
+ /**
198
+ * Capture an agent execution event
199
+ */
200
+ async captureExecution(event) {
201
+ if (!this.isRunning) {
202
+ throw new Error('ExperienceCapture not running');
203
+ }
204
+ const experience = await this.extractExperience(event);
205
+ this.buffer.push(experience);
206
+ // Update stats
207
+ this.totalCaptured++;
208
+ this.byAgentType[event.agentType] = (this.byAgentType[event.agentType] || 0) + 1;
209
+ this.byTaskType[event.taskType] = (this.byTaskType[event.taskType] || 0) + 1;
210
+ if (event.success)
211
+ this.successCount++;
212
+ if (this.config.debug) {
213
+ this.logger.debug('[ExperienceCapture] Captured', {
214
+ id: experience.id,
215
+ agentType: event.agentType,
216
+ taskType: event.taskType,
217
+ bufferSize: this.buffer.length,
218
+ });
219
+ }
220
+ this.emit('captured', experience);
221
+ // Auto-flush if buffer is full
222
+ if (this.buffer.length >= this.config.bufferSize) {
223
+ await this.flush();
224
+ }
225
+ return experience.id;
226
+ }
227
+ /**
228
+ * Flush buffer to database
229
+ */
230
+ async flush() {
231
+ if (this.buffer.length === 0)
232
+ return 0;
233
+ const experiences = [...this.buffer];
234
+ this.buffer = [];
235
+ const stmt = this.db.prepare(`
236
+ INSERT INTO captured_experiences
237
+ (id, agent_id, agent_type, task_type, execution, context, outcome, embedding, created_at, processed)
238
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
239
+ `);
240
+ const insertMany = this.db.transaction((exps) => {
241
+ for (const exp of exps) {
242
+ stmt.run(exp.id, exp.agentId, exp.agentType, exp.taskType, JSON.stringify(exp.execution), JSON.stringify(exp.context), JSON.stringify(exp.outcome), exp.embedding ? Buffer.from(new Float32Array(exp.embedding).buffer) : null, exp.timestamp.getTime());
243
+ }
244
+ return exps.length;
245
+ });
246
+ const flushed = insertMany(experiences);
247
+ this.totalFlushed += flushed;
248
+ this.lastFlush = new Date();
249
+ this.logger.info('[ExperienceCapture] Flushed', { count: flushed });
250
+ this.emit('flushed', { count: flushed, experiences });
251
+ return flushed;
252
+ }
253
+ /**
254
+ * Get unprocessed experiences for learning
255
+ */
256
+ getUnprocessedExperiences(limit = 100) {
257
+ const rows = this.db.prepare(`
258
+ SELECT * FROM captured_experiences
259
+ WHERE processed = 0
260
+ ORDER BY created_at ASC
261
+ LIMIT ?
262
+ `).all(limit);
263
+ return rows.map(row => this.rowToExperience(row));
264
+ }
265
+ /**
266
+ * Get experiences by agent type
267
+ */
268
+ getExperiencesByAgentType(agentType, limit = 100) {
269
+ const rows = this.db.prepare(`
270
+ SELECT * FROM captured_experiences
271
+ WHERE agent_type = ?
272
+ ORDER BY created_at DESC
273
+ LIMIT ?
274
+ `).all(agentType, limit);
275
+ return rows.map(row => this.rowToExperience(row));
276
+ }
277
+ /**
278
+ * Get recent experiences
279
+ */
280
+ getRecentExperiences(hours = 24, limit = 100) {
281
+ const since = Date.now() - hours * 60 * 60 * 1000;
282
+ const rows = this.db.prepare(`
283
+ SELECT * FROM captured_experiences
284
+ WHERE created_at >= ?
285
+ ORDER BY created_at DESC
286
+ LIMIT ?
287
+ `).all(since, limit);
288
+ return rows.map(row => this.rowToExperience(row));
289
+ }
290
+ /**
291
+ * Mark experiences as processed
292
+ */
293
+ markAsProcessed(ids) {
294
+ const stmt = this.db.prepare(`
295
+ UPDATE captured_experiences SET processed = 1 WHERE id = ?
296
+ `);
297
+ const updateMany = this.db.transaction((expIds) => {
298
+ for (const id of expIds) {
299
+ stmt.run(id);
300
+ }
301
+ });
302
+ updateMany(ids);
303
+ }
304
+ /**
305
+ * Get capture statistics
306
+ */
307
+ getStats() {
308
+ return {
309
+ totalCaptured: this.totalCaptured,
310
+ totalFlushed: this.totalFlushed,
311
+ bufferSize: this.buffer.length,
312
+ lastFlush: this.lastFlush,
313
+ byAgentType: { ...this.byAgentType },
314
+ byTaskType: { ...this.byTaskType },
315
+ successRate: this.totalCaptured > 0 ? this.successCount / this.totalCaptured : 0,
316
+ };
317
+ }
318
+ /**
319
+ * Extract a CapturedExperience from an execution event
320
+ */
321
+ async extractExperience(event) {
322
+ // Extract patterns and decisions from output
323
+ const patternsUsed = this.extractPatterns(event.output);
324
+ const decisionsMade = this.extractDecisions(event.output);
325
+ const errorsEncountered = event.error ? [event.error.message] : [];
326
+ // Calculate quality score
327
+ const qualityScore = this.calculateQualityScore(event);
328
+ return {
329
+ id: `exp-${Date.now()}-${SecureRandom_1.SecureRandom.randomString(8, 'alphanumeric')}`,
330
+ agentId: event.agentId,
331
+ agentType: event.agentType,
332
+ taskType: event.taskType,
333
+ execution: {
334
+ input: event.input,
335
+ output: event.output,
336
+ duration: event.duration,
337
+ success: event.success,
338
+ },
339
+ context: {
340
+ patterns_used: patternsUsed,
341
+ decisions_made: decisionsMade,
342
+ errors_encountered: errorsEncountered,
343
+ },
344
+ outcome: {
345
+ quality_score: qualityScore,
346
+ coverage_delta: event.metrics?.coverage_delta || 0,
347
+ },
348
+ timestamp: event.timestamp,
349
+ };
350
+ }
351
+ /**
352
+ * Extract pattern IDs from execution output
353
+ */
354
+ extractPatterns(output) {
355
+ const patterns = [];
356
+ // Look for pattern references in output
357
+ if (output.patterns && Array.isArray(output.patterns)) {
358
+ patterns.push(...output.patterns.map((p) => p.id || String(p)));
359
+ }
360
+ if (output.patternsApplied && Array.isArray(output.patternsApplied)) {
361
+ patterns.push(...output.patternsApplied);
362
+ }
363
+ return patterns;
364
+ }
365
+ /**
366
+ * Extract decision points from execution output
367
+ */
368
+ extractDecisions(output) {
369
+ const decisions = [];
370
+ // Look for decision references in output
371
+ if (output.decisions && Array.isArray(output.decisions)) {
372
+ decisions.push(...output.decisions.map(String));
373
+ }
374
+ if (output.strategy) {
375
+ decisions.push(`strategy:${output.strategy}`);
376
+ }
377
+ if (output.framework) {
378
+ decisions.push(`framework:${output.framework}`);
379
+ }
380
+ return decisions;
381
+ }
382
+ /**
383
+ * Calculate a quality score for the execution
384
+ */
385
+ calculateQualityScore(event) {
386
+ let score = event.success ? 0.5 : 0.0;
387
+ // Bonus for metrics
388
+ if (event.metrics) {
389
+ if (event.metrics.coverage && event.metrics.coverage > 70) {
390
+ score += 0.2;
391
+ }
392
+ if (event.metrics.testsGenerated && event.metrics.testsGenerated > 5) {
393
+ score += 0.1;
394
+ }
395
+ if (event.metrics.duration && event.metrics.duration < 5000) {
396
+ score += 0.1; // Fast execution bonus
397
+ }
398
+ }
399
+ // Penalty for errors
400
+ if (event.error) {
401
+ score -= 0.2;
402
+ }
403
+ return Math.max(0, Math.min(1, score));
404
+ }
405
+ /**
406
+ * Convert database row to CapturedExperience
407
+ */
408
+ rowToExperience(row) {
409
+ return {
410
+ id: row.id,
411
+ agentId: row.agent_id,
412
+ agentType: row.agent_type,
413
+ taskType: row.task_type,
414
+ execution: JSON.parse(row.execution),
415
+ context: JSON.parse(row.context),
416
+ outcome: JSON.parse(row.outcome),
417
+ timestamp: new Date(row.created_at),
418
+ embedding: row.embedding ? Array.from(new Float32Array(row.embedding)) : undefined,
419
+ };
420
+ }
421
+ /**
422
+ * Close database connection
423
+ */
424
+ close() {
425
+ this.db.close();
426
+ }
427
+ }
428
+ exports.ExperienceCapture = ExperienceCapture;
429
+ ExperienceCapture.instance = null;
430
+ ExperienceCapture.instancePromise = null;
431
+ exports.default = ExperienceCapture;
432
+ //# sourceMappingURL=ExperienceCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperienceCapture.js","sourceRoot":"","sources":["../../../src/learning/capture/ExperienceCapture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * ExperienceExtractor - Extract learnable content from agent executions
3
+ *
4
+ * Analyzes agent execution events to extract:
5
+ * - Patterns and techniques used
6
+ * - Decisions made during execution
7
+ * - Errors encountered and handled
8
+ * - Quality metrics and scores
9
+ * - Vector embeddings for similarity search
10
+ *
11
+ * Part of the Nightly-Learner Phase 1 implementation.
12
+ *
13
+ * @version 1.0.0
14
+ * @module src/learning/capture/ExperienceExtractor
15
+ */
16
+ import { AgentExecutionEvent } from './ExperienceCapture';
17
+ /**
18
+ * Extracted content from an execution event
19
+ */
20
+ export interface ExtractedContent {
21
+ /** Patterns and techniques identified in the execution */
22
+ patterns: string[];
23
+ /** Decisions made during execution */
24
+ decisions: string[];
25
+ /** Errors encountered */
26
+ errors: string[];
27
+ /** Quality score (0-1) */
28
+ qualityScore: number;
29
+ /** Vector embedding for similarity search */
30
+ embedding?: number[];
31
+ /** Coverage metrics */
32
+ coverage?: {
33
+ delta: number;
34
+ total?: number;
35
+ };
36
+ /** Extraction metadata */
37
+ metadata: {
38
+ extractedAt: Date;
39
+ contentHash: string;
40
+ embeddingDimension?: number;
41
+ embeddingMethod?: 'hash' | 'ml';
42
+ };
43
+ }
44
+ /**
45
+ * Configuration for the experience extractor
46
+ */
47
+ export interface ExperienceExtractorConfig {
48
+ /** Enable embedding generation. Default: true */
49
+ generateEmbeddings?: boolean;
50
+ /** Use ML-based embeddings. Default: false (uses hash-based) */
51
+ useMLEmbeddings?: boolean;
52
+ /** Embedding dimension. Default: 256 */
53
+ embeddingDimension?: number;
54
+ /** Enable debug logging */
55
+ debug?: boolean;
56
+ }
57
+ /**
58
+ * Statistics for extraction operations
59
+ */
60
+ export interface ExtractionStats {
61
+ totalExtractions: number;
62
+ patternsExtracted: number;
63
+ decisionsExtracted: number;
64
+ errorsExtracted: number;
65
+ embeddingsGenerated: number;
66
+ avgQualityScore: number;
67
+ avgExtractionTime: number;
68
+ }
69
+ /**
70
+ * ExperienceExtractor extracts learnable content from agent executions
71
+ *
72
+ * Analyzes execution events to identify patterns, decisions, and quality metrics
73
+ * that can be used for learning and improvement.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const extractor = new ExperienceExtractor({
78
+ * generateEmbeddings: true,
79
+ * useMLEmbeddings: false
80
+ * });
81
+ *
82
+ * const content = await extractor.extract(executionEvent);
83
+ * console.log('Patterns:', content.patterns);
84
+ * console.log('Quality:', content.qualityScore);
85
+ * ```
86
+ */
87
+ export declare class ExperienceExtractor {
88
+ private config;
89
+ private logger;
90
+ private embeddingGenerator;
91
+ private totalExtractions;
92
+ private totalPatterns;
93
+ private totalDecisions;
94
+ private totalErrors;
95
+ private totalEmbeddings;
96
+ private totalQualityScore;
97
+ private totalExtractionTime;
98
+ constructor(config?: ExperienceExtractorConfig);
99
+ /**
100
+ * Extract learnable content from an agent execution event
101
+ *
102
+ * @param event - Agent execution event to analyze
103
+ * @returns Extracted content with patterns, decisions, and embeddings
104
+ */
105
+ extract(event: AgentExecutionEvent): Promise<ExtractedContent>;
106
+ /**
107
+ * Extract patterns used during execution
108
+ *
109
+ * Looks for:
110
+ * - Explicit pattern references in output
111
+ * - Testing frameworks and strategies
112
+ * - Code patterns and techniques
113
+ * - Quality engineering approaches
114
+ *
115
+ * @param output - Execution output data
116
+ * @returns Array of pattern identifiers
117
+ */
118
+ extractPatterns(output: Record<string, unknown>): string[];
119
+ /**
120
+ * Extract decisions made during execution
121
+ *
122
+ * Looks for:
123
+ * - Strategic choices
124
+ * - Configuration decisions
125
+ * - Implementation approaches
126
+ * - Trade-off evaluations
127
+ *
128
+ * @param output - Execution output data
129
+ * @returns Array of decision descriptions
130
+ */
131
+ extractDecisions(output: Record<string, unknown>): string[];
132
+ /**
133
+ * Extract errors encountered during execution
134
+ *
135
+ * @param event - Execution event
136
+ * @returns Array of error messages
137
+ */
138
+ private extractErrors;
139
+ /**
140
+ * Calculate quality score for the execution
141
+ *
142
+ * Scoring factors:
143
+ * - Success/failure (0.5 base)
144
+ * - Coverage metrics (+0.2)
145
+ * - Tests generated (+0.1)
146
+ * - Execution speed (+0.1)
147
+ * - Error penalties (-0.2)
148
+ *
149
+ * @param event - Execution event
150
+ * @returns Quality score between 0 and 1
151
+ */
152
+ calculateQualityScore(event: AgentExecutionEvent): number;
153
+ /**
154
+ * Generate embedding for execution content
155
+ *
156
+ * Creates a vector embedding of the execution's content for similarity search.
157
+ * Combines input, output, patterns, and decisions into a single representation.
158
+ *
159
+ * @param event - Execution event
160
+ * @returns Embedding result with vector and metadata
161
+ */
162
+ generateEmbedding(event: AgentExecutionEvent): Promise<{
163
+ embedding: number[];
164
+ dimension: number;
165
+ method: 'hash' | 'ml';
166
+ }>;
167
+ /**
168
+ * Extract coverage metrics from event
169
+ *
170
+ * @param event - Execution event
171
+ * @returns Coverage information
172
+ */
173
+ private extractCoverage;
174
+ /**
175
+ * Serialize execution content to text for embedding
176
+ *
177
+ * @param event - Execution event
178
+ * @returns Text representation
179
+ */
180
+ private serializeExecutionContent;
181
+ /**
182
+ * Create content hash for deduplication
183
+ *
184
+ * @param event - Execution event
185
+ * @returns Content hash
186
+ */
187
+ private createContentHash;
188
+ /**
189
+ * Hash a string using simple algorithm
190
+ *
191
+ * @param str - String to hash
192
+ * @returns Hash string
193
+ */
194
+ private hashString;
195
+ /**
196
+ * Get extraction statistics
197
+ *
198
+ * @returns Statistics about extraction operations
199
+ */
200
+ getStats(): ExtractionStats;
201
+ /**
202
+ * Reset statistics
203
+ */
204
+ resetStats(): void;
205
+ /**
206
+ * Update configuration
207
+ *
208
+ * @param config - New configuration values
209
+ */
210
+ updateConfig(config: Partial<ExperienceExtractorConfig>): void;
211
+ /**
212
+ * Get current configuration
213
+ *
214
+ * @returns Current configuration
215
+ */
216
+ getConfig(): Required<ExperienceExtractorConfig>;
217
+ }
218
+ export default ExperienceExtractor;
219
+ //# sourceMappingURL=ExperienceExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperienceExtractor.d.ts","sourceRoot":"","sources":["../../../src/learning/capture/ExperienceExtractor.ts"],"names":[],"mappings":"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"}