super-memory-pro 0.3.0 → 2.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 (56) hide show
  1. package/README.md +56 -2
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/db/connection.d.ts.map +1 -1
  6. package/dist/db/connection.js +86 -6
  7. package/dist/db/connection.js.map +1 -1
  8. package/dist/hooks/event-handler.d.ts.map +1 -1
  9. package/dist/hooks/event-handler.js +9 -0
  10. package/dist/hooks/event-handler.js.map +1 -1
  11. package/dist/hooks/message-handler.d.ts.map +1 -1
  12. package/dist/hooks/message-handler.js +3 -0
  13. package/dist/hooks/message-handler.js.map +1 -1
  14. package/dist/hooks/system-transform.d.ts +5 -12
  15. package/dist/hooks/system-transform.d.ts.map +1 -1
  16. package/dist/hooks/system-transform.js +43 -24
  17. package/dist/hooks/system-transform.js.map +1 -1
  18. package/dist/memory/embeddings.d.ts +22 -0
  19. package/dist/memory/embeddings.d.ts.map +1 -0
  20. package/dist/memory/embeddings.js +139 -0
  21. package/dist/memory/embeddings.js.map +1 -0
  22. package/dist/memory/extractor.d.ts.map +1 -1
  23. package/dist/memory/extractor.js +5 -1
  24. package/dist/memory/extractor.js.map +1 -1
  25. package/dist/memory/index.d.ts +13 -1
  26. package/dist/memory/index.d.ts.map +1 -1
  27. package/dist/memory/index.js +7 -1
  28. package/dist/memory/index.js.map +1 -1
  29. package/dist/memory/llm-extractor.d.ts +22 -0
  30. package/dist/memory/llm-extractor.d.ts.map +1 -0
  31. package/dist/memory/llm-extractor.js +117 -0
  32. package/dist/memory/llm-extractor.js.map +1 -0
  33. package/dist/memory/pattern-detector.d.ts +28 -0
  34. package/dist/memory/pattern-detector.d.ts.map +1 -0
  35. package/dist/memory/pattern-detector.js +221 -0
  36. package/dist/memory/pattern-detector.js.map +1 -0
  37. package/dist/memory/processor.d.ts +7 -1
  38. package/dist/memory/processor.d.ts.map +1 -1
  39. package/dist/memory/processor.js +112 -15
  40. package/dist/memory/processor.js.map +1 -1
  41. package/dist/memory/project-context.d.ts +24 -0
  42. package/dist/memory/project-context.d.ts.map +1 -0
  43. package/dist/memory/project-context.js +186 -0
  44. package/dist/memory/project-context.js.map +1 -0
  45. package/dist/memory/suggestions.d.ts +21 -0
  46. package/dist/memory/suggestions.d.ts.map +1 -0
  47. package/dist/memory/suggestions.js +205 -0
  48. package/dist/memory/suggestions.js.map +1 -0
  49. package/dist/memory/user-profile.d.ts +24 -0
  50. package/dist/memory/user-profile.d.ts.map +1 -0
  51. package/dist/memory/user-profile.js +220 -0
  52. package/dist/memory/user-profile.js.map +1 -0
  53. package/dist/types.d.ts +8 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/package.json +5 -5
  56. package/dist/db/migrations/migrations/001_initial.sql +0 -102
