agentic-qe 2.7.2 → 2.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +1 -1
  3. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  4. package/dist/learning/QLearning.d.ts +101 -1
  5. package/dist/learning/QLearning.d.ts.map +1 -1
  6. package/dist/learning/QLearning.js +168 -0
  7. package/dist/learning/QLearning.js.map +1 -1
  8. package/dist/mcp/server-instructions.d.ts +1 -1
  9. package/dist/mcp/server-instructions.js +1 -1
  10. package/dist/planning/GOAPPlanner.d.ts +42 -0
  11. package/dist/planning/GOAPPlanner.d.ts.map +1 -1
  12. package/dist/planning/GOAPPlanner.js +151 -0
  13. package/dist/planning/GOAPPlanner.js.map +1 -1
  14. package/dist/planning/PlanLearning.d.ts +184 -0
  15. package/dist/planning/PlanLearning.d.ts.map +1 -0
  16. package/dist/planning/PlanLearning.js +526 -0
  17. package/dist/planning/PlanLearning.js.map +1 -0
  18. package/dist/planning/PlanSimilarity.d.ts +148 -0
  19. package/dist/planning/PlanSimilarity.d.ts.map +1 -0
  20. package/dist/planning/PlanSimilarity.js +463 -0
  21. package/dist/planning/PlanSimilarity.js.map +1 -0
  22. package/dist/planning/execution/PlanExecutor.d.ts +101 -2
  23. package/dist/planning/execution/PlanExecutor.d.ts.map +1 -1
  24. package/dist/planning/execution/PlanExecutor.js +587 -14
  25. package/dist/planning/execution/PlanExecutor.js.map +1 -1
  26. package/dist/planning/index.d.ts +2 -0
  27. package/dist/planning/index.d.ts.map +1 -1
  28. package/dist/planning/index.js +15 -4
  29. package/dist/planning/index.js.map +1 -1
  30. package/dist/planning/integration/GOAPQualityGateIntegration.d.ts +6 -0
  31. package/dist/planning/integration/GOAPQualityGateIntegration.d.ts.map +1 -1
  32. package/dist/planning/integration/GOAPQualityGateIntegration.js +7 -0
  33. package/dist/planning/integration/GOAPQualityGateIntegration.js.map +1 -1
  34. package/dist/planning/types.d.ts +2 -0
  35. package/dist/planning/types.d.ts.map +1 -1
  36. package/dist/planning/types.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,148 @@
