@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.
- package/README.md +301 -0
- package/dist/adapter.d.ts +51 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +411 -0
- package/dist/adapter.js.map +1 -0
- package/dist/associations.d.ts +23 -0
- package/dist/associations.d.ts.map +1 -0
- package/dist/associations.js +109 -0
- package/dist/associations.js.map +1 -0
- package/dist/digests.d.ts +13 -0
- package/dist/digests.d.ts.map +1 -0
- package/dist/digests.js +154 -0
- package/dist/digests.js.map +1 -0
- package/dist/episodes.d.ts +25 -0
- package/dist/episodes.d.ts.map +1 -0
- package/dist/episodes.js +260 -0
- package/dist/episodes.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +27 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +650 -0
- package/dist/migrations.js.map +1 -0
- package/dist/procedural.d.ts +17 -0
- package/dist/procedural.d.ts.map +1 -0
- package/dist/procedural.js +195 -0
- package/dist/procedural.js.map +1 -0
- package/dist/search.d.ts +10 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +16 -0
- package/dist/search.js.map +1 -0
- package/dist/semantic.d.ts +17 -0
- package/dist/semantic.d.ts.map +1 -0
- package/dist/semantic.js +184 -0
- package/dist/semantic.js.map +1 -0
- package/package.json +24 -0
|
@@ -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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"}
|
package/dist/search.d.ts
ADDED
|
@@ -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"}
|
package/dist/semantic.js
ADDED
|
@@ -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
|
+
}
|