@@ -0,0 +1,220 @@
1
+ // ─── User Profile Module ──────────────────────────────────────────────────
2
+ // Evolving user profile that learns from each session.
3
+ // Tracks preferred languages, coding style, frameworks, patterns, etc.
4
+ import { getPool } from '../db/connection.js';
5
+ // ─── Profile Building ────────────────────────────────────────────────────
6
+ /**
7
+ * Build or update user profile from stored memories.
8
+ */
9
+ export async function buildUserProfile(projectId) {
10
+ try {
11
+ const pool = getPool();
12
+ // Fetch relevant memories for profile building
13
+ const result = await pool.query(`SELECT * FROM memories
14
+ WHERE ($1::text IS NULL OR project_id = $1)
15
+ AND memory_type IN ('user_profile', 'tech_stack', 'pattern', 'decision')
16
+ ORDER BY created_at DESC
17
+ LIMIT 200`, [projectId ?? null]);
18
+ const memories = result.rows;
19
+ // Analyze memories to build profile
20
+ const profile = {
21
+ preferredLanguages: extractLanguages(memories),
22
+ codingStyle: detectCodingStyle(memories),
23
+ frameworks: extractFrameworks(memories),
24
+ patterns: extractPatterns(memories),
25
+ avoidPatterns: extractAvoidPatterns(memories),
26
+ experienceLevel: detectExperienceLevel(memories),
27
+ lastUpdated: new Date().toISOString(),
28
+ };
29
+ return profile;
30
+ }
31
+ catch (err) {
32
+ console.error('[UltraMemory] Failed to build user profile:', err);
33
+ return getDefaultProfile();
34
+ }
35
+ }
36
+ /**
37
+ * Get profile insights with confidence scores.
38
+ */
39
+ export async function getProfileInsights(projectId) {
40
+ try {
41
+ const pool = getPool();
42
+ const result = await pool.query(`SELECT * FROM memories
43
+ WHERE ($1::text IS NULL OR project_id = $1)
44
+ AND memory_type IN ('user_profile', 'tech_stack', 'pattern')
45
+ ORDER BY importance DESC, created_at DESC
46
+ LIMIT 100`, [projectId ?? null]);
47
+ const memories = result.rows;
48
+ const insights = [];
49
+ // Language preferences
50
+ const languages = extractLanguages(memories);
51
+ if (languages.length > 0) {
52
+ insights.push({
53
+ category: 'languages',
54
+ insight: `Prefers: ${languages.join(', ')}`,
55
+ confidence: Math.min(1, languages.length / 3),
56
+ evidence: memories
57
+ .filter((m) => m.memory_type === 'tech_stack' && languages.some((l) => m.content.includes(l)))
58
+ .map((m) => m.content)
59
+ .slice(0, 3),
60
+ });
61
+ }
62
+ // Coding style
63
+ const style = detectCodingStyle(memories);
64
+ insights.push({
65
+ category: 'coding_style',
66
+ insight: `Coding style: ${style}`,
67
+ confidence: style === 'mixed' ? 0.5 : 0.7,
68
+ evidence: [],
69
+ });
70
+ // Frameworks
71
+ const frameworks = extractFrameworks(memories);
72
+ if (frameworks.length > 0) {
73
+ insights.push({
74
+ category: 'frameworks',
75
+ insight: `Uses: ${frameworks.join(', ')}`,
76
+ confidence: Math.min(1, frameworks.length / 2),
77
+ evidence: memories
78
+ .filter((m) => m.memory_type === 'tech_stack' && frameworks.some((f) => m.content.includes(f)))
79
+ .map((m) => m.content)
80
+ .slice(0, 3),
81
+ });
82
+ }
83
+ // Experience level
84
+ const experience = detectExperienceLevel(memories);
85
+ insights.push({
86
+ category: 'experience',
87
+ insight: `Experience level: ${experience}`,
88
+ confidence: 0.6,
89
+ evidence: [],
90
+ });
91
+ return insights;
92
+ }
93
+ catch (err) {
94
+ console.error('[UltraMemory] Failed to get profile insights:', err);
95
+ return [];
96
+ }
97
+ }
98
+ // ─── Extraction Helpers ──────────────────────────────────────────────────
99
+ function extractLanguages(memories) {
100
+ const languageCounts = new Map();
101
+ const commonLanguages = [
102
+ 'TypeScript', 'JavaScript', 'Python', 'Rust', 'Go', 'Java', 'C#',
103
+ 'Ruby', 'PHP', 'Swift', 'Kotlin', 'Dart', 'Elixir', 'Zig',
104
+ ];
105
+ for (const mem of memories) {
106
+ if (mem.memory_type !== 'tech_stack')
107
+ continue;
108
+ for (const lang of commonLanguages) {
109
+ if (mem.content.includes(lang) || mem.metadata?.technology === lang) {
110
+ languageCounts.set(lang, (languageCounts.get(lang) || 0) + 1);
111
+ }
112
+ }
113
+ }
114
+ return [...languageCounts.entries()]
115
+ .filter(([_, count]) => count >= 2)
116
+ .sort((a, b) => b[1] - a[1])
117
+ .map(([lang]) => lang)
118
+ .slice(0, 5);
119
+ }
120
+ function extractFrameworks(memories) {
121
+ const frameworkCounts = new Map();
122
+ const commonFrameworks = [
123
+ 'React', 'Vue', 'Angular', 'Next.js', 'Nuxt', 'Svelte', 'Express',
124
+ 'Fastify', 'Django', 'Flask', 'FastAPI', 'Rails', 'Laravel',
125
+ 'Tailwind CSS', 'Prisma', 'Drizzle',
126
+ ];
127
+ for (const mem of memories) {
128
+ if (mem.memory_type !== 'tech_stack')
129
+ continue;
130
+ for (const fw of commonFrameworks) {
131
+ if (mem.content.includes(fw) || mem.metadata?.technology === fw) {
132
+ frameworkCounts.set(fw, (frameworkCounts.get(fw) || 0) + 1);
133
+ }
134
+ }
135
+ }
136
+ return [...frameworkCounts.entries()]
137
+ .filter(([_, count]) => count >= 2)
138
+ .sort((a, b) => b[1] - a[1])
139
+ .map(([fw]) => fw)
140
+ .slice(0, 5);
141
+ }
142
+ function extractPatterns(memories) {
143
+ return memories
144
+ .filter((m) => m.memory_type === 'pattern')
145
+ .map((m) => m.content)
146
+ .slice(0, 10);
147
+ }
148
+ function extractAvoidPatterns(memories) {
149
+ const avoidIndicators = [
150
+ /\b(?:don'?t|avoid|hate|dislike|never|no\s+more)\b/i,
151
+ /\b(?:no\s+(?:more|longer)|stop\s+using)\b/i,
152
+ ];
153
+ return memories
154
+ .filter((m) => {
155
+ const content = m.content.toLowerCase();
156
+ return avoidIndicators.some((p) => p.test(content));
157
+ })
158
+ .map((m) => m.content)
159
+ .slice(0, 5);
160
+ }
161
+ function detectCodingStyle(memories) {
162
+ const styleIndicators = {
163
+ functional: [/\b(?:pure\s+function|immutable|lodash|ramda|map|filter|reduce)\b/i, /\bfunctional\b/i],
164
+ oop: [/\b(?:class|extends|implements|interface|polymorphism|encapsulation)\b/i, /\bobject[- ]oriented\b/i],
165
+ procedural: [/\b(?:function|procedure|imperative|step[- ]by[- ]step)\b/i],
166
+ };
167
+ const scores = { functional: 0, oop: 0, procedural: 0 };
168
+ for (const mem of memories) {
169
+ const content = mem.content;
170
+ for (const [style, patterns] of Object.entries(styleIndicators)) {
171
+ if (patterns.some((p) => p.test(content))) {
172
+ scores[style]++;
173
+ }
174
+ }
175
+ }
176
+ const maxScore = Math.max(scores.functional, scores.oop, scores.procedural);
177
+ if (maxScore === 0)
178
+ return 'mixed';
179
+ if (scores.functional === maxScore)
180
+ return 'functional';
181
+ if (scores.oop === maxScore)
182
+ return 'oop';
183
+ return 'procedural';
184
+ }
185
+ function detectExperienceLevel(memories) {
186
+ const advancedIndicators = [
187
+ /\b(?:architecture|scalability|microservices|distributed|kubernetes|terraform)\b/i,
188
+ /\b(?:performance|optimization|benchmark|profiling)\b/i,
189
+ /\b(?:security|authentication|authorization|encryption)\b/i,
190
+ ];
191
+ const beginnerIndicators = [
192
+ /\b(?:learning|new\s+to|beginner|getting\s+started|tutorial)\b/i,
193
+ /\b(?:how\s+to|what\s+is|can\s+someone|help\s+me)\b/i,
194
+ ];
195
+ let advancedCount = 0;
196
+ let beginnerCount = 0;
197
+ for (const mem of memories) {
198
+ if (advancedIndicators.some((p) => p.test(mem.content)))
199
+ advancedCount++;
200
+ if (beginnerIndicators.some((p) => p.test(mem.content)))
201
+ beginnerCount++;
202
+ }
203
+ if (advancedCount > 5)
204
+ return 'expert';
205
+ if (beginnerCount > 5)
206
+ return 'beginner';
207
+ return 'intermediate';
208
+ }
209
+ function getDefaultProfile() {
210
+ return {
211
+ preferredLanguages: [],
212
+ codingStyle: 'mixed',
213
+ frameworks: [],
214
+ patterns: [],
215
+ avoidPatterns: [],
216
+ experienceLevel: 'intermediate',
217
+ lastUpdated: new Date().toISOString(),
218
+ };
219
+ }
220
+ //# sourceMappingURL=user-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-profile.js","sourceRoot":"","sources":["../../src/memory/user-profile.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -90,6 +90,14 @@ export interface PluginConfig {
90
90
  minImportance: number;
91
91
  autoExtract: boolean;
92
92
  };
