memctx 1.0.0
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/LICENSE +21 -0
- package/README.md +289 -0
- package/dist/bin/claudectx.d.ts +2 -0
- package/dist/bin/claudectx.js +304 -0
- package/dist/bin/claudectx.js.map +1 -0
- package/dist/installer/daemon.d.ts +3 -0
- package/dist/installer/daemon.js +80 -0
- package/dist/installer/daemon.js.map +1 -0
- package/dist/installer/patch-settings.d.ts +2 -0
- package/dist/installer/patch-settings.js +83 -0
- package/dist/installer/patch-settings.js.map +1 -0
- package/dist/src/api/consolidate.d.ts +3 -0
- package/dist/src/api/consolidate.js +29 -0
- package/dist/src/api/consolidate.js.map +1 -0
- package/dist/src/api/context.d.ts +1 -0
- package/dist/src/api/context.js +26 -0
- package/dist/src/api/context.js.map +1 -0
- package/dist/src/api/force-end-session.d.ts +2 -0
- package/dist/src/api/force-end-session.js +60 -0
- package/dist/src/api/force-end-session.js.map +1 -0
- package/dist/src/api/health.d.ts +1 -0
- package/dist/src/api/health.js +27 -0
- package/dist/src/api/health.js.map +1 -0
- package/dist/src/api/hook.d.ts +2 -0
- package/dist/src/api/hook.js +187 -0
- package/dist/src/api/hook.js.map +1 -0
- package/dist/src/api/logs.d.ts +2 -0
- package/dist/src/api/logs.js +66 -0
- package/dist/src/api/logs.js.map +1 -0
- package/dist/src/api/memory.d.ts +2 -0
- package/dist/src/api/memory.js +93 -0
- package/dist/src/api/memory.js.map +1 -0
- package/dist/src/api/metrics.d.ts +3 -0
- package/dist/src/api/metrics.js +58 -0
- package/dist/src/api/metrics.js.map +1 -0
- package/dist/src/api/observations.d.ts +1 -0
- package/dist/src/api/observations.js +31 -0
- package/dist/src/api/observations.js.map +1 -0
- package/dist/src/api/projects.d.ts +1 -0
- package/dist/src/api/projects.js +29 -0
- package/dist/src/api/projects.js.map +1 -0
- package/dist/src/api/resync.d.ts +3 -0
- package/dist/src/api/resync.js +188 -0
- package/dist/src/api/resync.js.map +1 -0
- package/dist/src/api/search.d.ts +1 -0
- package/dist/src/api/search.js +36 -0
- package/dist/src/api/search.js.map +1 -0
- package/dist/src/api/sessions.d.ts +1 -0
- package/dist/src/api/sessions.js +137 -0
- package/dist/src/api/sessions.js.map +1 -0
- package/dist/src/api/settings.d.ts +2 -0
- package/dist/src/api/settings.js +90 -0
- package/dist/src/api/settings.js.map +1 -0
- package/dist/src/api/tags.d.ts +1 -0
- package/dist/src/api/tags.js +89 -0
- package/dist/src/api/tags.js.map +1 -0
- package/dist/src/config.d.ts +17 -0
- package/dist/src/config.js +39 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db/client.d.ts +3 -0
- package/dist/src/db/client.js +38 -0
- package/dist/src/db/client.js.map +1 -0
- package/dist/src/db/migrate.d.ts +1 -0
- package/dist/src/db/migrate.js +56 -0
- package/dist/src/db/migrate.js.map +1 -0
- package/dist/src/db/migrations/001_add_memory_tables.sql +149 -0
- package/dist/src/db/migrations/002_add_project_id_to_memory.sql +25 -0
- package/dist/src/db/migrations/003_enhance_sessions_schema.sql +27 -0
- package/dist/src/db/migrations/004_add_bookmarks.sql +5 -0
- package/dist/src/db/migrations/005_add_tags.sql +21 -0
- package/dist/src/db/migrations/006_add_notes.sql +2 -0
- package/dist/src/db/migrations/007_add_archived.sql +2 -0
- package/dist/src/db/queries.d.ts +104 -0
- package/dist/src/db/queries.js +432 -0
- package/dist/src/db/queries.js.map +1 -0
- package/dist/src/db/schema.d.ts +1 -0
- package/dist/src/db/schema.js +81 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/hooks/post-tool-use.d.ts +1 -0
- package/dist/src/hooks/post-tool-use.js +23 -0
- package/dist/src/hooks/post-tool-use.js.map +1 -0
- package/dist/src/hooks/pre-compact.d.ts +1 -0
- package/dist/src/hooks/pre-compact.js +18 -0
- package/dist/src/hooks/pre-compact.js.map +1 -0
- package/dist/src/hooks/session-end.d.ts +1 -0
- package/dist/src/hooks/session-end.js +20 -0
- package/dist/src/hooks/session-end.js.map +1 -0
- package/dist/src/hooks/session-start.d.ts +1 -0
- package/dist/src/hooks/session-start.js +32 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/hooks/stop.d.ts +1 -0
- package/dist/src/hooks/stop.js +22 -0
- package/dist/src/hooks/stop.js.map +1 -0
- package/dist/src/hooks/user-prompt-submit.d.ts +1 -0
- package/dist/src/hooks/user-prompt-submit.js +18 -0
- package/dist/src/hooks/user-prompt-submit.js.map +1 -0
- package/dist/src/hooks/utils.d.ts +3 -0
- package/dist/src/hooks/utils.js +96 -0
- package/dist/src/hooks/utils.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +92 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/auto-summarizer.d.ts +5 -0
- package/dist/src/services/auto-summarizer.js +50 -0
- package/dist/src/services/auto-summarizer.js.map +1 -0
- package/dist/src/services/claude-md-updater.d.ts +1 -0
- package/dist/src/services/claude-md-updater.js +43 -0
- package/dist/src/services/claude-md-updater.js.map +1 -0
- package/dist/src/services/context-builder.d.ts +1 -0
- package/dist/src/services/context-builder.js +97 -0
- package/dist/src/services/context-builder.js.map +1 -0
- package/dist/src/services/fuzzy-task-matcher.d.ts +37 -0
- package/dist/src/services/fuzzy-task-matcher.js +96 -0
- package/dist/src/services/fuzzy-task-matcher.js.map +1 -0
- package/dist/src/services/logger.d.ts +20 -0
- package/dist/src/services/logger.js +43 -0
- package/dist/src/services/logger.js.map +1 -0
- package/dist/src/services/memory-consolidator.d.ts +32 -0
- package/dist/src/services/memory-consolidator.js +192 -0
- package/dist/src/services/memory-consolidator.js.map +1 -0
- package/dist/src/services/memory-decay.d.ts +16 -0
- package/dist/src/services/memory-decay.js +79 -0
- package/dist/src/services/memory-decay.js.map +1 -0
- package/dist/src/services/metrics.d.ts +58 -0
- package/dist/src/services/metrics.js +100 -0
- package/dist/src/services/metrics.js.map +1 -0
- package/dist/src/services/project-detector.d.ts +5 -0
- package/dist/src/services/project-detector.js +43 -0
- package/dist/src/services/project-detector.js.map +1 -0
- package/dist/src/services/queue.d.ts +2 -0
- package/dist/src/services/queue.js +16 -0
- package/dist/src/services/queue.js.map +1 -0
- package/dist/src/services/session-timeout.d.ts +1 -0
- package/dist/src/services/session-timeout.js +50 -0
- package/dist/src/services/session-timeout.js.map +1 -0
- package/dist/src/services/summarization-queue.d.ts +43 -0
- package/dist/src/services/summarization-queue.js +150 -0
- package/dist/src/services/summarization-queue.js.map +1 -0
- package/dist/src/services/summarizer.d.ts +2 -0
- package/dist/src/services/summarizer.js +239 -0
- package/dist/src/services/summarizer.js.map +1 -0
- package/dist/src/services/transcript-reader.d.ts +9 -0
- package/dist/src/services/transcript-reader.js +50 -0
- package/dist/src/services/transcript-reader.js.map +1 -0
- package/dist/src/services/watcher.d.ts +1 -0
- package/dist/src/services/watcher.js +34 -0
- package/dist/src/services/watcher.js.map +1 -0
- package/dist/src/ws/broadcast.d.ts +3 -0
- package/dist/src/ws/broadcast.js +24 -0
- package/dist/src/ws/broadcast.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fuzzyTaskMatcher = exports.FuzzyTaskMatcher = void 0;
|
|
4
|
+
const queries_1 = require("../db/queries");
|
|
5
|
+
/**
|
|
6
|
+
* Fuzzy Task Matching
|
|
7
|
+
* Finds similar tasks to avoid duplicates
|
|
8
|
+
*/
|
|
9
|
+
class FuzzyTaskMatcher {
|
|
10
|
+
/**
|
|
11
|
+
* Calculate similarity between two strings (0-1)
|
|
12
|
+
* Uses Levenshtein distance
|
|
13
|
+
*/
|
|
14
|
+
similarity(a, b) {
|
|
15
|
+
const longer = a.length > b.length ? a : b;
|
|
16
|
+
const shorter = a.length > b.length ? b : a;
|
|
17
|
+
if (longer.length === 0)
|
|
18
|
+
return 1.0;
|
|
19
|
+
const distance = this.levenshteinDistance(longer.toLowerCase(), shorter.toLowerCase());
|
|
20
|
+
return (longer.length - distance) / longer.length;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Levenshtein distance algorithm
|
|
24
|
+
*/
|
|
25
|
+
levenshteinDistance(a, b) {
|
|
26
|
+
const matrix = [];
|
|
27
|
+
for (let i = 0; i <= b.length; i++) {
|
|
28
|
+
matrix[i] = [i];
|
|
29
|
+
}
|
|
30
|
+
for (let j = 0; j <= a.length; j++) {
|
|
31
|
+
matrix[0][j] = j;
|
|
32
|
+
}
|
|
33
|
+
for (let i = 1; i <= b.length; i++) {
|
|
34
|
+
for (let j = 1; j <= a.length; j++) {
|
|
35
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
36
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
40
|
+
matrix[i][j - 1] + 1, // insertion
|
|
41
|
+
matrix[i - 1][j] + 1 // deletion
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return matrix[b.length][a.length];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Find similar tasks
|
|
50
|
+
* Returns tasks with similarity > threshold (default 0.7)
|
|
51
|
+
*/
|
|
52
|
+
findSimilarTasks(title, projectId, threshold = 0.7) {
|
|
53
|
+
const allTasks = queries_1.queries.getTasks(undefined, projectId);
|
|
54
|
+
const similar = [];
|
|
55
|
+
for (const task of allTasks) {
|
|
56
|
+
const sim = this.similarity(title, task.title);
|
|
57
|
+
if (sim >= threshold) {
|
|
58
|
+
similar.push({ task, similarity: sim });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return similar.sort((a, b) => b.similarity - a.similarity).map(s => s.task);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if task already exists (fuzzy match)
|
|
65
|
+
* Returns existing task if found, null otherwise
|
|
66
|
+
*/
|
|
67
|
+
findExistingTask(title, projectId) {
|
|
68
|
+
const similar = this.findSimilarTasks(title, projectId, 0.85);
|
|
69
|
+
return similar.length > 0 ? similar[0] : null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Add task with duplicate detection
|
|
73
|
+
* Returns existing task if duplicate found, new task otherwise
|
|
74
|
+
*/
|
|
75
|
+
addTaskSmart(task) {
|
|
76
|
+
const existing = this.findExistingTask(task.title, task.projectId);
|
|
77
|
+
if (existing) {
|
|
78
|
+
console.log(`[FuzzyMatcher] Found similar task: "${existing.title}" (similarity > 85%)`);
|
|
79
|
+
return existing;
|
|
80
|
+
}
|
|
81
|
+
const id = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
82
|
+
queries_1.queries.addTask({
|
|
83
|
+
id,
|
|
84
|
+
title: task.title,
|
|
85
|
+
description: task.description,
|
|
86
|
+
priority: task.priority || 'medium',
|
|
87
|
+
status: 'pending',
|
|
88
|
+
projectId: task.projectId,
|
|
89
|
+
sessionId: task.sessionId
|
|
90
|
+
});
|
|
91
|
+
return { id, ...task };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.FuzzyTaskMatcher = FuzzyTaskMatcher;
|
|
95
|
+
exports.fuzzyTaskMatcher = new FuzzyTaskMatcher();
|
|
96
|
+
//# sourceMappingURL=fuzzy-task-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy-task-matcher.js","sourceRoot":"","sources":["../../../src/services/fuzzy-task-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Logging System
|
|
3
|
+
* Provides consistent log formatting with levels and context
|
|
4
|
+
*/
|
|
5
|
+
export declare enum LogLevel {
|
|
6
|
+
DEBUG = 0,
|
|
7
|
+
INFO = 1,
|
|
8
|
+
WARN = 2,
|
|
9
|
+
ERROR = 3
|
|
10
|
+
}
|
|
11
|
+
export declare class Logger {
|
|
12
|
+
private minLevel;
|
|
13
|
+
constructor(minLevel?: LogLevel);
|
|
14
|
+
private log;
|
|
15
|
+
debug(component: string, message: string, meta?: any): void;
|
|
16
|
+
info(component: string, message: string, meta?: any): void;
|
|
17
|
+
warn(component: string, message: string, meta?: any): void;
|
|
18
|
+
error(component: string, message: string, meta?: any): void;
|
|
19
|
+
}
|
|
20
|
+
export declare const logger: Logger;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structured Logging System
|
|
4
|
+
* Provides consistent log formatting with levels and context
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.logger = exports.Logger = exports.LogLevel = void 0;
|
|
8
|
+
var LogLevel;
|
|
9
|
+
(function (LogLevel) {
|
|
10
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
11
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
12
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
13
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
14
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
15
|
+
class Logger {
|
|
16
|
+
minLevel;
|
|
17
|
+
constructor(minLevel = LogLevel.INFO) {
|
|
18
|
+
this.minLevel = minLevel;
|
|
19
|
+
}
|
|
20
|
+
log(level, component, message, meta) {
|
|
21
|
+
if (level < this.minLevel)
|
|
22
|
+
return;
|
|
23
|
+
const timestamp = new Date().toISOString();
|
|
24
|
+
const levelName = LogLevel[level];
|
|
25
|
+
const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
|
|
26
|
+
console.log(`[${timestamp}] [${levelName}] [${component}] ${message}${metaStr}`);
|
|
27
|
+
}
|
|
28
|
+
debug(component, message, meta) {
|
|
29
|
+
this.log(LogLevel.DEBUG, component, message, meta);
|
|
30
|
+
}
|
|
31
|
+
info(component, message, meta) {
|
|
32
|
+
this.log(LogLevel.INFO, component, message, meta);
|
|
33
|
+
}
|
|
34
|
+
warn(component, message, meta) {
|
|
35
|
+
this.log(LogLevel.WARN, component, message, meta);
|
|
36
|
+
}
|
|
37
|
+
error(component, message, meta) {
|
|
38
|
+
this.log(LogLevel.ERROR, component, message, meta);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.Logger = Logger;
|
|
42
|
+
exports.logger = new Logger(process.env.LOG_LEVEL === 'debug' ? LogLevel.DEBUG : LogLevel.INFO);
|
|
43
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/services/logger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,MAAa,MAAM;IACT,QAAQ,CAAU;IAE1B,YAAY,WAAqB,QAAQ,CAAC,IAAI;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEO,GAAG,CAAC,KAAe,EAAE,SAAiB,EAAE,OAAe,EAAE,IAAU;QACzE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEjC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAEtD,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO,GAAG,OAAO,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAU;QAClD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAU;QACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAU;QACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAU;QAClD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC;CACF;AAhCD,wBAgCC;AAEY,QAAA,MAAM,GAAG,IAAI,MAAM,CAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CACnE,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface ConsolidationResult {
|
|
2
|
+
merged: number;
|
|
3
|
+
conflicts: number;
|
|
4
|
+
reinforced: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Memory Consolidation Engine
|
|
8
|
+
* Merges duplicate memories, detects conflicts, and reinforces patterns
|
|
9
|
+
*/
|
|
10
|
+
export declare class MemoryConsolidator {
|
|
11
|
+
/**
|
|
12
|
+
* Consolidate all memory types for a project
|
|
13
|
+
*/
|
|
14
|
+
consolidateProject(projectId: string): Promise<ConsolidationResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Merge duplicate preferences
|
|
17
|
+
* Strategy: Keep highest confidence, average if similar
|
|
18
|
+
*/
|
|
19
|
+
private consolidatePreferences;
|
|
20
|
+
/**
|
|
21
|
+
* Merge duplicate knowledge items
|
|
22
|
+
* Strategy: Combine content, boost confidence
|
|
23
|
+
*/
|
|
24
|
+
private consolidateKnowledge;
|
|
25
|
+
/**
|
|
26
|
+
* Reinforce patterns seen multiple times
|
|
27
|
+
* Strategy: Boost confidence for repeated patterns
|
|
28
|
+
*/
|
|
29
|
+
private reinforcePatterns;
|
|
30
|
+
}
|
|
31
|
+
export declare const consolidator: MemoryConsolidator;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.consolidator = exports.MemoryConsolidator = void 0;
|
|
4
|
+
const queries_1 = require("../db/queries");
|
|
5
|
+
/**
|
|
6
|
+
* Memory Consolidation Engine
|
|
7
|
+
* Merges duplicate memories, detects conflicts, and reinforces patterns
|
|
8
|
+
*/
|
|
9
|
+
class MemoryConsolidator {
|
|
10
|
+
/**
|
|
11
|
+
* Consolidate all memory types for a project
|
|
12
|
+
*/
|
|
13
|
+
async consolidateProject(projectId) {
|
|
14
|
+
const result = {
|
|
15
|
+
merged: 0,
|
|
16
|
+
conflicts: 0,
|
|
17
|
+
reinforced: 0
|
|
18
|
+
};
|
|
19
|
+
// Consolidate preferences
|
|
20
|
+
result.merged += await this.consolidatePreferences(projectId);
|
|
21
|
+
// Consolidate knowledge
|
|
22
|
+
result.merged += await this.consolidateKnowledge(projectId);
|
|
23
|
+
// Reinforce patterns
|
|
24
|
+
result.reinforced += await this.reinforcePatterns(projectId);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Merge duplicate preferences
|
|
29
|
+
* Strategy: Keep highest confidence, average if similar
|
|
30
|
+
*/
|
|
31
|
+
async consolidatePreferences(projectId) {
|
|
32
|
+
const prefs = queries_1.queries.getPreferences(projectId);
|
|
33
|
+
const groups = new Map();
|
|
34
|
+
// Group by category + key
|
|
35
|
+
for (const pref of prefs) {
|
|
36
|
+
const key = `${pref.category}:${pref.key}`;
|
|
37
|
+
if (!groups.has(key))
|
|
38
|
+
groups.set(key, []);
|
|
39
|
+
groups.get(key).push(pref);
|
|
40
|
+
}
|
|
41
|
+
let merged = 0;
|
|
42
|
+
for (const [key, items] of groups) {
|
|
43
|
+
if (items.length <= 1)
|
|
44
|
+
continue;
|
|
45
|
+
// Check if values are similar
|
|
46
|
+
const values = items.map(i => i.value);
|
|
47
|
+
const uniqueValues = [...new Set(values)];
|
|
48
|
+
if (uniqueValues.length === 1) {
|
|
49
|
+
// Same value, merge by averaging confidence
|
|
50
|
+
const avgConfidence = items.reduce((sum, i) => sum + (i.confidence || 1.0), 0) / items.length;
|
|
51
|
+
const maxConfidence = Math.min(avgConfidence * 1.1, 1.0); // Boost slightly, cap at 1.0
|
|
52
|
+
// Keep the most recent one, update confidence
|
|
53
|
+
const latest = items.sort((a, b) => (b.updated_at || 0) - (a.updated_at || 0))[0];
|
|
54
|
+
queries_1.queries.setPreference(latest.category, latest.key, latest.value, maxConfidence, latest.source_session_id, projectId);
|
|
55
|
+
// Delete older duplicates
|
|
56
|
+
for (const item of items) {
|
|
57
|
+
if (item.id !== latest.id) {
|
|
58
|
+
queries_1.queries.deletePreference(item.id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
merged += items.length - 1;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Conflicting values - keep highest confidence
|
|
65
|
+
const sorted = items.sort((a, b) => (b.confidence || 1.0) - (a.confidence || 1.0));
|
|
66
|
+
const winner = sorted[0];
|
|
67
|
+
// Log conflict for review
|
|
68
|
+
console.log(`[Consolidator] Preference conflict: ${key}`);
|
|
69
|
+
console.log(` Winner: ${winner.value} (confidence: ${winner.confidence})`);
|
|
70
|
+
console.log(` Losers: ${sorted.slice(1).map(i => `${i.value} (${i.confidence})`).join(', ')}`);
|
|
71
|
+
// Delete lower confidence items
|
|
72
|
+
for (const item of sorted.slice(1)) {
|
|
73
|
+
queries_1.queries.deletePreference(item.id);
|
|
74
|
+
}
|
|
75
|
+
merged += items.length - 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return merged;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Merge duplicate knowledge items
|
|
82
|
+
* Strategy: Combine content, boost confidence
|
|
83
|
+
*/
|
|
84
|
+
async consolidateKnowledge(projectId) {
|
|
85
|
+
const knowledge = queries_1.queries.getKnowledge(undefined, 1000, projectId);
|
|
86
|
+
const groups = new Map();
|
|
87
|
+
// Group by category + topic
|
|
88
|
+
for (const item of knowledge) {
|
|
89
|
+
const key = `${item.category}:${item.topic}`;
|
|
90
|
+
if (!groups.has(key))
|
|
91
|
+
groups.set(key, []);
|
|
92
|
+
groups.get(key).push(item);
|
|
93
|
+
}
|
|
94
|
+
let merged = 0;
|
|
95
|
+
for (const [key, items] of groups) {
|
|
96
|
+
if (items.length <= 1)
|
|
97
|
+
continue;
|
|
98
|
+
// Merge content from all items
|
|
99
|
+
const contents = items.map(i => i.content);
|
|
100
|
+
const uniqueContents = [...new Set(contents)];
|
|
101
|
+
if (uniqueContents.length === 1) {
|
|
102
|
+
// Same content, boost confidence
|
|
103
|
+
const avgConfidence = items.reduce((sum, i) => sum + (i.confidence || 0.5), 0) / items.length;
|
|
104
|
+
const boostedConfidence = Math.min(avgConfidence * 1.15, 1.0);
|
|
105
|
+
const latest = items.sort((a, b) => (b.updated_at || 0) - (a.updated_at || 0))[0];
|
|
106
|
+
queries_1.queries.addKnowledge({
|
|
107
|
+
id: latest.id,
|
|
108
|
+
category: latest.category,
|
|
109
|
+
topic: latest.topic,
|
|
110
|
+
content: latest.content,
|
|
111
|
+
confidence: boostedConfidence,
|
|
112
|
+
sessionId: latest.source_session_id,
|
|
113
|
+
projectId
|
|
114
|
+
});
|
|
115
|
+
for (const item of items) {
|
|
116
|
+
if (item.id !== latest.id) {
|
|
117
|
+
queries_1.queries.deleteKnowledge(item.id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
merged += items.length - 1;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Different content - combine into richer description
|
|
124
|
+
const combined = uniqueContents.join('; ');
|
|
125
|
+
const avgConfidence = items.reduce((sum, i) => sum + (i.confidence || 0.5), 0) / items.length;
|
|
126
|
+
const latest = items.sort((a, b) => (b.updated_at || 0) - (a.updated_at || 0))[0];
|
|
127
|
+
queries_1.queries.addKnowledge({
|
|
128
|
+
id: latest.id,
|
|
129
|
+
category: latest.category,
|
|
130
|
+
topic: latest.topic,
|
|
131
|
+
content: combined.slice(0, 500), // Cap length
|
|
132
|
+
confidence: avgConfidence,
|
|
133
|
+
sessionId: latest.source_session_id,
|
|
134
|
+
projectId
|
|
135
|
+
});
|
|
136
|
+
for (const item of items) {
|
|
137
|
+
if (item.id !== latest.id) {
|
|
138
|
+
queries_1.queries.deleteKnowledge(item.id);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
merged += items.length - 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return merged;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reinforce patterns seen multiple times
|
|
148
|
+
* Strategy: Boost confidence for repeated patterns
|
|
149
|
+
*/
|
|
150
|
+
async reinforcePatterns(projectId) {
|
|
151
|
+
const patterns = queries_1.queries.getPatterns(undefined, 1000, projectId);
|
|
152
|
+
const groups = new Map();
|
|
153
|
+
// Group by type + title
|
|
154
|
+
for (const pattern of patterns) {
|
|
155
|
+
const key = `${pattern.pattern_type}:${pattern.title}`;
|
|
156
|
+
if (!groups.has(key))
|
|
157
|
+
groups.set(key, []);
|
|
158
|
+
groups.get(key).push(pattern);
|
|
159
|
+
}
|
|
160
|
+
let reinforced = 0;
|
|
161
|
+
for (const [key, items] of groups) {
|
|
162
|
+
if (items.length <= 1)
|
|
163
|
+
continue;
|
|
164
|
+
// Pattern seen multiple times - reinforce it
|
|
165
|
+
const latest = items.sort((a, b) => (b.updated_at || 0) - (a.updated_at || 0))[0];
|
|
166
|
+
const reinforcementBoost = Math.min(items.length * 0.1, 0.3); // Max 30% boost
|
|
167
|
+
queries_1.queries.addPattern({
|
|
168
|
+
id: latest.id,
|
|
169
|
+
type: latest.pattern_type,
|
|
170
|
+
title: latest.title,
|
|
171
|
+
description: latest.description,
|
|
172
|
+
example: latest.example,
|
|
173
|
+
projectId
|
|
174
|
+
});
|
|
175
|
+
// Increment success count for reinforcement
|
|
176
|
+
for (let i = 0; i < items.length - 1; i++) {
|
|
177
|
+
queries_1.queries.incrementPatternSuccess(latest.id);
|
|
178
|
+
}
|
|
179
|
+
// Delete duplicates
|
|
180
|
+
for (const item of items) {
|
|
181
|
+
if (item.id !== latest.id) {
|
|
182
|
+
queries_1.queries.deletePattern(item.id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
reinforced += items.length - 1;
|
|
186
|
+
}
|
|
187
|
+
return reinforced;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.MemoryConsolidator = MemoryConsolidator;
|
|
191
|
+
exports.consolidator = new MemoryConsolidator();
|
|
192
|
+
//# sourceMappingURL=memory-consolidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-consolidator.js","sourceRoot":"","sources":["../../../src/services/memory-consolidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Decay System
|
|
3
|
+
* Gradually reduces confidence of unused memories
|
|
4
|
+
*/
|
|
5
|
+
export declare class MemoryDecay {
|
|
6
|
+
/**
|
|
7
|
+
* Apply daily decay to all memories
|
|
8
|
+
* Reduces confidence by 1% per day for unused items
|
|
9
|
+
*/
|
|
10
|
+
applyDailyDecay(projectId: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Schedule daily decay job
|
|
13
|
+
*/
|
|
14
|
+
startDecayScheduler(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare const memoryDecay: MemoryDecay;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memoryDecay = exports.MemoryDecay = void 0;
|
|
4
|
+
const queries_1 = require("../db/queries");
|
|
5
|
+
/**
|
|
6
|
+
* Memory Decay System
|
|
7
|
+
* Gradually reduces confidence of unused memories
|
|
8
|
+
*/
|
|
9
|
+
class MemoryDecay {
|
|
10
|
+
/**
|
|
11
|
+
* Apply daily decay to all memories
|
|
12
|
+
* Reduces confidence by 1% per day for unused items
|
|
13
|
+
*/
|
|
14
|
+
async applyDailyDecay(projectId) {
|
|
15
|
+
const decayRate = 0.01; // 1% per day
|
|
16
|
+
const softDeleteThreshold = 0.2; // Delete when confidence drops below 20%
|
|
17
|
+
// Decay preferences
|
|
18
|
+
const prefs = queries_1.queries.getPreferences(projectId);
|
|
19
|
+
for (const pref of prefs) {
|
|
20
|
+
const daysSinceUpdate = Math.floor((Date.now() / 1000 - (pref.updated_at || pref.created_at)) / 86400);
|
|
21
|
+
if (daysSinceUpdate > 0) {
|
|
22
|
+
const newConfidence = Math.max((pref.confidence || 1.0) - (decayRate * daysSinceUpdate), 0);
|
|
23
|
+
if (newConfidence < softDeleteThreshold) {
|
|
24
|
+
console.log(`[Decay] Soft-deleting preference: ${pref.category}:${pref.key} (confidence: ${newConfidence})`);
|
|
25
|
+
queries_1.queries.deletePreference(pref.id);
|
|
26
|
+
}
|
|
27
|
+
else if (newConfidence < pref.confidence) {
|
|
28
|
+
queries_1.queries.setPreference(pref.category, pref.key, pref.value, newConfidence, pref.source_session_id, projectId);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Decay knowledge
|
|
33
|
+
const knowledge = queries_1.queries.getKnowledge(undefined, 1000, projectId);
|
|
34
|
+
for (const item of knowledge) {
|
|
35
|
+
const daysSinceUpdate = Math.floor((Date.now() / 1000 - (item.updated_at || item.created_at)) / 86400);
|
|
36
|
+
if (daysSinceUpdate > 0) {
|
|
37
|
+
const newConfidence = Math.max((item.confidence || 0.5) - (decayRate * daysSinceUpdate), 0);
|
|
38
|
+
if (newConfidence < softDeleteThreshold) {
|
|
39
|
+
console.log(`[Decay] Soft-deleting knowledge: ${item.topic} (confidence: ${newConfidence})`);
|
|
40
|
+
queries_1.queries.deleteKnowledge(item.id);
|
|
41
|
+
}
|
|
42
|
+
else if (newConfidence < item.confidence) {
|
|
43
|
+
queries_1.queries.addKnowledge({
|
|
44
|
+
id: item.id,
|
|
45
|
+
category: item.category,
|
|
46
|
+
topic: item.topic,
|
|
47
|
+
content: item.content,
|
|
48
|
+
confidence: newConfidence,
|
|
49
|
+
sessionId: item.source_session_id,
|
|
50
|
+
projectId
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
console.log(`[Decay] Applied daily decay to project ${projectId}`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Schedule daily decay job
|
|
59
|
+
*/
|
|
60
|
+
startDecayScheduler() {
|
|
61
|
+
// Run decay every 24 hours
|
|
62
|
+
setInterval(async () => {
|
|
63
|
+
console.log('[Decay] Running scheduled decay job');
|
|
64
|
+
const projects = queries_1.queries.getAllProjects();
|
|
65
|
+
for (const project of projects) {
|
|
66
|
+
try {
|
|
67
|
+
await this.applyDailyDecay(project.id);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error(`[Decay] Failed for project ${project.id}:`, error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}, 24 * 60 * 60 * 1000); // 24 hours
|
|
74
|
+
console.log('[Decay] Decay scheduler started (runs every 24 hours)');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.MemoryDecay = MemoryDecay;
|
|
78
|
+
exports.memoryDecay = new MemoryDecay();
|
|
79
|
+
//# sourceMappingURL=memory-decay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-decay.js","sourceRoot":"","sources":["../../../src/services/memory-decay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Tracking System
|
|
3
|
+
* Tracks performance and usage metrics
|
|
4
|
+
*/
|
|
5
|
+
interface Metrics {
|
|
6
|
+
summarizations: {
|
|
7
|
+
total: number;
|
|
8
|
+
successful: number;
|
|
9
|
+
failed: number;
|
|
10
|
+
avgDuration: number;
|
|
11
|
+
};
|
|
12
|
+
sessions: {
|
|
13
|
+
total: number;
|
|
14
|
+
active: number;
|
|
15
|
+
completed: number;
|
|
16
|
+
};
|
|
17
|
+
memory: {
|
|
18
|
+
preferences: number;
|
|
19
|
+
knowledge: number;
|
|
20
|
+
patterns: number;
|
|
21
|
+
tasks: number;
|
|
22
|
+
};
|
|
23
|
+
queue: {
|
|
24
|
+
high: number;
|
|
25
|
+
normal: number;
|
|
26
|
+
low: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare class MetricsTracker {
|
|
30
|
+
private metrics;
|
|
31
|
+
private summarizationDurations;
|
|
32
|
+
/**
|
|
33
|
+
* Record summarization attempt
|
|
34
|
+
*/
|
|
35
|
+
recordSummarization(success: boolean, duration: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Update session counts
|
|
38
|
+
*/
|
|
39
|
+
updateSessionCounts(total: number, active: number, completed: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Update memory counts
|
|
42
|
+
*/
|
|
43
|
+
updateMemoryCounts(preferences: number, knowledge: number, patterns: number, tasks: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* Update queue counts
|
|
46
|
+
*/
|
|
47
|
+
updateQueueCounts(high: number, normal: number, low: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get all metrics
|
|
50
|
+
*/
|
|
51
|
+
getMetrics(): Metrics;
|
|
52
|
+
/**
|
|
53
|
+
* Reset metrics
|
|
54
|
+
*/
|
|
55
|
+
reset(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const metricsTracker: MetricsTracker;
|
|
58
|
+
export {};
|