agentic-qe 3.7.6 → 3.7.8

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 (171) hide show
  1. package/.claude/helpers/statusline-v3.cjs +13 -1
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +39 -0
  4. package/README.md +36 -0
  5. package/dist/cli/bundle.js +2052 -183
  6. package/dist/coordination/complexity-composition/index.d.ts +2 -0
  7. package/dist/coordination/complexity-composition/index.d.ts.map +1 -0
  8. package/dist/coordination/complexity-composition/index.js +2 -0
  9. package/dist/coordination/complexity-composition/index.js.map +1 -0
  10. package/dist/coordination/complexity-composition/team-composer.d.ts +72 -0
  11. package/dist/coordination/complexity-composition/team-composer.d.ts.map +1 -0
  12. package/dist/coordination/complexity-composition/team-composer.js +221 -0
  13. package/dist/coordination/complexity-composition/team-composer.js.map +1 -0
  14. package/dist/coordination/consensus/consensus-engine.d.ts +10 -1
  15. package/dist/coordination/consensus/consensus-engine.d.ts.map +1 -1
  16. package/dist/coordination/consensus/consensus-engine.js +31 -1
  17. package/dist/coordination/consensus/consensus-engine.js.map +1 -1
  18. package/dist/coordination/consensus/index.d.ts +1 -0
  19. package/dist/coordination/consensus/index.d.ts.map +1 -1
  20. package/dist/coordination/consensus/index.js +4 -0
  21. package/dist/coordination/consensus/index.js.map +1 -1
  22. package/dist/coordination/consensus/interfaces.d.ts +5 -0
  23. package/dist/coordination/consensus/interfaces.d.ts.map +1 -1
  24. package/dist/coordination/consensus/interfaces.js +1 -0
  25. package/dist/coordination/consensus/interfaces.js.map +1 -1
  26. package/dist/coordination/consensus/sycophancy-scorer.d.ts +62 -0
  27. package/dist/coordination/consensus/sycophancy-scorer.d.ts.map +1 -0
  28. package/dist/coordination/consensus/sycophancy-scorer.js +200 -0
  29. package/dist/coordination/consensus/sycophancy-scorer.js.map +1 -0
  30. package/dist/coordination/fleet-tiers/tier-selector.d.ts +20 -0
  31. package/dist/coordination/fleet-tiers/tier-selector.d.ts.map +1 -1
  32. package/dist/coordination/fleet-tiers/tier-selector.js +31 -0
  33. package/dist/coordination/fleet-tiers/tier-selector.js.map +1 -1
  34. package/dist/coordination/fleet-tiers/types.d.ts +2 -0
  35. package/dist/coordination/fleet-tiers/types.d.ts.map +1 -1
  36. package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts +71 -0
  37. package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts.map +1 -0
  38. package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js +456 -0
  39. package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js.map +1 -0
  40. package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts +81 -0
  41. package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts.map +1 -0
  42. package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js +20 -0
  43. package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js.map +1 -0
  44. package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts +19 -0
  45. package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts.map +1 -1
  46. package/dist/domains/test-execution/services/e2e/browser-orchestrator.js +82 -0
  47. package/dist/domains/test-execution/services/e2e/browser-orchestrator.js.map +1 -1
  48. package/dist/domains/test-execution/services/e2e/index.d.ts +2 -0
  49. package/dist/domains/test-execution/services/e2e/index.d.ts.map +1 -1
  50. package/dist/domains/test-execution/services/e2e/index.js +5 -0
  51. package/dist/domains/test-execution/services/e2e/index.js.map +1 -1
  52. package/dist/domains/test-execution/services/e2e/step-executors.d.ts +6 -0
  53. package/dist/domains/test-execution/services/e2e/step-executors.d.ts.map +1 -1
  54. package/dist/domains/test-execution/services/e2e/step-executors.js +17 -2
  55. package/dist/domains/test-execution/services/e2e/step-executors.js.map +1 -1
  56. package/dist/domains/test-execution/services/e2e/types.d.ts +18 -1
  57. package/dist/domains/test-execution/services/e2e/types.d.ts.map +1 -1
  58. package/dist/domains/test-execution/services/e2e/types.js.map +1 -1
  59. package/dist/domains/test-generation/blind-review/blind-review-orchestrator.d.ts +65 -0
  60. package/dist/domains/test-generation/blind-review/blind-review-orchestrator.d.ts.map +1 -0
  61. package/dist/domains/test-generation/blind-review/blind-review-orchestrator.js +189 -0
  62. package/dist/domains/test-generation/blind-review/blind-review-orchestrator.js.map +1 -0
  63. package/dist/domains/test-generation/blind-review/index.d.ts +2 -0
  64. package/dist/domains/test-generation/blind-review/index.d.ts.map +1 -0
  65. package/dist/domains/test-generation/blind-review/index.js +2 -0
  66. package/dist/domains/test-generation/blind-review/index.js.map +1 -0
  67. package/dist/domains/test-generation/gates/index.d.ts +2 -0
  68. package/dist/domains/test-generation/gates/index.d.ts.map +1 -0
  69. package/dist/domains/test-generation/gates/index.js +2 -0
  70. package/dist/domains/test-generation/gates/index.js.map +1 -0
  71. package/dist/domains/test-generation/gates/test-quality-gate.d.ts +85 -0
  72. package/dist/domains/test-generation/gates/test-quality-gate.d.ts.map +1 -0
  73. package/dist/domains/test-generation/gates/test-quality-gate.js +320 -0
  74. package/dist/domains/test-generation/gates/test-quality-gate.js.map +1 -0
  75. package/dist/domains/test-generation/interfaces.d.ts +3 -0
  76. package/dist/domains/test-generation/interfaces.d.ts.map +1 -1
  77. package/dist/domains/test-generation/pattern-injection/edge-case-injector.d.ts +68 -0
  78. package/dist/domains/test-generation/pattern-injection/edge-case-injector.d.ts.map +1 -0
  79. package/dist/domains/test-generation/pattern-injection/edge-case-injector.js +225 -0
  80. package/dist/domains/test-generation/pattern-injection/edge-case-injector.js.map +1 -0
  81. package/dist/domains/test-generation/pattern-injection/index.d.ts +2 -0
  82. package/dist/domains/test-generation/pattern-injection/index.d.ts.map +1 -0
  83. package/dist/domains/test-generation/pattern-injection/index.js +2 -0
  84. package/dist/domains/test-generation/pattern-injection/index.js.map +1 -0
  85. package/dist/domains/test-generation/services/test-generator.d.ts +6 -0
  86. package/dist/domains/test-generation/services/test-generator.d.ts.map +1 -1
  87. package/dist/domains/test-generation/services/test-generator.js +29 -0
  88. package/dist/domains/test-generation/services/test-generator.js.map +1 -1
  89. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +8 -2
  90. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts.map +1 -1
  91. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +62 -38
  92. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js.map +1 -1
  93. package/dist/integrations/browser/client-factory.d.ts +6 -1
  94. package/dist/integrations/browser/client-factory.d.ts.map +1 -1
  95. package/dist/integrations/browser/client-factory.js +37 -2
  96. package/dist/integrations/browser/client-factory.js.map +1 -1
  97. package/dist/integrations/browser/index.d.ts +5 -1
  98. package/dist/integrations/browser/index.d.ts.map +1 -1
  99. package/dist/integrations/browser/index.js +8 -1
  100. package/dist/integrations/browser/index.js.map +1 -1
  101. package/dist/integrations/browser/page-pool-types.d.ts +70 -0
  102. package/dist/integrations/browser/page-pool-types.d.ts.map +1 -0
  103. package/dist/integrations/browser/page-pool-types.js +19 -0
  104. package/dist/integrations/browser/page-pool-types.js.map +1 -0
  105. package/dist/integrations/browser/page-pool.d.ts +79 -0
  106. package/dist/integrations/browser/page-pool.d.ts.map +1 -0
  107. package/dist/integrations/browser/page-pool.js +288 -0
  108. package/dist/integrations/browser/page-pool.js.map +1 -0
  109. package/dist/integrations/browser/resource-blocking.d.ts +47 -0
  110. package/dist/integrations/browser/resource-blocking.d.ts.map +1 -0
  111. package/dist/integrations/browser/resource-blocking.js +195 -0
  112. package/dist/integrations/browser/resource-blocking.js.map +1 -0
  113. package/dist/integrations/browser/stealth/index.d.ts +8 -0
  114. package/dist/integrations/browser/stealth/index.d.ts.map +1 -0
  115. package/dist/integrations/browser/stealth/index.js +7 -0
  116. package/dist/integrations/browser/stealth/index.js.map +1 -0
  117. package/dist/integrations/browser/stealth/stealth-client.d.ts +51 -0
  118. package/dist/integrations/browser/stealth/stealth-client.d.ts.map +1 -0
  119. package/dist/integrations/browser/stealth/stealth-client.js +359 -0
  120. package/dist/integrations/browser/stealth/stealth-client.js.map +1 -0
  121. package/dist/integrations/browser/stealth/stealth-types.d.ts +35 -0
  122. package/dist/integrations/browser/stealth/stealth-types.d.ts.map +1 -0
  123. package/dist/integrations/browser/stealth/stealth-types.js +17 -0
  124. package/dist/integrations/browser/stealth/stealth-types.js.map +1 -0
  125. package/dist/integrations/browser/types.d.ts +13 -10
  126. package/dist/integrations/browser/types.d.ts.map +1 -1
  127. package/dist/integrations/browser/types.js.map +1 -1
  128. package/dist/learning/experience-capture.d.ts +12 -2
  129. package/dist/learning/experience-capture.d.ts.map +1 -1
  130. package/dist/learning/experience-capture.js +28 -35
  131. package/dist/learning/experience-capture.js.map +1 -1
  132. package/dist/learning/experience-consolidation.d.ts +74 -0
  133. package/dist/learning/experience-consolidation.d.ts.map +1 -0
  134. package/dist/learning/experience-consolidation.js +403 -0
  135. package/dist/learning/experience-consolidation.js.map +1 -0
  136. package/dist/mcp/bundle.js +3050 -341
  137. package/dist/routing/calibration/ema-calibrator.d.ts +93 -0
  138. package/dist/routing/calibration/ema-calibrator.d.ts.map +1 -0
  139. package/dist/routing/calibration/ema-calibrator.js +140 -0
  140. package/dist/routing/calibration/ema-calibrator.js.map +1 -0
  141. package/dist/routing/calibration/index.d.ts +2 -0
  142. package/dist/routing/calibration/index.d.ts.map +1 -0
  143. package/dist/routing/calibration/index.js +2 -0
  144. package/dist/routing/calibration/index.js.map +1 -0
  145. package/dist/routing/escalation/auto-escalation-tracker.d.ts +62 -0
  146. package/dist/routing/escalation/auto-escalation-tracker.d.ts.map +1 -0
  147. package/dist/routing/escalation/auto-escalation-tracker.js +116 -0
  148. package/dist/routing/escalation/auto-escalation-tracker.js.map +1 -0
  149. package/dist/routing/escalation/index.d.ts +2 -0
  150. package/dist/routing/escalation/index.d.ts.map +1 -0
  151. package/dist/routing/escalation/index.js +2 -0
  152. package/dist/routing/escalation/index.js.map +1 -0
  153. package/dist/routing/index.d.ts +4 -0
  154. package/dist/routing/index.d.ts.map +1 -1
  155. package/dist/routing/index.js +4 -0
  156. package/dist/routing/index.js.map +1 -1
  157. package/dist/routing/routing-config.d.ts +4 -0
  158. package/dist/routing/routing-config.d.ts.map +1 -1
  159. package/dist/routing/routing-config.js +2 -0
  160. package/dist/routing/routing-config.js.map +1 -1
  161. package/dist/routing/routing-feedback.d.ts +35 -2
  162. package/dist/routing/routing-feedback.d.ts.map +1 -1
  163. package/dist/routing/routing-feedback.js +97 -3
  164. package/dist/routing/routing-feedback.js.map +1 -1
  165. package/dist/routing/types.d.ts +2 -0
  166. package/dist/routing/types.d.ts.map +1 -1
  167. package/dist/routing/types.js.map +1 -1
  168. package/dist/workers/workers/learning-consolidation.d.ts.map +1 -1
  169. package/dist/workers/workers/learning-consolidation.js +32 -0
  170. package/dist/workers/workers/learning-consolidation.js.map +1 -1
  171. package/package.json +1 -1
