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.
- package/.claude/helpers/statusline-v3.cjs +13 -1
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +39 -0
- package/README.md +36 -0
- package/dist/cli/bundle.js +2052 -183
- package/dist/coordination/complexity-composition/index.d.ts +2 -0
- package/dist/coordination/complexity-composition/index.d.ts.map +1 -0
- package/dist/coordination/complexity-composition/index.js +2 -0
- package/dist/coordination/complexity-composition/index.js.map +1 -0
- package/dist/coordination/complexity-composition/team-composer.d.ts +72 -0
- package/dist/coordination/complexity-composition/team-composer.d.ts.map +1 -0
- package/dist/coordination/complexity-composition/team-composer.js +221 -0
- package/dist/coordination/complexity-composition/team-composer.js.map +1 -0
- package/dist/coordination/consensus/consensus-engine.d.ts +10 -1
- package/dist/coordination/consensus/consensus-engine.d.ts.map +1 -1
- package/dist/coordination/consensus/consensus-engine.js +31 -1
- package/dist/coordination/consensus/consensus-engine.js.map +1 -1
- package/dist/coordination/consensus/index.d.ts +1 -0
- package/dist/coordination/consensus/index.d.ts.map +1 -1
- package/dist/coordination/consensus/index.js +4 -0
- package/dist/coordination/consensus/index.js.map +1 -1
- package/dist/coordination/consensus/interfaces.d.ts +5 -0
- package/dist/coordination/consensus/interfaces.d.ts.map +1 -1
- package/dist/coordination/consensus/interfaces.js +1 -0
- package/dist/coordination/consensus/interfaces.js.map +1 -1
- package/dist/coordination/consensus/sycophancy-scorer.d.ts +62 -0
- package/dist/coordination/consensus/sycophancy-scorer.d.ts.map +1 -0
- package/dist/coordination/consensus/sycophancy-scorer.js +200 -0
- package/dist/coordination/consensus/sycophancy-scorer.js.map +1 -0
- package/dist/coordination/fleet-tiers/tier-selector.d.ts +20 -0
- package/dist/coordination/fleet-tiers/tier-selector.d.ts.map +1 -1
- package/dist/coordination/fleet-tiers/tier-selector.js +31 -0
- package/dist/coordination/fleet-tiers/tier-selector.js.map +1 -1
- package/dist/coordination/fleet-tiers/types.d.ts +2 -0
- package/dist/coordination/fleet-tiers/types.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts +71 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.d.ts.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js +456 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-service.js.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts +81 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.d.ts.map +1 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js +20 -0
- package/dist/domains/test-execution/services/e2e/adaptive-locator-types.js.map +1 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts +19 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.js +82 -0
- package/dist/domains/test-execution/services/e2e/browser-orchestrator.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/index.d.ts +2 -0
- package/dist/domains/test-execution/services/e2e/index.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/index.js +5 -0
- package/dist/domains/test-execution/services/e2e/index.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/step-executors.d.ts +6 -0
- package/dist/domains/test-execution/services/e2e/step-executors.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/step-executors.js +17 -2
- package/dist/domains/test-execution/services/e2e/step-executors.js.map +1 -1
- package/dist/domains/test-execution/services/e2e/types.d.ts +18 -1
- package/dist/domains/test-execution/services/e2e/types.d.ts.map +1 -1
- package/dist/domains/test-execution/services/e2e/types.js.map +1 -1
- package/dist/domains/test-generation/blind-review/blind-review-orchestrator.d.ts +65 -0
- package/dist/domains/test-generation/blind-review/blind-review-orchestrator.d.ts.map +1 -0
- package/dist/domains/test-generation/blind-review/blind-review-orchestrator.js +189 -0
- package/dist/domains/test-generation/blind-review/blind-review-orchestrator.js.map +1 -0
- package/dist/domains/test-generation/blind-review/index.d.ts +2 -0
- package/dist/domains/test-generation/blind-review/index.d.ts.map +1 -0
- package/dist/domains/test-generation/blind-review/index.js +2 -0
- package/dist/domains/test-generation/blind-review/index.js.map +1 -0
- package/dist/domains/test-generation/gates/index.d.ts +2 -0
- package/dist/domains/test-generation/gates/index.d.ts.map +1 -0
- package/dist/domains/test-generation/gates/index.js +2 -0
- package/dist/domains/test-generation/gates/index.js.map +1 -0
- package/dist/domains/test-generation/gates/test-quality-gate.d.ts +85 -0
- package/dist/domains/test-generation/gates/test-quality-gate.d.ts.map +1 -0
- package/dist/domains/test-generation/gates/test-quality-gate.js +320 -0
- package/dist/domains/test-generation/gates/test-quality-gate.js.map +1 -0
- package/dist/domains/test-generation/interfaces.d.ts +3 -0
- package/dist/domains/test-generation/interfaces.d.ts.map +1 -1
- package/dist/domains/test-generation/pattern-injection/edge-case-injector.d.ts +68 -0
- package/dist/domains/test-generation/pattern-injection/edge-case-injector.d.ts.map +1 -0
- package/dist/domains/test-generation/pattern-injection/edge-case-injector.js +225 -0
- package/dist/domains/test-generation/pattern-injection/edge-case-injector.js.map +1 -0
- package/dist/domains/test-generation/pattern-injection/index.d.ts +2 -0
- package/dist/domains/test-generation/pattern-injection/index.d.ts.map +1 -0
- package/dist/domains/test-generation/pattern-injection/index.js +2 -0
- package/dist/domains/test-generation/pattern-injection/index.js.map +1 -0
- package/dist/domains/test-generation/services/test-generator.d.ts +6 -0
- package/dist/domains/test-generation/services/test-generator.d.ts.map +1 -1
- package/dist/domains/test-generation/services/test-generator.js +29 -0
- package/dist/domains/test-generation/services/test-generator.js.map +1 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +8 -2
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts.map +1 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +62 -38
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js.map +1 -1
- package/dist/integrations/browser/client-factory.d.ts +6 -1
- package/dist/integrations/browser/client-factory.d.ts.map +1 -1
- package/dist/integrations/browser/client-factory.js +37 -2
- package/dist/integrations/browser/client-factory.js.map +1 -1
- package/dist/integrations/browser/index.d.ts +5 -1
- package/dist/integrations/browser/index.d.ts.map +1 -1
- package/dist/integrations/browser/index.js +8 -1
- package/dist/integrations/browser/index.js.map +1 -1
- package/dist/integrations/browser/page-pool-types.d.ts +70 -0
- package/dist/integrations/browser/page-pool-types.d.ts.map +1 -0
- package/dist/integrations/browser/page-pool-types.js +19 -0
- package/dist/integrations/browser/page-pool-types.js.map +1 -0
- package/dist/integrations/browser/page-pool.d.ts +79 -0
- package/dist/integrations/browser/page-pool.d.ts.map +1 -0
- package/dist/integrations/browser/page-pool.js +288 -0
- package/dist/integrations/browser/page-pool.js.map +1 -0
- package/dist/integrations/browser/resource-blocking.d.ts +47 -0
- package/dist/integrations/browser/resource-blocking.d.ts.map +1 -0
- package/dist/integrations/browser/resource-blocking.js +195 -0
- package/dist/integrations/browser/resource-blocking.js.map +1 -0
- package/dist/integrations/browser/stealth/index.d.ts +8 -0
- package/dist/integrations/browser/stealth/index.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/index.js +7 -0
- package/dist/integrations/browser/stealth/index.js.map +1 -0
- package/dist/integrations/browser/stealth/stealth-client.d.ts +51 -0
- package/dist/integrations/browser/stealth/stealth-client.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/stealth-client.js +359 -0
- package/dist/integrations/browser/stealth/stealth-client.js.map +1 -0
- package/dist/integrations/browser/stealth/stealth-types.d.ts +35 -0
- package/dist/integrations/browser/stealth/stealth-types.d.ts.map +1 -0
- package/dist/integrations/browser/stealth/stealth-types.js +17 -0
- package/dist/integrations/browser/stealth/stealth-types.js.map +1 -0
- package/dist/integrations/browser/types.d.ts +13 -10
- package/dist/integrations/browser/types.d.ts.map +1 -1
- package/dist/integrations/browser/types.js.map +1 -1
- package/dist/learning/experience-capture.d.ts +12 -2
- package/dist/learning/experience-capture.d.ts.map +1 -1
- package/dist/learning/experience-capture.js +28 -35
- package/dist/learning/experience-capture.js.map +1 -1
- package/dist/learning/experience-consolidation.d.ts +74 -0
- package/dist/learning/experience-consolidation.d.ts.map +1 -0
- package/dist/learning/experience-consolidation.js +403 -0
- package/dist/learning/experience-consolidation.js.map +1 -0
- package/dist/mcp/bundle.js +3050 -341
- package/dist/routing/calibration/ema-calibrator.d.ts +93 -0
- package/dist/routing/calibration/ema-calibrator.d.ts.map +1 -0
- package/dist/routing/calibration/ema-calibrator.js +140 -0
- package/dist/routing/calibration/ema-calibrator.js.map +1 -0
- package/dist/routing/calibration/index.d.ts +2 -0
- package/dist/routing/calibration/index.d.ts.map +1 -0
- package/dist/routing/calibration/index.js +2 -0
- package/dist/routing/calibration/index.js.map +1 -0
- package/dist/routing/escalation/auto-escalation-tracker.d.ts +62 -0
- package/dist/routing/escalation/auto-escalation-tracker.d.ts.map +1 -0
- package/dist/routing/escalation/auto-escalation-tracker.js +116 -0
- package/dist/routing/escalation/auto-escalation-tracker.js.map +1 -0
- package/dist/routing/escalation/index.d.ts +2 -0
- package/dist/routing/escalation/index.d.ts.map +1 -0
- package/dist/routing/escalation/index.js +2 -0
- package/dist/routing/escalation/index.js.map +1 -0
- package/dist/routing/index.d.ts +4 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/routing-config.d.ts +4 -0
- package/dist/routing/routing-config.d.ts.map +1 -1
- package/dist/routing/routing-config.js +2 -0
- package/dist/routing/routing-config.js.map +1 -1
- package/dist/routing/routing-feedback.d.ts +35 -2
- package/dist/routing/routing-feedback.d.ts.map +1 -1
- package/dist/routing/routing-feedback.js +97 -3
- package/dist/routing/routing-feedback.js.map +1 -1
- package/dist/routing/types.d.ts +2 -0
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/types.js.map +1 -1
- package/dist/workers/workers/learning-consolidation.d.ts.map +1 -1
- package/dist/workers/workers/learning-consolidation.js +32 -0
- package/dist/workers/workers/learning-consolidation.js.map +1 -1
- 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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"}
|