super-memory-pro 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 (107) hide show
  1. package/README.md +247 -0
  2. package/dist/config.d.ts +6 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +25 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/db/connection.d.ts +20 -0
  7. package/dist/db/connection.d.ts.map +1 -0
  8. package/dist/db/connection.js +66 -0
  9. package/dist/db/connection.js.map +1 -0
  10. package/dist/db/migrations/001_initial.sql +102 -0
  11. package/dist/db/migrations.d.ts +14 -0
  12. package/dist/db/migrations.d.ts.map +1 -0
  13. package/dist/db/migrations.js +86 -0
  14. package/dist/db/migrations.js.map +1 -0
  15. package/dist/db/queries.d.ts +24 -0
  16. package/dist/db/queries.d.ts.map +1 -0
  17. package/dist/db/queries.js +179 -0
  18. package/dist/db/queries.js.map +1 -0
  19. package/dist/hooks/event-handler.d.ts +13 -0
  20. package/dist/hooks/event-handler.d.ts.map +1 -0
  21. package/dist/hooks/event-handler.js +80 -0
  22. package/dist/hooks/event-handler.js.map +1 -0
  23. package/dist/hooks/index.d.ts +4 -0
  24. package/dist/hooks/index.d.ts.map +1 -0
  25. package/dist/hooks/index.js +7 -0
  26. package/dist/hooks/index.js.map +1 -0
  27. package/dist/hooks/message-handler.d.ts +13 -0
  28. package/dist/hooks/message-handler.d.ts.map +1 -0
  29. package/dist/hooks/message-handler.js +47 -0
  30. package/dist/hooks/message-handler.js.map +1 -0
  31. package/dist/hooks/session-compactor.d.ts +15 -0
  32. package/dist/hooks/session-compactor.d.ts.map +1 -0
  33. package/dist/hooks/session-compactor.js +40 -0
  34. package/dist/hooks/session-compactor.js.map +1 -0
  35. package/dist/hooks/system-transform.d.ts +27 -0
  36. package/dist/hooks/system-transform.d.ts.map +1 -0
  37. package/dist/hooks/system-transform.js +76 -0
  38. package/dist/hooks/system-transform.js.map +1 -0
  39. package/dist/hooks/tool-handler.d.ts +14 -0
  40. package/dist/hooks/tool-handler.d.ts.map +1 -0
  41. package/dist/hooks/tool-handler.js +94 -0
  42. package/dist/hooks/tool-handler.js.map +1 -0
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +152 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/installer/index.d.ts +19 -0
  48. package/dist/installer/index.d.ts.map +1 -0
  49. package/dist/installer/index.js +553 -0
  50. package/dist/installer/index.js.map +1 -0
  51. package/dist/memory/extractor.d.ts +29 -0
  52. package/dist/memory/extractor.d.ts.map +1 -0
  53. package/dist/memory/extractor.js +426 -0
  54. package/dist/memory/extractor.js.map +1 -0
  55. package/dist/memory/index.d.ts +7 -0
  56. package/dist/memory/index.d.ts.map +1 -0
  57. package/dist/memory/index.js +7 -0
  58. package/dist/memory/index.js.map +1 -0
  59. package/dist/memory/processor.d.ts +50 -0
  60. package/dist/memory/processor.d.ts.map +1 -0
  61. package/dist/memory/processor.js +199 -0
  62. package/dist/memory/processor.js.map +1 -0
  63. package/dist/memory/search.d.ts +35 -0
  64. package/dist/memory/search.d.ts.map +1 -0
  65. package/dist/memory/search.js +170 -0
  66. package/dist/memory/search.js.map +1 -0
  67. package/dist/memory/store.d.ts +32 -0
  68. package/dist/memory/store.d.ts.map +1 -0
  69. package/dist/memory/store.js +112 -0
  70. package/dist/memory/store.js.map +1 -0
  71. package/dist/server/index.d.ts +16 -0
  72. package/dist/server/index.d.ts.map +1 -0
  73. package/dist/server/index.js +49 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/middleware/async-handler.d.ts +11 -0
  76. package/dist/server/middleware/async-handler.d.ts.map +1 -0
  77. package/dist/server/middleware/async-handler.js +14 -0
  78. package/dist/server/middleware/async-handler.js.map +1 -0
  79. package/dist/server/middleware/error-handler.d.ts +11 -0
  80. package/dist/server/middleware/error-handler.d.ts.map +1 -0
  81. package/dist/server/middleware/error-handler.js +18 -0
  82. package/dist/server/middleware/error-handler.js.map +1 -0
  83. package/dist/server/routes/health.d.ts +2 -0
  84. package/dist/server/routes/health.d.ts.map +1 -0
  85. package/dist/server/routes/health.js +25 -0
  86. package/dist/server/routes/health.js.map +1 -0
  87. package/dist/server/routes/memory.d.ts +2 -0
  88. package/dist/server/routes/memory.d.ts.map +1 -0
  89. package/dist/server/routes/memory.js +139 -0
  90. package/dist/server/routes/memory.js.map +1 -0
  91. package/dist/server/schemas.d.ts +51 -0
  92. package/dist/server/schemas.d.ts.map +1 -0
  93. package/dist/server/schemas.js +23 -0
  94. package/dist/server/schemas.js.map +1 -0
  95. package/dist/tools/definitions.d.ts +130 -0
  96. package/dist/tools/definitions.d.ts.map +1 -0
  97. package/dist/tools/definitions.js +78 -0
  98. package/dist/tools/definitions.js.map +1 -0
  99. package/dist/tools/index.d.ts +32 -0
  100. package/dist/tools/index.d.ts.map +1 -0
  101. package/dist/tools/index.js +148 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/dist/types.d.ts +108 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +12 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +70 -0
