memobank-cli 0.2.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 (128) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/LICENSE +21 -0
  3. package/README.md +300 -0
  4. package/dist/cli.d.ts +7 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +294 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/capture.d.ts +12 -0
  9. package/dist/commands/capture.d.ts.map +1 -0
  10. package/dist/commands/capture.js +191 -0
  11. package/dist/commands/capture.js.map +1 -0
  12. package/dist/commands/import.d.ts +28 -0
  13. package/dist/commands/import.d.ts.map +1 -0
  14. package/dist/commands/import.js +356 -0
  15. package/dist/commands/import.js.map +1 -0
  16. package/dist/commands/index.d.ts +12 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +82 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/commands/install.d.ts +16 -0
  21. package/dist/commands/install.d.ts.map +1 -0
  22. package/dist/commands/install.js +142 -0
  23. package/dist/commands/install.js.map +1 -0
  24. package/dist/commands/lifecycle.d.ts +21 -0
  25. package/dist/commands/lifecycle.d.ts.map +1 -0
  26. package/dist/commands/lifecycle.js +106 -0
  27. package/dist/commands/lifecycle.js.map +1 -0
  28. package/dist/commands/map.d.ts +10 -0
  29. package/dist/commands/map.d.ts.map +1 -0
  30. package/dist/commands/map.js +72 -0
  31. package/dist/commands/map.js.map +1 -0
  32. package/dist/commands/onboarding.d.ts +10 -0
  33. package/dist/commands/onboarding.d.ts.map +1 -0
  34. package/dist/commands/onboarding.js +420 -0
  35. package/dist/commands/onboarding.js.map +1 -0
  36. package/dist/commands/recall.d.ts +13 -0
  37. package/dist/commands/recall.d.ts.map +1 -0
  38. package/dist/commands/recall.js +89 -0
  39. package/dist/commands/recall.js.map +1 -0
  40. package/dist/commands/review.d.ts +11 -0
  41. package/dist/commands/review.d.ts.map +1 -0
  42. package/dist/commands/review.js +66 -0
  43. package/dist/commands/review.js.map +1 -0
  44. package/dist/commands/search.d.ts +13 -0
  45. package/dist/commands/search.d.ts.map +1 -0
  46. package/dist/commands/search.js +107 -0
  47. package/dist/commands/search.js.map +1 -0
  48. package/dist/commands/setup.d.ts +9 -0
  49. package/dist/commands/setup.d.ts.map +1 -0
  50. package/dist/commands/setup.js +354 -0
  51. package/dist/commands/setup.js.map +1 -0
  52. package/dist/commands/write.d.ts +14 -0
  53. package/dist/commands/write.d.ts.map +1 -0
  54. package/dist/commands/write.js +247 -0
  55. package/dist/commands/write.js.map +1 -0
  56. package/dist/config.d.ts +19 -0
  57. package/dist/config.d.ts.map +1 -0
  58. package/dist/config.js +147 -0
  59. package/dist/config.js.map +1 -0
  60. package/dist/core/decay-engine.d.ts +16 -0
  61. package/dist/core/decay-engine.d.ts.map +1 -0
  62. package/dist/core/decay-engine.js +91 -0
  63. package/dist/core/decay-engine.js.map +1 -0
  64. package/dist/core/embedding.d.ts +60 -0
  65. package/dist/core/embedding.d.ts.map +1 -0
  66. package/dist/core/embedding.js +169 -0
  67. package/dist/core/embedding.js.map +1 -0
  68. package/dist/core/lifecycle-manager.d.ts +105 -0
  69. package/dist/core/lifecycle-manager.d.ts.map +1 -0
  70. package/dist/core/lifecycle-manager.js +332 -0
  71. package/dist/core/lifecycle-manager.js.map +1 -0
  72. package/dist/core/memory-template.d.ts +70 -0
  73. package/dist/core/memory-template.d.ts.map +1 -0
  74. package/dist/core/memory-template.js +496 -0
  75. package/dist/core/memory-template.js.map +1 -0
  76. package/dist/core/noise-filter.d.ts +39 -0
  77. package/dist/core/noise-filter.d.ts.map +1 -0
  78. package/dist/core/noise-filter.js +168 -0
  79. package/dist/core/noise-filter.js.map +1 -0
  80. package/dist/core/retriever.d.ts +21 -0
  81. package/dist/core/retriever.d.ts.map +1 -0
  82. package/dist/core/retriever.js +77 -0
  83. package/dist/core/retriever.js.map +1 -0
  84. package/dist/core/sanitizer.d.ts +9 -0
  85. package/dist/core/sanitizer.d.ts.map +1 -0
  86. package/dist/core/sanitizer.js +57 -0
  87. package/dist/core/sanitizer.js.map +1 -0
  88. package/dist/core/smart-extractor.d.ts +12 -0
  89. package/dist/core/smart-extractor.d.ts.map +1 -0
  90. package/dist/core/smart-extractor.js +102 -0
  91. package/dist/core/smart-extractor.js.map +1 -0
  92. package/dist/core/store.d.ts +40 -0
  93. package/dist/core/store.d.ts.map +1 -0
  94. package/dist/core/store.js +233 -0
  95. package/dist/core/store.js.map +1 -0
  96. package/dist/core/tool-config.d.ts +33 -0
  97. package/dist/core/tool-config.d.ts.map +1 -0
  98. package/dist/core/tool-config.js +253 -0
  99. package/dist/core/tool-config.js.map +1 -0
  100. package/dist/engines/engine-adapter.d.ts +22 -0
  101. package/dist/engines/engine-adapter.d.ts.map +1 -0
  102. package/dist/engines/engine-adapter.js +7 -0
  103. package/dist/engines/engine-adapter.js.map +1 -0
  104. package/dist/engines/lancedb-engine.d.ts +55 -0
  105. package/dist/engines/lancedb-engine.d.ts.map +1 -0
  106. package/dist/engines/lancedb-engine.js +279 -0
  107. package/dist/engines/lancedb-engine.js.map +1 -0
  108. package/dist/engines/text-engine.d.ts +30 -0
  109. package/dist/engines/text-engine.d.ts.map +1 -0
  110. package/dist/engines/text-engine.js +100 -0
  111. package/dist/engines/text-engine.js.map +1 -0
  112. package/dist/platforms/claude-code.d.ts +13 -0
  113. package/dist/platforms/claude-code.d.ts.map +1 -0
  114. package/dist/platforms/claude-code.js +85 -0
  115. package/dist/platforms/claude-code.js.map +1 -0
  116. package/dist/platforms/codex.d.ts +9 -0
  117. package/dist/platforms/codex.d.ts.map +1 -0
  118. package/dist/platforms/codex.js +102 -0
  119. package/dist/platforms/codex.js.map +1 -0
  120. package/dist/platforms/cursor.d.ts +9 -0
  121. package/dist/platforms/cursor.d.ts.map +1 -0
  122. package/dist/platforms/cursor.js +112 -0
  123. package/dist/platforms/cursor.js.map +1 -0
  124. package/dist/types.d.ts +55 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +6 -0
  127. package/dist/types.js.map +1 -0
  128. package/package.json +87 -0
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Noise Filter Module
4
+ * Filters out low-value content before capturing as memory
5
+ * Ported from memory-lancedb-pro
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.isNoise = isNoise;
9
+ exports.hasHighValueIndicators = hasHighValueIndicators;
10
+ exports.calculateValueScore = calculateValueScore;
11
+ exports.filterAndRank = filterAndRank;
12
+ exports.getCaptureRecommendation = getCaptureRecommendation;
13
+ /**
14
+ * Patterns that indicate low-value content
15
+ */
16
+ const LOW_VALUE_PATTERNS = [
17
+ // Greetings and farewells
18
+ /^(hi|hello|hey|goodbye|see you|thanks|thank you)/i,
19
+ // Simple acknowledgments
20
+ /^(ok|okay|sure|yes|no|yeah|yep|nope)/i,
21
+ // Meta-questions about the AI
22
+ /^(are you|can you|do you|will you)/i,
23
+ // File operations without context
24
+ /^(opened|closed|saved|created|deleted) file/i,
25
+ // Simple commands
26
+ /^(run|execute|test|build|lint)/i,
27
+ // Trivial changes
28
+ /^(fixed typo|updated comment|reformatted)/i,
29
+ ];
30
+ /**
31
+ * High-value indicators
32
+ */
33
+ const HIGH_VALUE_PATTERNS = [
34
+ // Problem-solving
35
+ /(problem|issue|bug|error|fix|solution|resolved)/i,
36
+ // Decisions and rationale
37
+ /(decided|choice|trade.?off|rationale|because|therefore)/i,
38
+ // Learnings and insights
39
+ /(learned|discovered|realized|insight|understand|now i know)/i,
40
+ // Patterns and best practices
41
+ /(pattern|practice|principle|guideline|rule|strategy)/i,
42
+ // Architecture and design
43
+ /(architecture|design|structure|component|system|module)/i,
44
+ // Performance and optimization
45
+ /(performance|optimize|speed|memory|efficient|scalability)/i,
46
+ // Security
47
+ /(security|vulnerability|authentication|authorization|encryption)/i,
48
+ // Workflows and processes
49
+ /(workflow|process|pipeline|deployment|ci.?cd|automation)/i,
50
+ ];
51
+ /**
52
+ * Check if content is likely noise
53
+ */
54
+ function isNoise(content) {
55
+ const trimmed = content.trim();
56
+ // Too short
57
+ if (trimmed.length < 50) {
58
+ return true;
59
+ }
60
+ // Check low-value patterns
61
+ for (const pattern of LOW_VALUE_PATTERNS) {
62
+ if (pattern.test(trimmed)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Check if content has high value indicators
70
+ */
71
+ function hasHighValueIndicators(content) {
72
+ for (const pattern of HIGH_VALUE_PATTERNS) {
73
+ if (pattern.test(content)) {
74
+ return true;
75
+ }
76
+ }
77
+ return false;
78
+ }
79
+ /**
80
+ * Calculate content value score (0-1)
81
+ */
82
+ function calculateValueScore(content) {
83
+ let score = 0.5; // Base score
84
+ // Length factor (longer content tends to be more detailed)
85
+ const lengthFactor = Math.min(1, content.length / 500);
86
+ score += lengthFactor * 0.2;
87
+ // High-value pattern matches
88
+ const highValueMatches = HIGH_VALUE_PATTERNS.filter((p) => p.test(content)).length;
89
+ score += Math.min(0.3, highValueMatches * 0.05);
90
+ // Low-value pattern matches (penalty)
91
+ const lowValueMatches = LOW_VALUE_PATTERNS.filter((p) => p.test(content)).length;
92
+ score -= lowValueMatches * 0.2;
93
+ // Code block presence (often indicates concrete examples)
94
+ if (content.includes('```')) {
95
+ score += 0.1;
96
+ }
97
+ // Structured content (headers, lists)
98
+ if (content.includes('##') || content.includes('- ') || content.includes('1.')) {
99
+ score += 0.1;
100
+ }
101
+ // Clamp to 0-1
102
+ return Math.max(0, Math.min(1, score));
103
+ }
104
+ function filterAndRank(memories) {
105
+ const filtered = [];
106
+ for (const memory of memories) {
107
+ const { content } = memory;
108
+ // Skip obvious noise
109
+ if (isNoise(content)) {
110
+ console.log(`⊘ Skipped (noise): ${memory.name || memory.description || 'unnamed'}`);
111
+ continue;
112
+ }
113
+ // Calculate score
114
+ const score = calculateValueScore(content);
115
+ // Determine reason
116
+ let reason = '';
117
+ if (score >= 0.7) {
118
+ reason = 'High value - significant learning or decision';
119
+ }
120
+ else if (score >= 0.5) {
121
+ reason = 'Medium value - useful context';
122
+ }
123
+ else {
124
+ reason = 'Low value - consider skipping';
125
+ }
126
+ filtered.push({
127
+ content,
128
+ score,
129
+ reason,
130
+ });
131
+ }
132
+ // Sort by score descending
133
+ return filtered.sort((a, b) => b.score - a.score);
134
+ }
135
+ /**
136
+ * Get recommendation for whether to capture
137
+ */
138
+ function getCaptureRecommendation(score) {
139
+ if (score >= 0.7) {
140
+ return {
141
+ shouldCapture: true,
142
+ confidence: 'high',
143
+ reason: 'High-value content worth remembering',
144
+ };
145
+ }
146
+ else if (score >= 0.5) {
147
+ return {
148
+ shouldCapture: true,
149
+ confidence: 'medium',
150
+ reason: 'Potentially useful context',
151
+ };
152
+ }
153
+ else if (score >= 0.3) {
154
+ return {
155
+ shouldCapture: false,
156
+ confidence: 'medium',
157
+ reason: 'Low-value content, consider skipping',
158
+ };
159
+ }
160
+ else {
161
+ return {
162
+ shouldCapture: false,
163
+ confidence: 'high',
164
+ reason: 'Very low-value content, likely noise',
165
+ };
166
+ }
167
+ }
168
+ //# sourceMappingURL=noise-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise-filter.js","sourceRoot":"","sources":["../../src/core/noise-filter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA6CH,0BAgBC;AAKD,wDAOC;AAKD,kDA2BC;AAWD,sCAoCC;AAKD,4DA8BC;AAzLD;;GAEG;AACH,MAAM,kBAAkB,GAAa;IACnC,0BAA0B;IAC1B,mDAAmD;IACnD,yBAAyB;IACzB,uCAAuC;IACvC,8BAA8B;IAC9B,qCAAqC;IACrC,kCAAkC;IAClC,8CAA8C;IAC9C,kBAAkB;IAClB,iCAAiC;IACjC,kBAAkB;IAClB,4CAA4C;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAa;IACpC,kBAAkB;IAClB,kDAAkD;IAClD,0BAA0B;IAC1B,0DAA0D;IAC1D,yBAAyB;IACzB,8DAA8D;IAC9D,8BAA8B;IAC9B,uDAAuD;IACvD,0BAA0B;IAC1B,0DAA0D;IAC1D,+BAA+B;IAC/B,4DAA4D;IAC5D,WAAW;IACX,mEAAmE;IACnE,0BAA0B;IAC1B,2DAA2D;CAC5D,CAAC;AAEF;;GAEG;AACH,SAAgB,OAAO,CAAC,OAAe;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,YAAY;IACZ,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAAe;IACpD,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,aAAa;IAE9B,2DAA2D;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACvD,KAAK,IAAI,YAAY,GAAG,GAAG,CAAC;IAE5B,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACnF,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAEhD,sCAAsC;IACtC,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,KAAK,IAAI,eAAe,GAAG,GAAG,CAAC;IAE/B,0DAA0D;IAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IAED,eAAe;IACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAWD,SAAgB,aAAa,CAC3B,QAAyE;IAEzE,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAE3B,qBAAqB;QACrB,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC;YACpF,SAAS;QACX,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE3C,mBAAmB;QACnB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,+CAA+C,CAAC;QAC3D,CAAC;aAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,GAAG,+BAA+B,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,+BAA+B,CAAC;QAC3C,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,KAAK;YACL,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,KAAa;IAKpD,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,sCAAsC;SAC/C,CAAC;IACJ,CAAC;SAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,4BAA4B;SACrC,CAAC;IACJ,CAAC;SAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,sCAAsC;SAC/C,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,sCAAsC;SAC/C,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Retriever module
3
+ * Orchestrates engine search and formats output for MEMORY.md injection
4
+ * Tracks access patterns for lifecycle management
5
+ */
6
+ import { RecallResult, MemoConfig } from '../types';
7
+ import { EngineAdapter } from '../engines/engine-adapter';
8
+ /**
9
+ * Recall memories for a query
10
+ * Returns both the results and formatted markdown
11
+ * Records access for lifecycle tracking
12
+ */
13
+ export declare function recall(query: string, repoRoot: string, config: MemoConfig, engine?: EngineAdapter): Promise<{
14
+ results: RecallResult[];
15
+ markdown: string;
16
+ }>;
17
+ /**
18
+ * Write recall results to MEMORY.md
19
+ */
20
+ export declare function writeRecallResults(repoRoot: string, results: RecallResult[], query: string, engine: string): void;
21
+ //# sourceMappingURL=retriever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../src/core/retriever.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU1D;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BxD;AAoCD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CAEN"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Retriever module
4
+ * Orchestrates engine search and formats output for MEMORY.md injection
5
+ * Tracks access patterns for lifecycle management
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.recall = recall;
9
+ exports.writeRecallResults = writeRecallResults;
10
+ const store_1 = require("./store");
11
+ const text_engine_1 = require("../engines/text-engine");
12
+ const lifecycle_manager_1 = require("./lifecycle-manager");
13
+ // Simple token estimation (rough approximation: ~4 chars per token)
14
+ function estimateTokenCount(text) {
15
+ return Math.ceil(text.length / 4);
16
+ }
17
+ /**
18
+ * Recall memories for a query
19
+ * Returns both the results and formatted markdown
20
+ * Records access for lifecycle tracking
21
+ */
22
+ async function recall(query, repoRoot, config, engine) {
23
+ // Load all memories
24
+ const memories = (0, store_1.loadAll)(repoRoot);
25
+ // Use provided engine or default to text engine
26
+ const searchEngine = engine || new text_engine_1.TextEngine();
27
+ // Run search
28
+ let results = await searchEngine.search(query, memories, config.memory.top_k);
29
+ // Record access for each recalled memory
30
+ for (const result of results) {
31
+ (0, lifecycle_manager_1.recordAccess)(repoRoot, result.memory.path, query);
32
+ }
33
+ // Truncate if over token budget
34
+ let markdown = formatResultsAsMarkdown(results, query, config.embedding.engine, memories.length);
35
+ let tokenCount = estimateTokenCount(markdown);
36
+ if (tokenCount > config.memory.token_budget) {
37
+ // Remove results until under budget
38
+ while (results.length > 0 && tokenCount > config.memory.token_budget) {
39
+ results.pop();
40
+ markdown = formatResultsAsMarkdown(results, query, config.embedding.engine, memories.length);
41
+ tokenCount = estimateTokenCount(markdown);
42
+ }
43
+ }
44
+ return { results, markdown };
45
+ }
46
+ /**
47
+ * Format recall results as markdown for MEMORY.md
48
+ */
49
+ function formatResultsAsMarkdown(results, query, engine, totalMemories) {
50
+ let markdown = `<!-- Last updated: ${new Date().toISOString()} | query: "${query}" | engine: ${engine} | top ${results.length} of ${totalMemories} -->\n\n`;
51
+ markdown += `## Recalled Memory\n\n`;
52
+ if (results.length === 0) {
53
+ markdown += `*No memories found for "${query}"*\n`;
54
+ }
55
+ else {
56
+ for (const result of results) {
57
+ const { memory, score } = result;
58
+ const confidenceStr = memory.confidence ? ` · ${memory.confidence} confidence` : '';
59
+ const tagStr = memory.tags.length > 0 ? ` · tags: ${memory.tags.join(', ')}` : '';
60
+ const relativePath = memory.path.replace(/^.*\/memobank\//, '');
61
+ markdown += `### [${memory.type}] ${memory.name}${confidenceStr}\n`;
62
+ markdown += `> ${memory.description}\n`;
63
+ markdown += `> \`${relativePath}\`${tagStr}\n\n`;
64
+ }
65
+ }
66
+ const tokenCount = estimateTokenCount(markdown);
67
+ markdown += `---\n`;
68
+ markdown += `*${results.length} of ${totalMemories} memories · engine: ${engine} · ~${tokenCount} tokens*`;
69
+ return markdown;
70
+ }
71
+ /**
72
+ * Write recall results to MEMORY.md
73
+ */
74
+ function writeRecallResults(repoRoot, results, query, engine) {
75
+ (0, store_1.writeMemoryMd)(repoRoot, results, query, engine);
76
+ }
77
+ //# sourceMappingURL=retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/core/retriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Sanitizer module
3
+ * Strips secrets and sensitive information from content before writing to memory
4
+ */
5
+ /**
6
+ * Sanitize content by replacing sensitive patterns with [REDACTED]
7
+ */
8
+ export declare function sanitize(content: string): string;
9
+ //# sourceMappingURL=sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyDhD"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Sanitizer module
4
+ * Strips secrets and sensitive information from content before writing to memory
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.sanitize = sanitize;
8
+ /**
9
+ * Sanitize content by replacing sensitive patterns with [REDACTED]
10
+ */
11
+ function sanitize(content) {
12
+ let sanitized = content;
13
+ // 1. API keys
14
+ // OpenAI: sk-...
15
+ sanitized = sanitized.replace(/sk-[A-Za-z0-9]{20,}/g, '[REDACTED]');
16
+ // GitHub personal access tokens: ghp_...
17
+ sanitized = sanitized.replace(/ghp_[A-Za-z0-9]{36}/g, '[REDACTED]');
18
+ // Bearer tokens
19
+ sanitized = sanitized.replace(/Bearer [A-Za-z0-9._-]{20,}/g, 'Bearer [REDACTED]');
20
+ // 2. IP addresses
21
+ // IPv4
22
+ sanitized = sanitized.replace(/\b\d{1,3}(\.\d{1,3}){3}\b/g, (match) => {
23
+ const parts = match.split('.');
24
+ // Check if it's a valid IP (all parts 0-255)
25
+ if (parts.every((part) => {
26
+ const num = parseInt(part, 10);
27
+ return num >= 0 && num <= 255;
28
+ })) {
29
+ return '[REDACTED]';
30
+ }
31
+ return match;
32
+ });
33
+ // IPv6 (simplified pattern)
34
+ sanitized = sanitized.replace(/\b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g, '[REDACTED]');
35
+ // 3. JWT tokens
36
+ sanitized = sanitized.replace(/eyJ[A-Za-z0-9._-]{50,}\.[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+/g, '[REDACTED]');
37
+ // 4. .env-style variables with long values
38
+ sanitized = sanitized.replace(/[A-Z_]+=["']?[A-Za-z0-9/+]{20,}["']?/g, (match) => {
39
+ // Replace the value part only
40
+ return match.replace(/=["']?[A-Za-z0-9/+]{20,}["']?/, '=[REDACTED]');
41
+ });
42
+ // 5. AWS Access Keys
43
+ sanitized = sanitized.replace(/AKIA[0-9A-Z]{16}/g, '[REDACTED]');
44
+ // 6. Generic API keys (alphanumeric with special chars, 20+ chars)
45
+ sanitized = sanitized.replace(/\b[A-Za-z0-9_\-]{20,}\b/g, (match) => {
46
+ // Skip common non-secret patterns
47
+ if (/^[a-f0-9]{32}$/.test(match))
48
+ return match; // MD5 hashes
49
+ if (/^[a-f0-9]{40}$/.test(match))
50
+ return match; // SHA1 hashes
51
+ if (/^[a-f0-9]{64}$/.test(match))
52
+ return match; // SHA256 hashes
53
+ return '[REDACTED]';
54
+ });
55
+ return sanitized;
56
+ }
57
+ //# sourceMappingURL=sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../src/core/sanitizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAKH,4BAyDC;AA5DD;;GAEG;AACH,SAAgB,QAAQ,CAAC,OAAe;IACtC,IAAI,SAAS,GAAG,OAAO,CAAC;IAExB,cAAc;IACd,iBAAiB;IACjB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;IAEpE,yCAAyC;IACzC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;IAEpE,gBAAgB;IAChB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,CAAC;IAElF,kBAAkB;IAClB,OAAO;IACP,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,6CAA6C;QAC7C,IACE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC;QAChC,CAAC,CAAC,EACF,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,6CAA6C,EAAE,YAAY,CAAC,CAAC;IAE3F,gBAAgB;IAChB,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,2DAA2D,EAC3D,YAAY,CACb,CAAC;IAEF,2CAA2C;IAC3C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,uCAAuC,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/E,8BAA8B;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,+BAA+B,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEjE,mEAAmE;IACnE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,EAAE;QAClE,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,aAAa;QAC7D,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc;QAC9D,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,gBAAgB;QAChE,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Smart Extractor module
3
+ * LLM-powered extraction for memo capture
4
+ * Ported from memory-lancedb-pro
5
+ */
6
+ import { ExtractionResult } from '../types';
7
+ /**
8
+ * Extract memories from session text using LLM
9
+ * Falls back to no-op if no API key is configured
10
+ */
11
+ export declare function extract(sessionText: string, apiKey?: string, model?: string): Promise<ExtractionResult[]>;
12
+ //# sourceMappingURL=smart-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-extractor.d.ts","sourceRoot":"","sources":["../../src/core/smart-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAoC5C;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAqC,GAC3C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+D7B"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Smart Extractor module
4
+ * LLM-powered extraction for memo capture
5
+ * Ported from memory-lancedb-pro
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.extract = extract;
9
+ const SYSTEM_PROMPT = `You extract structured memories from AI coding session summaries.
10
+ Return a JSON array. Each item:
11
+ {
12
+ "name": "slug-format",
13
+ "type": "lesson|decision|workflow|architecture",
14
+ "description": "one sentence summary",
15
+ "tags": ["tag1", "tag2"],
16
+ "confidence": "low|medium|high",
17
+ "content": "markdown body with the full insight"
18
+ }
19
+
20
+ ## Extraction Criteria
21
+
22
+ ### DO Extract (High Value):
23
+ - Problems solved and solutions found
24
+ - Architectural decisions and rationale
25
+ - Workflows and processes discovered
26
+ - Best practices and patterns learned
27
+ - Bug fixes with root cause analysis
28
+ - Performance optimizations
29
+ - Security considerations
30
+ - Trade-offs and their reasoning
31
+
32
+ ### DO NOT Extract (Low Value):
33
+ - Simple file operations (opened, closed, saved)
34
+ - Running commands (test, build, lint)
35
+ - Greetings and acknowledgments
36
+ - Trivial changes (typos, formatting)
37
+ - Questions without answers
38
+ - Meta-discussions about the AI
39
+
40
+ Extract only significant learnings. Skip trivial actions. Max 3 items per session.`;
41
+ /**
42
+ * Extract memories from session text using LLM
43
+ * Falls back to no-op if no API key is configured
44
+ */
45
+ async function extract(sessionText, apiKey, model = 'claude-3-5-sonnet-20241022') {
46
+ // Check for API key
47
+ const effectiveApiKey = apiKey || process.env.ANTHROPIC_API_KEY;
48
+ if (!effectiveApiKey) {
49
+ console.warn('No API key configured. Skipping LLM extraction.');
50
+ return [];
51
+ }
52
+ try {
53
+ // Call Claude API
54
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
55
+ method: 'POST',
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ 'x-api-key': effectiveApiKey,
59
+ 'anthropic-version': '2023-06-01',
60
+ },
61
+ body: JSON.stringify({
62
+ model,
63
+ max_tokens: 4096,
64
+ system: SYSTEM_PROMPT,
65
+ messages: [
66
+ {
67
+ role: 'user',
68
+ content: `Extract memories from this session:\n\n${sessionText}`,
69
+ },
70
+ ],
71
+ }),
72
+ });
73
+ if (!response.ok) {
74
+ const error = await response.text();
75
+ console.error(`LLM extraction failed: ${error}`);
76
+ return [];
77
+ }
78
+ const data = (await response.json());
79
+ const content = data.content[0]?.text || '';
80
+ // Parse JSON from response
81
+ const jsonMatch = content.match(/\[[\s\S]*\]/);
82
+ if (!jsonMatch) {
83
+ console.error('Could not parse JSON from LLM response');
84
+ return [];
85
+ }
86
+ const extracted = JSON.parse(jsonMatch[0]);
87
+ // Validate and filter
88
+ return extracted.filter((item) => {
89
+ return (item.name &&
90
+ item.type &&
91
+ item.description &&
92
+ Array.isArray(item.tags) &&
93
+ item.confidence &&
94
+ item.content);
95
+ });
96
+ }
97
+ catch (error) {
98
+ console.error(`LLM extraction error: ${error.message}`);
99
+ return [];
100
+ }
101
+ }
102
+ //# sourceMappingURL=smart-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-extractor.js","sourceRoot":"","sources":["../../src/core/smart-extractor.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0CH,0BAmEC;AAxGD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mFA+B6D,CAAC;AAEpF;;;GAGG;AACI,KAAK,UAAU,OAAO,CAC3B,WAAmB,EACnB,MAAe,EACf,QAAgB,4BAA4B;IAE5C,oBAAoB;IACpB,MAAM,eAAe,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,eAAe;gBAC5B,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,0CAA0C,WAAW,EAAE;qBACjE;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAE5C,2BAA2B;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAuB,CAAC;QAEjE,sBAAsB;QACtB,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,OAAO,CACL,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,WAAW;gBAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,UAAU;gBACf,IAAI,CAAC,OAAO,CACb,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * File I/O layer for memobank
3
+ * Reads and writes .md files with YAML frontmatter
4
+ */
5
+ import { MemoryFile } from '../types';
6
+ /**
7
+ * Find memobank root directory
8
+ * Resolution order:
9
+ * 1. --repo CLI flag (passed as parameter)
10
+ * 2. MEMOBANK_REPO env var
11
+ * 3. meta/config.yaml in cwd or parent dirs (walk up)
12
+ * 4. ~/.memobank/<git-repo-name>/
13
+ * 5. ~/.memobank/default/
14
+ */
15
+ export declare function findRepoRoot(cwd: string, repoFlag?: string): string;
16
+ /**
17
+ * Load all memory files from a repo
18
+ */
19
+ export declare function loadAll(repoRoot: string): MemoryFile[];
20
+ /**
21
+ * Load a single memory file
22
+ */
23
+ export declare function loadFile(filePath: string): MemoryFile;
24
+ /**
25
+ * Write a new memory file
26
+ * Creates filename from name + created date
27
+ */
28
+ export declare function writeMemory(repoRoot: string, memory: Omit<MemoryFile, 'path'>): string;
29
+ /**
30
+ * Update MEMORY.md with recall results
31
+ */
32
+ export declare function writeMemoryMd(repoRoot: string, results: Array<{
33
+ memory: MemoryFile;
34
+ score: number;
35
+ }>, query: string, engine: string): void;
36
+ /**
37
+ * Read MEMORY.md content
38
+ */
39
+ export declare function readMemoryMd(repoRoot: string): string | null;
40
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAA0B,MAAM,UAAU,CAAC;AAI9D;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAwCnE;AASD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAmBtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CA4BrD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,CAoCtF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CA8BN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D"}