@molroo-io/sdk 0.5.2
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 +251 -0
- package/dist/cjs/api-client.d.ts +23 -0
- package/dist/cjs/api-client.d.ts.map +1 -0
- package/dist/cjs/api-client.js +55 -0
- package/dist/cjs/defaults/index.d.ts +8 -0
- package/dist/cjs/defaults/index.d.ts.map +1 -0
- package/dist/cjs/defaults/index.js +30 -0
- package/dist/cjs/defaults/persona.json +17 -0
- package/dist/cjs/embedding/cloudflare.d.ts +15 -0
- package/dist/cjs/embedding/cloudflare.d.ts.map +1 -0
- package/dist/cjs/embedding/cloudflare.js +16 -0
- package/dist/cjs/embedding/cohere.d.ts +8 -0
- package/dist/cjs/embedding/cohere.d.ts.map +1 -0
- package/dist/cjs/embedding/cohere.js +31 -0
- package/dist/cjs/embedding/index.d.ts +9 -0
- package/dist/cjs/embedding/index.d.ts.map +1 -0
- package/dist/cjs/embedding/index.js +11 -0
- package/dist/cjs/embedding/local.d.ts +6 -0
- package/dist/cjs/embedding/local.d.ts.map +1 -0
- package/dist/cjs/embedding/local.js +28 -0
- package/dist/cjs/embedding/openai.d.ts +9 -0
- package/dist/cjs/embedding/openai.d.ts.map +1 -0
- package/dist/cjs/embedding/openai.js +26 -0
- package/dist/cjs/errors.d.ts +17 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +21 -0
- package/dist/cjs/events/console.d.ts +25 -0
- package/dist/cjs/events/console.d.ts.map +1 -0
- package/dist/cjs/events/console.js +41 -0
- package/dist/cjs/events/types.d.ts +28 -0
- package/dist/cjs/events/types.d.ts.map +1 -0
- package/dist/cjs/events/types.js +13 -0
- package/dist/cjs/events/webhook.d.ts +30 -0
- package/dist/cjs/events/webhook.d.ts.map +1 -0
- package/dist/cjs/events/webhook.js +79 -0
- package/dist/cjs/generate/persona.d.ts +16 -0
- package/dist/cjs/generate/persona.d.ts.map +1 -0
- package/dist/cjs/generate/persona.js +42 -0
- package/dist/cjs/generate/prompt.d.ts +7 -0
- package/dist/cjs/generate/prompt.d.ts.map +1 -0
- package/dist/cjs/generate/prompt.js +41 -0
- package/dist/cjs/generate/schema.d.ts +32 -0
- package/dist/cjs/generate/schema.d.ts.map +1 -0
- package/dist/cjs/generate/schema.js +54 -0
- package/dist/cjs/generated/index.d.ts +2 -0
- package/dist/cjs/generated/index.d.ts.map +1 -0
- package/dist/cjs/generated/index.js +2 -0
- package/dist/cjs/index.d.ts +66 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/llm/adapter.d.ts +61 -0
- package/dist/cjs/llm/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/adapter.js +2 -0
- package/dist/cjs/llm/resolve.d.ts +28 -0
- package/dist/cjs/llm/resolve.d.ts.map +1 -0
- package/dist/cjs/llm/resolve.js +20 -0
- package/dist/cjs/llm/schema.d.ts +60 -0
- package/dist/cjs/llm/schema.d.ts.map +1 -0
- package/dist/cjs/llm/schema.js +72 -0
- package/dist/cjs/llm/types.d.ts +24 -0
- package/dist/cjs/llm/types.d.ts.map +1 -0
- package/dist/cjs/llm/types.js +2 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/adapter.js +234 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/config.js +2 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts +9 -0
- package/dist/cjs/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/cjs/llm/vercel-ai/index.js +13 -0
- package/dist/cjs/memory/cloudflare/index.d.ts +3 -0
- package/dist/cjs/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/index.js +5 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/cjs/memory/cloudflare/vectorize.js +55 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts +16 -0
- package/dist/cjs/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory-semantic.js +57 -0
- package/dist/cjs/memory/in-memory.d.ts +46 -0
- package/dist/cjs/memory/in-memory.d.ts.map +1 -0
- package/dist/cjs/memory/in-memory.js +115 -0
- package/dist/cjs/memory/pinecone/index.d.ts +7 -0
- package/dist/cjs/memory/pinecone/index.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/index.js +8 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/memory-adapter.js +220 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts +44 -0
- package/dist/cjs/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/pinecone/semantic.js +90 -0
- package/dist/cjs/memory/recall.d.ts +58 -0
- package/dist/cjs/memory/recall.d.ts.map +1 -0
- package/dist/cjs/memory/recall.js +220 -0
- package/dist/cjs/memory/semantic.d.ts +24 -0
- package/dist/cjs/memory/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/semantic.js +2 -0
- package/dist/cjs/memory/sqlite/index.d.ts +3 -0
- package/dist/cjs/memory/sqlite/index.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/index.js +5 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/memory-adapter.js +336 -0
- package/dist/cjs/memory/sqlite/schema.d.ts +4 -0
- package/dist/cjs/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/cjs/memory/sqlite/schema.js +91 -0
- package/dist/cjs/memory/supabase/index.d.ts +7 -0
- package/dist/cjs/memory/supabase/index.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/index.js +8 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/memory-adapter.js +335 -0
- package/dist/cjs/memory/supabase/semantic.d.ts +44 -0
- package/dist/cjs/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/cjs/memory/supabase/semantic.js +72 -0
- package/dist/cjs/memory/types.d.ts +231 -0
- package/dist/cjs/memory/types.d.ts.map +1 -0
- package/dist/cjs/memory/types.js +12 -0
- package/dist/cjs/persona.d.ts +326 -0
- package/dist/cjs/persona.d.ts.map +1 -0
- package/dist/cjs/persona.js +824 -0
- package/dist/cjs/types.d.ts +263 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +15 -0
- package/dist/cjs/world/client.d.ts +36 -0
- package/dist/cjs/world/client.d.ts.map +1 -0
- package/dist/cjs/world/client.js +59 -0
- package/dist/cjs/world/errors.d.ts +9 -0
- package/dist/cjs/world/errors.d.ts.map +1 -0
- package/dist/cjs/world/errors.js +15 -0
- package/dist/cjs/world/index.d.ts +10 -0
- package/dist/cjs/world/index.d.ts.map +1 -0
- package/dist/cjs/world/index.js +16 -0
- package/dist/cjs/world/types.d.ts +101 -0
- package/dist/cjs/world/types.d.ts.map +1 -0
- package/dist/cjs/world/types.js +8 -0
- package/dist/cjs/world/village.d.ts +75 -0
- package/dist/cjs/world/village.d.ts.map +1 -0
- package/dist/cjs/world/village.js +278 -0
- package/dist/cjs/world/world-persona.d.ts +182 -0
- package/dist/cjs/world/world-persona.d.ts.map +1 -0
- package/dist/cjs/world/world-persona.js +192 -0
- package/dist/cjs/world/world.d.ts +41 -0
- package/dist/cjs/world/world.d.ts.map +1 -0
- package/dist/cjs/world/world.js +91 -0
- package/dist/esm/api-client.d.ts +23 -0
- package/dist/esm/api-client.d.ts.map +1 -0
- package/dist/esm/api-client.js +48 -0
- package/dist/esm/defaults/index.d.ts +8 -0
- package/dist/esm/defaults/index.d.ts.map +1 -0
- package/dist/esm/defaults/index.js +23 -0
- package/dist/esm/defaults/persona.json +17 -0
- package/dist/esm/embedding/cloudflare.d.ts +15 -0
- package/dist/esm/embedding/cloudflare.d.ts.map +1 -0
- package/dist/esm/embedding/cloudflare.js +13 -0
- package/dist/esm/embedding/cohere.d.ts +8 -0
- package/dist/esm/embedding/cohere.d.ts.map +1 -0
- package/dist/esm/embedding/cohere.js +28 -0
- package/dist/esm/embedding/index.d.ts +9 -0
- package/dist/esm/embedding/index.d.ts.map +1 -0
- package/dist/esm/embedding/index.js +4 -0
- package/dist/esm/embedding/local.d.ts +6 -0
- package/dist/esm/embedding/local.d.ts.map +1 -0
- package/dist/esm/embedding/local.js +25 -0
- package/dist/esm/embedding/openai.d.ts +9 -0
- package/dist/esm/embedding/openai.d.ts.map +1 -0
- package/dist/esm/embedding/openai.js +23 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +17 -0
- package/dist/esm/events/console.d.ts +25 -0
- package/dist/esm/events/console.d.ts.map +1 -0
- package/dist/esm/events/console.js +37 -0
- package/dist/esm/events/types.d.ts +28 -0
- package/dist/esm/events/types.d.ts.map +1 -0
- package/dist/esm/events/types.js +12 -0
- package/dist/esm/events/webhook.d.ts +30 -0
- package/dist/esm/events/webhook.d.ts.map +1 -0
- package/dist/esm/events/webhook.js +75 -0
- package/dist/esm/generate/persona.d.ts +16 -0
- package/dist/esm/generate/persona.d.ts.map +1 -0
- package/dist/esm/generate/persona.js +39 -0
- package/dist/esm/generate/prompt.d.ts +7 -0
- package/dist/esm/generate/prompt.d.ts.map +1 -0
- package/dist/esm/generate/prompt.js +38 -0
- package/dist/esm/generate/schema.d.ts +32 -0
- package/dist/esm/generate/schema.d.ts.map +1 -0
- package/dist/esm/generate/schema.js +51 -0
- package/dist/esm/generated/index.d.ts +2 -0
- package/dist/esm/generated/index.d.ts.map +1 -0
- package/dist/esm/generated/index.js +1 -0
- package/dist/esm/index.d.ts +66 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +49 -0
- package/dist/esm/llm/adapter.d.ts +61 -0
- package/dist/esm/llm/adapter.d.ts.map +1 -0
- package/dist/esm/llm/adapter.js +1 -0
- package/dist/esm/llm/resolve.d.ts +28 -0
- package/dist/esm/llm/resolve.d.ts.map +1 -0
- package/dist/esm/llm/resolve.js +17 -0
- package/dist/esm/llm/schema.d.ts +60 -0
- package/dist/esm/llm/schema.d.ts.map +1 -0
- package/dist/esm/llm/schema.js +69 -0
- package/dist/esm/llm/types.d.ts +24 -0
- package/dist/esm/llm/types.d.ts.map +1 -0
- package/dist/esm/llm/types.js +1 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts +29 -0
- package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/adapter.js +196 -0
- package/dist/esm/llm/vercel-ai/config.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/config.js +1 -0
- package/dist/esm/llm/vercel-ai/index.d.ts +9 -0
- package/dist/esm/llm/vercel-ai/index.d.ts.map +1 -0
- package/dist/esm/llm/vercel-ai/index.js +8 -0
- package/dist/esm/memory/cloudflare/index.d.ts +3 -0
- package/dist/esm/memory/cloudflare/index.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/index.js +1 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts +62 -0
- package/dist/esm/memory/cloudflare/vectorize.d.ts.map +1 -0
- package/dist/esm/memory/cloudflare/vectorize.js +51 -0
- package/dist/esm/memory/in-memory-semantic.d.ts +16 -0
- package/dist/esm/memory/in-memory-semantic.d.ts.map +1 -0
- package/dist/esm/memory/in-memory-semantic.js +53 -0
- package/dist/esm/memory/in-memory.d.ts +46 -0
- package/dist/esm/memory/in-memory.d.ts.map +1 -0
- package/dist/esm/memory/in-memory.js +111 -0
- package/dist/esm/memory/pinecone/index.d.ts +7 -0
- package/dist/esm/memory/pinecone/index.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/index.js +3 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts +62 -0
- package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/memory-adapter.js +216 -0
- package/dist/esm/memory/pinecone/semantic.d.ts +44 -0
- package/dist/esm/memory/pinecone/semantic.d.ts.map +1 -0
- package/dist/esm/memory/pinecone/semantic.js +86 -0
- package/dist/esm/memory/recall.d.ts +58 -0
- package/dist/esm/memory/recall.d.ts.map +1 -0
- package/dist/esm/memory/recall.js +215 -0
- package/dist/esm/memory/semantic.d.ts +24 -0
- package/dist/esm/memory/semantic.d.ts.map +1 -0
- package/dist/esm/memory/semantic.js +1 -0
- package/dist/esm/memory/sqlite/index.d.ts +3 -0
- package/dist/esm/memory/sqlite/index.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/index.js +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts +58 -0
- package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/memory-adapter.js +296 -0
- package/dist/esm/memory/sqlite/schema.d.ts +4 -0
- package/dist/esm/memory/sqlite/schema.d.ts.map +1 -0
- package/dist/esm/memory/sqlite/schema.js +86 -0
- package/dist/esm/memory/supabase/index.d.ts +7 -0
- package/dist/esm/memory/supabase/index.d.ts.map +1 -0
- package/dist/esm/memory/supabase/index.js +3 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts +67 -0
- package/dist/esm/memory/supabase/memory-adapter.d.ts.map +1 -0
- package/dist/esm/memory/supabase/memory-adapter.js +331 -0
- package/dist/esm/memory/supabase/semantic.d.ts +44 -0
- package/dist/esm/memory/supabase/semantic.d.ts.map +1 -0
- package/dist/esm/memory/supabase/semantic.js +68 -0
- package/dist/esm/memory/types.d.ts +231 -0
- package/dist/esm/memory/types.d.ts.map +1 -0
- package/dist/esm/memory/types.js +9 -0
- package/dist/esm/persona.d.ts +326 -0
- package/dist/esm/persona.d.ts.map +1 -0
- package/dist/esm/persona.js +787 -0
- package/dist/esm/types.d.ts +263 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +11 -0
- package/dist/esm/world/client.d.ts +36 -0
- package/dist/esm/world/client.d.ts.map +1 -0
- package/dist/esm/world/client.js +52 -0
- package/dist/esm/world/errors.d.ts +9 -0
- package/dist/esm/world/errors.d.ts.map +1 -0
- package/dist/esm/world/errors.js +11 -0
- package/dist/esm/world/index.d.ts +10 -0
- package/dist/esm/world/index.d.ts.map +1 -0
- package/dist/esm/world/index.js +8 -0
- package/dist/esm/world/types.d.ts +101 -0
- package/dist/esm/world/types.d.ts.map +1 -0
- package/dist/esm/world/types.js +7 -0
- package/dist/esm/world/village.d.ts +75 -0
- package/dist/esm/world/village.d.ts.map +1 -0
- package/dist/esm/world/village.js +274 -0
- package/dist/esm/world/world-persona.d.ts +182 -0
- package/dist/esm/world/world-persona.d.ts.map +1 -0
- package/dist/esm/world/world-persona.js +188 -0
- package/dist/esm/world/world.d.ts +41 -0
- package/dist/esm/world/world.d.ts.map +1 -0
- package/dist/esm/world/world.js +87 -0
- package/package.json +207 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteMemoryAdapter = void 0;
|
|
4
|
+
var memory_adapter_1 = require("./memory-adapter");
|
|
5
|
+
Object.defineProperty(exports, "SqliteMemoryAdapter", { enumerable: true, get: function () { return memory_adapter_1.SqliteMemoryAdapter; } });
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import type { MemoryAdapter, Episode, Reflection, RecallQuery, SemanticRecallOptions, EpisodePatch, CountQuery, EmbeddingAdapter } from '../types';
|
|
3
|
+
export interface SqliteMemoryAdapterOptions {
|
|
4
|
+
/** Path to SQLite database file, or ':memory:' for in-memory. */
|
|
5
|
+
dbPath: string;
|
|
6
|
+
/** Enable WAL mode for better concurrent reads. Default: true. */
|
|
7
|
+
walMode?: boolean;
|
|
8
|
+
/** Enable vector search. When absent, semanticRecall is not available. */
|
|
9
|
+
vector?: {
|
|
10
|
+
/** Embedding provider (embed function + dimension). */
|
|
11
|
+
embedding: EmbeddingAdapter;
|
|
12
|
+
/** sqlite-vec load function. Auto-imports if not provided. */
|
|
13
|
+
loadVec?: (db: Database.Database) => void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* SQLite-backed MemoryAdapter with optional vector search.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // RDB only (no vector search)
|
|
22
|
+
* const adapter = new SqliteMemoryAdapter({ dbPath: './memory.db' });
|
|
23
|
+
* await adapter.init();
|
|
24
|
+
*
|
|
25
|
+
* // With vector search
|
|
26
|
+
* const adapter = new SqliteMemoryAdapter({
|
|
27
|
+
* dbPath: './memory.db',
|
|
28
|
+
* vector: {
|
|
29
|
+
* embedding: openaiEmbedding({ apiKey: '...' }),
|
|
30
|
+
* },
|
|
31
|
+
* });
|
|
32
|
+
* await adapter.init();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class SqliteMemoryAdapter implements MemoryAdapter {
|
|
36
|
+
private db;
|
|
37
|
+
private opts;
|
|
38
|
+
private vectorEnabled;
|
|
39
|
+
private stmts;
|
|
40
|
+
constructor(options: SqliteMemoryAdapterOptions);
|
|
41
|
+
/** Initialize the database and create tables. Must be called before use. */
|
|
42
|
+
init(): Promise<void>;
|
|
43
|
+
private prepareStatements;
|
|
44
|
+
saveEpisode(episode: Episode): Promise<void>;
|
|
45
|
+
recall(query: RecallQuery): Promise<Episode[]>;
|
|
46
|
+
saveReflection(reflection: Reflection): Promise<void>;
|
|
47
|
+
getReflections(sourceEntity?: string): Promise<Reflection[]>;
|
|
48
|
+
semanticRecall(query: string, options?: SemanticRecallOptions): Promise<Episode[]>;
|
|
49
|
+
getByIds(ids: string[]): Promise<Episode[]>;
|
|
50
|
+
countEpisodes(query: CountQuery): Promise<number>;
|
|
51
|
+
updateEpisode(id: string, patch: EpisodePatch): Promise<void>;
|
|
52
|
+
deleteEpisode(id: string): Promise<void>;
|
|
53
|
+
expireEpisodes(before: number, minImportance?: number): Promise<number>;
|
|
54
|
+
private indexEmbedding;
|
|
55
|
+
/** Close the database connection. */
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=memory-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-adapter.d.ts","sourceRoot":"","sources":["../../../../src/memory/sqlite/memory-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EACP,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,MAAM,CAAC,EAAE;QACP,uDAAuD;QACvD,SAAS,EAAE,gBAAgB,CAAC;QAC5B,8DAA8D;QAC9D,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;KAC3C,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,KAAK,CAQX;gBAEU,OAAO,EAAE,0BAA0B;IAI/C,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,OAAO,CAAC,iBAAiB;IAkCnB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAkC9C,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAU5D,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAuCf,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAM3C,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBjD,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB7E,OAAO,CAAC,cAAc;IAYtB,qCAAqC;IACrC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SqliteMemoryAdapter = void 0;
|
|
40
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
41
|
+
const schema_1 = require("./schema");
|
|
42
|
+
/**
|
|
43
|
+
* SQLite-backed MemoryAdapter with optional vector search.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // RDB only (no vector search)
|
|
48
|
+
* const adapter = new SqliteMemoryAdapter({ dbPath: './memory.db' });
|
|
49
|
+
* await adapter.init();
|
|
50
|
+
*
|
|
51
|
+
* // With vector search
|
|
52
|
+
* const adapter = new SqliteMemoryAdapter({
|
|
53
|
+
* dbPath: './memory.db',
|
|
54
|
+
* vector: {
|
|
55
|
+
* embedding: openaiEmbedding({ apiKey: '...' }),
|
|
56
|
+
* },
|
|
57
|
+
* });
|
|
58
|
+
* await adapter.init();
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
class SqliteMemoryAdapter {
|
|
62
|
+
constructor(options) {
|
|
63
|
+
this.vectorEnabled = false;
|
|
64
|
+
this.opts = options;
|
|
65
|
+
}
|
|
66
|
+
/** Initialize the database and create tables. Must be called before use. */
|
|
67
|
+
async init() {
|
|
68
|
+
this.db = new better_sqlite3_1.default(this.opts.dbPath);
|
|
69
|
+
if (this.opts.walMode !== false) {
|
|
70
|
+
this.db.pragma('journal_mode = WAL');
|
|
71
|
+
}
|
|
72
|
+
if (this.opts.vector) {
|
|
73
|
+
const dim = this.opts.vector.embedding.dimension;
|
|
74
|
+
if (this.opts.vector.loadVec) {
|
|
75
|
+
this.opts.vector.loadVec(this.db);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const sqliteVec = await Promise.resolve().then(() => __importStar(require('sqlite-vec')));
|
|
79
|
+
sqliteVec.load(this.db);
|
|
80
|
+
}
|
|
81
|
+
this.db.exec((0, schema_1.createSchema)(dim));
|
|
82
|
+
this.vectorEnabled = true;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.db.exec((0, schema_1.createSchemaWithoutVec)());
|
|
86
|
+
}
|
|
87
|
+
this.prepareStatements();
|
|
88
|
+
}
|
|
89
|
+
prepareStatements() {
|
|
90
|
+
this.stmts = {
|
|
91
|
+
insertEpisode: this.db.prepare(`
|
|
92
|
+
INSERT OR REPLACE INTO episodes
|
|
93
|
+
(id, timestamp, source_entity, context, appraisal, emotion_v, emotion_a, emotion_d, intensity, importance)
|
|
94
|
+
VALUES
|
|
95
|
+
(@id, @timestamp, @sourceEntity, @context, @appraisal, @emotionV, @emotionA, @emotionD, @intensity, @importance)
|
|
96
|
+
`),
|
|
97
|
+
insertReflection: this.db.prepare(`
|
|
98
|
+
INSERT OR REPLACE INTO reflections
|
|
99
|
+
(id, timestamp, source_entity, content, trigger_type, emotion_v, emotion_a, emotion_d)
|
|
100
|
+
VALUES
|
|
101
|
+
(@id, @timestamp, @sourceEntity, @content, @triggerType, @emotionV, @emotionA, @emotionD)
|
|
102
|
+
`),
|
|
103
|
+
getReflections: this.db.prepare(`SELECT * FROM reflections WHERE source_entity = ? ORDER BY timestamp DESC LIMIT ?`),
|
|
104
|
+
getReflectionsAll: this.db.prepare(`SELECT * FROM reflections ORDER BY timestamp DESC LIMIT ?`),
|
|
105
|
+
getByIds: this.db.prepare(`SELECT * FROM episodes WHERE id IN (SELECT value FROM json_each(?))`),
|
|
106
|
+
updateEpisode: this.db.prepare(`
|
|
107
|
+
UPDATE episodes SET importance = @importance, intensity = @intensity,
|
|
108
|
+
emotion_v = @emotionV, emotion_a = @emotionA, emotion_d = @emotionD
|
|
109
|
+
WHERE id = @id
|
|
110
|
+
`),
|
|
111
|
+
deleteEpisode: this.db.prepare(`DELETE FROM episodes WHERE id = ?`),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ── Required methods ──
|
|
115
|
+
async saveEpisode(episode) {
|
|
116
|
+
this.stmts.insertEpisode.run({
|
|
117
|
+
id: episode.id,
|
|
118
|
+
timestamp: episode.timestamp,
|
|
119
|
+
sourceEntity: episode.sourceEntity ?? null,
|
|
120
|
+
context: episode.context ?? null,
|
|
121
|
+
appraisal: JSON.stringify(episode.appraisal),
|
|
122
|
+
emotionV: episode.emotionSnapshot.V,
|
|
123
|
+
emotionA: episode.emotionSnapshot.A,
|
|
124
|
+
emotionD: episode.emotionSnapshot.D,
|
|
125
|
+
intensity: episode.intensity,
|
|
126
|
+
importance: episode.importance,
|
|
127
|
+
});
|
|
128
|
+
if (this.vectorEnabled && this.opts.vector) {
|
|
129
|
+
try {
|
|
130
|
+
const text = episode.context ?? episode.sourceEntity ?? '';
|
|
131
|
+
if (text) {
|
|
132
|
+
const embedding = await this.opts.vector.embedding.embed(text);
|
|
133
|
+
this.indexEmbedding(episode.id, embedding);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Best-effort: vector indexing failure doesn't block episode save.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async recall(query) {
|
|
142
|
+
const conditions = [];
|
|
143
|
+
const params = [];
|
|
144
|
+
if (query.sourceEntity) {
|
|
145
|
+
conditions.push('source_entity = ?');
|
|
146
|
+
params.push(query.sourceEntity);
|
|
147
|
+
}
|
|
148
|
+
if (query.context) {
|
|
149
|
+
conditions.push('context LIKE ?');
|
|
150
|
+
params.push(`%${query.context}%`);
|
|
151
|
+
}
|
|
152
|
+
if (query.minImportance !== undefined) {
|
|
153
|
+
conditions.push('importance >= ?');
|
|
154
|
+
params.push(query.minImportance);
|
|
155
|
+
}
|
|
156
|
+
if (query.timeRange) {
|
|
157
|
+
conditions.push('timestamp >= ? AND timestamp <= ?');
|
|
158
|
+
params.push(query.timeRange[0], query.timeRange[1]);
|
|
159
|
+
}
|
|
160
|
+
if (query.valenceRange) {
|
|
161
|
+
conditions.push('emotion_v >= ? AND emotion_v <= ?');
|
|
162
|
+
params.push(query.valenceRange[0], query.valenceRange[1]);
|
|
163
|
+
}
|
|
164
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
165
|
+
const limit = query.limit ?? 10;
|
|
166
|
+
params.push(limit);
|
|
167
|
+
const sql = `SELECT * FROM episodes ${where} ORDER BY timestamp DESC LIMIT ?`;
|
|
168
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
169
|
+
return rows.map(rowToEpisode);
|
|
170
|
+
}
|
|
171
|
+
async saveReflection(reflection) {
|
|
172
|
+
this.stmts.insertReflection.run({
|
|
173
|
+
id: reflection.id,
|
|
174
|
+
timestamp: reflection.timestamp,
|
|
175
|
+
sourceEntity: reflection.sourceEntity ?? null,
|
|
176
|
+
content: reflection.content,
|
|
177
|
+
triggerType: reflection.trigger,
|
|
178
|
+
emotionV: reflection.emotionSnapshot.V,
|
|
179
|
+
emotionA: reflection.emotionSnapshot.A,
|
|
180
|
+
emotionD: reflection.emotionSnapshot.D,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async getReflections(sourceEntity) {
|
|
184
|
+
const maxRows = 100;
|
|
185
|
+
const rows = sourceEntity
|
|
186
|
+
? this.stmts.getReflections.all(sourceEntity, maxRows)
|
|
187
|
+
: this.stmts.getReflectionsAll.all(maxRows);
|
|
188
|
+
return rows.map(rowToReflection);
|
|
189
|
+
}
|
|
190
|
+
// ── Optional methods ──
|
|
191
|
+
async semanticRecall(query, options) {
|
|
192
|
+
if (!this.vectorEnabled || !this.opts.vector || !this.db.open) {
|
|
193
|
+
return this.recall({ context: query, limit: options?.topK ?? 10 });
|
|
194
|
+
}
|
|
195
|
+
const embedding = await this.opts.vector.embedding.embed(query);
|
|
196
|
+
const topK = options?.topK ?? 5;
|
|
197
|
+
const hasFilter = options?.filter?.sourceEntity || options?.filter?.minImportance !== undefined;
|
|
198
|
+
const fetchK = hasFilter ? topK * 4 : topK;
|
|
199
|
+
const vec = new Float32Array(embedding);
|
|
200
|
+
const vecRows = this.db.prepare(`SELECT id, distance FROM embeddings WHERE embedding MATCH ? ORDER BY distance LIMIT ?`).all(vec, fetchK);
|
|
201
|
+
if (vecRows.length === 0)
|
|
202
|
+
return [];
|
|
203
|
+
const ids = vecRows.map(r => r.id);
|
|
204
|
+
const distMap = new Map(vecRows.map(r => [r.id, r.distance]));
|
|
205
|
+
let sql = `SELECT * FROM episodes WHERE id IN (${ids.map(() => '?').join(',')})`;
|
|
206
|
+
const params = [...ids];
|
|
207
|
+
if (options?.filter?.sourceEntity) {
|
|
208
|
+
sql += ` AND source_entity = ?`;
|
|
209
|
+
params.push(options.filter.sourceEntity);
|
|
210
|
+
}
|
|
211
|
+
if (options?.filter?.minImportance !== undefined) {
|
|
212
|
+
sql += ` AND importance >= ?`;
|
|
213
|
+
params.push(options.filter.minImportance);
|
|
214
|
+
}
|
|
215
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
216
|
+
return rows
|
|
217
|
+
.map(row => rowToEpisode(row))
|
|
218
|
+
.sort((a, b) => (distMap.get(a.id) ?? 1) - (distMap.get(b.id) ?? 1))
|
|
219
|
+
.slice(0, topK);
|
|
220
|
+
}
|
|
221
|
+
async getByIds(ids) {
|
|
222
|
+
if (ids.length === 0)
|
|
223
|
+
return [];
|
|
224
|
+
const rows = this.stmts.getByIds.all(JSON.stringify(ids));
|
|
225
|
+
return rows.map(rowToEpisode);
|
|
226
|
+
}
|
|
227
|
+
async countEpisodes(query) {
|
|
228
|
+
const conditions = [];
|
|
229
|
+
const params = [];
|
|
230
|
+
if (query.sourceEntity) {
|
|
231
|
+
conditions.push('source_entity = ?');
|
|
232
|
+
params.push(query.sourceEntity);
|
|
233
|
+
}
|
|
234
|
+
if (query.context) {
|
|
235
|
+
conditions.push('context LIKE ?');
|
|
236
|
+
params.push(`%${query.context}%`);
|
|
237
|
+
}
|
|
238
|
+
if (query.timeRange) {
|
|
239
|
+
conditions.push('timestamp >= ? AND timestamp <= ?');
|
|
240
|
+
params.push(query.timeRange[0], query.timeRange[1]);
|
|
241
|
+
}
|
|
242
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
243
|
+
const sql = `SELECT COUNT(*) as cnt FROM episodes ${where}`;
|
|
244
|
+
const row = this.db.prepare(sql).get(...params);
|
|
245
|
+
return row.cnt;
|
|
246
|
+
}
|
|
247
|
+
async updateEpisode(id, patch) {
|
|
248
|
+
const existing = this.stmts.getByIds.all(JSON.stringify([id]));
|
|
249
|
+
if (existing.length === 0)
|
|
250
|
+
return;
|
|
251
|
+
const row = existing[0];
|
|
252
|
+
this.stmts.updateEpisode.run({
|
|
253
|
+
id,
|
|
254
|
+
importance: patch.importance ?? row.importance,
|
|
255
|
+
intensity: patch.intensity ?? row.intensity,
|
|
256
|
+
emotionV: patch.emotionSnapshot?.V ?? row.emotion_v,
|
|
257
|
+
emotionA: patch.emotionSnapshot?.A ?? row.emotion_a,
|
|
258
|
+
emotionD: patch.emotionSnapshot?.D ?? row.emotion_d,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async deleteEpisode(id) {
|
|
262
|
+
this.stmts.deleteEpisode.run(id);
|
|
263
|
+
if (this.vectorEnabled) {
|
|
264
|
+
try {
|
|
265
|
+
this.db.prepare(`DELETE FROM embeddings WHERE id = ?`).run(id);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Best-effort: vector cleanup failure is non-fatal.
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async expireEpisodes(before, minImportance) {
|
|
273
|
+
const threshold = minImportance ?? 0;
|
|
274
|
+
const result = this.db.prepare(`DELETE FROM episodes WHERE timestamp < ? AND importance < ?`).run(before, threshold);
|
|
275
|
+
if (this.vectorEnabled) {
|
|
276
|
+
try {
|
|
277
|
+
this.db.prepare(`DELETE FROM embeddings WHERE id NOT IN (SELECT id FROM episodes)`).run();
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Best-effort cleanup.
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return result.changes;
|
|
284
|
+
}
|
|
285
|
+
// ── Utility ──
|
|
286
|
+
indexEmbedding(id, embedding) {
|
|
287
|
+
if (!this.db.open)
|
|
288
|
+
return;
|
|
289
|
+
try {
|
|
290
|
+
const vec = new Float32Array(embedding);
|
|
291
|
+
const exists = this.db.prepare(`SELECT 1 FROM embeddings WHERE id = ?`).get(id);
|
|
292
|
+
if (exists)
|
|
293
|
+
return;
|
|
294
|
+
this.db.prepare(`INSERT INTO embeddings (id, embedding) VALUES (?, ?)`).run(id, vec);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Silently ignore.
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/** Close the database connection. */
|
|
301
|
+
close() {
|
|
302
|
+
this.db.close();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.SqliteMemoryAdapter = SqliteMemoryAdapter;
|
|
306
|
+
// ── Row mappers ──
|
|
307
|
+
function rowToEpisode(row) {
|
|
308
|
+
return {
|
|
309
|
+
id: row.id,
|
|
310
|
+
timestamp: row.timestamp,
|
|
311
|
+
sourceEntity: row.source_entity ?? undefined,
|
|
312
|
+
context: row.context ?? undefined,
|
|
313
|
+
appraisal: JSON.parse(row.appraisal),
|
|
314
|
+
emotionSnapshot: {
|
|
315
|
+
V: row.emotion_v,
|
|
316
|
+
A: row.emotion_a,
|
|
317
|
+
D: row.emotion_d,
|
|
318
|
+
},
|
|
319
|
+
intensity: row.intensity,
|
|
320
|
+
importance: row.importance,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function rowToReflection(row) {
|
|
324
|
+
return {
|
|
325
|
+
id: row.id,
|
|
326
|
+
timestamp: row.timestamp,
|
|
327
|
+
sourceEntity: row.source_entity ?? undefined,
|
|
328
|
+
content: row.content,
|
|
329
|
+
trigger: row.trigger_type,
|
|
330
|
+
emotionSnapshot: {
|
|
331
|
+
V: row.emotion_v,
|
|
332
|
+
A: row.emotion_a,
|
|
333
|
+
D: row.emotion_d,
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/memory/sqlite/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CA4CzD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAuC/C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.createSchema = createSchema;
|
|
5
|
+
exports.createSchemaWithoutVec = createSchemaWithoutVec;
|
|
6
|
+
exports.SCHEMA_VERSION = 2;
|
|
7
|
+
function createSchema(embeddingDim) {
|
|
8
|
+
return `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS _meta (
|
|
10
|
+
key TEXT PRIMARY KEY,
|
|
11
|
+
value TEXT NOT NULL
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
INSERT OR IGNORE INTO _meta (key, value) VALUES ('schema_version', '${exports.SCHEMA_VERSION}');
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS episodes (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
timestamp INTEGER NOT NULL,
|
|
19
|
+
source_entity TEXT,
|
|
20
|
+
context TEXT,
|
|
21
|
+
appraisal TEXT NOT NULL,
|
|
22
|
+
emotion_v REAL NOT NULL,
|
|
23
|
+
emotion_a REAL NOT NULL,
|
|
24
|
+
emotion_d REAL NOT NULL,
|
|
25
|
+
intensity REAL NOT NULL,
|
|
26
|
+
importance REAL NOT NULL
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_source ON episodes(source_entity);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_timestamp ON episodes(timestamp DESC);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_importance ON episodes(importance);
|
|
32
|
+
|
|
33
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS embeddings USING vec0(
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
embedding FLOAT[${embeddingDim}]
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS reflections (
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
timestamp INTEGER NOT NULL,
|
|
41
|
+
source_entity TEXT,
|
|
42
|
+
content TEXT NOT NULL,
|
|
43
|
+
trigger_type TEXT NOT NULL,
|
|
44
|
+
emotion_v REAL NOT NULL,
|
|
45
|
+
emotion_a REAL NOT NULL,
|
|
46
|
+
emotion_d REAL NOT NULL
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_reflections_source ON reflections(source_entity);
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
function createSchemaWithoutVec() {
|
|
53
|
+
return `
|
|
54
|
+
CREATE TABLE IF NOT EXISTS _meta (
|
|
55
|
+
key TEXT PRIMARY KEY,
|
|
56
|
+
value TEXT NOT NULL
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
INSERT OR IGNORE INTO _meta (key, value) VALUES ('schema_version', '${exports.SCHEMA_VERSION}');
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS episodes (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
timestamp INTEGER NOT NULL,
|
|
64
|
+
source_entity TEXT,
|
|
65
|
+
context TEXT,
|
|
66
|
+
appraisal TEXT NOT NULL,
|
|
67
|
+
emotion_v REAL NOT NULL,
|
|
68
|
+
emotion_a REAL NOT NULL,
|
|
69
|
+
emotion_d REAL NOT NULL,
|
|
70
|
+
intensity REAL NOT NULL,
|
|
71
|
+
importance REAL NOT NULL
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_source ON episodes(source_entity);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_timestamp ON episodes(timestamp DESC);
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_episodes_importance ON episodes(importance);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS reflections (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
timestamp INTEGER NOT NULL,
|
|
81
|
+
source_entity TEXT,
|
|
82
|
+
content TEXT NOT NULL,
|
|
83
|
+
trigger_type TEXT NOT NULL,
|
|
84
|
+
emotion_v REAL NOT NULL,
|
|
85
|
+
emotion_a REAL NOT NULL,
|
|
86
|
+
emotion_d REAL NOT NULL
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_reflections_source ON reflections(source_entity);
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { SupabaseSemanticMemory } from './semantic';
|
|
2
|
+
export type { SupabaseSemanticMemoryOptions } from './semantic';
|
|
3
|
+
/** @deprecated Use SupabaseSemanticMemory */
|
|
4
|
+
export { SupabaseMemoryAdapter } from './memory-adapter';
|
|
5
|
+
/** @deprecated Use SupabaseSemanticMemoryOptions */
|
|
6
|
+
export type { SupabaseMemoryAdapterOptions } from './memory-adapter';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/memory/supabase/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,6CAA6C;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,oDAAoD;AACpD,YAAY,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SupabaseMemoryAdapter = exports.SupabaseSemanticMemory = void 0;
|
|
4
|
+
var semantic_1 = require("./semantic");
|
|
5
|
+
Object.defineProperty(exports, "SupabaseSemanticMemory", { enumerable: true, get: function () { return semantic_1.SupabaseSemanticMemory; } });
|
|
6
|
+
/** @deprecated Use SupabaseSemanticMemory */
|
|
7
|
+
var memory_adapter_1 = require("./memory-adapter");
|
|
8
|
+
Object.defineProperty(exports, "SupabaseMemoryAdapter", { enumerable: true, get: function () { return memory_adapter_1.SupabaseMemoryAdapter; } });
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { MemoryAdapter, Episode, Reflection, RecallQuery, SemanticRecallOptions, EpisodePatch, CountQuery, EmbeddingAdapter } from '../types';
|
|
2
|
+
export interface SupabaseMemoryAdapterOptions {
|
|
3
|
+
/** Supabase project URL. */
|
|
4
|
+
supabaseUrl: string;
|
|
5
|
+
/** Supabase anon or service-role key. */
|
|
6
|
+
supabaseKey: string;
|
|
7
|
+
/** Persona/world ID for RLS scoping. */
|
|
8
|
+
personaId: string;
|
|
9
|
+
/** RLS strategy. Default: 'application'. */
|
|
10
|
+
rlsStrategy?: 'application' | 'jwt';
|
|
11
|
+
/** Enable vector search. When absent, semanticRecall falls back to text recall. */
|
|
12
|
+
vector?: {
|
|
13
|
+
/** Embedding provider (embed function + dimension). */
|
|
14
|
+
embedding: EmbeddingAdapter;
|
|
15
|
+
/** Match threshold for pgvector similarity. Default: 0.7. */
|
|
16
|
+
matchThreshold?: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Supabase-backed MemoryAdapter with optional pgvector semantic search.
|
|
21
|
+
*
|
|
22
|
+
* Combines episode/reflection RDB storage with optional pgvector embeddings
|
|
23
|
+
* into a single unified MemoryAdapter interface.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // RDB only (no vector search)
|
|
28
|
+
* const adapter = new SupabaseMemoryAdapter({
|
|
29
|
+
* supabaseUrl: process.env.SUPABASE_URL!,
|
|
30
|
+
* supabaseKey: process.env.SUPABASE_KEY!,
|
|
31
|
+
* personaId: 'world-123',
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* // With vector search
|
|
35
|
+
* const adapter = new SupabaseMemoryAdapter({
|
|
36
|
+
* supabaseUrl: process.env.SUPABASE_URL!,
|
|
37
|
+
* supabaseKey: process.env.SUPABASE_KEY!,
|
|
38
|
+
* personaId: 'world-123',
|
|
39
|
+
* vector: {
|
|
40
|
+
* embedding: openaiEmbedding({ apiKey: '...' }),
|
|
41
|
+
* matchThreshold: 0.75,
|
|
42
|
+
* },
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class SupabaseMemoryAdapter implements MemoryAdapter {
|
|
47
|
+
private client;
|
|
48
|
+
private personaId;
|
|
49
|
+
private rlsStrategy;
|
|
50
|
+
private vectorEnabled;
|
|
51
|
+
private embedding?;
|
|
52
|
+
private matchThreshold;
|
|
53
|
+
constructor(options: SupabaseMemoryAdapterOptions);
|
|
54
|
+
private setPersonaContext;
|
|
55
|
+
saveEpisode(episode: Episode): Promise<void>;
|
|
56
|
+
recall(query: RecallQuery): Promise<Episode[]>;
|
|
57
|
+
saveReflection(reflection: Reflection): Promise<void>;
|
|
58
|
+
getReflections(sourceEntity?: string): Promise<Reflection[]>;
|
|
59
|
+
semanticRecall(query: string, options?: SemanticRecallOptions): Promise<Episode[]>;
|
|
60
|
+
getByIds(ids: string[]): Promise<Episode[]>;
|
|
61
|
+
countEpisodes(query: CountQuery): Promise<number>;
|
|
62
|
+
updateEpisode(id: string, patch: EpisodePatch): Promise<void>;
|
|
63
|
+
deleteEpisode(id: string): Promise<void>;
|
|
64
|
+
expireEpisodes(before: number, minImportance?: number): Promise<number>;
|
|
65
|
+
private indexEmbedding;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=memory-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-adapter.d.ts","sourceRoot":"","sources":["../../../../src/memory/supabase/memory-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EACP,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,4BAA4B;IAC3C,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC;IACpC,mFAAmF;IACnF,MAAM,CAAC,EAAE;QACP,uDAAuD;QACvD,SAAS,EAAE,gBAAgB,CAAC;QAC5B,6DAA6D;QAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,4BAA4B;YASnC,iBAAiB;IAazB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC5C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgC9C,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB5D,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IA+Bf,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY3C,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBjD,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB7D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxC,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;YAwCJ,cAAc;CAqB7B"}
|