93
+ /** LLM settings for AI extraction */
94
+ llm: {
95
+ enabled: boolean;
96
+ model: string;
97
+ apiKey: string;
98
+ baseUrl: string;
99
+ summarizeSessions: boolean;
100
+ };
93
101
  }
94
102
  /** Search result with relevance */
95
103
  export interface MemorySearchResult {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "super-memory-pro",
4
- "version": "0.3.0",
5
- "description": "Ultra-persistent memory plugin for OpenCode — learn, remember, and recall across sessions",
4
+ "version": "2.0.0",
5
+ "description": "Ultra-persistent memory plugin for OpenCode — AI-powered extraction, semantic search, and cross-session learning",
6
6
  "keywords": [
7
7
  "opencode",
8
8
  "opencode-plugin",
@@ -50,9 +50,9 @@
50
50
  "zod": "^4.1.8"
51
51
  },
52
52
  "devDependencies": {
53
- "@types/express": "^5.0.2",
54
- "@types/node": "^22.15.3",
55
- "@types/pg": "^8.11.14",
53
+ "@types/express": "^5.0.6",
54
+ "@types/node": "^22.19.21",
55
+ "@types/pg": "^8.20.0",
56
56
  "@types/uuid": "^10.0.0",
57
57
  "tsx": "^4.19.4",
58
58
  "typescript": "^5.8.3",
@@ -1,102 +0,0 @@
1
- -- Ultra Memory: Initial Schema
2
- -- Creates core tables for persistent memory storage
3
-
4
- -- Migration tracking table
5
- CREATE TABLE IF NOT EXISTS _migrations (
6
- id SERIAL PRIMARY KEY,
7
- name TEXT NOT NULL UNIQUE,
8
- applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
9
- );
10
-
11
- -- Projects table
12
- CREATE TABLE IF NOT EXISTS projects (
13
- id TEXT PRIMARY KEY,
14
- name TEXT NOT NULL,
15
- path TEXT,
16
- description TEXT,
17
- tech_stack JSONB NOT NULL DEFAULT '[]'::jsonb,
18
- conventions JSONB NOT NULL DEFAULT '{}'::jsonb,
19
- metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
20
- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
21
- updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
22
- );
23
-
24
- -- Sessions table
25
- CREATE TABLE IF NOT EXISTS sessions (
26
- id TEXT PRIMARY KEY,
27
- project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
28
- summary TEXT,
29
- message_count INTEGER NOT NULL DEFAULT 0,
30
- tokens_used INTEGER NOT NULL DEFAULT 0,
31
- started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
32
- ended_at TIMESTAMPTZ,
33
- metadata JSONB NOT NULL DEFAULT '{}'::jsonb
34
- );
35
-
36
- -- Core memories table
37
- CREATE TABLE IF NOT EXISTS memories (
38
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
39
- memory_type TEXT NOT NULL CHECK (memory_type IN (
40
- 'user_profile',
41
- 'tech_stack',
42
- 'project_context',
43
- 'session',
44
- 'pattern',
45
- 'decision',
46
- 'explicit'
47
- )),
48
- project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
49
- session_id TEXT REFERENCES sessions(id) ON DELETE SET NULL,
50
- key TEXT NOT NULL,
51
- value JSONB NOT NULL DEFAULT '{}'::jsonb,
52
- content TEXT NOT NULL,
53
- importance INTEGER NOT NULL DEFAULT 1 CHECK (importance BETWEEN 1 AND 5),
54
- source TEXT NOT NULL DEFAULT 'auto',
55
- metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
56
- access_count INTEGER NOT NULL DEFAULT 0,
57
- created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
58
- updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
59
- last_accessed_at TIMESTAMPTZ,
60
- -- Full-text search vector
61
- search_vector TSVECTOR GENERATED ALWAYS AS (
62
- to_tsvector('english', coalesce(content, ''))
63
- ) STORED,
64
- -- Unique constraint: one key per type per project
65
- UNIQUE (memory_type, project_id, key)
66
- );
67
-
68
- -- Indexes
69
- CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(memory_type);
70
- CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
71
- CREATE INDEX IF NOT EXISTS idx_memories_key ON memories(key);
72
- CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance DESC);
73
- CREATE INDEX IF NOT EXISTS idx_memories_fts ON memories USING GIN(search_vector);
74
- CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at DESC);
75
- CREATE INDEX IF NOT EXISTS idx_memories_last_access ON memories(last_accessed_at DESC NULLS LAST);
76
- CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_id);
77
- CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at DESC);
78
-
79
- -- Updated_at trigger function
80
- CREATE OR REPLACE FUNCTION update_updated_at_column()
81
- RETURNS TRIGGER AS $$
82
- BEGIN
83
- NEW.updated_at = NOW();
84
- RETURN NEW;
85
- END;
86
- $$ LANGUAGE plpgsql;
87
-
88
- -- Apply trigger to tables
89
- DO $$
90
- BEGIN
91
- IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'update_projects_updated_at') THEN
92
- CREATE TRIGGER update_projects_updated_at
93
- BEFORE UPDATE ON projects
94
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
95
- END IF;
96
- IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'update_memories_updated_at') THEN
97
- CREATE TRIGGER update_memories_updated_at
98
- BEFORE UPDATE ON memories
99
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
100
- END IF;
101
- END;
102
- $$;