@@ -0,0 +1,426 @@
1
+ // ─── Pattern Extraction Utilities ───────────────────────────────────────────
2
+ // Heuristic/regex-based extractors for tech stack, decisions, preferences,
3
+ // recurring patterns, and content classification. No AI/ML involved.
4
+ // ─── Technology Detection ──────────────────────────────────────────────────
5
+ /**
6
+ * Canonical tech name → detection patterns.
7
+ * Ordered so multi-word entries (e.g. "React Native") come before shorter ones.
8
+ */
9
+ const TECH_ENTRIES = [
10
+ // JavaScript ecosystem
11
+ { name: 'TypeScript', patterns: [/\btypescript\b/i] },
12
+ { name: 'JavaScript', patterns: [/\bjavascript\b/i, /\bJS(?![a-z])/] },
13
+ { name: 'Node.js', patterns: [/\bnode\.js\b/i, /\bnodejs\b/i] },
14
+ { name: 'Deno', patterns: [/\bdeno\b/i] },
15
+ { name: 'Bun', patterns: [/\bbun\b/i] },
16
+ { name: 'Express', patterns: [/\bexpress\b/i] },
17
+ { name: 'Fastify', patterns: [/\bfastify\b/i] },
18
+ { name: 'Next.js', patterns: [/\bnext\.js\b/i, /\bnextjs\b/i] },
19
+ { name: 'Nuxt', patterns: [/\bnuxt\b/i, /\bnuxt\.js\b/i] },
20
+ { name: 'Svelte', patterns: [/\bsvelte\b/i] },
21
+ { name: 'React Native', patterns: [/\breact\s+native\b/i] },
22
+ { name: 'React', patterns: [/\breact\b/i] },
23
+ { name: 'Vue', patterns: [/\bvue\b/i, /\bvue\.js\b/i] },
24
+ { name: 'Angular', patterns: [/\bangular\b/i] },
25
+ { name: 'Solid', patterns: [/\bsolid(?:js)?\b/i] },
26
+ // Languages
27
+ { name: 'Python', patterns: [/\bpython\b/i] },
28
+ { name: 'Rust', patterns: [/\brust\b/i] },
29
+ { name: 'Go', patterns: [/\bGo(?:\s+language|\s+backend|\s+server|\s+api|\s+mod|\s+run|\s+build|\s+programming|\s+concurrency)\b/] },
30
+ { name: 'Ruby', patterns: [/\bruby\b/i] },
31
+ { name: 'PHP', patterns: [/\bPHP\b/] },
32
+ { name: 'C#', patterns: [/\bC#\b/] },
33
+ { name: 'Swift', patterns: [/\bswift\b/i] },
34
+ { name: 'Kotlin', patterns: [/\bkotlin\b/i] },
35
+ { name: 'Dart', patterns: [/\bdart\b/i] },
36
+ { name: 'Elixir', patterns: [/\belixir\b/i] },
37
+ { name: 'Zig', patterns: [/\bzig\b/i] },
38
+ // Databases
39
+ { name: 'PostgreSQL', patterns: [/\bpostgresql\b/i, /\bpostgres\b/i] },
40
+ { name: 'MySQL', patterns: [/\bmysql\b/i] },
41
+ { name: 'SQLite', patterns: [/\bsqlite\b/i] },
42
+ { name: 'MongoDB', patterns: [/\bmongodb\b/i, /\bmongo\b/i] },
43
+ { name: 'Redis', patterns: [/\bredis\b/i] },
44
+ { name: 'MariaDB', patterns: [/\bmariadb\b/i] },
45
+ { name: 'Memcached', patterns: [/\bmemcached\b/i] },
46
+ { name: 'Supabase', patterns: [/\bsupabase\b/i] },
47
+ { name: 'Firebase', patterns: [/\bfirebase\b/i] },
48
+ // Infrastructure
49
+ { name: 'Docker', patterns: [/\bdocker\b/i] },
50
+ { name: 'Kubernetes', patterns: [/\bkubernetes\b/i, /\bk8s\b/i] },
51
+ { name: 'AWS', patterns: [/\bAWS\b/] },
52
+ { name: 'GCP', patterns: [/\bGCP\b/] },
53
+ { name: 'Azure', patterns: [/\bazure\b/i] },
54
+ { name: 'Cloudflare', patterns: [/\bcloudflare\b/i] },
55
+ { name: 'Vercel', patterns: [/\bvercel\b/i] },
56
+ { name: 'Netlify', patterns: [/\bnetlify\b/i] },
57
+ { name: 'Railway', patterns: [/\brailway\b/i] },
58
+ { name: 'Terraform', patterns: [/\bterraform\b/i] },
59
+ { name: 'Ansible', patterns: [/\bansible\b/i] },
60
+ { name: 'Pulumi', patterns: [/\bpulumi\b/i] },
61
+ { name: 'Nginx', patterns: [/\bnginx\b/i] },
62
+ { name: 'Apache', patterns: [/\bapache\b/i] },
63
+ { name: 'Caddy', patterns: [/\bcaddy\b/i] },
64
+ { name: 'GitHub Actions', patterns: [/\bgithub\s+actions\b/i] },
65
+ { name: 'CI/CD', patterns: [/\bci\/cd\b/i] },
66
+ // ORMs / Query builders
67
+ { name: 'Prisma', patterns: [/\bprisma\b/i] },
68
+ { name: 'Drizzle', patterns: [/\bdrizzle\b/i] },
69
+ { name: 'TypeORM', patterns: [/\btypeorm\b/i] },
70
+ { name: 'Sequelize', patterns: [/\bsequelize\b/i] },
71
+ { name: 'Knex', patterns: [/\bknex\b/i] },
72
+ // API / protocols
73
+ { name: 'GraphQL', patterns: [/\bgraphql\b/i] },
74
+ { name: 'tRPC', patterns: [/\btrpc\b/i] },
75
+ { name: 'REST', patterns: [/\bREST\b/] },
76
+ { name: 'gRPC', patterns: [/\bgrpc\b/i] },
77
+ // CSS / UI
78
+ { name: 'Tailwind CSS', patterns: [/\btailwind\b/i, /\btailwindcss\b/i] },
79
+ { name: 'Bootstrap', patterns: [/\bbootstrap\b/i] },
80
+ { name: 'Shadcn/ui', patterns: [/\bshadcn\b/i] },
81
+ { name: 'Radix UI', patterns: [/\bradix\b/i] },
82
+ // Testing
83
+ { name: 'Jest', patterns: [/\bjest\b/i] },
84
+ { name: 'Vitest', patterns: [/\bvitest\b/i] },
85
+ { name: 'Playwright', patterns: [/\bplaywright\b/i] },
86
+ { name: 'Cypress', patterns: [/\bcypress\b/i] },
87
+ { name: 'Pytest', patterns: [/\bpytest\b/i] },
88
+ // Bundlers / build
89
+ { name: 'Webpack', patterns: [/\bwebpack\b/i] },
90
+ { name: 'Vite', patterns: [/\bvite\b/i] },
91
+ { name: 'ESBuild', patterns: [/\besbuild\b/i] },
92
+ { name: 'Rollup', patterns: [/\brollup\b/i] },
93
+ { name: 'Turbopack', patterns: [/\bturbopack\b/i] },
94
+ { name: 'Parcel', patterns: [/\bparcel\b/i] },
95
+ // Package managers
96
+ { name: 'pnpm', patterns: [/\bpnpm\b/i] },
97
+ { name: 'Yarn', patterns: [/\byarn\b/i] },
98
+ { name: 'npm', patterns: [/\bnpm\b/i] },
99
+ // Mobile
100
+ { name: 'Flutter', patterns: [/\bflutter\b/i] },
101
+ { name: 'Expo', patterns: [/\bexpo\b/i] },
102
+ // Message queues / streaming
103
+ { name: 'Kafka', patterns: [/\bkafka\b/i] },
104
+ { name: 'RabbitMQ', patterns: [/\brabbitmq\b/i] },
105
+ { name: 'NATS', patterns: [/\bNATS\b/] },
106
+ { name: 'SQS', patterns: [/\bSQS\b/] },
107
+ // Monitoring / observability
108
+ { name: 'Datadog', patterns: [/\bdatadog\b/i] },
109
+ { name: 'Grafana', patterns: [/\bgrafana\b/i] },
110
+ { name: 'Prometheus', patterns: [/\bprometheus\b/i] },
111
+ { name: 'Sentry', patterns: [/\bsentry\b/i] },
112
+ { name: 'OpenTelemetry', patterns: [/\bopentelemetry\b/i] },
113
+ // Misc
114
+ { name: 'Electron', patterns: [/\belectron\b/i] },
115
+ { name: 'Tauri', patterns: [/\btauri\b/i] },
116
+ { name: 'Monorepo', patterns: [/\b(?:monorepo|mono-repo)\b/i] },
117
+ { name: 'Turborepo', patterns: [/\bturborepo\b/i] },
118
+ { name: 'Nx', patterns: [/\bNx\b/] },
119
+ ];
120
+ /** Contextual cues that the preceding noun is a technology. */
121
+ const TECH_CONTEXT_PATTERNS = [
122
+ // English
123
+ /\b(?:using|built\s+(?:with|on|using)|powered\s+by|written\s+in)\s+/gi,
124
+ /\b(?:developed\s+(?:with|in|using)|made\s+with|implemented\s+in)\s+/gi,
125
+ /\b(?:created\s+(?:with|using|in)|running\s+(?:on|with)|works\s+with)\s+/gi,
126
+ /\b(?:stack|technologies|tech\s+stack|dependencies|frameworks|libraries)(?::|\s+(?:are|is|include[s]?))\s*/gi,
127
+ /\b(?:based\s+on|built\s+upon|runs?\s+on|depends?\s+on)\s+/gi,
128
+ /\b(?:migrating?\s+(?:from|to)|switching?\s+(?:from|to)|moving?\s+(?:from|to))\s+/gi,
129
+ /\b(?:work(?:s|ing)?\s+with|familiar\s+with|experienced\s+in|proficient\s+in)\s+/gi,
130
+ // Spanish
131
+ /\b(?:usando|construido\s+con|escrito\s+en|desarrollado\s+(?:con|en))\s+/gi,
132
+ /\b(?:implementado\s+(?:con|en)|creado\s+con|corriendo\s+(?:en|con))\s+/gi,
133
+ /\b(?:basado\s+en|depende\s+de|funciona\s+con|trabaja\s+con)\s+/gi,
134
+ /\b(?:stack|tecnologías?|dependencias|frameworks?|liberrías?)(?::|\s+(?:son|incluye[n]?))\s*/gi,
135
+ ];
136
+ /**
137
+ * Detect technology mentions in text.
138
+ * Uses a combination of direct name matching and contextual cues.
139
+ */
140
+ export function extractTechStack(text) {
141
+ const found = new Set();
142
+ const lower = text.toLowerCase();
143
+ // 1. Direct name matching
144
+ for (const entry of TECH_ENTRIES) {
145
+ for (const pattern of entry.patterns) {
146
+ if (pattern.test(text)) {
147
+ found.add(entry.name);
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ // 2. Contextual extraction: look for known tech after indicator phrases
153
+ const contextMatch = new Set();
154
+ for (const ctxPattern of TECH_CONTEXT_PATTERNS) {
155
+ ctxPattern.lastIndex = 0;
156
+ let match;
157
+ while ((match = ctxPattern.exec(text)) !== null) {
158
+ // Peek at the next ~40 chars after the indicator
159
+ const after = text.slice(match.index + match[0].length, match.index + match[0].length + 60);
160
+ // Check if any known tech name appears in this window
161
+ for (const entry of TECH_ENTRIES) {
162
+ for (const pat of entry.patterns) {
163
+ const stripped = pat.source.replace(/\\b/gi, '');
164
+ const nameRegex = new RegExp(stripped, 'i');
165
+ if (nameRegex.test(after)) {
166
+ contextMatch.add(entry.name);
167
+ break;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ for (const name of contextMatch)
174
+ found.add(name);
175
+ return [...found].sort();
176
+ }
177
+ // ─── Decision Extraction ───────────────────────────────────────────────────
178
+ const DECISION_PATTERNS = [
179
+ // English
180
+ /let'?s\s+(?:use|go\s+with|try|stick\s+with|adopt|pick|choose)\s+(.+?)(?:[.!,;]|$)/gi,
181
+ /(?:we|i)\s+(?:decided|chose|opted|selected|picked|voted|settled)\s+(?:to\s+)?(?:use\s+|go\s+with\s+|for\s+|on\s+)?(.+?)(?:[.!,;]|$)/gi,
182
+ /(?:decided|agreed|resolved|concluded)\s+(?:that|to)\s+(.+?)(?:[.!,;]|$)/gi,
183
+ /prefer\s+(.+?)\s+(?:over|to)\s+(.+?)(?:[.!,;]|$)/gi,
184
+ /(?:the\s+)?(?:decision|choice|conclusion|consensus)\s+(?:is|was|will\s+be)\s+(.+?)(?:[.!,;]|$)/gi,
185
+ /(?:we|i)'?ll\s+(?:use|go\s+with|try|stick\s+with)\s+(.+?)(?:[.!,;]|$)/gi,
186
+ /(?:go(?:ing)?\s+(?:with|for))\s+(.+?)(?:[.!,;]|$)/gi,
187
+ /(?:recommend|suggest)(?:ed|s)?\s+(?:using|going\s+with)\s+(.+?)(?:[.!,;]|$)/gi,
188
+ // Spanish
189
+ /vamos\s+a\s+(?:usar|probar|quedarnos\s+con|implementar|adoptar|elegir)\s+(.+?)(?:[.!,;]|$)/gi,
190
+ /(?:decidimos|optamos|seleccionamos|escogimos|acordamos|votamos)\s+(?:usar\s+|por\s+)?(.+?)(?:[.!,;]|$)/gi,
191
+ /(?:prefiero|preferimos)\s+(.+?)\s+(?:sobre|a|antes\s+que)\s+(.+?)(?:[.!,;]|$)/gi,
192
+ /(?:la\s+)?(?:decisión|elección|conclusión|consenso)\s+(?:es|fue|será)\s+(.+?)(?:[.!,;]|$)/gi,
193
+ /nos\s+(?:quedamos|vamos)\s+con\s+(.+?)(?:[.!,;]|$)/gi,
194
+ /(?:recomiendo|sugiero|proponemos?)\s+(?:usar|utilizar)\s+(.+?)(?:[.!,;]|$)/gi,
195
+ ];
196
+ /**
197
+ * Extract decisions from text.
198
+ * Returns array of { decision, context } where decision is the choice made
199
+ * and context provides surrounding framing.
200
+ */
201
+ export function extractDecisions(text) {
202
+ const results = [];
203
+ const seen = new Set();
204
+ for (const pattern of DECISION_PATTERNS) {
205
+ pattern.lastIndex = 0;
206
+ let match;
207
+ while ((match = pattern.exec(text)) !== null) {
208
+ // The captured group(s) contain the decision content
209
+ if (match[2] && match[1]) {
210
+ // Prefer X over Y pattern
211
+ const decision = `${match[1].trim()} over ${match[2].trim()}`;
212
+ const key = decision.toLowerCase();
213
+ if (!seen.has(key)) {
214
+ seen.add(key);
215
+ results.push({
216
+ decision: match[1].trim(),
217
+ context: match[2].trim(),
218
+ });
219
+ }
220
+ }
221
+ else if (match[1]) {
222
+ const raw = match[1].trim();
223
+ const key = raw.toLowerCase();
224
+ if (!seen.has(key) && raw.length > 2) {
225
+ seen.add(key);
226
+ // Extract surrounding 80 chars before match as context
227
+ const ctxStart = Math.max(0, match.index - 80);
228
+ const context = text.slice(ctxStart, match.index).trim();
229
+ results.push({ decision: raw, context });
230
+ }
231
+ }
232
+ }
233
+ }
234
+ return results;
235
+ }
236
+ // ─── User Preference Extraction ────────────────────────────────────────────
237
+ const PREFERENCE_PATTERNS = [
238
+ // English
239
+ /\bI\s+(?:prefer|like|love|enjoy|dislike|hate|usually|always|often|tend\s+to|am\s+used\s+to|would\s+rather|would\s+prefer|appreciate|admire)\s+(.+?)(?:[.!,;]|$)/gi,
240
+ /\bmy\s+(?:favorite|preferred|go-to|preference|preferred\s+way)\b(?:\s+\w+)*?\s+(?:is|are)\s+(.+?)(?:[.!,;]|$)/gi,
241
+ /\bI['']?m\s+(?:more\s+of\s+a|not\s+a\s+fan\s+of|a\s+fan\s+of|comfortable\s+with|used\s+to)\s+(.+?)(?:[.!,;]|$)/gi,
242
+ /\bI\s+(?:don'?t|do\s+not)\s+(?:like|enjoy|prefer)\s+(.+?)(?:[.!,;]|$)/gi,
243
+ /\bI'?d\s+(?:rather|prefer)\s+(.+?)(?:[.!,;]|$)/gi,
244
+ // Spanish
245
+ /(?:prefiero|me\s+gusta|me\s+encanta|disfruto|admiro)\s+(.+?)(?:[.!,;]|$)/gi,
246
+ /(?:suelo|normalmente|usualmente|generalmente|a\s+menudo|siempre)\s+(.+?)(?:[.!,;]|$)/gi,
247
+ /(?:mi\s+favorito|mi\s+preferido|lo\s+que\s+más\s+me\s+gusta)\s+(?:es|son)\s+(.+?)(?:[.!,;]|$)/gi,
248
+ /no\s+(?:me\s+gusta|soporto|soportamos)\s+(.+?)(?:[.!,;]|$)/gi,
249
+ /(?:acostumbro|acostumbramos)\s+(?:a\s+)?(.+?)(?:[.!,;]|$)/gi,
250
+ ];
251
+ /**
252
+ * Extract user preferences from text.
253
+ */
254
+ export function extractUserPreferences(text) {
255
+ const results = [];
256
+ const seen = new Set();
257
+ for (const pattern of PREFERENCE_PATTERNS) {
258
+ pattern.lastIndex = 0;
259
+ let match;
260
+ while ((match = pattern.exec(text)) !== null) {
261
+ const raw = match[1]?.trim();
262
+ if (raw && raw.length > 2) {
263
+ const key = raw.toLowerCase();
264
+ if (!seen.has(key)) {
265
+ seen.add(key);
266
+ results.push(raw);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ return results;
272
+ }
273
+ // ─── Pattern Extraction ────────────────────────────────────────────────────
274
+ const COMMAND_PATTERNS = [
275
+ // npm / yarn / pnpm / bun
276
+ /(?:npm|yarn|pnpm|bun)\s+(?:install|add|remove|run|test|build|start|dev|publish|link|unlink|ci|audit|fix|update|upgrade)\b/gi,
277
+ // git
278
+ /git\s+(?:clone|init|add|commit|push|pull|fetch|merge|rebase|checkout|branch|tag|stash|log|diff|status|reset|revert|cherry-pick|switch|restore)\b/gi,
279
+ // docker
280
+ /docker\s+(?:run|build|compose|ps|exec|logs|pull|push|stop|start|restart|rm|image|volume|network)\b/gi,
281
+ /docker-compose\s+(?:up|down|build|logs|exec|run|ps|stop|start)\b/gi,
282
+ // kubectl
283
+ /kubectl\s+(?:get|apply|delete|describe|logs|exec|port-forward|rollout|scale|create|edit|patch)\b/gi,
284
+ // AWS CLI
285
+ /aws\s+(?:s3|ec2|lambda|eks|rds|dynamodb|cloudformation|iam|ssm)\s+\w+/gi,
286
+ // gcloud
287
+ /gcloud\s+(?:run|functions|builds|storage|container|sql|deploy)\b/gi,
288
+ // npx
289
+ /npx\s+\w+/gi,
290
+ // cargo
291
+ /cargo\s+(?:build|run|test|check|clippy|fmt|add|remove|update|publish|install)\b/gi,
292
+ // go
293
+ /go\s+(?:build|run|test|mod|get|install|vet|fmt|generate)\b/gi,
294
+ // pip
295
+ /pip\s+(?:install|uninstall|freeze|list|show|check|compile|sync)\b/gi,
296
+ // Other common commands
297
+ /(?:pnpm|yarn|npm|bun|npx)\s+(?:dlx|create|cache|why|info|outdated)\b/gi,
298
+ /make\s+\w+/gi,
299
+ ];
300
+ const WORKFLOW_PATTERNS = [
301
+ // English workflow descriptions
302
+ /(?:every\s+time|whenever|when\s+I|always\s+|never\s+|usually\s+|typically\s+|normally\s+).{5,60}(?:[.!,]|$)/gi,
303
+ /(?:before|after)\s+(?:committing|deploying|building|testing|releasing|merging|pushing).{0,60}(?:[.!,]|$)/gi,
304
+ /(?:step\s+\d+|first|then|next|finally)\s+.{5,80}(?:[.!,]|$)/gi,
305
+ // Spanish workflow descriptions
306
+ /(?:cada\s+vez\s+que|siempre\s+que|cuando|normalmente|usualmente|generalmente)\s+.{5,60}(?:[.!,]|$)/gi,
307
+ /(?:antes\s+de|después\s+de)\s+(?:committear|desplegar|buildear|testear|release|merge|pushear).{0,60}(?:[.!,]|$)/gi,
308
+ /(?:paso\s+\d+|primero|luego|después|finalmente)\s+.{5,80}(?:[.!,]|$)/gi,
309
+ ];
310
+ /**
311
+ * Extract recurring patterns — commands, workflows, and habitual actions.
312
+ */
313
+ export function extractPatterns(text) {
314
+ const results = [];
315
+ const seen = new Set();
316
+ // Extract command patterns
317
+ for (const pattern of COMMAND_PATTERNS) {
318
+ pattern.lastIndex = 0;
319
+ let match;
320
+ while ((match = pattern.exec(text)) !== null) {
321
+ const raw = match[0].trim();
322
+ const key = raw.toLowerCase();
323
+ if (!seen.has(key)) {
324
+ seen.add(key);
325
+ results.push(raw);
326
+ }
327
+ }
328
+ }
329
+ // Extract workflow descriptive patterns
330
+ for (const pattern of WORKFLOW_PATTERNS) {
331
+ pattern.lastIndex = 0;
332
+ let match;
333
+ while ((match = pattern.exec(text)) !== null) {
334
+ const raw = match[0].trim();
335
+ const key = raw.toLowerCase().slice(0, 40);
336
+ if (!seen.has(key) && raw.length > 8) {
337
+ seen.add(key);
338
+ results.push(raw);
339
+ }
340
+ }
341
+ }
342
+ return results;
343
+ }
344
+ // ─── Content Classification ────────────────────────────────────────────────
345
+ /**
346
+ * Determine the most likely MemoryType based on content heuristics.
347
+ * Checks are ordered by specificity (most distinctive patterns first).
348
+ */
349
+ export function classifyContent(text) {
350
+ const lower = text.toLowerCase();
351
+ // ── user_profile: personal preferences, habits, self-descriptions ──
352
+ const userProfileIndicators = [
353
+ /\bI\s+(?:prefer|like|love|enjoy|dislike|hate|usually|always|often|tend\s+to|am\s+used\s+to)\b/i,
354
+ /\b(?:prefiero|me\s+gusta|suelo|acostumbro)\b/i,
355
+ /\bmy\s+(?:favorite|preferred|go-to|preference)\b/i,
356
+ /\bI['']?m\s+(?:more\s+of\s+a|comfortable\s+with|used\s+to)\b/i,
357
+ /\bI\s+work\s+(?:as|in|with|on)\b/i,
358
+ /\b(?:mi\s+)?(?:rol|puesto|posición)\s+(?:es|como)\b/i,
359
+ ];
360
+ if (userProfileIndicators.some((p) => p.test(text))) {
361
+ // Only classify as user_profile if personal preference indicators dominate
362
+ const prefCount = countMatches(text, userProfileIndicators);
363
+ if (prefCount >= 2 || (prefCount >= 1 && text.split(/\s+/).length < 30)) {
364
+ return 'user_profile';
365
+ }
366
+ }
367
+ // ── decision: explicit choices, decisions, agreements ──
368
+ const decisionIndicators = [
369
+ /\b(?:decided|chose|opted|selected|picked|voted|settled|agreed|resolved|concluded)\b/i,
370
+ /\blet'?s\s+(?:use|go\s+with|try|stick\s+with|adopt)\b/i,
371
+ /(?:la\s+)?(?:decisión|elección|conclusión|consenso)\s+(?:es|fue|será)\b/i,
372
+ /\b(?:decidimos|optamos|acordamos|votamos|seleccionamos)\b/i,
373
+ /\bvamos\s+a\s+(?:usar|quedarnos)\b/i,
374
+ ];
375
+ if (decisionIndicators.some((p) => p.test(text))) {
376
+ return 'decision';
377
+ }
378
+ // ── tech_stack: technology mentions ──
379
+ const techs = extractTechStack(text);
380
+ if (techs.length >= 2 || (techs.length === 1 && /\b(?:using|built\s+with|stack)\b/i.test(text))) {
381
+ return 'tech_stack';
382
+ }
383
+ // ── pattern: procedural, habitual, or command descriptions ──
384
+ const patternIndicators = [
385
+ /\b(?:every\s+time|whenever|always\s+|never\s+|usually\s+|typically\s+|normally\s+)/i,
386
+ /\b(?:npm|yarn|pnpm|bun|git|docker|kubectl|aws|gcloud|cargo|go|pip|make)\s+\w+/i,
387
+ /\b(?:step\s+\d+|first|then|next|finally)\s+/i,
388
+ /\b(?:cada\s+vez\s+que|siempre\s+que|cuando|normalmente)\s+/i,
389
+ ];
390
+ if (patternIndicators.some((p) => p.test(text))) {
391
+ return 'pattern';
392
+ }
393
+ // ── project_context: project/app/feature/bug discussions ──
394
+ const projectIndicators = [
395
+ /\b(?:the\s+)?(?:project|app|application|repo|repository|codebase|monorepo)\s+(?:is|uses|has|was|will|should)\b/i,
396
+ /\b(?:feature|bug|fix|refactor|implement|migrate|component|module|service|api)\b/i,
397
+ /\b(?:architecture|design|pattern|structure|layout|schema|migration)\b/i,
398
+ /\bvamos\s+a\s+(?:implementar|refactorizar|migrar|crear|añadir)\b/i,
399
+ ];
400
+ if (projectIndicators.some((p) => p.test(text))) {
401
+ return 'project_context';
402
+ }
403
+ // ── explicit: user explicitly asking to remember something ──
404
+ const explicitIndicators = [
405
+ /\b(?:remember|remembered|recall|save|store|keep\s+in\s+mind|note|take\s+note)\b/i,
406
+ /importante:\s+/i,
407
+ /\b(?:recuerda|recordar|guardar|almacenar|nota|importante)\b/i,
408
+ ];
409
+ if (explicitIndicators.some((p) => p.test(text))) {
410
+ return 'explicit';
411
+ }
412
+ // ── session: default fallback ──
413
+ return 'session';
414
+ }
415
+ // ─── Internal Helpers ──────────────────────────────────────────────────────
416
+ /** Count how many regex patterns match at least once in text. */
417
+ function countMatches(text, patterns) {
418
+ let count = 0;
419
+ for (const p of patterns) {
420
+ p.lastIndex = 0;
421
+ if (p.test(text))
422
+ count++;
423
+ }
424
+ return count;
425
+ }
426
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { extractTechStack, extractDecisions, extractUserPreferences, extractPatterns, classifyContent, } from './extractor.js';
2
+ export { storeMemory, storeMemories, storeTechStack, } from './store.js';
3
+ export { searchRelevantMemories, formatMemoriesForPrompt, } from './search.js';
4
+ export type { SearchOptions } from './search.js';
5
+ export { processMessage, getContextForQuery, } from './processor.js';
6
+ export type { ProcessMessageMetadata, ContextQueryOptions } from './processor.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // ─── Memory Module ─────────────────────────────────────────────────────────
2
+ // Barrel export for the Ultra Memory processor module.
3
+ export { extractTechStack, extractDecisions, extractUserPreferences, extractPatterns, classifyContent, } from './extractor.js';
4
+ export { storeMemory, storeMemories, storeTechStack, } from './store.js';
5
+ export { searchRelevantMemories, formatMemoriesForPrompt, } from './search.js';
6
+ export { processMessage, getContextForQuery, } from './processor.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uDAAuD;AAEvD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAIrB,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { MemoryRecord } from '../types.js';
2
+ import { type SearchOptions } from './search.js';
3
+ export interface ProcessMessageMetadata {
4
+ sessionId?: string;
5
+ projectId?: string;
6
+ source?: string;
7
+ }
8
+ /**
9
+ * Process a message: extract patterns → classify → store memories.
10
+ *
11
+ * This is the main pipeline for ingesting a message into the memory system.
12
+ * It runs all extractors in parallel, classifies the content, and persists
13
+ * everything atomically (each memory independently — partial failures are
14
+ * tolerated).
15
+ *
16
+ * Extraction steps:
17
+ * 1. Tech stack mentions → tech_stack memories
18
+ * 2. Decisions → decision memories
19
+ * 3. User preferences → user_profile memories
20
+ * 4. Workflow patterns → pattern memories
21
+ * 5. Content classification → appropriate type memory
22
+ *
23
+ * @param content - The message text to process
24
+ * @param metadata - Session / project / source context
25
+ * @returns - All memories created or updated
26
+ */
27
+ export declare function processMessage(content: string, metadata: ProcessMessageMetadata): Promise<MemoryRecord[]>;
28
+ export interface ContextQueryOptions {
29
+ /** Scope to a specific project */
30
+ projectId?: string;
31
+ /** Maximum memories to inject into prompt (default: 5) */
32
+ maxInjections?: number;
33
+ /** Minimum importance filter (1-5) */
34
+ minImportance?: number;
35
+ /** Specific types to search */
36
+ types?: SearchOptions['types'];
37
+ }
38
+ /**
39
+ * Get relevant context for a query as formatted prompt text.
40
+ *
41
+ * Searches the memory store for relevant records, formats them as
42
+ * structured markdown, and returns a string suitable for injection
43
+ * into an LLM system prompt.
44
+ *
45
+ * @param query - The query to find context for
46
+ * @param options - Optional filters and limits
47
+ * @returns - Formatted context string (empty if nothing relevant)
48
+ */
49
+ export declare function getContextForQuery(query: string, options?: ContextQueryOptions): Promise<string>;
50
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/memory/processor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,YAAY,EAAE,MAAM,aAAa,CAAC;AAS9D,OAAO,EAAmD,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQlG,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,YAAY,EAAE,CAAC,CA4GzB;AAID,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}