@engram-mem/supabase 0.1.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.
@@ -0,0 +1,195 @@
1
+ import { generateId } from '@engram-mem/core';
2
+ import { sanitizeIlike } from './search.js';
3
+ export class SupabaseProceduralStorage {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ async insert(memory) {
9
+ const id = generateId();
10
+ // Insert into memories table first (FK requirement)
11
+ const { error: memErr } = await this.client
12
+ .from('memories')
13
+ .insert({ id, type: 'procedural' });
14
+ if (memErr)
15
+ throw new Error(`Procedural memory insert failed: ${memErr.message}`);
16
+ const { data, error } = await this.client
17
+ .from('memory_procedural')
18
+ .insert({
19
+ id,
20
+ category: memory.category,
21
+ trigger_text: memory.trigger,
22
+ procedure: memory.procedure,
23
+ confidence: memory.confidence,
24
+ observation_count: memory.observationCount,
25
+ last_observed: memory.lastObserved.toISOString(),
26
+ first_observed: memory.firstObserved.toISOString(),
27
+ decay_rate: memory.decayRate,
28
+ source_episode_ids: memory.sourceEpisodeIds,
29
+ embedding: memory.embedding ?? null,
30
+ metadata: memory.metadata,
31
+ })
32
+ .select()
33
+ .single();
34
+ if (error)
35
+ throw new Error(`Procedural insert failed: ${error.message}`);
36
+ return rowToProcedural(data);
37
+ }
38
+ async search(query, opts) {
39
+ const limit = opts?.limit ?? 10;
40
+ const embedding = opts?.embedding;
41
+ if (embedding) {
42
+ // Prefer hybrid RRF search when query text is also available
43
+ if (query) {
44
+ const { data, error } = await this.client.rpc('engram_hybrid_recall', {
45
+ p_query_text: query,
46
+ p_query_embedding: JSON.stringify(embedding),
47
+ p_match_count: limit,
48
+ p_include_episodes: false,
49
+ p_include_digests: false,
50
+ p_include_semantic: false,
51
+ p_include_procedural: true,
52
+ });
53
+ if (error)
54
+ throw new Error(`Procedural search (hybrid) failed: ${error.message}`);
55
+ const rows = (data ?? []);
56
+ const RRF_MAX = 2.0 / 61.0;
57
+ return rows.map((r) => ({
58
+ item: recallRowToProcedural(r),
59
+ similarity: Math.min(1.0, (r.similarity || 0) / RRF_MAX),
60
+ }));
61
+ }
62
+ // Embedding only — fall back to pure vector search
63
+ const { data, error } = await this.client.rpc('engram_recall', {
64
+ p_query_embedding: embedding,
65
+ p_session_id: null,
66
+ p_match_count: limit,
67
+ p_min_similarity: opts?.minScore ?? 0.15,
68
+ p_include_episodes: false,
69
+ p_include_digests: false,
70
+ p_include_semantic: false,
71
+ p_include_procedural: true,
72
+ });
73
+ if (error)
74
+ throw new Error(`Procedural search (vector) failed: ${error.message}`);
75
+ const rows = (data ?? []);
76
+ return rows.map((r) => ({
77
+ item: recallRowToProcedural(r),
78
+ similarity: r.similarity,
79
+ }));
80
+ }
81
+ // Text fallback
82
+ const { data, error } = await this.client
83
+ .from('memory_procedural')
84
+ .select('*')
85
+ .or(`trigger_text.ilike.%${sanitizeIlike(query)}%,procedure.ilike.%${sanitizeIlike(query)}%`)
86
+ .limit(limit);
87
+ if (error)
88
+ throw new Error(`Procedural search (text) failed: ${error.message}`);
89
+ return (data ?? []).map((r) => ({
90
+ item: rowToProcedural(r),
91
+ similarity: 0.5,
92
+ }));
93
+ }
94
+ async searchByTrigger(activity, opts) {
95
+ const limit = opts?.limit ?? 10;
96
+ const embedding = opts?.embedding;
97
+ if (embedding) {
98
+ // Reuse vector search — procedural table indexed on trigger+procedure combined
99
+ return this.search(activity, opts);
100
+ }
101
+ const { data, error } = await this.client
102
+ .from('memory_procedural')
103
+ .select('*')
104
+ .ilike('trigger_text', `%${sanitizeIlike(activity)}%`)
105
+ .limit(limit);
106
+ if (error)
107
+ throw new Error(`Procedural searchByTrigger failed: ${error.message}`);
108
+ return (data ?? []).map((r) => ({
109
+ item: rowToProcedural(r),
110
+ similarity: 0.5,
111
+ }));
112
+ }
113
+ async recordAccess(id) {
114
+ const { error } = await this.client.rpc('engram_record_access', {
115
+ p_id: id,
116
+ p_memory_type: 'procedural',
117
+ });
118
+ if (error)
119
+ throw new Error(`Procedural recordAccess failed: ${error.message}`);
120
+ }
121
+ async incrementObservation(id) {
122
+ const { data: current, error: fetchErr } = await this.client
123
+ .from('memory_procedural')
124
+ .select('observation_count')
125
+ .eq('id', id)
126
+ .single();
127
+ if (fetchErr)
128
+ throw new Error(`Procedural incrementObservation fetch failed: ${fetchErr.message}`);
129
+ const row = current;
130
+ const { error } = await this.client
131
+ .from('memory_procedural')
132
+ .update({
133
+ observation_count: row.observation_count + 1,
134
+ last_observed: new Date().toISOString(),
135
+ })
136
+ .eq('id', id);
137
+ if (error)
138
+ throw new Error(`Procedural incrementObservation update failed: ${error.message}`);
139
+ }
140
+ async batchDecay(opts) {
141
+ const { data, error } = await this.client.rpc('engram_decay_pass', {
142
+ p_semantic_decay_rate: 0,
143
+ p_procedural_decay_rate: opts.decayRate,
144
+ p_semantic_days: 999999,
145
+ p_procedural_days: opts.daysThreshold,
146
+ p_edge_prune_strength: 0,
147
+ p_edge_prune_days: 999999,
148
+ });
149
+ if (error)
150
+ throw new Error(`Procedural batchDecay failed: ${error.message}`);
151
+ const rows = data;
152
+ return rows?.[0]?.procedural_decayed ?? 0;
153
+ }
154
+ }
155
+ function rowToProcedural(row) {
156
+ return {
157
+ id: row.id,
158
+ category: row.category,
159
+ trigger: row.trigger_text,
160
+ procedure: row.procedure,
161
+ confidence: row.confidence,
162
+ observationCount: row.observation_count,
163
+ lastObserved: new Date(row.last_observed),
164
+ firstObserved: new Date(row.first_observed),
165
+ accessCount: row.access_count,
166
+ lastAccessed: row.last_accessed ? new Date(row.last_accessed) : null,
167
+ decayRate: row.decay_rate,
168
+ sourceEpisodeIds: row.source_episode_ids ?? [],
169
+ embedding: row.embedding ?? null,
170
+ metadata: row.metadata ?? {},
171
+ createdAt: new Date(row.created_at),
172
+ updatedAt: new Date(row.updated_at),
173
+ };
174
+ }
175
+ function recallRowToProcedural(row) {
176
+ return {
177
+ id: row.id,
178
+ category: 'workflow',
179
+ trigger: '',
180
+ procedure: row.content,
181
+ confidence: row.salience,
182
+ observationCount: 1,
183
+ lastObserved: new Date(row.created_at),
184
+ firstObserved: new Date(row.created_at),
185
+ accessCount: row.access_count,
186
+ lastAccessed: null,
187
+ decayRate: 0.01,
188
+ sourceEpisodeIds: [],
189
+ embedding: null,
190
+ metadata: {},
191
+ createdAt: new Date(row.created_at),
192
+ updatedAt: new Date(row.created_at),
193
+ };
194
+ }
195
+ //# sourceMappingURL=procedural.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedural.js","sourceRoot":"","sources":["../src/procedural.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Sanitize a query string for use inside a PostgREST ilike pattern.
3
+ *
4
+ * ilike uses SQL LIKE semantics where `%` matches any sequence of characters,
5
+ * `_` matches any single character. PostgREST's `.or()` filter also treats
6
+ * `.` and `,` as field/value separators in the filter DSL. Escape all four
7
+ * to prevent filter injection.
8
+ */
9
+ export declare function sanitizeIlike(query: string): string;
10
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD"}
package/dist/search.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Sanitize a query string for use inside a PostgREST ilike pattern.
3
+ *
4
+ * ilike uses SQL LIKE semantics where `%` matches any sequence of characters,
5
+ * `_` matches any single character. PostgREST's `.or()` filter also treats
6
+ * `.` and `,` as field/value separators in the filter DSL. Escape all four
7
+ * to prevent filter injection.
8
+ */
9
+ export function sanitizeIlike(query) {
10
+ return query
11
+ .replace(/%/g, '\\%')
12
+ .replace(/_/g, '\\_')
13
+ .replace(/\./g, '\\.')
14
+ .replace(/,/g, '\\,');
15
+ }
16
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { SupabaseClient } from '@supabase/supabase-js';
2
+ import type { SemanticMemory, SearchOptions, SearchResult } from '@engram-mem/core';
3
+ import type { SemanticStorage } from '@engram-mem/core';
4
+ export declare class SupabaseSemanticStorage implements SemanticStorage {
5
+ private readonly client;
6
+ constructor(client: SupabaseClient);
7
+ insert(memory: Omit<SemanticMemory, 'id' | 'createdAt' | 'updatedAt' | 'accessCount' | 'lastAccessed'>): Promise<SemanticMemory>;
8
+ search(query: string, opts?: SearchOptions): Promise<SearchResult<SemanticMemory>[]>;
9
+ getUnaccessed(days: number): Promise<SemanticMemory[]>;
10
+ recordAccessAndBoost(id: string, confidenceBoost: number): Promise<void>;
11
+ markSuperseded(id: string, supersededBy: string): Promise<void>;
12
+ batchDecay(opts: {
13
+ daysThreshold: number;
14
+ decayRate: number;
15
+ }): Promise<number>;
16
+ }
17
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,qBAAa,uBAAwB,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,MAAM,CACV,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC,GAC9F,OAAO,CAAC,cAAc,CAAC;IA+BpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;IA6DpF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAWtD,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D,UAAU,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CActF"}
@@ -0,0 +1,184 @@
1
+ import { generateId } from '@engram-mem/core';
2
+ import { sanitizeIlike } from './search.js';
3
+ export class SupabaseSemanticStorage {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ async insert(memory) {
9
+ const id = generateId();
10
+ // Insert into memories table first (FK requirement)
11
+ const { error: memErr } = await this.client
12
+ .from('memories')
13
+ .insert({ id, type: 'semantic' });
14
+ if (memErr)
15
+ throw new Error(`Semantic memory insert failed: ${memErr.message}`);
16
+ const { data, error } = await this.client
17
+ .from('memory_semantic')
18
+ .insert({
19
+ id,
20
+ topic: memory.topic,
21
+ content: memory.content,
22
+ confidence: memory.confidence,
23
+ source_digest_ids: memory.sourceDigestIds,
24
+ source_episode_ids: memory.sourceEpisodeIds,
25
+ decay_rate: memory.decayRate,
26
+ supersedes: memory.supersedes ?? null,
27
+ superseded_by: memory.supersededBy ?? null,
28
+ embedding: memory.embedding ?? null,
29
+ metadata: memory.metadata,
30
+ })
31
+ .select()
32
+ .single();
33
+ if (error)
34
+ throw new Error(`Semantic insert failed: ${error.message}`);
35
+ return rowToSemantic(data);
36
+ }
37
+ async search(query, opts) {
38
+ const limit = opts?.limit ?? 10;
39
+ const embedding = opts?.embedding;
40
+ if (embedding) {
41
+ // Prefer hybrid RRF search when query text is also available
42
+ if (query) {
43
+ const { data, error } = await this.client.rpc('engram_hybrid_recall', {
44
+ p_query_text: query,
45
+ p_query_embedding: JSON.stringify(embedding),
46
+ p_match_count: limit,
47
+ p_include_episodes: false,
48
+ p_include_digests: false,
49
+ p_include_semantic: true,
50
+ p_include_procedural: false,
51
+ });
52
+ if (error)
53
+ throw new Error(`Semantic search (hybrid) failed: ${error.message}`);
54
+ const rows = (data ?? []);
55
+ const RRF_MAX = 2.0 / 61.0;
56
+ return rows.map((r) => ({
57
+ item: recallRowToSemantic(r),
58
+ similarity: Math.min(1.0, (r.similarity || 0) / RRF_MAX),
59
+ }));
60
+ }
61
+ // Embedding only — fall back to pure vector search
62
+ const { data, error } = await this.client.rpc('engram_recall', {
63
+ p_query_embedding: embedding,
64
+ p_session_id: null,
65
+ p_match_count: limit,
66
+ p_min_similarity: opts?.minScore ?? 0.15,
67
+ p_include_episodes: false,
68
+ p_include_digests: false,
69
+ p_include_semantic: true,
70
+ p_include_procedural: false,
71
+ });
72
+ if (error)
73
+ throw new Error(`Semantic search (vector) failed: ${error.message}`);
74
+ const rows = (data ?? []);
75
+ return rows.map((r) => ({
76
+ item: recallRowToSemantic(r),
77
+ similarity: r.similarity,
78
+ }));
79
+ }
80
+ // Text fallback
81
+ const { data, error } = await this.client
82
+ .from('memory_semantic')
83
+ .select('*')
84
+ .or(`topic.ilike.%${sanitizeIlike(query)}%,content.ilike.%${sanitizeIlike(query)}%`)
85
+ .is('superseded_by', null)
86
+ .limit(limit);
87
+ if (error)
88
+ throw new Error(`Semantic search (text) failed: ${error.message}`);
89
+ return (data ?? []).map((r) => ({
90
+ item: rowToSemantic(r),
91
+ similarity: 0.5,
92
+ }));
93
+ }
94
+ async getUnaccessed(days) {
95
+ const cutoff = new Date(Date.now() - days * 86400000).toISOString();
96
+ const { data, error } = await this.client
97
+ .from('memory_semantic')
98
+ .select('*')
99
+ .gt('confidence', 0.05)
100
+ .or(`last_accessed.is.null,last_accessed.lt.${cutoff}`);
101
+ if (error)
102
+ throw new Error(`Semantic getUnaccessed failed: ${error.message}`);
103
+ return (data ?? []).map(rowToSemantic);
104
+ }
105
+ async recordAccessAndBoost(id, confidenceBoost) {
106
+ const { error } = await this.client.rpc('engram_record_access', {
107
+ p_id: id,
108
+ p_memory_type: 'semantic',
109
+ p_conf_boost: confidenceBoost,
110
+ });
111
+ if (error)
112
+ throw new Error(`Semantic recordAccessAndBoost failed: ${error.message}`);
113
+ }
114
+ async markSuperseded(id, supersededBy) {
115
+ // Update the old memory to point to its replacement
116
+ const { error: err1 } = await this.client
117
+ .from('memory_semantic')
118
+ .update({ superseded_by: supersededBy })
119
+ .eq('id', id);
120
+ if (err1)
121
+ throw new Error(`Semantic markSuperseded (old) failed: ${err1.message}`);
122
+ // Update the new memory to record what it supersedes
123
+ const { error: err2 } = await this.client
124
+ .from('memory_semantic')
125
+ .update({ supersedes: id })
126
+ .eq('id', supersededBy);
127
+ if (err2)
128
+ throw new Error(`Semantic markSuperseded (new) failed: ${err2.message}`);
129
+ }
130
+ async batchDecay(opts) {
131
+ // Call engram_decay_pass and extract semantic_decayed count
132
+ const { data, error } = await this.client.rpc('engram_decay_pass', {
133
+ p_semantic_decay_rate: opts.decayRate,
134
+ p_procedural_decay_rate: 0,
135
+ p_semantic_days: opts.daysThreshold,
136
+ p_procedural_days: 999999,
137
+ p_edge_prune_strength: 0,
138
+ p_edge_prune_days: 999999,
139
+ });
140
+ if (error)
141
+ throw new Error(`Semantic batchDecay failed: ${error.message}`);
142
+ const rows = data;
143
+ return rows?.[0]?.semantic_decayed ?? 0;
144
+ }
145
+ }
146
+ function rowToSemantic(row) {
147
+ return {
148
+ id: row.id,
149
+ topic: row.topic,
150
+ content: row.content,
151
+ confidence: row.confidence,
152
+ sourceDigestIds: row.source_digest_ids ?? [],
153
+ sourceEpisodeIds: row.source_episode_ids ?? [],
154
+ accessCount: row.access_count,
155
+ lastAccessed: row.last_accessed ? new Date(row.last_accessed) : null,
156
+ decayRate: row.decay_rate,
157
+ supersedes: row.supersedes ?? null,
158
+ supersededBy: row.superseded_by ?? null,
159
+ embedding: row.embedding ?? null,
160
+ metadata: row.metadata ?? {},
161
+ createdAt: new Date(row.created_at),
162
+ updatedAt: new Date(row.updated_at),
163
+ };
164
+ }
165
+ function recallRowToSemantic(row) {
166
+ return {
167
+ id: row.id,
168
+ topic: '',
169
+ content: row.content,
170
+ confidence: row.salience,
171
+ sourceDigestIds: [],
172
+ sourceEpisodeIds: [],
173
+ accessCount: row.access_count,
174
+ lastAccessed: null,
175
+ decayRate: 0.02,
176
+ supersedes: null,
177
+ supersededBy: null,
178
+ embedding: null,
179
+ metadata: {},
180
+ createdAt: new Date(row.created_at),
181
+ updatedAt: new Date(row.created_at),
182
+ };
183
+ }
184
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@engram-mem/supabase",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": ["dist/", "README.md"],
8
+ "publishConfig": { "access": "public" },
9
+ "repository": { "type": "git", "url": "https://github.com/muhammadkh4n/engram.git" },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "vitest run",
13
+ "typecheck": "tsc --noEmit",
14
+ "clean": "rm -rf dist"
15
+ },
16
+ "dependencies": {
17
+ "@engram-mem/core": "*",
18
+ "@supabase/supabase-js": "^2.45.0"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "^5.5.0",
22
+ "vitest": "^2.0.0"
23
+ }
24
+ }