swarm-mail 1.2.2 → 1.4.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 +174 -144
- package/bin/swarm-db.ts +168 -0
- package/dist/adapter.d.ts +2 -2
- package/dist/analytics/formatters.d.ts +50 -0
- package/dist/analytics/formatters.d.ts.map +1 -0
- package/dist/analytics/index.d.ts +35 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/queries/agent-activity.d.ts +21 -0
- package/dist/analytics/queries/agent-activity.d.ts.map +1 -0
- package/dist/analytics/queries/checkpoint-frequency.d.ts +26 -0
- package/dist/analytics/queries/checkpoint-frequency.d.ts.map +1 -0
- package/dist/analytics/queries/failed-decompositions.d.ts +22 -0
- package/dist/analytics/queries/failed-decompositions.d.ts.map +1 -0
- package/dist/analytics/queries/human-feedback.d.ts +26 -0
- package/dist/analytics/queries/human-feedback.d.ts.map +1 -0
- package/dist/analytics/queries/index.d.ts +21 -0
- package/dist/analytics/queries/index.d.ts.map +1 -0
- package/dist/analytics/queries/lock-contention.d.ts +20 -0
- package/dist/analytics/queries/lock-contention.d.ts.map +1 -0
- package/dist/analytics/queries/message-latency.d.ts +24 -0
- package/dist/analytics/queries/message-latency.d.ts.map +1 -0
- package/dist/analytics/queries/recovery-success.d.ts +26 -0
- package/dist/analytics/queries/recovery-success.d.ts.map +1 -0
- package/dist/analytics/queries/scope-violations.d.ts +27 -0
- package/dist/analytics/queries/scope-violations.d.ts.map +1 -0
- package/dist/analytics/queries/strategy-success-rates.d.ts +20 -0
- package/dist/analytics/queries/strategy-success-rates.d.ts.map +1 -0
- package/dist/analytics/queries/task-duration.d.ts +31 -0
- package/dist/analytics/queries/task-duration.d.ts.map +1 -0
- package/dist/analytics/query-builder.d.ts +110 -0
- package/dist/analytics/query-builder.d.ts.map +1 -0
- package/dist/analytics/types.d.ts +36 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/cli/db.d.ts +73 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/db/client.d.ts +68 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/drizzle.d.ts +24 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/index.d.ts +25 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/migrate.d.ts +81 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/schema/hive.d.ts +1596 -0
- package/dist/db/schema/hive.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +12 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/memory.d.ts +214 -0
- package/dist/db/schema/memory.d.ts.map +1 -0
- package/dist/db/schema/streams.d.ts +1601 -0
- package/dist/db/schema/streams.d.ts.map +1 -0
- package/dist/debug-demo.d.ts +12 -0
- package/dist/debug-demo.d.ts.map +1 -0
- package/dist/debug.d.ts +19 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/errors/base-error.d.ts +49 -0
- package/dist/errors/base-error.d.ts.map +1 -0
- package/dist/errors/checkpoint-error.d.ts +10 -0
- package/dist/errors/checkpoint-error.d.ts.map +1 -0
- package/dist/errors/decomposition-error.d.ts +10 -0
- package/dist/errors/decomposition-error.d.ts.map +1 -0
- package/dist/errors/index.d.ts +37 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/reservation-error.d.ts +10 -0
- package/dist/errors/reservation-error.d.ts.map +1 -0
- package/dist/errors/validation-error.d.ts +10 -0
- package/dist/errors/validation-error.d.ts.map +1 -0
- package/dist/hive/adapter.d.ts +8 -8
- package/dist/hive/adapter.d.ts.map +1 -1
- package/dist/hive/dependencies-drizzle.d.ts +31 -0
- package/dist/hive/dependencies-drizzle.d.ts.map +1 -0
- package/dist/hive/dependencies.d.ts.map +1 -1
- package/dist/hive/flush-manager.d.ts +2 -1
- package/dist/hive/flush-manager.d.ts.map +1 -1
- package/dist/hive/jsonl.d.ts.map +1 -1
- package/dist/hive/migrations.d.ts +23 -3
- package/dist/hive/migrations.d.ts.map +1 -1
- package/dist/hive/projections-drizzle.d.ts +43 -0
- package/dist/hive/projections-drizzle.d.ts.map +1 -0
- package/dist/hive/projections.d.ts +8 -0
- package/dist/hive/projections.d.ts.map +1 -1
- package/dist/hive/queries-drizzle.d.ts +52 -0
- package/dist/hive/queries-drizzle.d.ts.map +1 -0
- package/dist/hive/queries.d.ts +38 -0
- package/dist/hive/queries.d.ts.map +1 -1
- package/dist/hive/store.d.ts +36 -14
- package/dist/hive/store.d.ts.map +1 -1
- package/dist/index.d.ts +37 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84673 -38352
- package/dist/libsql.convenience.d.ts +155 -0
- package/dist/libsql.convenience.d.ts.map +1 -0
- package/dist/libsql.d.ts +93 -0
- package/dist/libsql.d.ts.map +1 -0
- package/dist/memory/adapter.d.ts +6 -7
- package/dist/memory/adapter.d.ts.map +1 -1
- package/dist/memory/libsql-schema.d.ts +83 -0
- package/dist/memory/libsql-schema.d.ts.map +1 -0
- package/dist/memory/migrate-legacy.d.ts +3 -0
- package/dist/memory/migrate-legacy.d.ts.map +1 -1
- package/dist/memory/migrations.d.ts +11 -0
- package/dist/memory/migrations.d.ts.map +1 -1
- package/dist/memory/store.d.ts +39 -31
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/test-utils.d.ts +59 -0
- package/dist/memory/test-utils.d.ts.map +1 -0
- package/dist/migrate-pglite-to-libsql.d.ts +73 -0
- package/dist/migrate-pglite-to-libsql.d.ts.map +1 -0
- package/dist/pglite.d.ts +8 -170
- package/dist/pglite.d.ts.map +1 -1
- package/dist/streams/agent-mail.d.ts +13 -0
- package/dist/streams/agent-mail.d.ts.map +1 -1
- package/dist/streams/auto-migrate.d.ts +182 -0
- package/dist/streams/auto-migrate.d.ts.map +1 -0
- package/dist/streams/effect/ask.d.ts +5 -4
- package/dist/streams/effect/ask.d.ts.map +1 -1
- package/dist/streams/effect/cursor.d.ts +3 -2
- package/dist/streams/effect/cursor.d.ts.map +1 -1
- package/dist/streams/effect/deferred.d.ts +12 -9
- package/dist/streams/effect/deferred.d.ts.map +1 -1
- package/dist/streams/effect/lock.d.ts +13 -11
- package/dist/streams/effect/lock.d.ts.map +1 -1
- package/dist/streams/effect/mailbox.d.ts +3 -2
- package/dist/streams/effect/mailbox.d.ts.map +1 -1
- package/dist/streams/events.d.ts +4 -0
- package/dist/streams/events.d.ts.map +1 -1
- package/dist/streams/index.d.ts +20 -74
- package/dist/streams/index.d.ts.map +1 -1
- package/dist/streams/libsql-schema.d.ts +77 -0
- package/dist/streams/libsql-schema.d.ts.map +1 -0
- package/dist/streams/migrations.d.ts +8 -8
- package/dist/streams/migrations.d.ts.map +1 -1
- package/dist/streams/projections-drizzle.d.ts +175 -0
- package/dist/streams/projections-drizzle.d.ts.map +1 -0
- package/dist/streams/projections.d.ts +9 -0
- package/dist/streams/projections.d.ts.map +1 -1
- package/dist/streams/store-drizzle.d.ts +96 -0
- package/dist/streams/store-drizzle.d.ts.map +1 -0
- package/dist/streams/store.d.ts +23 -0
- package/dist/streams/store.d.ts.map +1 -1
- package/dist/streams/swarm-mail.d.ts +9 -0
- package/dist/streams/swarm-mail.d.ts.map +1 -1
- package/dist/test-libsql.d.ts +76 -0
- package/dist/test-libsql.d.ts.map +1 -0
- package/dist/types/adapter.d.ts +3 -3
- package/dist/types/database.d.ts +12 -12
- package/dist/types/hive-adapter.d.ts +5 -5
- package/package.json +10 -6
- package/dist/beads/adapter.d.ts +0 -38
- package/dist/beads/adapter.d.ts.map +0 -1
- package/dist/beads/blocked-cache.d.ts +0 -21
- package/dist/beads/blocked-cache.d.ts.map +0 -1
- package/dist/beads/comments.d.ts +0 -21
- package/dist/beads/comments.d.ts.map +0 -1
- package/dist/beads/dependencies.d.ts +0 -58
- package/dist/beads/dependencies.d.ts.map +0 -1
- package/dist/beads/events.d.ts +0 -163
- package/dist/beads/events.d.ts.map +0 -1
- package/dist/beads/flush-manager.d.ts +0 -71
- package/dist/beads/flush-manager.d.ts.map +0 -1
- package/dist/beads/index.d.ts +0 -25
- package/dist/beads/index.d.ts.map +0 -1
- package/dist/beads/jsonl.d.ts +0 -103
- package/dist/beads/jsonl.d.ts.map +0 -1
- package/dist/beads/labels.d.ts +0 -21
- package/dist/beads/labels.d.ts.map +0 -1
- package/dist/beads/merge.d.ts +0 -99
- package/dist/beads/merge.d.ts.map +0 -1
- package/dist/beads/migrations.d.ts +0 -41
- package/dist/beads/migrations.d.ts.map +0 -1
- package/dist/beads/operations.d.ts +0 -56
- package/dist/beads/operations.d.ts.map +0 -1
- package/dist/beads/projections.d.ts +0 -103
- package/dist/beads/projections.d.ts.map +0 -1
- package/dist/beads/queries.d.ts +0 -77
- package/dist/beads/queries.d.ts.map +0 -1
- package/dist/beads/store.d.ts +0 -98
- package/dist/beads/store.d.ts.map +0 -1
- package/dist/beads/validation.d.ts +0 -75
- package/dist/beads/validation.d.ts.map +0 -1
- package/dist/daemon.d.ts +0 -161
- package/dist/daemon.d.ts.map +0 -1
- package/dist/socket-adapter.d.ts +0 -78
- package/dist/socket-adapter.d.ts.map +0 -1
- package/dist/streams/debug.d.ts +0 -173
- package/dist/streams/debug.d.ts.map +0 -1
- package/dist/test-server.d.ts +0 -64
- package/dist/test-server.d.ts.map +0 -1
- package/dist/types/beads-adapter.d.ts +0 -397
- package/dist/types/beads-adapter.d.ts.map +0 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LibSQL Convenience Layer - Simple API for libSQL users
|
|
3
|
+
*
|
|
4
|
+
* Parallel to pglite.ts - provides simplified interface for users who want
|
|
5
|
+
* libSQL without manually setting up adapters.
|
|
6
|
+
*
|
|
7
|
+
* ## Simple API (this file)
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { getSwarmMailLibSQL } from '@opencode/swarm-mail';
|
|
10
|
+
*
|
|
11
|
+
* const swarmMail = await getSwarmMailLibSQL('/path/to/project');
|
|
12
|
+
* await swarmMail.registerAgent(projectKey, 'agent-name');
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* ## Advanced API (adapter pattern)
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { createLibSQLAdapter, createSwarmMailAdapter } from '@opencode/swarm-mail';
|
|
18
|
+
*
|
|
19
|
+
* const db = await createLibSQLAdapter({ url: 'libsql://...' });
|
|
20
|
+
* const swarmMail = createSwarmMailAdapter(db, '/path/to/project');
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import type { SwarmDb } from "./db/client.js";
|
|
24
|
+
import type { SwarmMailAdapter } from "./types/adapter.js";
|
|
25
|
+
import type { DatabaseAdapter } from "./types/database.js";
|
|
26
|
+
/**
|
|
27
|
+
* Get project-specific temporary directory name
|
|
28
|
+
*
|
|
29
|
+
* Creates a stable directory name based on project path:
|
|
30
|
+
* `opencode-<project-name>-<hash>`
|
|
31
|
+
*
|
|
32
|
+
* @param projectPath - Absolute path to project
|
|
33
|
+
* @returns Directory name (not full path)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* getProjectTempDirName("/path/to/my-project");
|
|
38
|
+
* // => "opencode-my-project-a1b2c3d4"
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function getProjectTempDirName(projectPath: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Hash project path to 8-character hex string
|
|
44
|
+
*
|
|
45
|
+
* Uses SHA-256 truncated to 8 chars for project path disambiguation.
|
|
46
|
+
*
|
|
47
|
+
* @param projectPath - Path to hash
|
|
48
|
+
* @returns 8-character hex hash
|
|
49
|
+
*/
|
|
50
|
+
export declare function hashProjectPath(projectPath: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Get database file path for a project
|
|
53
|
+
*
|
|
54
|
+
* Returns `file:/<tmpdir>/opencode-<project>-<hash>/streams.db`
|
|
55
|
+
* or `file:/<tmpdir>/opencode-global/streams.db` if no project specified.
|
|
56
|
+
*
|
|
57
|
+
* Creates directory if it doesn't exist.
|
|
58
|
+
*
|
|
59
|
+
* @param projectPath - Optional project path (defaults to global)
|
|
60
|
+
* @returns Database file URL for libSQL
|
|
61
|
+
*/
|
|
62
|
+
export declare function getDatabasePath(projectPath?: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get SwarmMailAdapter for a project (singleton)
|
|
65
|
+
*
|
|
66
|
+
* Creates or returns existing adapter for the project.
|
|
67
|
+
* Uses file-based libSQL database in system temp directory.
|
|
68
|
+
*
|
|
69
|
+
* **Singleton behavior:** Multiple calls with same path return same instance.
|
|
70
|
+
*
|
|
71
|
+
* @param projectPath - Absolute path to project (or undefined for global)
|
|
72
|
+
* @returns SwarmMailAdapter instance
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const swarmMail = await getSwarmMailLibSQL('/path/to/project');
|
|
77
|
+
* await swarmMail.registerAgent(projectKey, 'agent-1');
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function getSwarmMailLibSQL(projectPath?: string): Promise<SwarmMailAdapter>;
|
|
81
|
+
/**
|
|
82
|
+
* Create in-memory SwarmMailAdapter for testing
|
|
83
|
+
*
|
|
84
|
+
* Uses `:memory:` database - no persistence.
|
|
85
|
+
* Each call creates a new isolated instance.
|
|
86
|
+
*
|
|
87
|
+
* @param testId - Unique test identifier
|
|
88
|
+
* @returns SwarmMailAdapter instance
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const swarmMail = await createInMemorySwarmMailLibSQL('test-123');
|
|
93
|
+
* // ... use for tests ...
|
|
94
|
+
* await swarmMail.close();
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function createInMemorySwarmMailLibSQL(testId: string): Promise<SwarmMailAdapter>;
|
|
98
|
+
/**
|
|
99
|
+
* Close SwarmMailAdapter for specific project
|
|
100
|
+
*
|
|
101
|
+
* Closes database connection and removes from singleton cache.
|
|
102
|
+
*
|
|
103
|
+
* @param projectPath - Project path (or undefined for global)
|
|
104
|
+
*/
|
|
105
|
+
export declare function closeSwarmMailLibSQL(projectPath?: string): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Close all SwarmMailAdapter instances
|
|
108
|
+
*
|
|
109
|
+
* Useful for cleanup in tests or application shutdown.
|
|
110
|
+
*/
|
|
111
|
+
export declare function closeAllSwarmMailLibSQL(): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Convert a DatabaseAdapter to a SwarmDb (Drizzle database)
|
|
114
|
+
*
|
|
115
|
+
* This is useful when you have a DatabaseAdapter from getSwarmMailLibSQL()
|
|
116
|
+
* but need a SwarmDb for the memory store.
|
|
117
|
+
*
|
|
118
|
+
* @param adapter - DatabaseAdapter (must be a LibSQLAdapter internally)
|
|
119
|
+
* @returns SwarmDb (Drizzle database)
|
|
120
|
+
* @throws Error if adapter doesn't have getClient() method
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const swarmMail = await getSwarmMailLibSQL('/path/to/project');
|
|
125
|
+
* const dbAdapter = await swarmMail.getDatabase();
|
|
126
|
+
* const drizzleDb = toSwarmDb(dbAdapter);
|
|
127
|
+
*
|
|
128
|
+
* // Now use drizzleDb with memory store
|
|
129
|
+
* const store = createMemoryStore(drizzleDb);
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function toSwarmDb(adapter: DatabaseAdapter): SwarmDb;
|
|
133
|
+
/**
|
|
134
|
+
* Convert DatabaseAdapter OR PGlite to SwarmDb (Drizzle client)
|
|
135
|
+
*
|
|
136
|
+
* Supports both:
|
|
137
|
+
* - LibSQLAdapter (has getClient() method)
|
|
138
|
+
* - PGlite (direct instance)
|
|
139
|
+
*
|
|
140
|
+
* @param db - DatabaseAdapter or PGlite instance
|
|
141
|
+
* @returns Drizzle client compatible with SwarmDb
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* // Works with LibSQLAdapter
|
|
146
|
+
* const adapter = await createLibSQLAdapter();
|
|
147
|
+
* const drizzle = toDrizzleDb(adapter);
|
|
148
|
+
*
|
|
149
|
+
* // Works with PGlite
|
|
150
|
+
* const pglite = await getDatabase(projectPath);
|
|
151
|
+
* const drizzle = toDrizzleDb(pglite);
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare function toDrizzleDb(db: any): SwarmDb;
|
|
155
|
+
//# sourceMappingURL=libsql.convenience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libsql.convenience.d.ts","sourceRoot":"","sources":["../src/libsql.convenience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAU3D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAajE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAW7D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAO3D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAgB5C"}
|
package/dist/libsql.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LibSQLAdapter - libSQL implementation of DatabaseAdapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps @libsql/client to implement the DatabaseAdapter interface.
|
|
5
|
+
* Supports file-based, in-memory, and remote (Turso) databases.
|
|
6
|
+
*
|
|
7
|
+
* Key differences from PGLite:
|
|
8
|
+
* - Uses ? placeholders instead of $1, $2, etc.
|
|
9
|
+
* - Native vector support with F32_BLOB(N) columns
|
|
10
|
+
* - No extensions needed for vector operations
|
|
11
|
+
* - vector_distance_cos() returns distance (lower = more similar)
|
|
12
|
+
*
|
|
13
|
+
* Based on spike at packages/swarm-mail/scripts/sqlite-vec-spike.ts
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // In-memory (for tests)
|
|
18
|
+
* const db = await createLibSQLAdapter({ url: ":memory:" });
|
|
19
|
+
*
|
|
20
|
+
* // File-based
|
|
21
|
+
* const db = await createLibSQLAdapter({ url: "file:./swarm.db" });
|
|
22
|
+
*
|
|
23
|
+
* // Remote (Turso)
|
|
24
|
+
* const db = await createLibSQLAdapter({
|
|
25
|
+
* url: "libsql://[database].turso.io",
|
|
26
|
+
* authToken: process.env.TURSO_TOKEN
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import type { DatabaseAdapter } from "./types/database.js";
|
|
31
|
+
/**
|
|
32
|
+
* LibSQL configuration options
|
|
33
|
+
*
|
|
34
|
+
* Extends @libsql/client Config with type safety.
|
|
35
|
+
*/
|
|
36
|
+
export interface LibSQLConfig {
|
|
37
|
+
/** Database URL - ":memory:", "file:./path.db", or "libsql://..." */
|
|
38
|
+
url: string;
|
|
39
|
+
/** Auth token for remote Turso databases */
|
|
40
|
+
authToken?: string;
|
|
41
|
+
/** Connection timeout in milliseconds */
|
|
42
|
+
timeout?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Convert PostgreSQL-style placeholders ($1, $2, ...) to SQLite-style (?)
|
|
46
|
+
* and expand parameters for reused placeholders.
|
|
47
|
+
*
|
|
48
|
+
* PostgreSQL allows reusing placeholders (e.g., $1, $2, $1) but SQLite's ?
|
|
49
|
+
* placeholders are strictly positional. This function:
|
|
50
|
+
* 1. Converts $N to ? in order of appearance
|
|
51
|
+
* 2. Expands the params array to match (duplicating values for reused placeholders)
|
|
52
|
+
*
|
|
53
|
+
* If SQL already uses ? placeholders (native SQLite style), params are passed through unchanged.
|
|
54
|
+
*
|
|
55
|
+
* @param sql - SQL string with PostgreSQL or SQLite placeholders
|
|
56
|
+
* @param params - Original parameters array
|
|
57
|
+
* @returns Object with converted SQL and expanded parameters
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* // PostgreSQL: VALUES ($1, $2, $1) with params [a, b]
|
|
62
|
+
* // SQLite: VALUES (?, ?, ?) with params [a, b, a]
|
|
63
|
+
* const result = convertPlaceholders("VALUES ($1, $2, $1)", ["a", "b"]);
|
|
64
|
+
* // result.sql = "VALUES (?, ?, ?)"
|
|
65
|
+
* // result.params = ["a", "b", "a"]
|
|
66
|
+
*
|
|
67
|
+
* // Already SQLite style - pass through unchanged
|
|
68
|
+
* const result2 = convertPlaceholders("VALUES (?, ?, ?)", ["a", "b", "c"]);
|
|
69
|
+
* // result2.sql = "VALUES (?, ?, ?)"
|
|
70
|
+
* // result2.params = ["a", "b", "c"]
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function convertPlaceholders(sql: string, params?: unknown[]): {
|
|
74
|
+
sql: string;
|
|
75
|
+
params: unknown[] | undefined;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Create a LibSQLAdapter instance
|
|
79
|
+
*
|
|
80
|
+
* Factory function that creates and initializes a libSQL database connection.
|
|
81
|
+
*
|
|
82
|
+
* @param config - LibSQL configuration (url, authToken, etc.)
|
|
83
|
+
* @returns DatabaseAdapter instance
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const db = await createLibSQLAdapter({ url: ":memory:" });
|
|
88
|
+
* await db.exec("CREATE TABLE users (id INTEGER PRIMARY KEY)");
|
|
89
|
+
* await db.close();
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function createLibSQLAdapter(config: LibSQLConfig): Promise<DatabaseAdapter>;
|
|
93
|
+
//# sourceMappingURL=libsql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libsql.d.ts","sourceRoot":"","sources":["../src/libsql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,qBAAqB,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;CAAE,CAuFhD;AAmGD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,YAAY,GAClB,OAAO,CAAC,eAAe,CAAC,CA0B1B"}
|
package/dist/memory/adapter.d.ts
CHANGED
|
@@ -14,11 +14,10 @@
|
|
|
14
14
|
* ## Usage
|
|
15
15
|
* ```typescript
|
|
16
16
|
* import { createMemoryAdapter } from './adapter.js';
|
|
17
|
-
* import {
|
|
18
|
-
* import { PGlite } from '@electric-sql/pglite';
|
|
17
|
+
* import { createInMemorySwarmMailLibSQL } from 'swarm-mail';
|
|
19
18
|
*
|
|
20
|
-
* const
|
|
21
|
-
* const db =
|
|
19
|
+
* const swarmMail = await createInMemorySwarmMailLibSQL('my-project');
|
|
20
|
+
* const db = swarmMail.getDrizzle();
|
|
22
21
|
* const config = {
|
|
23
22
|
* ollamaHost: 'http://localhost:11434',
|
|
24
23
|
* ollamaModel: 'mxbai-embed-large',
|
|
@@ -39,7 +38,7 @@
|
|
|
39
38
|
* const results = await adapter.find("token refresh", { fts: true });
|
|
40
39
|
* ```
|
|
41
40
|
*/
|
|
42
|
-
import type {
|
|
41
|
+
import type { SwarmDb } from "../db/client.js";
|
|
43
42
|
import { type Memory, type SearchResult } from "./store.js";
|
|
44
43
|
import { type MemoryConfig } from "./ollama.js";
|
|
45
44
|
export type { MemoryConfig } from "./ollama.js";
|
|
@@ -82,11 +81,11 @@ export interface HealthStatus {
|
|
|
82
81
|
/**
|
|
83
82
|
* Create a memory adapter with high-level operations
|
|
84
83
|
*
|
|
85
|
-
* @param db -
|
|
84
|
+
* @param db - Drizzle database instance (libSQL)
|
|
86
85
|
* @param config - Ollama configuration
|
|
87
86
|
* @returns Memory adapter instance
|
|
88
87
|
*/
|
|
89
|
-
export declare function createMemoryAdapter(db:
|
|
88
|
+
export declare function createMemoryAdapter(db: SwarmDb, config: MemoryConfig): {
|
|
90
89
|
/**
|
|
91
90
|
* Store a memory with automatic embedding generation
|
|
92
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/memory/adapter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/memory/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAqB,KAAK,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAMxE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY;IAqFjE;;;;;;;OAOG;uBAEY,MAAM,YACV,YAAY,GACpB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IA2C1B;;;;;;OAMG;gBACe,MAAM,YAAW,WAAW,GAAQ,OAAO,CAAC,YAAY,EAAE,CAAC;IA0C7E;;;;;OAKG;YACW,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7C;;;;OAIG;eACc,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;;;;;OAQG;iBACgB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczC;;;;;OAKG;mBACiB;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpE;;;;OAIG;aACY,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAIhE;;;;OAIG;mBACkB,OAAO,CAAC,YAAY,CAAC;EAiB7C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL Memory Schema - FTS5 and Vector Extensions
|
|
3
|
+
*
|
|
4
|
+
* Provides FTS5 full-text search and vector indexes for memories table.
|
|
5
|
+
*
|
|
6
|
+
* ## Schema Source of Truth
|
|
7
|
+
* - **Table structure**: db/schema/memory.ts (Drizzle schema)
|
|
8
|
+
* - **FTS5/vector DDL**: This file (raw SQL - Drizzle can't create these)
|
|
9
|
+
*
|
|
10
|
+
* ## Synchronization
|
|
11
|
+
* The memories table definition MUST match db/schema/memory.ts exactly.
|
|
12
|
+
* Changes to table structure should be made in db/schema/memory.ts first,
|
|
13
|
+
* then reflected here.
|
|
14
|
+
*
|
|
15
|
+
* ## Key Differences from PGlite
|
|
16
|
+
*
|
|
17
|
+
* | PGlite (pgvector) | libSQL |
|
|
18
|
+
* |--------------------------|--------------------------------------|
|
|
19
|
+
* | `vector(768)` | `F32_BLOB(768)` |
|
|
20
|
+
* | `$1::vector` | `vector(?)` |
|
|
21
|
+
* | `embedding <=> $1` | `vector_distance_cos(embedding, vector(?))` |
|
|
22
|
+
* | `CREATE EXTENSION vector`| Not needed (native support) |
|
|
23
|
+
* | GIN FTS index | FTS5 virtual table |
|
|
24
|
+
* | JSONB | TEXT (JSON stored as string) |
|
|
25
|
+
* | TIMESTAMPTZ | TEXT (ISO 8601 string) |
|
|
26
|
+
*
|
|
27
|
+
* ## Vector Search Notes
|
|
28
|
+
* - libSQL returns distance (0 = identical, 2 = opposite)
|
|
29
|
+
* - To get similarity score: similarity = 1 - distance
|
|
30
|
+
* - Lower distance = higher similarity (opposite of pgvector score)
|
|
31
|
+
*
|
|
32
|
+
* @module memory/libsql-schema
|
|
33
|
+
*/
|
|
34
|
+
import type { Client } from "@libsql/client";
|
|
35
|
+
/** Embedding dimension for mxbai-embed-large (matches PGlite schema) */
|
|
36
|
+
export declare const EMBEDDING_DIM = 1024;
|
|
37
|
+
/**
|
|
38
|
+
* Create libSQL memory schema with FTS5 and vector support
|
|
39
|
+
*
|
|
40
|
+
* Creates:
|
|
41
|
+
* - memories table (structure from db/schema/memory.ts)
|
|
42
|
+
* - FTS5 virtual table for full-text search (Drizzle can't create this)
|
|
43
|
+
* - Vector index (Drizzle can't create this)
|
|
44
|
+
* - Standard indexes for performance
|
|
45
|
+
*
|
|
46
|
+
* Idempotent - safe to call multiple times.
|
|
47
|
+
*
|
|
48
|
+
* @param db - libSQL client instance
|
|
49
|
+
* @throws Error if schema creation fails
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* import { createClient } from "@libsql/client";
|
|
54
|
+
* import { createLibSQLMemorySchema } from "./libsql-schema.js";
|
|
55
|
+
*
|
|
56
|
+
* const db = createClient({ url: ":memory:" });
|
|
57
|
+
* await createLibSQLMemorySchema(db);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function createLibSQLMemorySchema(db: Client): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Drop libSQL memory schema
|
|
63
|
+
*
|
|
64
|
+
* Removes all tables, indexes, and triggers created by createLibSQLMemorySchema.
|
|
65
|
+
* Useful for tests and cleanup.
|
|
66
|
+
*
|
|
67
|
+
* @param db - libSQL client instance
|
|
68
|
+
*/
|
|
69
|
+
export declare function dropLibSQLMemorySchema(db: Client): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Verify libSQL memory schema exists and is valid
|
|
72
|
+
*
|
|
73
|
+
* Checks for:
|
|
74
|
+
* - memories table with required columns
|
|
75
|
+
* - FTS5 virtual table
|
|
76
|
+
* - Required indexes
|
|
77
|
+
* - Required triggers
|
|
78
|
+
*
|
|
79
|
+
* @param db - libSQL client instance
|
|
80
|
+
* @returns True if schema is valid, false otherwise
|
|
81
|
+
*/
|
|
82
|
+
export declare function validateLibSQLMemorySchema(db: Client): Promise<boolean>;
|
|
83
|
+
//# sourceMappingURL=libsql-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libsql-schema.d.ts","sourceRoot":"","sources":["../../src/memory/libsql-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ExE;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CActE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B7E"}
|
|
@@ -66,6 +66,9 @@ export interface MigrationResult {
|
|
|
66
66
|
export declare function getDefaultLegacyPath(): string;
|
|
67
67
|
/**
|
|
68
68
|
* Check if legacy database exists
|
|
69
|
+
*
|
|
70
|
+
* Checks for the presence of PGLite data files (PG_VERSION file)
|
|
71
|
+
* to distinguish between an empty directory and an actual database.
|
|
69
72
|
*/
|
|
70
73
|
export declare function legacyDatabaseExists(path?: string): boolean;
|
|
71
74
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-legacy.d.ts","sourceRoot":"","sources":["../../src/memory/migrate-legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;
|
|
1
|
+
{"version":3,"file":"migrate-legacy.d.ts","sourceRoot":"","sources":["../../src/memory/migrate-legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,eAAe,CAAC;IAC1B,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB;AAsBD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ3D;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAkJ1B;AAwBD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAuC3D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnF"}
|
|
@@ -35,8 +35,19 @@ import type { Migration } from "../streams/migrations.js";
|
|
|
35
35
|
* in src/streams/migrations.ts.
|
|
36
36
|
*/
|
|
37
37
|
export declare const memoryMigration: Migration;
|
|
38
|
+
/**
|
|
39
|
+
* Migration v9 (libSQL): Add memory tables
|
|
40
|
+
*
|
|
41
|
+
* LibSQL-compatible version using:
|
|
42
|
+
* - F32_BLOB for vector embeddings (instead of pgvector)
|
|
43
|
+
* - TEXT for metadata (instead of JSONB)
|
|
44
|
+
* - TEXT for timestamps (instead of TIMESTAMPTZ)
|
|
45
|
+
* - FTS5 virtual table (instead of PostgreSQL GIN index)
|
|
46
|
+
*/
|
|
47
|
+
export declare const memoryMigrationLibSQL: Migration;
|
|
38
48
|
/**
|
|
39
49
|
* Export memory migrations array
|
|
40
50
|
*/
|
|
41
51
|
export declare const memoryMigrations: Migration[];
|
|
52
|
+
export declare const memoryMigrationsLibSQL: Migration[];
|
|
42
53
|
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/memory/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,SAkD7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/memory/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,SAkD7B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,SA6DnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAAsB,CAAC;AAC/D,eAAO,MAAM,sBAAsB,EAAE,SAAS,EAA4B,CAAC"}
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory Store -
|
|
2
|
+
* Memory Store - Drizzle-based memory operations
|
|
3
3
|
*
|
|
4
|
-
* Provides CRUD operations and semantic search for memories using
|
|
5
|
-
*
|
|
4
|
+
* Provides CRUD operations and semantic search for memories using Drizzle ORM.
|
|
5
|
+
* Replaces raw SQL adapter detection with Drizzle's unified query interface.
|
|
6
6
|
*
|
|
7
7
|
* ## Design Pattern
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
8
|
+
* - Uses Drizzle query builder for all operations (except vector search)
|
|
9
|
+
* - Vector similarity search uses sql`` template for vector_distance_cos()
|
|
10
|
+
* - No adapter type detection needed - Drizzle handles PGlite/libSQL differences
|
|
11
11
|
*
|
|
12
12
|
* ## Key Operations
|
|
13
|
-
* - store: Insert or update memory with embedding
|
|
13
|
+
* - store: Insert or update memory with embedding (UPSERT via onConflictDoUpdate)
|
|
14
14
|
* - search: Vector similarity search with threshold/limit/collection filters
|
|
15
|
-
* - ftsSearch: Full-text search
|
|
15
|
+
* - ftsSearch: Full-text search (uses raw SQL - FTS5 not yet in Drizzle)
|
|
16
16
|
* - list: List all memories, optionally filtered by collection
|
|
17
17
|
* - get: Retrieve single memory by ID
|
|
18
18
|
* - delete: Remove memory and its embedding
|
|
19
19
|
* - getStats: Memory and embedding counts
|
|
20
20
|
*
|
|
21
|
-
* ##
|
|
22
|
-
*
|
|
23
|
-
* -
|
|
24
|
-
* -
|
|
25
|
-
* -
|
|
21
|
+
* ## Migration Notes
|
|
22
|
+
* - Removed detectAdapterType() - Drizzle abstracts this
|
|
23
|
+
* - Removed PGlite-specific code (separate memory_embeddings table)
|
|
24
|
+
* - libSQL schema has embedding inline in memories table
|
|
25
|
+
* - JSON columns (metadata, tags) stored as TEXT, need JSON.parse/stringify
|
|
26
|
+
* - Timestamps are TEXT (ISO strings)
|
|
26
27
|
*/
|
|
27
|
-
import type {
|
|
28
|
+
import type { SwarmDb } from "../db/client.js";
|
|
28
29
|
/** Embedding dimension for mxbai-embed-large */
|
|
29
30
|
export declare const EMBEDDING_DIM = 1024;
|
|
30
31
|
/** Memory data structure */
|
|
@@ -50,31 +51,30 @@ export interface SearchOptions {
|
|
|
50
51
|
readonly collection?: string;
|
|
51
52
|
}
|
|
52
53
|
/**
|
|
53
|
-
* Create a memory store using
|
|
54
|
+
* Create a memory store using Drizzle ORM
|
|
54
55
|
*
|
|
55
|
-
*
|
|
56
|
+
* Uses Drizzle query builder for all operations except vector search
|
|
57
|
+
* (vector_distance_cos requires raw SQL template).
|
|
58
|
+
*
|
|
59
|
+
* @param db - Drizzle database instance (libSQL)
|
|
56
60
|
* @returns Memory store operations
|
|
57
61
|
*
|
|
58
62
|
* @example
|
|
59
63
|
* ```typescript
|
|
60
|
-
* import {
|
|
61
|
-
*
|
|
62
|
-
* import { vector } from '@electric-sql/pglite/vector';
|
|
63
|
-
*
|
|
64
|
-
* const pglite = await PGlite.create({ dataDir: './db', extensions: { vector } });
|
|
65
|
-
* const db = wrapPGlite(pglite);
|
|
64
|
+
* import { createInMemoryDb } from '../db/client.js';
|
|
65
|
+
* const db = await createInMemoryDb();
|
|
66
66
|
* const store = createMemoryStore(db);
|
|
67
67
|
*
|
|
68
68
|
* await store.store(memory, embedding);
|
|
69
69
|
* const results = await store.search(queryEmbedding);
|
|
70
70
|
* ```
|
|
71
71
|
*/
|
|
72
|
-
export declare function createMemoryStore(db:
|
|
72
|
+
export declare function createMemoryStore(db: SwarmDb): {
|
|
73
73
|
/**
|
|
74
74
|
* Store a memory with its embedding
|
|
75
75
|
*
|
|
76
|
-
* Uses
|
|
77
|
-
*
|
|
76
|
+
* Uses Drizzle's onConflictDoUpdate for UPSERT behavior.
|
|
77
|
+
* Vector embedding stored via sql`` template with vector() function.
|
|
78
78
|
*
|
|
79
79
|
* @param memory - Memory to store
|
|
80
80
|
* @param embedding - 1024-dimensional vector
|
|
@@ -84,8 +84,14 @@ export declare function createMemoryStore(db: DatabaseAdapter): {
|
|
|
84
84
|
/**
|
|
85
85
|
* Vector similarity search
|
|
86
86
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
87
|
+
* Uses vector_top_k() function with libsql_vector_idx for efficient ANN search.
|
|
88
|
+
* Returns results sorted by similarity (highest first).
|
|
89
|
+
*
|
|
90
|
+
* libSQL vector search requires:
|
|
91
|
+
* 1. A vector index: CREATE INDEX ... ON table(libsql_vector_idx(column))
|
|
92
|
+
* 2. Using vector_top_k() which returns a virtual table with just (id) - the rowid
|
|
93
|
+
* 3. Joining the virtual table back to get full rows
|
|
94
|
+
* 4. Calculating distance separately with vector_distance_cos()
|
|
89
95
|
*
|
|
90
96
|
* @param queryEmbedding - 1024-dimensional query vector
|
|
91
97
|
* @param options - Search options (limit, threshold, collection)
|
|
@@ -95,12 +101,12 @@ export declare function createMemoryStore(db: DatabaseAdapter): {
|
|
|
95
101
|
/**
|
|
96
102
|
* Full-text search
|
|
97
103
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
104
|
+
* Uses FTS5 virtual table (memories_fts) for text search.
|
|
105
|
+
* Falls back to raw SQL since FTS5 isn't yet in Drizzle.
|
|
100
106
|
*
|
|
101
107
|
* @param searchQuery - Text query string
|
|
102
108
|
* @param options - Search options (limit, collection)
|
|
103
|
-
* @returns Array of search results ranked by
|
|
109
|
+
* @returns Array of search results ranked by relevance
|
|
104
110
|
*/
|
|
105
111
|
ftsSearch(searchQuery: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
106
112
|
/**
|
|
@@ -120,7 +126,7 @@ export declare function createMemoryStore(db: DatabaseAdapter): {
|
|
|
120
126
|
/**
|
|
121
127
|
* Delete a memory
|
|
122
128
|
*
|
|
123
|
-
*
|
|
129
|
+
* Embedding stored inline in same table, single DELETE works.
|
|
124
130
|
*
|
|
125
131
|
* @param id - Memory ID
|
|
126
132
|
*/
|
|
@@ -128,6 +134,8 @@ export declare function createMemoryStore(db: DatabaseAdapter): {
|
|
|
128
134
|
/**
|
|
129
135
|
* Get database statistics
|
|
130
136
|
*
|
|
137
|
+
* Counts memories and embeddings (embeddings in same table).
|
|
138
|
+
*
|
|
131
139
|
* @returns Memory and embedding counts
|
|
132
140
|
*/
|
|
133
141
|
getStats(): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAO/C,gDAAgD;AAChD,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,4BAA4B;AAC5B,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC;CACtC;AAED,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO;IAuBzC;;;;;;;;;OASG;kBACiB,MAAM,aAAa,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/D;;;;;;;;;;;;;;;OAeG;2BAEe,MAAM,EAAE,YACf,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC;IA6C1B;;;;;;;;;OASG;2BAEY,MAAM,YACV,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC;IA4C1B;;;;;OAKG;sBACqB,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAYlD;;;;;OAKG;YACW,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS7C;;;;;;OAMG;eACc,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;;;OAMG;gBACe,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;EAgBtE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Utilities for Memory Store
|
|
3
|
+
*
|
|
4
|
+
* Provides shared test setup for in-memory libSQL databases with full memory schema.
|
|
5
|
+
* This ensures consistency across all memory-related tests by centralizing the schema setup.
|
|
6
|
+
*
|
|
7
|
+
* ## Key Features
|
|
8
|
+
* - Creates in-memory libSQL database with full memory schema
|
|
9
|
+
* - Includes vector index for similarity search (required for vector_top_k)
|
|
10
|
+
* - Sets up FTS5 virtual table for full-text search fallback
|
|
11
|
+
* - Creates triggers to keep FTS in sync with memories table
|
|
12
|
+
* - Returns cleanup function for proper test teardown
|
|
13
|
+
*
|
|
14
|
+
* ## Usage
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { createTestMemoryDb } from 'swarm-mail';
|
|
17
|
+
*
|
|
18
|
+
* let cleanup: () => Promise<void>;
|
|
19
|
+
*
|
|
20
|
+
* beforeEach(async () => {
|
|
21
|
+
* const setup = await createTestMemoryDb();
|
|
22
|
+
* db = setup.db;
|
|
23
|
+
* client = setup.client;
|
|
24
|
+
* cleanup = setup.cleanup;
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* afterEach(async () => {
|
|
28
|
+
* await cleanup();
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* ## Why This Exists
|
|
33
|
+
* The critical piece that's often missed in manual schema setup is the vector index:
|
|
34
|
+
* ```sql
|
|
35
|
+
* CREATE INDEX idx_memories_embedding ON memories(libsql_vector_idx(embedding))
|
|
36
|
+
* ```
|
|
37
|
+
* Without it, vector_top_k() fails with "failed to parse vector index parameters".
|
|
38
|
+
*
|
|
39
|
+
* This utility ensures all memory tests use the same complete schema.
|
|
40
|
+
*/
|
|
41
|
+
import type { Client } from "@libsql/client";
|
|
42
|
+
import type { SwarmDb } from "../db/client.js";
|
|
43
|
+
/**
|
|
44
|
+
* Create in-memory libSQL database with complete memory schema
|
|
45
|
+
*
|
|
46
|
+
* Sets up:
|
|
47
|
+
* - memories table with F32_BLOB(1024) vector column
|
|
48
|
+
* - FTS5 virtual table for full-text search
|
|
49
|
+
* - Triggers to keep FTS in sync
|
|
50
|
+
* - Vector index for similarity search
|
|
51
|
+
*
|
|
52
|
+
* @returns Database client, Drizzle client, and cleanup function
|
|
53
|
+
*/
|
|
54
|
+
export declare function createTestMemoryDb(): Promise<{
|
|
55
|
+
client: Client;
|
|
56
|
+
db: SwarmDb;
|
|
57
|
+
cleanup: () => Promise<void>;
|
|
58
|
+
}>;
|
|
59
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../src/memory/test-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAyDD"}
|