@@ -0,0 +1,403 @@
1
+ /**
2
+ * Experience Consolidation System
3
+ *
4
+ * Replaces destructive pruning with smart consolidation that:
5
+ * - Phase 1: Clusters & merges similar experiences via HNSW
6
+ * - Phase 2: Reinforces quality based on reuse success
7
+ * - Phase 3: Archives truly valueless entries (soft-delete only)
8
+ *
9
+ * Ensures the Exp counter is monotonically non-decreasing.
10
+ */
11
+ import { v4 as uuidv4 } from 'uuid';
12
+ import { getUnifiedMemory } from '../kernel/unified-memory.js';
13
+ import { HNSWEmbeddingIndex } from '../integrations/embeddings/index/HNSWIndex.js';
14
+ const DEFAULT_CONFIG = {
15
+ mergeSimilarityThreshold: 0.85,
16
+ maxMergesPerRun: 50,
17
+ softThreshold: 400,
18
+ hardThreshold: 2000,
19
+ archiveMinAgeDays: 30,
20
+ archiveQualityThreshold: 0.15,
21
+ mergeQualityBoost: 0.02,
22
+ };
23
+ // ============================================================================
24
+ // ExperienceConsolidator
25
+ // ============================================================================
26
+ export class ExperienceConsolidator {
27
+ config;
28
+ db = null;
29
+ initialized = false;
30
+ constructor(config = {}) {
31
+ this.config = { ...DEFAULT_CONFIG, ...config };
32
+ }
33
+ /**
34
+ * Initialize with database handle
35
+ */
36
+ async initialize(db) {
37
+ if (this.initialized)
38
+ return;
39
+ if (db) {
40
+ this.db = db;
41
+ }
42
+ else {
43
+ const um = getUnifiedMemory();
44
+ await um.initialize();
45
+ this.db = um.getDatabase();
46
+ }
47
+ this.initialized = true;
48
+ }
49
+ /**
50
+ * Consolidate all domains that exceed the soft threshold
51
+ */
52
+ async consolidateAll(domains) {
53
+ this.ensureInitialized();
54
+ const totalResult = {
55
+ merged: 0,
56
+ qualityUpdated: 0,
57
+ archived: 0,
58
+ hardDeleted: 0,
59
+ activeRemaining: 0,
60
+ domainsProcessed: [],
61
+ };
62
+ // Get domain counts
63
+ const domainCounts = this.db.prepare("SELECT domain, COUNT(*) as cnt FROM captured_experiences WHERE consolidated_into IS NULL GROUP BY domain").all();
64
+ const targetDomains = domains
65
+ ? domainCounts.filter(d => domains.includes(d.domain))
66
+ : domainCounts.filter(d => d.cnt > this.config.softThreshold);
67
+ for (const { domain, cnt } of targetDomains) {
68
+ const result = await this.consolidateDomain(domain, cnt);
69
+ totalResult.merged += result.merged;
70
+ totalResult.qualityUpdated += result.qualityUpdated;
71
+ totalResult.archived += result.archived;
72
+ totalResult.hardDeleted += result.hardDeleted;
73
+ totalResult.domainsProcessed.push(domain);
74
+ }
75
+ // Count total active remaining
76
+ const activeCount = this.db.prepare("SELECT COUNT(*) as cnt FROM captured_experiences WHERE consolidated_into IS NULL").get();
77
+ totalResult.activeRemaining = activeCount.cnt;
78
+ if (totalResult.merged > 0 || totalResult.archived > 0) {
79
+ console.log(`[ExperienceConsolidator] Consolidated: ${totalResult.merged} merged, ` +
80
+ `${totalResult.archived} archived, ${totalResult.activeRemaining} active`);
81
+ }
82
+ return totalResult;
83
+ }
84
+ /**
85
+ * Consolidate a single domain
86
+ */
87
+ async consolidateDomain(domain, _currentCount) {
88
+ this.ensureInitialized();
89
+ const result = {
90
+ merged: 0,
91
+ qualityUpdated: 0,
92
+ archived: 0,
93
+ hardDeleted: 0,
94
+ activeRemaining: 0,
95
+ domainsProcessed: [domain],
96
+ };
97
+ // Phase 1: Cluster & Merge
98
+ result.merged = await this.clusterAndMerge(domain);
99
+ // Phase 2: Quality Reinforcement
100
+ result.qualityUpdated = this.reinforceQuality(domain);
101
+ // Phase 3: Archive Valueless
102
+ result.archived = this.archiveValueless(domain);
103
+ // Safety valve: hard-delete if still over hard threshold
104
+ const afterCount = this.db.prepare("SELECT COUNT(*) as cnt FROM captured_experiences WHERE domain = ? AND consolidated_into IS NULL").get(domain).cnt;
105
+ if (afterCount > this.config.hardThreshold) {
106
+ result.hardDeleted = this.hardDeleteExcess(domain, afterCount);
107
+ }
108
+ result.activeRemaining = afterCount - result.hardDeleted;
109
+ return result;
110
+ }
111
+ /**
112
+ * One-time bootstrap for domains with large backlogs
113
+ */
114
+ async bootstrapDomain(domain) {
115
+ this.ensureInitialized();
116
+ // Check if already bootstrapped
117
+ const flag = this.db.prepare("SELECT value FROM kv_store WHERE key = ?").get(`consolidation_bootstrap_${domain}`);
118
+ if (flag) {
119
+ console.log(`[ExperienceConsolidator] Domain ${domain} already bootstrapped`);
120
+ return {
121
+ merged: 0, qualityUpdated: 0, archived: 0,
122
+ hardDeleted: 0, activeRemaining: 0, domainsProcessed: [domain],
123
+ };
124
+ }
125
+ // Use relaxed settings for bootstrap
126
+ const savedConfig = { ...this.config };
127
+ this.config.mergeSimilarityThreshold = 0.80;
128
+ this.config.maxMergesPerRun = 200;
129
+ const result = await this.consolidateDomain(domain);
130
+ // Restore config
131
+ Object.assign(this.config, savedConfig);
132
+ // Set bootstrap flag
133
+ try {
134
+ this.db.prepare("INSERT OR REPLACE INTO kv_store (key, value, namespace) VALUES (?, ?, 'system')").run(`consolidation_bootstrap_${domain}`, new Date().toISOString());
135
+ }
136
+ catch {
137
+ // kv_store may not exist in all setups
138
+ }
139
+ console.log(`[ExperienceConsolidator] Bootstrap ${domain}: ` +
140
+ `${result.merged} merged, ${result.archived} archived`);
141
+ return result;
142
+ }
143
+ // ============================================================================
144
+ // Phase 1: Cluster & Merge
145
+ // ============================================================================
146
+ async clusterAndMerge(domain) {
147
+ // Get active experiences with embeddings, sorted by quality DESC
148
+ const candidates = this.db.prepare(`
149
+ SELECT id, task, domain, quality, success, application_count,
150
+ consolidation_count, reuse_success_count, reuse_failure_count,
151
+ embedding, embedding_dimension, started_at
152
+ FROM captured_experiences
153
+ WHERE domain = ? AND consolidated_into IS NULL AND embedding IS NOT NULL
154
+ ORDER BY quality DESC
155
+ `).all(domain);
156
+ if (candidates.length < 2)
157
+ return 0;
158
+ // Build a temporary HNSW index for this domain
159
+ const hnswIndex = new HNSWEmbeddingIndex({
160
+ dimension: 384,
161
+ M: 16,
162
+ efConstruction: 200,
163
+ efSearch: 100,
164
+ metric: 'cosine',
165
+ });
166
+ const idMap = new Map();
167
+ let nextId = 0;
168
+ for (const row of candidates) {
169
+ if (row.embedding && row.embedding_dimension) {
170
+ const vector = this.bufferToFloatArray(row.embedding, row.embedding_dimension);
171
+ const hnswId = nextId++;
172
+ idMap.set(hnswId, row.id);
173
+ const iEmb = {
174
+ vector,
175
+ dimension: 384,
176
+ namespace: 'experiences',
177
+ text: row.id,
178
+ timestamp: Date.now(),
179
+ quantization: 'none',
180
+ metadata: {},
181
+ };
182
+ hnswIndex.addEmbedding(iEmb, hnswId);
183
+ }
184
+ }
185
+ // Track which IDs have been absorbed
186
+ const absorbed = new Set();
187
+ let mergeCount = 0;
188
+ const markConsolidated = this.db.prepare("UPDATE captured_experiences SET consolidated_into = ? WHERE id = ?");
189
+ const boostSurvivor = this.db.prepare(`
190
+ UPDATE captured_experiences
191
+ SET consolidation_count = consolidation_count + ?,
192
+ quality = MIN(1.0, quality + ?),
193
+ quality_updated_at = datetime('now')
194
+ WHERE id = ?
195
+ `);
196
+ const logConsolidation = this.db.prepare(`
197
+ INSERT INTO experience_consolidation_log (id, domain, action, source_ids, target_id, details, created_at)
198
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'))
199
+ `);
200
+ // Iterate experiences by quality DESC
201
+ for (const row of candidates) {
202
+ if (mergeCount >= this.config.maxMergesPerRun)
203
+ break;
204
+ if (absorbed.has(row.id))
205
+ continue;
206
+ if (!row.embedding || !row.embedding_dimension)
207
+ continue;
208
+ const queryVector = this.bufferToFloatArray(row.embedding, row.embedding_dimension);
209
+ const queryEmb = {
210
+ vector: queryVector,
211
+ dimension: 384,
212
+ namespace: 'experiences',
213
+ text: row.id,
214
+ timestamp: Date.now(),
215
+ quantization: 'none',
216
+ metadata: {},
217
+ };
218
+ // Find 5 nearest neighbors
219
+ const neighbors = hnswIndex.search(queryEmb, {
220
+ limit: 6, // extra because self will be included
221
+ namespace: 'experiences',
222
+ });
223
+ const mergedIds = [];
224
+ for (const { id: hnswId, distance } of neighbors) {
225
+ if (mergeCount >= this.config.maxMergesPerRun)
226
+ break;
227
+ const neighborId = idMap.get(hnswId);
228
+ if (!neighborId || neighborId === row.id || absorbed.has(neighborId))
229
+ continue;
230
+ const similarity = 1 - distance;
231
+ if (similarity < this.config.mergeSimilarityThreshold)
232
+ continue;
233
+ // Find the neighbor in candidates
234
+ const neighbor = candidates.find(c => c.id === neighborId);
235
+ if (!neighbor)
236
+ continue;
237
+ // Only merge lower-quality, unused neighbors into the survivor
238
+ if (neighbor.quality <= row.quality && neighbor.application_count === 0) {
239
+ absorbed.add(neighborId);
240
+ mergedIds.push(neighborId);
241
+ mergeCount++;
242
+ }
243
+ }
244
+ // Apply merges in a transaction
245
+ if (mergedIds.length > 0) {
246
+ const transaction = this.db.transaction(() => {
247
+ for (const absorbedId of mergedIds) {
248
+ markConsolidated.run(row.id, absorbedId);
249
+ }
250
+ const boost = this.config.mergeQualityBoost * mergedIds.length;
251
+ boostSurvivor.run(mergedIds.length, boost, row.id);
252
+ logConsolidation.run(uuidv4(), domain, 'merge', JSON.stringify(mergedIds), row.id, JSON.stringify({ count: mergedIds.length, boost }));
253
+ });
254
+ transaction();
255
+ }
256
+ }
257
+ // Clean up HNSW index
258
+ hnswIndex.clearIndex('experiences');
259
+ return mergeCount;
260
+ }
261
+ // ============================================================================
262
+ // Phase 2: Quality Reinforcement
263
+ // ============================================================================
264
+ reinforceQuality(domain) {
265
+ // Get experiences with application history
266
+ const experiences = this.db.prepare(`
267
+ SELECT ce.id, ce.quality, ce.consolidation_count,
268
+ ce.reuse_success_count, ce.reuse_failure_count,
269
+ COALESCE(app.total, 0) as app_total,
270
+ COALESCE(app.successes, 0) as app_successes
271
+ FROM captured_experiences ce
272
+ LEFT JOIN (
273
+ SELECT experience_id,
274
+ COUNT(*) as total,
275
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as successes
276
+ FROM experience_applications
277
+ GROUP BY experience_id
278
+ ) app ON app.experience_id = ce.id
279
+ WHERE ce.domain = ? AND ce.consolidated_into IS NULL
280
+ AND (app.total > 0 OR ce.reuse_success_count > 0 OR ce.reuse_failure_count > 0)
281
+ `).all(domain);
282
+ if (experiences.length === 0)
283
+ return 0;
284
+ const updateQuality = this.db.prepare(`
285
+ UPDATE captured_experiences
286
+ SET quality = ?, quality_updated_at = datetime('now')
287
+ WHERE id = ?
288
+ `);
289
+ let updated = 0;
290
+ const transaction = this.db.transaction(() => {
291
+ for (const exp of experiences) {
292
+ // Calculate success rate from applications + direct tracking
293
+ const totalReuses = exp.app_total + exp.reuse_success_count + exp.reuse_failure_count;
294
+ const totalSuccesses = exp.app_successes + exp.reuse_success_count;
295
+ const successRate = totalReuses > 0 ? totalSuccesses / totalReuses : 0;
296
+ // Consolidation bonus (capped at 10)
297
+ const consolidationBonus = Math.min(exp.consolidation_count, 10) / 10;
298
+ // New quality: 40% original + 40% success rate + 20% consolidation
299
+ const newQuality = Math.min(1.0, 0.4 * exp.quality + 0.4 * successRate + 0.2 * consolidationBonus);
300
+ // Only update if quality changed meaningfully
301
+ if (Math.abs(newQuality - exp.quality) > 0.01) {
302
+ updateQuality.run(newQuality, exp.id);
303
+ updated++;
304
+ }
305
+ }
306
+ });
307
+ transaction();
308
+ return updated;
309
+ }
310
+ // ============================================================================
311
+ // Phase 3: Archive Valueless
312
+ // ============================================================================
313
+ archiveValueless(domain) {
314
+ const cutoffDate = new Date();
315
+ cutoffDate.setDate(cutoffDate.getDate() - this.config.archiveMinAgeDays);
316
+ const cutoffStr = cutoffDate.toISOString().replace('T', ' ').slice(0, 19);
317
+ // Archive when ALL conditions met:
318
+ // quality < threshold, no applications, no success, single (not consolidated), old enough
319
+ const result = this.db.prepare(`
320
+ UPDATE captured_experiences
321
+ SET consolidated_into = 'archived'
322
+ WHERE domain = ?
323
+ AND consolidated_into IS NULL
324
+ AND quality < ?
325
+ AND application_count = 0
326
+ AND success = 0
327
+ AND consolidation_count = 1
328
+ AND started_at < ?
329
+ `).run(domain, this.config.archiveQualityThreshold, cutoffStr);
330
+ if (result.changes > 0) {
331
+ // Log the archive action
332
+ try {
333
+ this.db.prepare(`
334
+ INSERT INTO experience_consolidation_log (id, domain, action, source_ids, details, created_at)
335
+ VALUES (?, ?, 'archive', '[]', ?, datetime('now'))
336
+ `).run(uuidv4(), domain, JSON.stringify({ count: result.changes }));
337
+ }
338
+ catch {
339
+ // Logging is best-effort
340
+ }
341
+ }
342
+ return result.changes;
343
+ }
344
+ // ============================================================================
345
+ // Safety Valve: Hard Delete
346
+ // ============================================================================
347
+ hardDeleteExcess(domain, currentCount) {
348
+ const excess = currentCount - this.config.hardThreshold;
349
+ if (excess <= 0)
350
+ return 0;
351
+ // Delete oldest archived entries first
352
+ const archivedDeleted = this.db.prepare(`
353
+ DELETE FROM captured_experiences
354
+ WHERE id IN (
355
+ SELECT id FROM captured_experiences
356
+ WHERE domain = ? AND consolidated_into = 'archived'
357
+ ORDER BY started_at ASC
358
+ LIMIT ?
359
+ )
360
+ `).run(domain, excess);
361
+ let totalDeleted = archivedDeleted.changes;
362
+ // If still over, delete oldest low-quality active entries
363
+ if (totalDeleted < excess) {
364
+ const remaining = excess - totalDeleted;
365
+ const activeDeleted = this.db.prepare(`
366
+ DELETE FROM captured_experiences
367
+ WHERE id IN (
368
+ SELECT id FROM captured_experiences
369
+ WHERE domain = ? AND consolidated_into IS NULL AND application_count = 0
370
+ ORDER BY quality ASC, started_at ASC
371
+ LIMIT ?
372
+ )
373
+ `).run(domain, remaining);
374
+ totalDeleted += activeDeleted.changes;
375
+ }
376
+ if (totalDeleted > 0) {
377
+ console.warn(`[ExperienceConsolidator] Safety valve: hard-deleted ${totalDeleted} from ${domain}`);
378
+ }
379
+ return totalDeleted;
380
+ }
381
+ // ============================================================================
382
+ // Utilities
383
+ // ============================================================================
384
+ ensureInitialized() {
385
+ if (!this.initialized || !this.db) {
386
+ throw new Error('ExperienceConsolidator not initialized. Call initialize() first.');
387
+ }
388
+ }
389
+ bufferToFloatArray(buffer, dimension) {
390
+ const arr = [];
391
+ for (let i = 0; i < dimension; i++) {
392
+ arr.push(buffer.readFloatLE(i * 4));
393
+ }
394
+ return arr;
395
+ }
396
+ }
397
+ /**
398
+ * Create an ExperienceConsolidator instance
399
+ */
400
+ export function createExperienceConsolidator(config = {}) {
401
+ return new ExperienceConsolidator(config);
402
+ }
403
+ //# sourceMappingURL=experience-consolidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience-consolidation.js","sourceRoot":"","sources":["../../src/learning/experience-consolidation.ts"],"names":[],"mappings":"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"}