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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/dist/bin/claudectx.d.ts +2 -0
  4. package/dist/bin/claudectx.js +304 -0
  5. package/dist/bin/claudectx.js.map +1 -0
  6. package/dist/installer/daemon.d.ts +3 -0
  7. package/dist/installer/daemon.js +80 -0
  8. package/dist/installer/daemon.js.map +1 -0
  9. package/dist/installer/patch-settings.d.ts +2 -0
  10. package/dist/installer/patch-settings.js +83 -0
  11. package/dist/installer/patch-settings.js.map +1 -0
  12. package/dist/src/api/consolidate.d.ts +3 -0
  13. package/dist/src/api/consolidate.js +29 -0
  14. package/dist/src/api/consolidate.js.map +1 -0
  15. package/dist/src/api/context.d.ts +1 -0
  16. package/dist/src/api/context.js +26 -0
  17. package/dist/src/api/context.js.map +1 -0
  18. package/dist/src/api/force-end-session.d.ts +2 -0
  19. package/dist/src/api/force-end-session.js +60 -0
  20. package/dist/src/api/force-end-session.js.map +1 -0
  21. package/dist/src/api/health.d.ts +1 -0
  22. package/dist/src/api/health.js +27 -0
  23. package/dist/src/api/health.js.map +1 -0
  24. package/dist/src/api/hook.d.ts +2 -0
  25. package/dist/src/api/hook.js +187 -0
  26. package/dist/src/api/hook.js.map +1 -0
  27. package/dist/src/api/logs.d.ts +2 -0
  28. package/dist/src/api/logs.js +66 -0
  29. package/dist/src/api/logs.js.map +1 -0
  30. package/dist/src/api/memory.d.ts +2 -0
  31. package/dist/src/api/memory.js +93 -0
  32. package/dist/src/api/memory.js.map +1 -0
  33. package/dist/src/api/metrics.d.ts +3 -0
  34. package/dist/src/api/metrics.js +58 -0
  35. package/dist/src/api/metrics.js.map +1 -0
  36. package/dist/src/api/observations.d.ts +1 -0
  37. package/dist/src/api/observations.js +31 -0
  38. package/dist/src/api/observations.js.map +1 -0
  39. package/dist/src/api/projects.d.ts +1 -0
  40. package/dist/src/api/projects.js +29 -0
  41. package/dist/src/api/projects.js.map +1 -0
  42. package/dist/src/api/resync.d.ts +3 -0
  43. package/dist/src/api/resync.js +188 -0
  44. package/dist/src/api/resync.js.map +1 -0
  45. package/dist/src/api/search.d.ts +1 -0
  46. package/dist/src/api/search.js +36 -0
  47. package/dist/src/api/search.js.map +1 -0
  48. package/dist/src/api/sessions.d.ts +1 -0
  49. package/dist/src/api/sessions.js +137 -0
  50. package/dist/src/api/sessions.js.map +1 -0
  51. package/dist/src/api/settings.d.ts +2 -0
  52. package/dist/src/api/settings.js +90 -0
  53. package/dist/src/api/settings.js.map +1 -0
  54. package/dist/src/api/tags.d.ts +1 -0
  55. package/dist/src/api/tags.js +89 -0
  56. package/dist/src/api/tags.js.map +1 -0
  57. package/dist/src/config.d.ts +17 -0
  58. package/dist/src/config.js +39 -0
  59. package/dist/src/config.js.map +1 -0
  60. package/dist/src/db/client.d.ts +3 -0
  61. package/dist/src/db/client.js +38 -0
  62. package/dist/src/db/client.js.map +1 -0
  63. package/dist/src/db/migrate.d.ts +1 -0
  64. package/dist/src/db/migrate.js +56 -0
  65. package/dist/src/db/migrate.js.map +1 -0
  66. package/dist/src/db/migrations/001_add_memory_tables.sql +149 -0
  67. package/dist/src/db/migrations/002_add_project_id_to_memory.sql +25 -0
  68. package/dist/src/db/migrations/003_enhance_sessions_schema.sql +27 -0
  69. package/dist/src/db/migrations/004_add_bookmarks.sql +5 -0
  70. package/dist/src/db/migrations/005_add_tags.sql +21 -0
  71. package/dist/src/db/migrations/006_add_notes.sql +2 -0
  72. package/dist/src/db/migrations/007_add_archived.sql +2 -0
  73. package/dist/src/db/queries.d.ts +104 -0
  74. package/dist/src/db/queries.js +432 -0
  75. package/dist/src/db/queries.js.map +1 -0
  76. package/dist/src/db/schema.d.ts +1 -0
  77. package/dist/src/db/schema.js +81 -0
  78. package/dist/src/db/schema.js.map +1 -0
  79. package/dist/src/hooks/post-tool-use.d.ts +1 -0
  80. package/dist/src/hooks/post-tool-use.js +23 -0
  81. package/dist/src/hooks/post-tool-use.js.map +1 -0
  82. package/dist/src/hooks/pre-compact.d.ts +1 -0
  83. package/dist/src/hooks/pre-compact.js +18 -0
  84. package/dist/src/hooks/pre-compact.js.map +1 -0
  85. package/dist/src/hooks/session-end.d.ts +1 -0
  86. package/dist/src/hooks/session-end.js +20 -0
  87. package/dist/src/hooks/session-end.js.map +1 -0
  88. package/dist/src/hooks/session-start.d.ts +1 -0
  89. package/dist/src/hooks/session-start.js +32 -0
  90. package/dist/src/hooks/session-start.js.map +1 -0
  91. package/dist/src/hooks/stop.d.ts +1 -0
  92. package/dist/src/hooks/stop.js +22 -0
  93. package/dist/src/hooks/stop.js.map +1 -0
  94. package/dist/src/hooks/user-prompt-submit.d.ts +1 -0
  95. package/dist/src/hooks/user-prompt-submit.js +18 -0
  96. package/dist/src/hooks/user-prompt-submit.js.map +1 -0
  97. package/dist/src/hooks/utils.d.ts +3 -0
  98. package/dist/src/hooks/utils.js +96 -0
  99. package/dist/src/hooks/utils.js.map +1 -0
  100. package/dist/src/index.d.ts +1 -0
  101. package/dist/src/index.js +92 -0
  102. package/dist/src/index.js.map +1 -0
  103. package/dist/src/services/auto-summarizer.d.ts +5 -0
  104. package/dist/src/services/auto-summarizer.js +50 -0
  105. package/dist/src/services/auto-summarizer.js.map +1 -0
  106. package/dist/src/services/claude-md-updater.d.ts +1 -0
  107. package/dist/src/services/claude-md-updater.js +43 -0
  108. package/dist/src/services/claude-md-updater.js.map +1 -0
  109. package/dist/src/services/context-builder.d.ts +1 -0
  110. package/dist/src/services/context-builder.js +97 -0
  111. package/dist/src/services/context-builder.js.map +1 -0
  112. package/dist/src/services/fuzzy-task-matcher.d.ts +37 -0
  113. package/dist/src/services/fuzzy-task-matcher.js +96 -0
  114. package/dist/src/services/fuzzy-task-matcher.js.map +1 -0
  115. package/dist/src/services/logger.d.ts +20 -0
  116. package/dist/src/services/logger.js +43 -0
  117. package/dist/src/services/logger.js.map +1 -0
  118. package/dist/src/services/memory-consolidator.d.ts +32 -0
  119. package/dist/src/services/memory-consolidator.js +192 -0
  120. package/dist/src/services/memory-consolidator.js.map +1 -0
  121. package/dist/src/services/memory-decay.d.ts +16 -0
  122. package/dist/src/services/memory-decay.js +79 -0
  123. package/dist/src/services/memory-decay.js.map +1 -0
  124. package/dist/src/services/metrics.d.ts +58 -0
  125. package/dist/src/services/metrics.js +100 -0
  126. package/dist/src/services/metrics.js.map +1 -0
  127. package/dist/src/services/project-detector.d.ts +5 -0
  128. package/dist/src/services/project-detector.js +43 -0
  129. package/dist/src/services/project-detector.js.map +1 -0
  130. package/dist/src/services/queue.d.ts +2 -0
  131. package/dist/src/services/queue.js +16 -0
  132. package/dist/src/services/queue.js.map +1 -0
  133. package/dist/src/services/session-timeout.d.ts +1 -0
  134. package/dist/src/services/session-timeout.js +50 -0
  135. package/dist/src/services/session-timeout.js.map +1 -0
  136. package/dist/src/services/summarization-queue.d.ts +43 -0
  137. package/dist/src/services/summarization-queue.js +150 -0
  138. package/dist/src/services/summarization-queue.js.map +1 -0
  139. package/dist/src/services/summarizer.d.ts +2 -0
  140. package/dist/src/services/summarizer.js +239 -0
  141. package/dist/src/services/summarizer.js.map +1 -0
  142. package/dist/src/services/transcript-reader.d.ts +9 -0
  143. package/dist/src/services/transcript-reader.js +50 -0
  144. package/dist/src/services/transcript-reader.js.map +1 -0
  145. package/dist/src/services/watcher.d.ts +1 -0
  146. package/dist/src/services/watcher.js +34 -0
  147. package/dist/src/services/watcher.js.map +1 -0
  148. package/dist/src/ws/broadcast.d.ts +3 -0
  149. package/dist/src/ws/broadcast.js +24 -0
  150. package/dist/src/ws/broadcast.js.map +1 -0
  151. 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 {};