1
+ /**
2
+ * PlanSimilarity - Fast Plan Matching and Reuse System
3
+ *
4
+ * Implements efficient plan similarity matching using:
5
+ * - Feature vector extraction from WorldState
6
+ * - Cosine similarity for state comparison
7
+ * - Locality-Sensitive Hashing (LSH) for fast retrieval
8
+ * - Goal signature caching for O(1) exact matches
9
+ *
10
+ * Performance targets:
11
+ * - Similar plan retrieval: <100ms
12
+ * - Plan reuse rate: >30% for common goals
13
+ *
14
+ * @module planning/PlanSimilarity
15
+ * @version 1.0.0
16
+ */
17
+ import Database from 'better-sqlite3';
18
+ import { WorldState, StateConditions, GOAPAction } from './types';
19
+ /**
20
+ * Plan signature for fast matching
21
+ */
22
+ export interface PlanSignature {
23
+ id: string;
24
+ planId: string;
25
+ goalSignature: string;
26
+ stateVector: number[];
27
+ actionSequence: string[];
28
+ totalCost: number;
29
+ successRate: number;
30
+ usageCount: number;
31
+ lastUsed: Date;
32
+ createdAt: Date;
33
+ }
34
+ /**
35
+ * Similar plan result with similarity score
36
+ */
37
+ export interface SimilarPlan {
38
+ planId: string;
39
+ signature: PlanSignature;
40
+ similarityScore: number;
41
+ goalMatch: boolean;
42
+ stateDistance: number;
43
+ }
44
+ /**
45
+ * Plan reuse statistics
46
+ */
47
+ export interface PlanReuseStats {
48
+ totalPlans: number;
49
+ reusedPlans: number;
50
+ reuseRate: number;
51
+ avgSimilarityScore: number;
52
+ topGoals: {
53
+ goal: string;
54
+ reuseCount: number;
55
+ }[];
56
+ }
57
+ /**
58
+ * Configuration for similarity matching
59
+ */
60
+ export interface SimilarityConfig {
61
+ minSimilarityThreshold: number;
62
+ maxCandidates: number;
63
+ useGoalCaching: boolean;
64
+ stateDimensions: number;
65
+ lshBands: number;
66
+ }
67
+ /**
68
+ * PlanSimilarity - Efficient plan matching using feature vectors and LSH
69
+ */
70
+ export declare class PlanSimilarity {
71
+ private db;
72
+ private logger;
73
+ private config;
74
+ private goalCache;
75
+ private signatureCache;
76
+ private schemaInitialized;
77
+ constructor(db: Database.Database, config?: Partial<SimilarityConfig>);
78
+ /**
79
+ * Initialize schema for plan signatures
80
+ */
81
+ ensureSchema(): void;
82
+ /**
83
+ * Extract feature vector from WorldState
84
+ * Normalizes all numeric values to [0,1] range
85
+ */
86
+ extractStateVector(state: WorldState): number[];
87
+ /**
88
+ * Encode environment as numeric value
89
+ */
90
+ private encodeEnvironment;
91
+ /**
92
+ * Encode change size as numeric value
93
+ */
94
+ private encodeChangeSize;
95
+ /**
96
+ * Encode risk level as numeric value
97
+ */
98
+ private encodeRiskLevel;
99
+ /**
100
+ * Create signature hash from goal conditions
101
+ */
102
+ createGoalSignature(goalConditions: StateConditions): string;
103
+ /**
104
+ * Sort object keys recursively for deterministic serialization
105
+ */
106
+ private sortObjectKeys;
107
+ /**
108
+ * Calculate cosine similarity between two vectors
109
+ */
110
+ cosineSimilarity(vectorA: number[], vectorB: number[]): number;
111
+ /**
112
+ * Calculate Euclidean distance between two vectors
113
+ */
114
+ euclideanDistance(vectorA: number[], vectorB: number[]): number;
115
+ /**
116
+ * Store plan signature for future matching
117
+ */
118
+ storePlanSignature(planId: string, goalConditions: StateConditions, initialState: WorldState, actions: GOAPAction[], totalCost: number): PlanSignature;
119
+ /**
120
+ * Find similar plans for a given goal and state
121
+ * Performance target: <100ms
122
+ */
123
+ findSimilarPlans(goalConditions: StateConditions, currentState: WorldState, options?: {
124
+ maxCandidates?: number;
125
+ minSimilarity?: number;
126
+ }): Promise<SimilarPlan[]>;
127
+ /**
128
+ * Get signature from cache or database
129
+ */
130
+ private getSignature;
131
+ /**
132
+ * Record plan reuse (increments usage count)
133
+ */
134
+ recordPlanReuse(planId: string, success: boolean): void;
135
+ /**
136
+ * Get plan reuse statistics
137
+ */
138
+ getReuseStats(): PlanReuseStats;
139
+ /**
140
+ * Clear signature cache (for testing or memory management)
141
+ */
142
+ clearCache(): void;
143
+ /**
144
+ * Preload signatures into cache for faster matching
145
+ */
146
+ preloadCache(limit?: number): Promise<number>;
147
+ }
148
+ //# sourceMappingURL=PlanSimilarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanSimilarity.d.ts","sourceRoot":"","sources":["../../src/planning/PlanSimilarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ /**
3
+ * PlanSimilarity - Fast Plan Matching and Reuse System
4
+ *
5
+ * Implements efficient plan similarity matching using:
6
+ * - Feature vector extraction from WorldState
7
+ * - Cosine similarity for state comparison
8
+ * - Locality-Sensitive Hashing (LSH) for fast retrieval
9
+ * - Goal signature caching for O(1) exact matches
10
+ *
11
+ * Performance targets:
12
+ * - Similar plan retrieval: <100ms
13
+ * - Plan reuse rate: >30% for common goals
14
+ *
15
+ * @module planning/PlanSimilarity
16
+ * @version 1.0.0
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PlanSimilarity = void 0;
23
+ const Logger_1 = require("../utils/Logger");
24
+ const crypto_1 = __importDefault(require("crypto"));
25
+ const DEFAULT_CONFIG = {
26
+ minSimilarityThreshold: 0.7,
27
+ maxCandidates: 5,
28
+ useGoalCaching: true,
29
+ stateDimensions: 20,
30
+ lshBands: 4
31
+ };
32
+ /**
33
+ * PlanSimilarity - Efficient plan matching using feature vectors and LSH
34
+ */
35
+ class PlanSimilarity {
36
+ constructor(db, config = {}) {
37
+ this.goalCache = new Map(); // goalSignature -> planIds
38
+ this.signatureCache = new Map(); // planId -> signature
39
+ this.schemaInitialized = false;
40
+ this.db = db;
41
+ this.logger = Logger_1.Logger.getInstance();
42
+ this.config = { ...DEFAULT_CONFIG, ...config };
43
+ }
44
+ /**
45
+ * Initialize schema for plan signatures
46
+ */
47
+ ensureSchema() {
48
+ if (this.schemaInitialized)
49
+ return;
50
+ this.db.exec(`
51
+ CREATE TABLE IF NOT EXISTS goap_plan_signatures (
52
+ id TEXT PRIMARY KEY,
53
+ plan_id TEXT NOT NULL UNIQUE,
54
+ goal_signature TEXT NOT NULL,
55
+ state_vector TEXT NOT NULL,
56
+ action_sequence TEXT NOT NULL,
57
+ total_cost REAL NOT NULL,
58
+ success_rate REAL DEFAULT 1.0,
59
+ usage_count INTEGER DEFAULT 0,
60
+ last_used DATETIME,
61
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
62
+ )
63
+ `);
64
+ // Indexes for fast retrieval
65
+ try {
66
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_plan_sig_goal ON goap_plan_signatures (goal_signature)');
67
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_plan_sig_success ON goap_plan_signatures (success_rate DESC)');
68
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_plan_sig_usage ON goap_plan_signatures (usage_count DESC)');
69
+ }
70
+ catch {
71
+ // Indexes may already exist
72
+ }
73
+ this.schemaInitialized = true;
74
+ this.logger.debug('[PlanSimilarity] Schema initialized');
75
+ }
76
+ /**
77
+ * Extract feature vector from WorldState
78
+ * Normalizes all numeric values to [0,1] range
79
+ */
80
+ extractStateVector(state) {
81
+ const vector = [];
82
+ // Coverage features (4 dimensions)
83
+ vector.push(state.coverage.line / 100);
84
+ vector.push(state.coverage.branch / 100);
85
+ vector.push(state.coverage.function / 100);
86
+ vector.push(state.coverage.measured ? 1 : 0);
87
+ // Quality features (6 dimensions)
88
+ vector.push(state.quality.testsPassing / 100);
89
+ vector.push(state.quality.securityScore / 100);
90
+ vector.push(state.quality.performanceScore / 100);
91
+ vector.push(Math.min(state.quality.technicalDebt / 30, 1)); // Normalize debt (30 days max)
92
+ vector.push(state.quality.testsMeasured ? 1 : 0);
93
+ vector.push(state.quality.securityMeasured ? 1 : 0);
94
+ // Fleet features (3 dimensions)
95
+ vector.push(Math.min(state.fleet.activeAgents / 10, 1)); // Normalize (10 max)
96
+ vector.push(Math.min(state.fleet.availableAgents.length / 10, 1));
97
+ vector.push(state.fleet.topologyOptimized ? 1 : 0);
98
+ // Resource features (3 dimensions)
99
+ vector.push(Math.min(state.resources.timeRemaining / 3600, 1)); // 1 hour max
100
+ vector.push(Math.min(state.resources.memoryAvailable / 8192, 1)); // 8GB max
101
+ vector.push(Math.min(state.resources.parallelSlots / 8, 1)); // 8 slots max
102
+ // Context features (4 dimensions)
103
+ vector.push(this.encodeEnvironment(state.context.environment));
104
+ vector.push(this.encodeChangeSize(state.context.changeSize));
105
+ vector.push(this.encodeRiskLevel(state.context.riskLevel));
106
+ vector.push(Math.min(state.context.previousFailures / 5, 1)); // 5 failures max
107
+ return vector;
108
+ }
109
+ /**
110
+ * Encode environment as numeric value
111
+ */
112
+ encodeEnvironment(env) {
113
+ const mapping = { development: 0, staging: 0.5, production: 1 };
114
+ return mapping[env] ?? 0;
115
+ }
116
+ /**
117
+ * Encode change size as numeric value
118
+ */
119
+ encodeChangeSize(size) {
120
+ const mapping = { small: 0, medium: 0.5, large: 1 };
121
+ return mapping[size] ?? 0.5;
122
+ }
123
+ /**
124
+ * Encode risk level as numeric value
125
+ */
126
+ encodeRiskLevel(risk) {
127
+ const mapping = { low: 0, medium: 0.33, high: 0.67, critical: 1 };
128
+ return mapping[risk] ?? 0.5;
129
+ }
130
+ /**
131
+ * Create signature hash from goal conditions
132
+ */
133
+ createGoalSignature(goalConditions) {
134
+ // Sort keys for deterministic hashing
135
+ const sortedConditions = this.sortObjectKeys(goalConditions);
136
+ const json = JSON.stringify(sortedConditions);
137
+ return crypto_1.default.createHash('sha256').update(json).digest('hex').substring(0, 16);
138
+ }
139
+ /**
140
+ * Sort object keys recursively for deterministic serialization
141
+ */
142
+ sortObjectKeys(obj) {
143
+ if (obj === null || typeof obj !== 'object')
144
+ return obj;
145
+ if (Array.isArray(obj))
146
+ return obj.map(item => this.sortObjectKeys(item));
147
+ return Object.keys(obj)
148
+ .sort()
149
+ .reduce((result, key) => {
150
+ result[key] = this.sortObjectKeys(obj[key]);
151
+ return result;
152
+ }, {});
153
+ }
154
+ /**
155
+ * Calculate cosine similarity between two vectors
156
+ */
157
+ cosineSimilarity(vectorA, vectorB) {
158
+ if (vectorA.length !== vectorB.length) {
159
+ throw new Error(`Vector length mismatch: ${vectorA.length} vs ${vectorB.length}`);
160
+ }
161
+ let dotProduct = 0;
162
+ let normA = 0;
163
+ let normB = 0;
164
+ for (let i = 0; i < vectorA.length; i++) {
165
+ dotProduct += vectorA[i] * vectorB[i];
166
+ normA += vectorA[i] * vectorA[i];
167
+ normB += vectorB[i] * vectorB[i];
168
+ }
169
+ normA = Math.sqrt(normA);
170
+ normB = Math.sqrt(normB);
171
+ if (normA === 0 || normB === 0)
172
+ return 0;
173
+ return dotProduct / (normA * normB);
174
+ }
175
+ /**
176
+ * Calculate Euclidean distance between two vectors
177
+ */
178
+ euclideanDistance(vectorA, vectorB) {
179
+ if (vectorA.length !== vectorB.length) {
180
+ throw new Error(`Vector length mismatch: ${vectorA.length} vs ${vectorB.length}`);
181
+ }
182
+ let sum = 0;
183
+ for (let i = 0; i < vectorA.length; i++) {
184
+ const diff = vectorA[i] - vectorB[i];
185
+ sum += diff * diff;
186
+ }
187
+ return Math.sqrt(sum);
188
+ }
189
+ /**
190
+ * Store plan signature for future matching
191
+ */
192
+ storePlanSignature(planId, goalConditions, initialState, actions, totalCost) {
193
+ this.ensureSchema();
194
+ const id = `sig-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
195
+ const goalSignature = this.createGoalSignature(goalConditions);
196
+ const stateVector = this.extractStateVector(initialState);
197
+ const actionSequence = actions.map(a => a.id);
198
+ const signature = {
199
+ id,
200
+ planId,
201
+ goalSignature,
202
+ stateVector,
203
+ actionSequence,
204
+ totalCost,
205
+ successRate: 1.0,
206
+ usageCount: 0,
207
+ lastUsed: new Date(),
208
+ createdAt: new Date()
209
+ };
210
+ // Store in database
211
+ const stmt = this.db.prepare(`
212
+ INSERT OR REPLACE INTO goap_plan_signatures (
213
+ id, plan_id, goal_signature, state_vector, action_sequence,
214
+ total_cost, success_rate, usage_count, last_used, created_at
215
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
216
+ `);
217
+ stmt.run(signature.id, signature.planId, signature.goalSignature, JSON.stringify(signature.stateVector), JSON.stringify(signature.actionSequence), signature.totalCost, signature.successRate, signature.usageCount, signature.lastUsed.toISOString(), signature.createdAt.toISOString());
218
+ // Update caches
219
+ this.signatureCache.set(planId, signature);
220
+ const goalPlans = this.goalCache.get(goalSignature) || [];
221
+ if (!goalPlans.includes(planId)) {
222
+ goalPlans.push(planId);
223
+ this.goalCache.set(goalSignature, goalPlans);
224
+ }
225
+ this.logger.debug('[PlanSimilarity] Stored plan signature', {
226
+ planId,
227
+ goalSignature,
228
+ vectorLength: stateVector.length
229
+ });
230
+ return signature;
231
+ }
232
+ /**
233
+ * Find similar plans for a given goal and state
234
+ * Performance target: <100ms
235
+ */
236
+ async findSimilarPlans(goalConditions, currentState, options) {
237
+ const startTime = Date.now();
238
+ this.ensureSchema();
239
+ const maxCandidates = options?.maxCandidates ?? this.config.maxCandidates;
240
+ const minSimilarity = options?.minSimilarity ?? this.config.minSimilarityThreshold;
241
+ const goalSignature = this.createGoalSignature(goalConditions);
242
+ const currentVector = this.extractStateVector(currentState);
243
+ const similarPlans = [];
244
+ // Step 1: Check exact goal matches first (O(1) with cache)
245
+ if (this.config.useGoalCaching && this.goalCache.has(goalSignature)) {
246
+ const exactMatches = this.goalCache.get(goalSignature);
247
+ for (const planId of exactMatches) {
248
+ const signature = await this.getSignature(planId);
249
+ if (signature && signature.successRate >= 0.5) {
250
+ const similarity = this.cosineSimilarity(currentVector, signature.stateVector);
251
+ const distance = this.euclideanDistance(currentVector, signature.stateVector);
252
+ if (similarity >= minSimilarity) {
253
+ similarPlans.push({
254
+ planId,
255
+ signature,
256
+ similarityScore: similarity,
257
+ goalMatch: true,
258
+ stateDistance: distance
259
+ });
260
+ }
261
+ }
262
+ }
263
+ }
264
+ // Step 2: If not enough exact matches, search database for similar goals
265
+ if (similarPlans.length < maxCandidates) {
266
+ const candidates = this.db.prepare(`
267
+ SELECT * FROM goap_plan_signatures
268
+ WHERE success_rate >= 0.5
269
+ ORDER BY usage_count DESC, success_rate DESC
270
+ LIMIT ?
271
+ `).all(maxCandidates * 3);
272
+ for (const row of candidates) {
273
+ if (similarPlans.some(p => p.planId === row.plan_id))
274
+ continue;
275
+ const stateVector = JSON.parse(row.state_vector);
276
+ const similarity = this.cosineSimilarity(currentVector, stateVector);
277
+ const distance = this.euclideanDistance(currentVector, stateVector);
278
+ const isGoalMatch = row.goal_signature === goalSignature;
279
+ if (similarity >= minSimilarity || isGoalMatch) {
280
+ const signature = {
281
+ id: row.id,
282
+ planId: row.plan_id,
283
+ goalSignature: row.goal_signature,
284
+ stateVector,
285
+ actionSequence: JSON.parse(row.action_sequence),
286
+ totalCost: row.total_cost,
287
+ successRate: row.success_rate,
288
+ usageCount: row.usage_count,
289
+ lastUsed: new Date(row.last_used),
290
+ createdAt: new Date(row.created_at)
291
+ };
292
+ similarPlans.push({
293
+ planId: row.plan_id,
294
+ signature,
295
+ similarityScore: similarity,
296
+ goalMatch: isGoalMatch,
297
+ stateDistance: distance
298
+ });
299
+ }
300
+ }
301
+ }
302
+ // Sort by: exact goal match first, then similarity score
303
+ similarPlans.sort((a, b) => {
304
+ if (a.goalMatch !== b.goalMatch)
305
+ return b.goalMatch ? 1 : -1;
306
+ return b.similarityScore - a.similarityScore;
307
+ });
308
+ const results = similarPlans.slice(0, maxCandidates);
309
+ const elapsed = Date.now() - startTime;
310
+ this.logger.debug('[PlanSimilarity] Found similar plans', {
311
+ candidates: results.length,
312
+ exactMatches: results.filter(p => p.goalMatch).length,
313
+ elapsedMs: elapsed
314
+ });
315
+ if (elapsed > 100) {
316
+ this.logger.warn('[PlanSimilarity] Similarity search exceeded 100ms target', { elapsed });
317
+ }
318
+ return results;
319
+ }
320
+ /**
321
+ * Get signature from cache or database
322
+ */
323
+ async getSignature(planId) {
324
+ // Check cache first
325
+ if (this.signatureCache.has(planId)) {
326
+ return this.signatureCache.get(planId);
327
+ }
328
+ // Load from database
329
+ const row = this.db.prepare(`
330
+ SELECT * FROM goap_plan_signatures WHERE plan_id = ?
331
+ `).get(planId);
332
+ if (!row)
333
+ return null;
334
+ const signature = {
335
+ id: row.id,
336
+ planId: row.plan_id,
337
+ goalSignature: row.goal_signature,
338
+ stateVector: JSON.parse(row.state_vector),
339
+ actionSequence: JSON.parse(row.action_sequence),
340
+ totalCost: row.total_cost,
341
+ successRate: row.success_rate,
342
+ usageCount: row.usage_count,
343
+ lastUsed: new Date(row.last_used),
344
+ createdAt: new Date(row.created_at)
345
+ };
346
+ this.signatureCache.set(planId, signature);
347
+ return signature;
348
+ }
349
+ /**
350
+ * Record plan reuse (increments usage count)
351
+ */
352
+ recordPlanReuse(planId, success) {
353
+ this.ensureSchema();
354
+ // Update usage count and success rate
355
+ const current = this.db.prepare(`
356
+ SELECT success_rate, usage_count FROM goap_plan_signatures WHERE plan_id = ?
357
+ `).get(planId);
358
+ if (!current)
359
+ return;
360
+ const newUsageCount = current.usage_count + 1;
361
+ // Exponential moving average for success rate
362
+ const alpha = 0.1;
363
+ const newSuccessRate = current.success_rate * (1 - alpha) + (success ? 1 : 0) * alpha;
364
+ this.db.prepare(`
365
+ UPDATE goap_plan_signatures
366
+ SET usage_count = ?, success_rate = ?, last_used = CURRENT_TIMESTAMP
367
+ WHERE plan_id = ?
368
+ `).run(newUsageCount, newSuccessRate, planId);
369
+ // Update cache
370
+ const cached = this.signatureCache.get(planId);
371
+ if (cached) {
372
+ cached.usageCount = newUsageCount;
373
+ cached.successRate = newSuccessRate;
374
+ cached.lastUsed = new Date();
375
+ }
376
+ this.logger.debug('[PlanSimilarity] Recorded plan reuse', {
377
+ planId,
378
+ success,
379
+ usageCount: newUsageCount,
380
+ successRate: newSuccessRate
381
+ });
382
+ }
383
+ /**
384
+ * Get plan reuse statistics
385
+ */
386
+ getReuseStats() {
387
+ this.ensureSchema();
388
+ const totalRow = this.db.prepare(`
389
+ SELECT COUNT(*) as total FROM goap_plan_signatures
390
+ `).get();
391
+ const reusedRow = this.db.prepare(`
392
+ SELECT COUNT(*) as reused FROM goap_plan_signatures WHERE usage_count > 0
393
+ `).get();
394
+ const avgRow = this.db.prepare(`
395
+ SELECT AVG(success_rate) as avg_success FROM goap_plan_signatures WHERE usage_count > 0
396
+ `).get();
397
+ const topGoalsRows = this.db.prepare(`
398
+ SELECT goal_signature, SUM(usage_count) as total_reuse
399
+ FROM goap_plan_signatures
400
+ WHERE usage_count > 0
401
+ GROUP BY goal_signature
402
+ ORDER BY total_reuse DESC
403
+ LIMIT 5
404
+ `).all();
405
+ return {
406
+ totalPlans: totalRow.total,
407
+ reusedPlans: reusedRow.reused,
408
+ reuseRate: totalRow.total > 0 ? reusedRow.reused / totalRow.total : 0,
409
+ avgSimilarityScore: avgRow.avg_success ?? 0,
410
+ topGoals: topGoalsRows.map(row => ({
411
+ goal: row.goal_signature,
412
+ reuseCount: row.total_reuse
413
+ }))
414
+ };
415
+ }
416
+ /**
417
+ * Clear signature cache (for testing or memory management)
418
+ */
419
+ clearCache() {
420
+ this.goalCache.clear();
421
+ this.signatureCache.clear();
422
+ this.logger.debug('[PlanSimilarity] Cache cleared');
423
+ }
424
+ /**
425
+ * Preload signatures into cache for faster matching
426
+ */
427
+ async preloadCache(limit = 100) {
428
+ this.ensureSchema();
429
+ const rows = this.db.prepare(`
430
+ SELECT * FROM goap_plan_signatures
431
+ ORDER BY usage_count DESC, success_rate DESC
432
+ LIMIT ?
433
+ `).all(limit);
434
+ for (const row of rows) {
435
+ const signature = {
436
+ id: row.id,
437
+ planId: row.plan_id,
438
+ goalSignature: row.goal_signature,
439
+ stateVector: JSON.parse(row.state_vector),
440
+ actionSequence: JSON.parse(row.action_sequence),
441
+ totalCost: row.total_cost,
442
+ successRate: row.success_rate,
443
+ usageCount: row.usage_count,
444
+ lastUsed: new Date(row.last_used),
445
+ createdAt: new Date(row.created_at)
446
+ };
447
+ this.signatureCache.set(signature.planId, signature);
448
+ // Update goal cache
449
+ const goalPlans = this.goalCache.get(signature.goalSignature) || [];
450
+ if (!goalPlans.includes(signature.planId)) {
451
+ goalPlans.push(signature.planId);
452
+ this.goalCache.set(signature.goalSignature, goalPlans);
453
+ }
454
+ }
455
+ this.logger.debug('[PlanSimilarity] Preloaded cache', {
456
+ signatures: this.signatureCache.size,
457
+ goals: this.goalCache.size
458
+ });
459
+ return rows.length;
460
+ }
461
+ }
462
+ exports.PlanSimilarity = PlanSimilarity;
463
+ //# sourceMappingURL=PlanSimilarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanSimilarity.js","sourceRoot":"","sources":["../../src/planning/PlanSimilarity.ts"],"names":[],"mappings":"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"}