cmp-standards 2.8.0-alpha → 2.8.1
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/dist/cache/EmbeddingCache.d.ts +2 -1
- package/dist/cache/EmbeddingCache.d.ts.map +1 -1
- package/dist/cache/EmbeddingCache.js +12 -12
- package/dist/cache/EmbeddingCache.js.map +1 -1
- package/dist/db/cloud.d.ts +1 -0
- package/dist/db/cloud.d.ts.map +1 -1
- package/dist/db/drizzle-client.d.ts +10 -1
- package/dist/db/drizzle-client.d.ts.map +1 -1
- package/dist/db/drizzle-client.js +57 -3
- package/dist/db/drizzle-client.js.map +1 -1
- package/dist/db/errors.d.ts +13 -1
- package/dist/db/errors.d.ts.map +1 -1
- package/dist/db/errors.js +49 -5
- package/dist/db/errors.js.map +1 -1
- package/dist/db/migrations.d.ts +42 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +173 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/turso-client.d.ts +15 -3
- package/dist/db/turso-client.d.ts.map +1 -1
- package/dist/db/turso-client.js +49 -38
- package/dist/db/turso-client.js.map +1 -1
- package/dist/events/EventBus.d.ts +10 -0
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/events/EventBus.js +57 -1
- package/dist/events/EventBus.js.map +1 -1
- package/dist/experts/ExpertVotePersistence.d.ts +86 -0
- package/dist/experts/ExpertVotePersistence.d.ts.map +1 -0
- package/dist/experts/ExpertVotePersistence.js +234 -0
- package/dist/experts/ExpertVotePersistence.js.map +1 -0
- package/dist/experts/index.d.ts +1 -0
- package/dist/experts/index.d.ts.map +1 -1
- package/dist/experts/index.js +2 -0
- package/dist/experts/index.js.map +1 -1
- package/dist/hooks/cloud-post-tool-use.d.ts +5 -0
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
- package/dist/hooks/cloud-post-tool-use.js +43 -10
- package/dist/hooks/cloud-post-tool-use.js.map +1 -1
- package/dist/hooks/cloud-session-start.d.ts.map +1 -1
- package/dist/hooks/cloud-session-start.js +64 -0
- package/dist/hooks/cloud-session-start.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/session-end.d.ts +67 -0
- package/dist/hooks/session-end.d.ts.map +1 -0
- package/dist/hooks/session-end.js +268 -0
- package/dist/hooks/session-end.js.map +1 -0
- package/dist/interfaces/index.d.ts +450 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +50 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/mcp/schemas.d.ts +278 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +166 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/patterns/feedback-loop.d.ts +264 -0
- package/dist/patterns/feedback-loop.d.ts.map +1 -0
- package/dist/patterns/feedback-loop.js +329 -0
- package/dist/patterns/feedback-loop.js.map +1 -0
- package/dist/patterns/index.d.ts +9 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +9 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/lifecycle.d.ts +88 -0
- package/dist/patterns/lifecycle.d.ts.map +1 -0
- package/dist/patterns/lifecycle.js +284 -0
- package/dist/patterns/lifecycle.js.map +1 -0
- package/dist/patterns/registry.d.ts +142 -0
- package/dist/patterns/registry.d.ts.map +1 -0
- package/dist/patterns/registry.js +442 -0
- package/dist/patterns/registry.js.map +1 -0
- package/dist/performance/Debouncer.d.ts +57 -0
- package/dist/performance/Debouncer.d.ts.map +1 -1
- package/dist/performance/Debouncer.js +149 -0
- package/dist/performance/Debouncer.js.map +1 -1
- package/dist/performance/index.d.ts +1 -1
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -1
- package/dist/performance/index.js.map +1 -1
- package/dist/schema/expert-types.d.ts +2 -2
- package/dist/services/FeedbackCollector.d.ts +63 -0
- package/dist/services/FeedbackCollector.d.ts.map +1 -0
- package/dist/services/FeedbackCollector.js +219 -0
- package/dist/services/FeedbackCollector.js.map +1 -0
- package/dist/services/PlanManager.d.ts +1 -1
- package/dist/services/PlanManager.d.ts.map +1 -1
- package/dist/services/PlanManager.js +26 -6
- package/dist/services/PlanManager.js.map +1 -1
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/pattern-tracker.d.ts +50 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -1
- package/dist/services/pattern-tracker.js +148 -0
- package/dist/services/pattern-tracker.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,6 +15,45 @@ const DEFAULT_CONFIG = {
|
|
|
15
15
|
debug: false,
|
|
16
16
|
};
|
|
17
17
|
// =============================================================================
|
|
18
|
+
// Smart Debouncing by Tool Type
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Tool-specific debounce windows
|
|
22
|
+
* Different tools have different optimal debounce times
|
|
23
|
+
*/
|
|
24
|
+
export const TOOL_DEBOUNCE_CONFIG = {
|
|
25
|
+
// Read operations - frequent, short debounce
|
|
26
|
+
'Read': 1000,
|
|
27
|
+
'Glob': 2000,
|
|
28
|
+
'Grep': 2000,
|
|
29
|
+
'LSP': 1000,
|
|
30
|
+
// Write operations - no debounce (always execute)
|
|
31
|
+
'Write': 0,
|
|
32
|
+
'Edit': 0,
|
|
33
|
+
'NotebookEdit': 0,
|
|
34
|
+
// External operations - longer debounce
|
|
35
|
+
'WebSearch': 5000,
|
|
36
|
+
'WebFetch': 5000,
|
|
37
|
+
'Bash': 3000,
|
|
38
|
+
// Task/Agent operations - medium debounce
|
|
39
|
+
'Task': 3000,
|
|
40
|
+
'Skill': 2000,
|
|
41
|
+
// Default for unknown tools
|
|
42
|
+
'default': 3000
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Get debounce window for a specific tool
|
|
46
|
+
*/
|
|
47
|
+
export function getToolDebounceMs(toolName) {
|
|
48
|
+
return TOOL_DEBOUNCE_CONFIG[toolName] ?? TOOL_DEBOUNCE_CONFIG['default'];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a tool should never be debounced (write operations)
|
|
52
|
+
*/
|
|
53
|
+
export function isWriteOperation(toolName) {
|
|
54
|
+
return ['Write', 'Edit', 'NotebookEdit'].includes(toolName);
|
|
55
|
+
}
|
|
56
|
+
// =============================================================================
|
|
18
57
|
// Debouncer Implementation
|
|
19
58
|
// =============================================================================
|
|
20
59
|
export class Debouncer {
|
|
@@ -166,12 +205,115 @@ export class HookDebouncer extends Debouncer {
|
|
|
166
205
|
return this.shouldSkip(`hook:${key}`);
|
|
167
206
|
}
|
|
168
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Smart Debouncer with tool-specific windows
|
|
210
|
+
* Uses different debounce times based on tool type
|
|
211
|
+
*/
|
|
212
|
+
export class SmartDebouncer {
|
|
213
|
+
entries = new Map();
|
|
214
|
+
maxEntries;
|
|
215
|
+
debug;
|
|
216
|
+
stats = {
|
|
217
|
+
totalCalls: 0,
|
|
218
|
+
skipped: 0,
|
|
219
|
+
byTool: new Map()
|
|
220
|
+
};
|
|
221
|
+
constructor(options = {}) {
|
|
222
|
+
this.maxEntries = options.maxEntries ?? 500;
|
|
223
|
+
this.debug = options.debug ?? false;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if operation should be skipped based on tool-specific window
|
|
227
|
+
*/
|
|
228
|
+
shouldSkip(toolName, params) {
|
|
229
|
+
const debounceMs = getToolDebounceMs(toolName);
|
|
230
|
+
// Write operations are never debounced
|
|
231
|
+
if (debounceMs === 0) {
|
|
232
|
+
this.trackCall(toolName, false);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
this.stats.totalCalls++;
|
|
236
|
+
const now = Date.now();
|
|
237
|
+
const paramsStr = JSON.stringify(params, Object.keys(params).sort());
|
|
238
|
+
const key = createHash('md5').update(`${toolName}:${paramsStr}`).digest('hex');
|
|
239
|
+
const entry = this.entries.get(key);
|
|
240
|
+
if (entry && now - entry.lastCall < debounceMs) {
|
|
241
|
+
this.stats.skipped++;
|
|
242
|
+
entry.callCount++;
|
|
243
|
+
this.trackCall(toolName, true);
|
|
244
|
+
if (this.debug) {
|
|
245
|
+
console.log(`[SmartDebouncer] Skipping ${toolName} (window: ${debounceMs}ms, called ${entry.callCount}x)`);
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
// Update or create entry
|
|
250
|
+
this.entries.set(key, { lastCall: now, callCount: 1 });
|
|
251
|
+
// Cleanup if needed
|
|
252
|
+
if (this.entries.size > this.maxEntries) {
|
|
253
|
+
this.cleanup();
|
|
254
|
+
}
|
|
255
|
+
this.trackCall(toolName, false);
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
trackCall(toolName, skipped) {
|
|
259
|
+
const existing = this.stats.byTool.get(toolName) ?? { total: 0, skipped: 0 };
|
|
260
|
+
existing.total++;
|
|
261
|
+
if (skipped)
|
|
262
|
+
existing.skipped++;
|
|
263
|
+
this.stats.byTool.set(toolName, existing);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Cleanup old entries (uses longest debounce window)
|
|
267
|
+
*/
|
|
268
|
+
cleanup() {
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
const maxWindow = Math.max(...Object.values(TOOL_DEBOUNCE_CONFIG));
|
|
271
|
+
let removed = 0;
|
|
272
|
+
for (const [key, entry] of this.entries) {
|
|
273
|
+
if (now - entry.lastCall > maxWindow) {
|
|
274
|
+
this.entries.delete(key);
|
|
275
|
+
removed++;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return removed;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get statistics including per-tool breakdown
|
|
282
|
+
*/
|
|
283
|
+
getStats() {
|
|
284
|
+
const byTool = {};
|
|
285
|
+
for (const [tool, stats] of this.stats.byTool) {
|
|
286
|
+
byTool[tool] = {
|
|
287
|
+
...stats,
|
|
288
|
+
skipRate: stats.total > 0 ? stats.skipped / stats.total : 0
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
totalCalls: this.stats.totalCalls,
|
|
293
|
+
skipped: this.stats.skipped,
|
|
294
|
+
skipRate: this.stats.totalCalls > 0 ? this.stats.skipped / this.stats.totalCalls : 0,
|
|
295
|
+
byTool
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Reset all state
|
|
300
|
+
*/
|
|
301
|
+
reset() {
|
|
302
|
+
this.entries.clear();
|
|
303
|
+
this.stats = {
|
|
304
|
+
totalCalls: 0,
|
|
305
|
+
skipped: 0,
|
|
306
|
+
byTool: new Map()
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
169
310
|
// =============================================================================
|
|
170
311
|
// Singleton Instances
|
|
171
312
|
// =============================================================================
|
|
172
313
|
let globalDebouncer = null;
|
|
173
314
|
let globalEmbeddingDebouncer = null;
|
|
174
315
|
let globalHookDebouncer = null;
|
|
316
|
+
let globalSmartDebouncer = null;
|
|
175
317
|
export function getDebouncer(config) {
|
|
176
318
|
if (!globalDebouncer) {
|
|
177
319
|
globalDebouncer = new Debouncer(config);
|
|
@@ -190,9 +332,16 @@ export function getHookDebouncer(config) {
|
|
|
190
332
|
}
|
|
191
333
|
return globalHookDebouncer;
|
|
192
334
|
}
|
|
335
|
+
export function getSmartDebouncer(options) {
|
|
336
|
+
if (!globalSmartDebouncer) {
|
|
337
|
+
globalSmartDebouncer = new SmartDebouncer(options);
|
|
338
|
+
}
|
|
339
|
+
return globalSmartDebouncer;
|
|
340
|
+
}
|
|
193
341
|
export function resetDebouncers() {
|
|
194
342
|
globalDebouncer = null;
|
|
195
343
|
globalEmbeddingDebouncer = null;
|
|
196
344
|
globalHookDebouncer = null;
|
|
345
|
+
globalSmartDebouncer = null;
|
|
197
346
|
}
|
|
198
347
|
//# sourceMappingURL=Debouncer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Debouncer.js","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Debouncer.js","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* @file Performance Module - cmp-standards v2.8
|
|
3
3
|
* @description Performance optimization utilities
|
|
4
4
|
*/
|
|
5
|
-
export { Debouncer, DebouncerConfig, DebouncerStats, EmbeddingDebouncer, HookDebouncer, getDebouncer, getEmbeddingDebouncer, getHookDebouncer, resetDebouncers, } from './Debouncer.js';
|
|
5
|
+
export { Debouncer, DebouncerConfig, DebouncerStats, EmbeddingDebouncer, HookDebouncer, SmartDebouncer, getDebouncer, getEmbeddingDebouncer, getHookDebouncer, getSmartDebouncer, resetDebouncers, TOOL_DEBOUNCE_CONFIG, getToolDebounceMs, isWriteOperation, } from './Debouncer.js';
|
|
6
6
|
export { MemoryDecay, MemoryForScoring, ScoredMemory, DecayConfig, getMemoryDecay, resetMemoryDecay, } from './MemoryDecay.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAEf,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAA"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* @description Performance optimization utilities
|
|
4
4
|
*/
|
|
5
5
|
// Debouncing
|
|
6
|
-
export { Debouncer, EmbeddingDebouncer, HookDebouncer, getDebouncer, getEmbeddingDebouncer, getHookDebouncer, resetDebouncers,
|
|
6
|
+
export { Debouncer, EmbeddingDebouncer, HookDebouncer, SmartDebouncer, getDebouncer, getEmbeddingDebouncer, getHookDebouncer, getSmartDebouncer, resetDebouncers,
|
|
7
|
+
// Smart debouncing utilities
|
|
8
|
+
TOOL_DEBOUNCE_CONFIG, getToolDebounceMs, isWriteOperation, } from './Debouncer.js';
|
|
7
9
|
// Memory Decay
|
|
8
10
|
export { MemoryDecay, getMemoryDecay, resetMemoryDecay, } from './MemoryDecay.js';
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,OAAO,EACL,SAAS,EAGT,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,OAAO,EACL,SAAS,EAGT,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe;AACf,6BAA6B;AAC7B,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AAEvB,eAAe;AACf,OAAO,EACL,WAAW,EAIX,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAA"}
|
|
@@ -246,7 +246,7 @@ export declare const PatternStatContentSchema: z.ZodObject<{
|
|
|
246
246
|
autoImproveTriggered: boolean;
|
|
247
247
|
occurrenceCount: number;
|
|
248
248
|
avgSeverity: number;
|
|
249
|
-
trend: "increasing" | "
|
|
249
|
+
trend: "increasing" | "stable" | "decreasing";
|
|
250
250
|
isPersistent: boolean;
|
|
251
251
|
description?: string | undefined;
|
|
252
252
|
firstSeen?: string | undefined;
|
|
@@ -263,7 +263,7 @@ export declare const PatternStatContentSchema: z.ZodObject<{
|
|
|
263
263
|
autoImproveTriggered?: boolean | undefined;
|
|
264
264
|
occurrenceCount?: number | undefined;
|
|
265
265
|
avgSeverity?: number | undefined;
|
|
266
|
-
trend?: "increasing" | "
|
|
266
|
+
trend?: "increasing" | "stable" | "decreasing" | undefined;
|
|
267
267
|
isPersistent?: boolean | undefined;
|
|
268
268
|
eslintRuleId?: string | undefined;
|
|
269
269
|
effectivenessScore?: number | undefined;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file FeedbackCollector Service
|
|
3
|
+
* @description Tracks memory usage feedback to enable learning loop
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Track when memories are used, dismissed, or rated
|
|
7
|
+
* - Update memory decay scores based on feedback
|
|
8
|
+
* - Enable relevance learning over time
|
|
9
|
+
*
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
import type { DevSystem } from '../types/index.js';
|
|
13
|
+
export type FeedbackAction = 'used' | 'dismissed' | 'helpful' | 'wrong' | 'outdated';
|
|
14
|
+
export interface MemoryFeedback {
|
|
15
|
+
memoryId: string;
|
|
16
|
+
action: FeedbackAction;
|
|
17
|
+
toolContext?: string;
|
|
18
|
+
sessionId?: string;
|
|
19
|
+
timestamp?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface FeedbackStats {
|
|
22
|
+
totalFeedback: number;
|
|
23
|
+
usedCount: number;
|
|
24
|
+
dismissedCount: number;
|
|
25
|
+
helpfulCount: number;
|
|
26
|
+
wrongCount: number;
|
|
27
|
+
avgScore: number;
|
|
28
|
+
}
|
|
29
|
+
export interface MemoryWithScore {
|
|
30
|
+
id: string;
|
|
31
|
+
feedbackScore: number;
|
|
32
|
+
accessCount: number;
|
|
33
|
+
lastAccessedAt: string;
|
|
34
|
+
}
|
|
35
|
+
declare class FeedbackCollectorService {
|
|
36
|
+
/**
|
|
37
|
+
* Track feedback for a memory
|
|
38
|
+
*/
|
|
39
|
+
track(feedback: MemoryFeedback): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Track multiple memories used in a single tool call
|
|
42
|
+
*/
|
|
43
|
+
trackBatch(memoryIds: string[], action: FeedbackAction, toolContext?: string, sessionId?: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get feedback statistics for a memory
|
|
46
|
+
*/
|
|
47
|
+
getStats(memoryId: string): Promise<FeedbackStats | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Get memories sorted by feedback score (for relevance-based retrieval)
|
|
50
|
+
*/
|
|
51
|
+
getTopScoredMemories(system: DevSystem, limit?: number): Promise<MemoryWithScore[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Get memories with low scores that might need review or archival
|
|
54
|
+
*/
|
|
55
|
+
getLowScoredMemories(system: DevSystem, threshold?: number, limit?: number): Promise<MemoryWithScore[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Archive memories with very low scores (cleanup)
|
|
58
|
+
*/
|
|
59
|
+
archiveLowScoredMemories(system: DevSystem, threshold?: number, minAge?: number): Promise<number>;
|
|
60
|
+
}
|
|
61
|
+
export declare const feedbackCollector: FeedbackCollectorService;
|
|
62
|
+
export default feedbackCollector;
|
|
63
|
+
//# sourceMappingURL=FeedbackCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackCollector.d.ts","sourceRoot":"","sources":["../../src/services/FeedbackCollector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAMlD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAEpF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;CACvB;AAsBD,cAAM,wBAAwB;IAC5B;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEpD;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,cAAc,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgC/D;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,SAAS,EACjB,KAAK,SAAK,GACT,OAAO,CAAC,eAAe,EAAE,CAAC;IA8B7B;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,SAAS,EACjB,SAAS,SAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC,eAAe,EAAE,CAAC;IA8B7B;;OAEG;IACG,wBAAwB,CAC5B,MAAM,EAAE,SAAS,EACjB,SAAS,SAAM,EACf,MAAM,SAAK,GACV,OAAO,CAAC,MAAM,CAAC;CAsBnB;AAMD,eAAO,MAAM,iBAAiB,0BAAiC,CAAA;AAC/D,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file FeedbackCollector Service
|
|
3
|
+
* @description Tracks memory usage feedback to enable learning loop
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Track when memories are used, dismissed, or rated
|
|
7
|
+
* - Update memory decay scores based on feedback
|
|
8
|
+
* - Enable relevance learning over time
|
|
9
|
+
*
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
import { turso } from '../db/turso-client.js';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Score Adjustments
|
|
15
|
+
// =============================================================================
|
|
16
|
+
const SCORE_ADJUSTMENTS = {
|
|
17
|
+
used: 0.02, // Small positive for each use
|
|
18
|
+
dismissed: -0.05, // Negative when dismissed
|
|
19
|
+
helpful: 0.15, // Strong positive for explicit helpful
|
|
20
|
+
wrong: -0.25, // Strong negative for wrong info
|
|
21
|
+
outdated: -0.15 // Moderate negative for outdated
|
|
22
|
+
};
|
|
23
|
+
const MIN_SCORE = 0.0;
|
|
24
|
+
const MAX_SCORE = 1.0;
|
|
25
|
+
const DEFAULT_SCORE = 0.5;
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// FeedbackCollector Implementation
|
|
28
|
+
// =============================================================================
|
|
29
|
+
class FeedbackCollectorService {
|
|
30
|
+
/**
|
|
31
|
+
* Track feedback for a memory
|
|
32
|
+
*/
|
|
33
|
+
async track(feedback) {
|
|
34
|
+
const { memoryId, action, toolContext, sessionId } = feedback;
|
|
35
|
+
const timestamp = feedback.timestamp || new Date().toISOString();
|
|
36
|
+
try {
|
|
37
|
+
const db = turso.getClient();
|
|
38
|
+
// 1. Get current memory state
|
|
39
|
+
const result = await db.execute({
|
|
40
|
+
sql: `SELECT id, content FROM items WHERE id = ?`,
|
|
41
|
+
args: [memoryId]
|
|
42
|
+
});
|
|
43
|
+
if (result.rows.length === 0) {
|
|
44
|
+
console.warn(`[FeedbackCollector] Memory not found: ${memoryId}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const row = result.rows[0];
|
|
48
|
+
const content = typeof row.content === 'string'
|
|
49
|
+
? JSON.parse(row.content)
|
|
50
|
+
: row.content;
|
|
51
|
+
// 2. Calculate new score
|
|
52
|
+
const currentScore = content.feedbackScore ?? DEFAULT_SCORE;
|
|
53
|
+
const currentAccessCount = content.accessCount ?? 0;
|
|
54
|
+
const adjustment = SCORE_ADJUSTMENTS[action];
|
|
55
|
+
const newScore = Math.max(MIN_SCORE, Math.min(MAX_SCORE, currentScore + adjustment));
|
|
56
|
+
const newAccessCount = currentAccessCount + 1;
|
|
57
|
+
// 3. Build feedback history entry
|
|
58
|
+
const feedbackEntry = {
|
|
59
|
+
action,
|
|
60
|
+
toolContext,
|
|
61
|
+
sessionId,
|
|
62
|
+
timestamp
|
|
63
|
+
};
|
|
64
|
+
// Keep last 20 feedback entries
|
|
65
|
+
const feedbackHistory = content.feedbackHistory || [];
|
|
66
|
+
feedbackHistory.push(feedbackEntry);
|
|
67
|
+
if (feedbackHistory.length > 20) {
|
|
68
|
+
feedbackHistory.shift();
|
|
69
|
+
}
|
|
70
|
+
// 4. Update memory with new score and feedback
|
|
71
|
+
const updatedContent = {
|
|
72
|
+
...content,
|
|
73
|
+
feedbackScore: newScore,
|
|
74
|
+
accessCount: newAccessCount,
|
|
75
|
+
lastAccessedAt: timestamp,
|
|
76
|
+
feedbackHistory
|
|
77
|
+
};
|
|
78
|
+
await db.execute({
|
|
79
|
+
sql: `UPDATE items SET content = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
80
|
+
args: [JSON.stringify(updatedContent), memoryId]
|
|
81
|
+
});
|
|
82
|
+
console.log(`[FeedbackCollector] Tracked ${action} for ${memoryId}: ${currentScore.toFixed(2)} -> ${newScore.toFixed(2)}`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(`[FeedbackCollector] Failed to track feedback:`, error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Track multiple memories used in a single tool call
|
|
90
|
+
*/
|
|
91
|
+
async trackBatch(memoryIds, action, toolContext, sessionId) {
|
|
92
|
+
const timestamp = new Date().toISOString();
|
|
93
|
+
await Promise.all(memoryIds.map(memoryId => this.track({ memoryId, action, toolContext, sessionId, timestamp })));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get feedback statistics for a memory
|
|
97
|
+
*/
|
|
98
|
+
async getStats(memoryId) {
|
|
99
|
+
try {
|
|
100
|
+
const db = turso.getClient();
|
|
101
|
+
const result = await db.execute({
|
|
102
|
+
sql: `SELECT content FROM items WHERE id = ?`,
|
|
103
|
+
args: [memoryId]
|
|
104
|
+
});
|
|
105
|
+
if (result.rows.length === 0)
|
|
106
|
+
return null;
|
|
107
|
+
const content = typeof result.rows[0].content === 'string'
|
|
108
|
+
? JSON.parse(result.rows[0].content)
|
|
109
|
+
: result.rows[0].content;
|
|
110
|
+
const history = content.feedbackHistory || [];
|
|
111
|
+
const stats = {
|
|
112
|
+
totalFeedback: history.length,
|
|
113
|
+
usedCount: history.filter((f) => f.action === 'used').length,
|
|
114
|
+
dismissedCount: history.filter((f) => f.action === 'dismissed').length,
|
|
115
|
+
helpfulCount: history.filter((f) => f.action === 'helpful').length,
|
|
116
|
+
wrongCount: history.filter((f) => f.action === 'wrong').length,
|
|
117
|
+
avgScore: content.feedbackScore ?? DEFAULT_SCORE
|
|
118
|
+
};
|
|
119
|
+
return stats;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error(`[FeedbackCollector] Failed to get stats:`, error);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get memories sorted by feedback score (for relevance-based retrieval)
|
|
128
|
+
*/
|
|
129
|
+
async getTopScoredMemories(system, limit = 20) {
|
|
130
|
+
try {
|
|
131
|
+
const db = turso.getClient();
|
|
132
|
+
const result = await db.execute({
|
|
133
|
+
sql: `SELECT id, content FROM items
|
|
134
|
+
WHERE system = ? AND type = 'memory' AND status = 'active'
|
|
135
|
+
ORDER BY COALESCE(json_extract(content, '$.feedbackScore'), 0.5) DESC,
|
|
136
|
+
COALESCE(json_extract(content, '$.accessCount'), 0) DESC
|
|
137
|
+
LIMIT ?`,
|
|
138
|
+
args: [system, limit]
|
|
139
|
+
});
|
|
140
|
+
return result.rows.map(row => {
|
|
141
|
+
const content = typeof row.content === 'string'
|
|
142
|
+
? JSON.parse(row.content)
|
|
143
|
+
: row.content;
|
|
144
|
+
return {
|
|
145
|
+
id: row.id,
|
|
146
|
+
feedbackScore: content.feedbackScore ?? DEFAULT_SCORE,
|
|
147
|
+
accessCount: content.accessCount ?? 0,
|
|
148
|
+
lastAccessedAt: content.lastAccessedAt ?? ''
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(`[FeedbackCollector] Failed to get top scored:`, error);
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get memories with low scores that might need review or archival
|
|
159
|
+
*/
|
|
160
|
+
async getLowScoredMemories(system, threshold = 0.3, limit = 20) {
|
|
161
|
+
try {
|
|
162
|
+
const db = turso.getClient();
|
|
163
|
+
const result = await db.execute({
|
|
164
|
+
sql: `SELECT id, content FROM items
|
|
165
|
+
WHERE system = ? AND type = 'memory' AND status = 'active'
|
|
166
|
+
AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
|
|
167
|
+
ORDER BY json_extract(content, '$.feedbackScore') ASC
|
|
168
|
+
LIMIT ?`,
|
|
169
|
+
args: [system, threshold, limit]
|
|
170
|
+
});
|
|
171
|
+
return result.rows.map(row => {
|
|
172
|
+
const content = typeof row.content === 'string'
|
|
173
|
+
? JSON.parse(row.content)
|
|
174
|
+
: row.content;
|
|
175
|
+
return {
|
|
176
|
+
id: row.id,
|
|
177
|
+
feedbackScore: content.feedbackScore ?? DEFAULT_SCORE,
|
|
178
|
+
accessCount: content.accessCount ?? 0,
|
|
179
|
+
lastAccessedAt: content.lastAccessedAt ?? ''
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error(`[FeedbackCollector] Failed to get low scored:`, error);
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Archive memories with very low scores (cleanup)
|
|
190
|
+
*/
|
|
191
|
+
async archiveLowScoredMemories(system, threshold = 0.1, minAge = 30 // days
|
|
192
|
+
) {
|
|
193
|
+
try {
|
|
194
|
+
const db = turso.getClient();
|
|
195
|
+
const result = await db.execute({
|
|
196
|
+
sql: `UPDATE items SET status = 'archived', updated_at = datetime('now')
|
|
197
|
+
WHERE system = ? AND type = 'memory' AND status = 'active'
|
|
198
|
+
AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
|
|
199
|
+
AND created_at < datetime('now', '-' || ? || ' days')`,
|
|
200
|
+
args: [system, threshold, minAge]
|
|
201
|
+
});
|
|
202
|
+
const archived = result.rowsAffected ?? 0;
|
|
203
|
+
if (archived > 0) {
|
|
204
|
+
console.log(`[FeedbackCollector] Archived ${archived} low-scored memories`);
|
|
205
|
+
}
|
|
206
|
+
return archived;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
console.error(`[FeedbackCollector] Failed to archive:`, error);
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// =============================================================================
|
|
215
|
+
// Export Singleton
|
|
216
|
+
// =============================================================================
|
|
217
|
+
export const feedbackCollector = new FeedbackCollectorService();
|
|
218
|
+
export default feedbackCollector;
|
|
219
|
+
//# sourceMappingURL=FeedbackCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackCollector.js","sourceRoot":"","sources":["../../src/services/FeedbackCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,7 +78,7 @@ export declare class PlanManager {
|
|
|
78
78
|
*/
|
|
79
79
|
getLastCheckpoint(planId: string): Promise<PlanCheckpoint | null>;
|
|
80
80
|
/**
|
|
81
|
-
* Generar contexto de planes para session start
|
|
81
|
+
* Generar contexto de planes para session start (optimizado - sin N+1)
|
|
82
82
|
*/
|
|
83
83
|
getSessionContext(currentPrompt?: string): Promise<string>;
|
|
84
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanManager.d.ts","sourceRoot":"","sources":["../../src/services/PlanManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,mBAAmB,CAAA;AAM3D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAGrB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAYpD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCvD;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAkB/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAalC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0DpE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrE;;OAEG;IACG,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DtE;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuC3F;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsB3E;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IASvE;;OAEG;IACG,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanManager.d.ts","sourceRoot":"","sources":["../../src/services/PlanManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EAOpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,mBAAmB,CAAA;AAM3D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAGrB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAYpD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCvD;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAkB/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAalC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0DpE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrE;;OAEG;IACG,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DtE;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuC3F;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsB3E;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IASvE;;OAEG;IACG,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuEjE;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,WAAW,CAKb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,WAAW,CAEb"}
|
|
@@ -290,16 +290,36 @@ export class PlanManager {
|
|
|
290
290
|
// CONTEXT FOR SESSION START
|
|
291
291
|
// ===========================================================================
|
|
292
292
|
/**
|
|
293
|
-
* Generar contexto de planes para session start
|
|
293
|
+
* Generar contexto de planes para session start (optimizado - sin N+1)
|
|
294
294
|
*/
|
|
295
295
|
async getSessionContext(currentPrompt) {
|
|
296
296
|
let context = '';
|
|
297
|
-
//
|
|
298
|
-
const activePlans = await
|
|
297
|
+
// Batch query: obtener planes activos Y todos sus checkpoints en paralelo
|
|
298
|
+
const [activePlans, allCheckpoints] = await Promise.all([
|
|
299
|
+
this.getActive(),
|
|
300
|
+
this.client.list({ type: 'plan_checkpoint', limit: 100 }),
|
|
301
|
+
]);
|
|
302
|
+
// Pre-compute último checkpoint por planId (O(1) lookup en lugar de N queries)
|
|
303
|
+
const lastCheckpointByPlan = new Map();
|
|
304
|
+
for (const item of allCheckpoints) {
|
|
305
|
+
const parseResult = PlanCheckpointSchema.safeParse({
|
|
306
|
+
...item.content,
|
|
307
|
+
id: item.id,
|
|
308
|
+
});
|
|
309
|
+
if (parseResult.success) {
|
|
310
|
+
const checkpoint = parseResult.data;
|
|
311
|
+
const existing = lastCheckpointByPlan.get(checkpoint.planId);
|
|
312
|
+
// Mantener solo el más reciente
|
|
313
|
+
if (!existing || checkpoint.createdAt > existing.createdAt) {
|
|
314
|
+
lastCheckpointByPlan.set(checkpoint.planId, checkpoint);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
299
318
|
if (activePlans.length > 0) {
|
|
300
|
-
context += `##
|
|
319
|
+
context += `## Planes Activos (${activePlans.length})\n\n`;
|
|
301
320
|
for (const plan of activePlans.slice(0, 3)) {
|
|
302
|
-
|
|
321
|
+
// O(1) lookup en lugar de query a BD
|
|
322
|
+
const lastCheckpoint = lastCheckpointByPlan.get(plan.id);
|
|
303
323
|
context += `### ${plan.title}\n`;
|
|
304
324
|
context += `- **Estado**: ${plan.status}\n`;
|
|
305
325
|
if (lastCheckpoint) {
|
|
@@ -319,7 +339,7 @@ export class PlanManager {
|
|
|
319
339
|
limit: 3,
|
|
320
340
|
});
|
|
321
341
|
if (similar.length > 0) {
|
|
322
|
-
context += `##
|
|
342
|
+
context += `## Planes Relacionados Encontrados\n\n`;
|
|
323
343
|
context += `Tu solicitud parece relacionarse con planes existentes:\n\n`;
|
|
324
344
|
for (const match of similar) {
|
|
325
345
|
const similarity = Math.round(match.similarity * 100);
|