@withone/mem 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/LICENSE +21 -0
- package/README.md +92 -0
- package/bin/mem +36 -0
- package/dist/cli.d.ts +28 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +656 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +94 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +461 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +14 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +514 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
- package/skills/context/SKILL.md +168 -0
- package/skills/remember/SKILL.md +144 -0
- package/skills/search/SKILL.md +137 -0
- package/skills/setup/SKILL.md +162 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mem Supabase Client
|
|
3
|
+
* https://mem.now
|
|
4
|
+
*/
|
|
5
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
6
|
+
import OpenAI from "openai";
|
|
7
|
+
import type { MemRecord, MemRecordWithLinks, SearchResult, ContextResult, LinkedRecord, AddRecordOptions, UpdateRecordOptions, SearchOptions, ContextOptions, LinkedOptions } from "./types.js";
|
|
8
|
+
export declare function getSupabase(): SupabaseClient;
|
|
9
|
+
export declare function getOpenAI(): OpenAI;
|
|
10
|
+
/**
|
|
11
|
+
* Check if OpenAI is available for embeddings
|
|
12
|
+
*/
|
|
13
|
+
export declare function hasOpenAI(): boolean;
|
|
14
|
+
export declare function getEmbedding(text: string): Promise<number[] | null>;
|
|
15
|
+
export declare function extractSearchableText(data: Record<string, unknown>): string;
|
|
16
|
+
/**
|
|
17
|
+
* Add a new memory record
|
|
18
|
+
*/
|
|
19
|
+
export declare function add(type: string, data: Record<string, unknown>, options?: AddRecordOptions): Promise<MemRecord | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Get a record by ID
|
|
22
|
+
*/
|
|
23
|
+
export declare function get(id: string, withLinks?: boolean): Promise<MemRecord | MemRecordWithLinks | null>;
|
|
24
|
+
/**
|
|
25
|
+
* List records by type
|
|
26
|
+
*/
|
|
27
|
+
export declare function list(type: string, options?: {
|
|
28
|
+
filterField?: string;
|
|
29
|
+
filterValue?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): Promise<MemRecord[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Update a record
|
|
34
|
+
*/
|
|
35
|
+
export declare function update(id: string, data?: Record<string, unknown>, options?: UpdateRecordOptions): Promise<MemRecord | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Delete a record
|
|
38
|
+
*/
|
|
39
|
+
export declare function remove(id: string): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Create a link between two records
|
|
42
|
+
*/
|
|
43
|
+
export declare function link(fromId: string, toId: string, relation: string, options?: {
|
|
44
|
+
bidirectional?: boolean;
|
|
45
|
+
metadata?: Record<string, unknown>;
|
|
46
|
+
}): Promise<string | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Remove a link between two records
|
|
49
|
+
*/
|
|
50
|
+
export declare function unlink(fromId: string, toId: string, relation: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Get linked records
|
|
53
|
+
*/
|
|
54
|
+
export declare function linked(id: string, options?: LinkedOptions): Promise<LinkedRecord[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Hybrid search combining semantic similarity and full-text search
|
|
57
|
+
*/
|
|
58
|
+
export declare function search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Full-text search only (no embeddings)
|
|
61
|
+
*/
|
|
62
|
+
export declare function ftsSearch(query: string, options?: {
|
|
63
|
+
limit?: number;
|
|
64
|
+
type?: string;
|
|
65
|
+
}): Promise<SearchResult[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Get startup context: most relevant active records
|
|
68
|
+
*/
|
|
69
|
+
export declare function context(options?: ContextOptions): Promise<ContextResult[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Increment access count for records
|
|
72
|
+
*/
|
|
73
|
+
export declare function incrementAccess(recordIds: string[]): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Archive records (exclude from context but keep searchable)
|
|
76
|
+
*/
|
|
77
|
+
export declare function archive(recordIds: string[]): Promise<number>;
|
|
78
|
+
/**
|
|
79
|
+
* Unarchive records (restore to active status)
|
|
80
|
+
*/
|
|
81
|
+
export declare function unarchive(recordIds: string[]): Promise<number>;
|
|
82
|
+
/**
|
|
83
|
+
* Flush records (reset access count)
|
|
84
|
+
*/
|
|
85
|
+
export declare function flush(recordIds: string[]): Promise<number>;
|
|
86
|
+
/**
|
|
87
|
+
* Set weight for a record (1-10)
|
|
88
|
+
*/
|
|
89
|
+
export declare function weight(recordId: string, value: number): Promise<boolean>;
|
|
90
|
+
/**
|
|
91
|
+
* Apply the database schema
|
|
92
|
+
*/
|
|
93
|
+
export declare function migrate(): Promise<boolean>;
|
|
94
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mem Supabase Client
|
|
3
|
+
* https://mem.now
|
|
4
|
+
*/
|
|
5
|
+
import { createClient } from "@supabase/supabase-js";
|
|
6
|
+
import OpenAI from "openai";
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Client Singleton
|
|
9
|
+
// =============================================================================
|
|
10
|
+
let supabase = null;
|
|
11
|
+
let openai = null;
|
|
12
|
+
export function getSupabase() {
|
|
13
|
+
if (!supabase) {
|
|
14
|
+
const url = process.env.SUPABASE_URL;
|
|
15
|
+
const key = process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_ANON_KEY;
|
|
16
|
+
if (!url || !key) {
|
|
17
|
+
throw new Error("SUPABASE_URL and SUPABASE_SERVICE_KEY (or SUPABASE_ANON_KEY) must be set");
|
|
18
|
+
}
|
|
19
|
+
supabase = createClient(url, key);
|
|
20
|
+
}
|
|
21
|
+
return supabase;
|
|
22
|
+
}
|
|
23
|
+
export function getOpenAI() {
|
|
24
|
+
if (!openai) {
|
|
25
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
26
|
+
if (!apiKey) {
|
|
27
|
+
throw new Error("OPENAI_API_KEY must be set for embeddings");
|
|
28
|
+
}
|
|
29
|
+
openai = new OpenAI({ apiKey });
|
|
30
|
+
}
|
|
31
|
+
return openai;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if OpenAI is available for embeddings
|
|
35
|
+
*/
|
|
36
|
+
export function hasOpenAI() {
|
|
37
|
+
return !!process.env.OPENAI_API_KEY;
|
|
38
|
+
}
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// Embeddings
|
|
41
|
+
// =============================================================================
|
|
42
|
+
export async function getEmbedding(text) {
|
|
43
|
+
if (!text?.trim())
|
|
44
|
+
return null;
|
|
45
|
+
if (!hasOpenAI())
|
|
46
|
+
return null;
|
|
47
|
+
try {
|
|
48
|
+
const client = getOpenAI();
|
|
49
|
+
const response = await client.embeddings.create({
|
|
50
|
+
model: "text-embedding-3-small",
|
|
51
|
+
input: text.slice(0, 8000),
|
|
52
|
+
});
|
|
53
|
+
return response.data[0].embedding;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error("Warning: Failed to generate embedding:", error);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function extractSearchableText(data) {
|
|
61
|
+
// Generic extraction: concatenate all string values
|
|
62
|
+
const values = [];
|
|
63
|
+
for (const [, value] of Object.entries(data)) {
|
|
64
|
+
if (typeof value === "string" && value.trim()) {
|
|
65
|
+
values.push(value);
|
|
66
|
+
}
|
|
67
|
+
else if (Array.isArray(value)) {
|
|
68
|
+
for (const item of value) {
|
|
69
|
+
if (typeof item === "string" && item.trim()) {
|
|
70
|
+
values.push(item);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return values.join(" ");
|
|
76
|
+
}
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// CRUD Operations
|
|
79
|
+
// =============================================================================
|
|
80
|
+
/**
|
|
81
|
+
* Add a new memory record
|
|
82
|
+
*/
|
|
83
|
+
export async function add(type, data, options = {}) {
|
|
84
|
+
const { tags, weight, generateEmbedding = true } = options;
|
|
85
|
+
const db = getSupabase();
|
|
86
|
+
const insertData = {
|
|
87
|
+
type,
|
|
88
|
+
data,
|
|
89
|
+
tags: tags || extractTags(data),
|
|
90
|
+
};
|
|
91
|
+
if (weight !== undefined && weight >= 1 && weight <= 10) {
|
|
92
|
+
insertData.weight = weight;
|
|
93
|
+
}
|
|
94
|
+
if (generateEmbedding && hasOpenAI()) {
|
|
95
|
+
const searchableText = extractSearchableText(data);
|
|
96
|
+
if (searchableText) {
|
|
97
|
+
const embedding = await getEmbedding(searchableText);
|
|
98
|
+
if (embedding) {
|
|
99
|
+
insertData.embedding = embedding;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const { data: result, error } = await db
|
|
104
|
+
.from("mem_records")
|
|
105
|
+
.insert(insertData)
|
|
106
|
+
.select()
|
|
107
|
+
.single();
|
|
108
|
+
if (error) {
|
|
109
|
+
console.error("Error adding record:", error);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get a record by ID
|
|
116
|
+
*/
|
|
117
|
+
export async function get(id, withLinks = false) {
|
|
118
|
+
const db = getSupabase();
|
|
119
|
+
if (withLinks) {
|
|
120
|
+
const { data, error } = await db.rpc("mem_get_record_with_links", {
|
|
121
|
+
record_id: id,
|
|
122
|
+
});
|
|
123
|
+
if (error) {
|
|
124
|
+
console.error("Error getting record with links:", error);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return data;
|
|
128
|
+
}
|
|
129
|
+
const { data, error } = await db
|
|
130
|
+
.from("mem_records")
|
|
131
|
+
.select("*")
|
|
132
|
+
.eq("id", id)
|
|
133
|
+
.single();
|
|
134
|
+
if (error) {
|
|
135
|
+
console.error("Error getting record:", error);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return data;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List records by type
|
|
142
|
+
*/
|
|
143
|
+
export async function list(type, options = {}) {
|
|
144
|
+
const { filterField, filterValue, limit = 100 } = options;
|
|
145
|
+
const db = getSupabase();
|
|
146
|
+
let query = db.from("mem_records").select("*").eq("type", type);
|
|
147
|
+
if (filterField && filterValue) {
|
|
148
|
+
query = query.eq(`data->>${filterField}`, filterValue);
|
|
149
|
+
}
|
|
150
|
+
query = query.order("updated_at", { ascending: false }).limit(limit);
|
|
151
|
+
const { data, error } = await query;
|
|
152
|
+
if (error) {
|
|
153
|
+
console.error("Error listing records:", error);
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
return data || [];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Update a record
|
|
160
|
+
*/
|
|
161
|
+
export async function update(id, data, options = {}) {
|
|
162
|
+
const { tags, regenerateEmbedding = true } = options;
|
|
163
|
+
const db = getSupabase();
|
|
164
|
+
const existing = await get(id);
|
|
165
|
+
if (!existing)
|
|
166
|
+
return null;
|
|
167
|
+
const updateData = {};
|
|
168
|
+
if (data) {
|
|
169
|
+
const mergedData = { ...existing.data, ...data };
|
|
170
|
+
updateData.data = mergedData;
|
|
171
|
+
if (regenerateEmbedding && hasOpenAI()) {
|
|
172
|
+
const searchableText = extractSearchableText(mergedData);
|
|
173
|
+
if (searchableText) {
|
|
174
|
+
const embedding = await getEmbedding(searchableText);
|
|
175
|
+
if (embedding) {
|
|
176
|
+
updateData.embedding = embedding;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (tags !== undefined) {
|
|
182
|
+
updateData.tags = tags;
|
|
183
|
+
}
|
|
184
|
+
if (Object.keys(updateData).length === 0) {
|
|
185
|
+
return existing;
|
|
186
|
+
}
|
|
187
|
+
const { data: result, error } = await db
|
|
188
|
+
.from("mem_records")
|
|
189
|
+
.update(updateData)
|
|
190
|
+
.eq("id", id)
|
|
191
|
+
.select()
|
|
192
|
+
.single();
|
|
193
|
+
if (error) {
|
|
194
|
+
console.error("Error updating record:", error);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Delete a record
|
|
201
|
+
*/
|
|
202
|
+
export async function remove(id) {
|
|
203
|
+
const db = getSupabase();
|
|
204
|
+
const { error } = await db.from("mem_records").delete().eq("id", id);
|
|
205
|
+
return !error;
|
|
206
|
+
}
|
|
207
|
+
// =============================================================================
|
|
208
|
+
// Link Operations
|
|
209
|
+
// =============================================================================
|
|
210
|
+
/**
|
|
211
|
+
* Create a link between two records
|
|
212
|
+
*/
|
|
213
|
+
export async function link(fromId, toId, relation, options = {}) {
|
|
214
|
+
const { bidirectional = false, metadata } = options;
|
|
215
|
+
const db = getSupabase();
|
|
216
|
+
const { data, error } = await db.rpc("mem_create_link", {
|
|
217
|
+
from_record_id: fromId,
|
|
218
|
+
to_record_id: toId,
|
|
219
|
+
relation_type: relation,
|
|
220
|
+
is_bidirectional: bidirectional,
|
|
221
|
+
link_metadata: metadata,
|
|
222
|
+
});
|
|
223
|
+
if (error) {
|
|
224
|
+
console.error("Error creating link:", error);
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return data;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Remove a link between two records
|
|
231
|
+
*/
|
|
232
|
+
export async function unlink(fromId, toId, relation) {
|
|
233
|
+
const db = getSupabase();
|
|
234
|
+
const { data, error } = await db.rpc("mem_remove_link", {
|
|
235
|
+
from_record_id: fromId,
|
|
236
|
+
to_record_id: toId,
|
|
237
|
+
relation_type: relation,
|
|
238
|
+
});
|
|
239
|
+
if (error) {
|
|
240
|
+
console.error("Error removing link:", error);
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
return data;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get linked records
|
|
247
|
+
*/
|
|
248
|
+
export async function linked(id, options = {}) {
|
|
249
|
+
const { relation, direction = "outgoing" } = options;
|
|
250
|
+
const db = getSupabase();
|
|
251
|
+
const { data, error } = await db.rpc("mem_get_linked", {
|
|
252
|
+
record_id: id,
|
|
253
|
+
relation_type: relation || null,
|
|
254
|
+
direction,
|
|
255
|
+
});
|
|
256
|
+
if (error) {
|
|
257
|
+
console.error("Error getting linked records:", error);
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
return data || [];
|
|
261
|
+
}
|
|
262
|
+
// =============================================================================
|
|
263
|
+
// Search
|
|
264
|
+
// =============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Hybrid search combining semantic similarity and full-text search
|
|
267
|
+
*/
|
|
268
|
+
export async function search(query, options = {}) {
|
|
269
|
+
const { limit = 10, type, ftsWeight = 0.3, semanticWeight = 0.7, includeArchived = false, trackAccess = true, } = options;
|
|
270
|
+
const db = getSupabase();
|
|
271
|
+
const queryEmbedding = await getEmbedding(query);
|
|
272
|
+
if (!queryEmbedding) {
|
|
273
|
+
// Fall back to FTS only
|
|
274
|
+
return ftsSearch(query, { limit, type });
|
|
275
|
+
}
|
|
276
|
+
const { data, error } = await db.rpc("mem_hybrid_search", {
|
|
277
|
+
query_text: query,
|
|
278
|
+
query_embedding: queryEmbedding,
|
|
279
|
+
match_count: limit,
|
|
280
|
+
filter_type: type || null,
|
|
281
|
+
full_text_weight: ftsWeight,
|
|
282
|
+
semantic_weight: semanticWeight,
|
|
283
|
+
include_archived: includeArchived,
|
|
284
|
+
});
|
|
285
|
+
if (error) {
|
|
286
|
+
console.error("Error in hybrid search:", error);
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
const results = data || [];
|
|
290
|
+
// Track access for returned results
|
|
291
|
+
if (trackAccess && results.length > 0) {
|
|
292
|
+
const ids = results.map((r) => r.id);
|
|
293
|
+
await incrementAccess(ids);
|
|
294
|
+
}
|
|
295
|
+
return results;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Full-text search only (no embeddings)
|
|
299
|
+
*/
|
|
300
|
+
export async function ftsSearch(query, options = {}) {
|
|
301
|
+
const { limit = 10, type } = options;
|
|
302
|
+
const db = getSupabase();
|
|
303
|
+
let queryBuilder = db
|
|
304
|
+
.from("mem_records")
|
|
305
|
+
.select("id, type, data, tags")
|
|
306
|
+
.textSearch("searchable", query);
|
|
307
|
+
if (type) {
|
|
308
|
+
queryBuilder = queryBuilder.eq("type", type);
|
|
309
|
+
}
|
|
310
|
+
const { data, error } = await queryBuilder.limit(limit);
|
|
311
|
+
if (error) {
|
|
312
|
+
console.error("Error in FTS search:", error);
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
return (data || []).map((r, i) => ({
|
|
316
|
+
...r,
|
|
317
|
+
fts_rank: 1 / (1 + i),
|
|
318
|
+
semantic_rank: 0,
|
|
319
|
+
combined_score: 1 / (1 + i),
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
// =============================================================================
|
|
323
|
+
// Relevance & Context
|
|
324
|
+
// =============================================================================
|
|
325
|
+
/**
|
|
326
|
+
* Get startup context: most relevant active records
|
|
327
|
+
*/
|
|
328
|
+
export async function context(options = {}) {
|
|
329
|
+
const { limit = 20, types } = options;
|
|
330
|
+
const db = getSupabase();
|
|
331
|
+
const { data, error } = await db.rpc("mem_get_context", {
|
|
332
|
+
match_count: limit,
|
|
333
|
+
filter_types: types || null,
|
|
334
|
+
});
|
|
335
|
+
if (error) {
|
|
336
|
+
console.error("Error getting context:", error);
|
|
337
|
+
return [];
|
|
338
|
+
}
|
|
339
|
+
return data || [];
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Increment access count for records
|
|
343
|
+
*/
|
|
344
|
+
export async function incrementAccess(recordIds) {
|
|
345
|
+
if (recordIds.length === 0)
|
|
346
|
+
return;
|
|
347
|
+
const db = getSupabase();
|
|
348
|
+
const { error } = await db.rpc("mem_increment_access", {
|
|
349
|
+
record_ids: recordIds,
|
|
350
|
+
});
|
|
351
|
+
if (error) {
|
|
352
|
+
console.error("Error incrementing access:", error);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Archive records (exclude from context but keep searchable)
|
|
357
|
+
*/
|
|
358
|
+
export async function archive(recordIds) {
|
|
359
|
+
if (recordIds.length === 0)
|
|
360
|
+
return 0;
|
|
361
|
+
const db = getSupabase();
|
|
362
|
+
const { data, error } = await db.rpc("mem_archive", {
|
|
363
|
+
record_ids: recordIds,
|
|
364
|
+
});
|
|
365
|
+
if (error) {
|
|
366
|
+
console.error("Error archiving records:", error);
|
|
367
|
+
return 0;
|
|
368
|
+
}
|
|
369
|
+
return data || 0;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Unarchive records (restore to active status)
|
|
373
|
+
*/
|
|
374
|
+
export async function unarchive(recordIds) {
|
|
375
|
+
if (recordIds.length === 0)
|
|
376
|
+
return 0;
|
|
377
|
+
const db = getSupabase();
|
|
378
|
+
const { data, error } = await db.rpc("mem_unarchive", {
|
|
379
|
+
record_ids: recordIds,
|
|
380
|
+
});
|
|
381
|
+
if (error) {
|
|
382
|
+
console.error("Error unarchiving records:", error);
|
|
383
|
+
return 0;
|
|
384
|
+
}
|
|
385
|
+
return data || 0;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Flush records (reset access count)
|
|
389
|
+
*/
|
|
390
|
+
export async function flush(recordIds) {
|
|
391
|
+
if (recordIds.length === 0)
|
|
392
|
+
return 0;
|
|
393
|
+
const db = getSupabase();
|
|
394
|
+
const { data, error } = await db.rpc("mem_flush", {
|
|
395
|
+
record_ids: recordIds,
|
|
396
|
+
});
|
|
397
|
+
if (error) {
|
|
398
|
+
console.error("Error flushing records:", error);
|
|
399
|
+
return 0;
|
|
400
|
+
}
|
|
401
|
+
return data || 0;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Set weight for a record (1-10)
|
|
405
|
+
*/
|
|
406
|
+
export async function weight(recordId, value) {
|
|
407
|
+
if (value < 1 || value > 10) {
|
|
408
|
+
console.error("Weight must be between 1 and 10");
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
const db = getSupabase();
|
|
412
|
+
const { error } = await db
|
|
413
|
+
.from("mem_records")
|
|
414
|
+
.update({ weight: value })
|
|
415
|
+
.eq("id", recordId);
|
|
416
|
+
if (error) {
|
|
417
|
+
console.error("Error setting weight:", error);
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
// =============================================================================
|
|
423
|
+
// Migration
|
|
424
|
+
// =============================================================================
|
|
425
|
+
import { getMigrationSQL } from "./schema.js";
|
|
426
|
+
/**
|
|
427
|
+
* Apply the database schema
|
|
428
|
+
*/
|
|
429
|
+
export async function migrate() {
|
|
430
|
+
const db = getSupabase();
|
|
431
|
+
const sql = getMigrationSQL();
|
|
432
|
+
const { error } = await db.rpc("exec_sql", { sql_query: sql });
|
|
433
|
+
if (error) {
|
|
434
|
+
// Try direct execution if exec_sql doesn't exist
|
|
435
|
+
// This happens on fresh Supabase instances
|
|
436
|
+
console.log("Note: exec_sql function not found. Please run the migration SQL directly in the Supabase SQL editor.");
|
|
437
|
+
console.log("\nMigration SQL has been saved to: recall-migration.sql");
|
|
438
|
+
// Write the SQL to a file for manual execution
|
|
439
|
+
const fs = await import("fs/promises");
|
|
440
|
+
await fs.writeFile("recall-migration.sql", sql);
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
// =============================================================================
|
|
446
|
+
// Helpers
|
|
447
|
+
// =============================================================================
|
|
448
|
+
function extractTags(data) {
|
|
449
|
+
const tags = [];
|
|
450
|
+
if (Array.isArray(data.tags)) {
|
|
451
|
+
tags.push(...data.tags);
|
|
452
|
+
}
|
|
453
|
+
if (typeof data.category === "string") {
|
|
454
|
+
tags.push(data.category);
|
|
455
|
+
}
|
|
456
|
+
if (typeof data.status === "string") {
|
|
457
|
+
tags.push(data.status);
|
|
458
|
+
}
|
|
459
|
+
return [...new Set(tags)];
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall - Memory System for AI Agents
|
|
3
|
+
*
|
|
4
|
+
* A simple, graph-based memory system backed by Supabase
|
|
5
|
+
* with hybrid search and relevance scoring.
|
|
6
|
+
*/
|
|
7
|
+
export { getSupabase, getOpenAI, hasOpenAI, add, get, list, update, remove, link, unlink, linked, search, ftsSearch, context, incrementAccess, archive, unarchive, flush, weight, migrate, getEmbedding, extractSearchableText, } from "./client.js";
|
|
8
|
+
export type { MemRecord, MemRecordWithLinks, MemLink, SearchResult, ContextResult, LinkedRecord, AddRecordOptions, UpdateRecordOptions, SearchOptions, ContextOptions, LinkedOptions, } from "./types.js";
|
|
9
|
+
export { SCHEMA_VERSION, SCHEMA_SQL, VECTOR_INDEX_SQL, FUNCTIONS_SQL, getMigrationSQL, } from "./schema.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAEL,WAAW,EACX,SAAS,EACT,SAAS,EAGT,GAAG,EACH,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EAGN,IAAI,EACJ,MAAM,EACN,MAAM,EAGN,MAAM,EACN,SAAS,EAGT,OAAO,EACP,eAAe,EACf,OAAO,EACP,SAAS,EACT,KAAK,EACL,MAAM,EAGN,OAAO,EAGP,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall - Memory System for AI Agents
|
|
3
|
+
*
|
|
4
|
+
* A simple, graph-based memory system backed by Supabase
|
|
5
|
+
* with hybrid search and relevance scoring.
|
|
6
|
+
*/
|
|
7
|
+
// Core client functions
|
|
8
|
+
export {
|
|
9
|
+
// Client setup
|
|
10
|
+
getSupabase, getOpenAI, hasOpenAI,
|
|
11
|
+
// CRUD operations
|
|
12
|
+
add, get, list, update, remove,
|
|
13
|
+
// Link operations
|
|
14
|
+
link, unlink, linked,
|
|
15
|
+
// Search
|
|
16
|
+
search, ftsSearch,
|
|
17
|
+
// Context & Relevance
|
|
18
|
+
context, incrementAccess, archive, unarchive, flush, weight,
|
|
19
|
+
// Migration
|
|
20
|
+
migrate,
|
|
21
|
+
// Utilities
|
|
22
|
+
getEmbedding, extractSearchableText, } from "./client.js";
|
|
23
|
+
// Schema (for advanced users)
|
|
24
|
+
export { SCHEMA_VERSION, SCHEMA_SQL, VECTOR_INDEX_SQL, FUNCTIONS_SQL, getMigrationSQL, } from "./schema.js";
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAwB;AACxB,OAAO;AACL,eAAe;AACf,WAAW,EACX,SAAS,EACT,SAAS;AAET,kBAAkB;AAClB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM;AAEN,kBAAkB;AAClB,IAAI,EACJ,MAAM,EACN,MAAM;AAEN,SAAS;AACT,MAAM,EACN,SAAS;AAET,sBAAsB;AACtB,OAAO,EACP,eAAe,EACf,OAAO,EACP,SAAS,EACT,KAAK,EACL,MAAM;AAEN,YAAY;AACZ,OAAO;AAEP,YAAY;AACZ,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAiBrB,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC"}
|