swarm-mail 1.2.1 → 1.3.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.
Files changed (140) hide show
  1. package/dist/adapter.d.ts +2 -2
  2. package/dist/db/client.d.ts +68 -0
  3. package/dist/db/client.d.ts.map +1 -0
  4. package/dist/db/drizzle.d.ts +24 -0
  5. package/dist/db/drizzle.d.ts.map +1 -0
  6. package/dist/db/index.d.ts +25 -0
  7. package/dist/db/index.d.ts.map +1 -0
  8. package/dist/db/migrate.d.ts +81 -0
  9. package/dist/db/migrate.d.ts.map +1 -0
  10. package/dist/db/schema/hive.d.ts +1596 -0
  11. package/dist/db/schema/hive.d.ts.map +1 -0
  12. package/dist/db/schema/index.d.ts +12 -0
  13. package/dist/db/schema/index.d.ts.map +1 -0
  14. package/dist/db/schema/memory.d.ts +214 -0
  15. package/dist/db/schema/memory.d.ts.map +1 -0
  16. package/dist/db/schema/streams.d.ts +1601 -0
  17. package/dist/db/schema/streams.d.ts.map +1 -0
  18. package/dist/hive/adapter.d.ts +8 -8
  19. package/dist/hive/adapter.d.ts.map +1 -1
  20. package/dist/hive/dependencies-drizzle.d.ts +31 -0
  21. package/dist/hive/dependencies-drizzle.d.ts.map +1 -0
  22. package/dist/hive/dependencies.d.ts.map +1 -1
  23. package/dist/hive/flush-manager.d.ts +2 -1
  24. package/dist/hive/flush-manager.d.ts.map +1 -1
  25. package/dist/hive/jsonl.d.ts.map +1 -1
  26. package/dist/hive/migrations.d.ts +23 -3
  27. package/dist/hive/migrations.d.ts.map +1 -1
  28. package/dist/hive/projections-drizzle.d.ts +43 -0
  29. package/dist/hive/projections-drizzle.d.ts.map +1 -0
  30. package/dist/hive/projections.d.ts +8 -0
  31. package/dist/hive/projections.d.ts.map +1 -1
  32. package/dist/hive/queries-drizzle.d.ts +52 -0
  33. package/dist/hive/queries-drizzle.d.ts.map +1 -0
  34. package/dist/hive/queries.d.ts +38 -0
  35. package/dist/hive/queries.d.ts.map +1 -1
  36. package/dist/hive/store.d.ts +36 -14
  37. package/dist/hive/store.d.ts.map +1 -1
  38. package/dist/index.d.ts +34 -18
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +83673 -38455
  41. package/dist/libsql.convenience.d.ts +155 -0
  42. package/dist/libsql.convenience.d.ts.map +1 -0
  43. package/dist/libsql.d.ts +93 -0
  44. package/dist/libsql.d.ts.map +1 -0
  45. package/dist/memory/adapter.d.ts +6 -7
  46. package/dist/memory/adapter.d.ts.map +1 -1
  47. package/dist/memory/libsql-schema.d.ts +83 -0
  48. package/dist/memory/libsql-schema.d.ts.map +1 -0
  49. package/dist/memory/migrate-legacy.d.ts +11 -0
  50. package/dist/memory/migrate-legacy.d.ts.map +1 -1
  51. package/dist/memory/migrations.d.ts +11 -0
  52. package/dist/memory/migrations.d.ts.map +1 -1
  53. package/dist/memory/store.d.ts +39 -31
  54. package/dist/memory/store.d.ts.map +1 -1
  55. package/dist/memory/test-utils.d.ts +59 -0
  56. package/dist/memory/test-utils.d.ts.map +1 -0
  57. package/dist/migrate-pglite-to-libsql.d.ts +73 -0
  58. package/dist/migrate-pglite-to-libsql.d.ts.map +1 -0
  59. package/dist/pglite.d.ts +8 -170
  60. package/dist/pglite.d.ts.map +1 -1
  61. package/dist/streams/agent-mail.d.ts +13 -0
  62. package/dist/streams/agent-mail.d.ts.map +1 -1
  63. package/dist/streams/auto-migrate.d.ts +182 -0
  64. package/dist/streams/auto-migrate.d.ts.map +1 -0
  65. package/dist/streams/effect/ask.d.ts +5 -4
  66. package/dist/streams/effect/ask.d.ts.map +1 -1
  67. package/dist/streams/effect/cursor.d.ts +3 -2
  68. package/dist/streams/effect/cursor.d.ts.map +1 -1
  69. package/dist/streams/effect/deferred.d.ts +12 -9
  70. package/dist/streams/effect/deferred.d.ts.map +1 -1
  71. package/dist/streams/effect/lock.d.ts +13 -11
  72. package/dist/streams/effect/lock.d.ts.map +1 -1
  73. package/dist/streams/effect/mailbox.d.ts +3 -2
  74. package/dist/streams/effect/mailbox.d.ts.map +1 -1
  75. package/dist/streams/events.d.ts +4 -0
  76. package/dist/streams/events.d.ts.map +1 -1
  77. package/dist/streams/index.d.ts +20 -74
  78. package/dist/streams/index.d.ts.map +1 -1
  79. package/dist/streams/libsql-schema.d.ts +77 -0
  80. package/dist/streams/libsql-schema.d.ts.map +1 -0
  81. package/dist/streams/migrations.d.ts +8 -8
  82. package/dist/streams/migrations.d.ts.map +1 -1
  83. package/dist/streams/projections-drizzle.d.ts +175 -0
  84. package/dist/streams/projections-drizzle.d.ts.map +1 -0
  85. package/dist/streams/projections.d.ts +9 -0
  86. package/dist/streams/projections.d.ts.map +1 -1
  87. package/dist/streams/store-drizzle.d.ts +96 -0
  88. package/dist/streams/store-drizzle.d.ts.map +1 -0
  89. package/dist/streams/store.d.ts +23 -0
  90. package/dist/streams/store.d.ts.map +1 -1
  91. package/dist/streams/swarm-mail.d.ts +9 -0
  92. package/dist/streams/swarm-mail.d.ts.map +1 -1
  93. package/dist/test-libsql.d.ts +76 -0
  94. package/dist/test-libsql.d.ts.map +1 -0
  95. package/dist/types/adapter.d.ts +3 -3
  96. package/dist/types/database.d.ts +12 -12
  97. package/dist/types/hive-adapter.d.ts +5 -5
  98. package/package.json +5 -5
  99. package/dist/beads/adapter.d.ts +0 -38
  100. package/dist/beads/adapter.d.ts.map +0 -1
  101. package/dist/beads/blocked-cache.d.ts +0 -21
  102. package/dist/beads/blocked-cache.d.ts.map +0 -1
  103. package/dist/beads/comments.d.ts +0 -21
  104. package/dist/beads/comments.d.ts.map +0 -1
  105. package/dist/beads/dependencies.d.ts +0 -58
  106. package/dist/beads/dependencies.d.ts.map +0 -1
  107. package/dist/beads/events.d.ts +0 -163
  108. package/dist/beads/events.d.ts.map +0 -1
  109. package/dist/beads/flush-manager.d.ts +0 -71
  110. package/dist/beads/flush-manager.d.ts.map +0 -1
  111. package/dist/beads/index.d.ts +0 -25
  112. package/dist/beads/index.d.ts.map +0 -1
  113. package/dist/beads/jsonl.d.ts +0 -103
  114. package/dist/beads/jsonl.d.ts.map +0 -1
  115. package/dist/beads/labels.d.ts +0 -21
  116. package/dist/beads/labels.d.ts.map +0 -1
  117. package/dist/beads/merge.d.ts +0 -99
  118. package/dist/beads/merge.d.ts.map +0 -1
  119. package/dist/beads/migrations.d.ts +0 -41
  120. package/dist/beads/migrations.d.ts.map +0 -1
  121. package/dist/beads/operations.d.ts +0 -56
  122. package/dist/beads/operations.d.ts.map +0 -1
  123. package/dist/beads/projections.d.ts +0 -103
  124. package/dist/beads/projections.d.ts.map +0 -1
  125. package/dist/beads/queries.d.ts +0 -77
  126. package/dist/beads/queries.d.ts.map +0 -1
  127. package/dist/beads/store.d.ts +0 -98
  128. package/dist/beads/store.d.ts.map +0 -1
  129. package/dist/beads/validation.d.ts +0 -75
  130. package/dist/beads/validation.d.ts.map +0 -1
  131. package/dist/daemon.d.ts +0 -161
  132. package/dist/daemon.d.ts.map +0 -1
  133. package/dist/socket-adapter.d.ts +0 -78
  134. package/dist/socket-adapter.d.ts.map +0 -1
  135. package/dist/streams/debug.d.ts +0 -173
  136. package/dist/streams/debug.d.ts.map +0 -1
  137. package/dist/test-server.d.ts +0 -64
  138. package/dist/test-server.d.ts.map +0 -1
  139. package/dist/types/beads-adapter.d.ts +0 -397
  140. 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"}
@@ -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"}
@@ -14,11 +14,10 @@
14
14
  * ## Usage
15
15
  * ```typescript
16
16
  * import { createMemoryAdapter } from './adapter.js';
17
- * import { wrapPGlite } from '../pglite.js';
18
- * import { PGlite } from '@electric-sql/pglite';
17
+ * import { createInMemorySwarmMailLibSQL } from 'swarm-mail';
19
18
  *
20
- * const pglite = await PGlite.create({ dataDir: './db' });
21
- * const db = wrapPGlite(pglite);
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 { DatabaseAdapter } from "../types/database.js";
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 - DatabaseAdapter for PGlite/PostgreSQL
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: DatabaseAdapter, config: MemoryConfig): {
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,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,eAAe,EAAE,MAAM,EAAE,YAAY;IAqFzE;;;;;;;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"}
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
  /**
@@ -85,4 +88,12 @@ export declare function getMigrationStatus(legacyPath?: string): Promise<{
85
88
  total: number;
86
89
  withEmbeddings: number;
87
90
  } | null>;
91
+ /**
92
+ * Check if target database already has memories
93
+ * Used to skip migration prompt if already migrated
94
+ *
95
+ * @param targetDb - Target database adapter
96
+ * @returns true if memories exist, false if empty
97
+ */
98
+ export declare function targetHasMemories(targetDb: DatabaseAdapter): Promise<boolean>;
88
99
  //# sourceMappingURL=migrate-legacy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-legacy.d.ts","sourceRoot":"","sources":["../../src/memory/migrate-legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAOH,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;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA4I1B;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,CAiC3D"}
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"}
@@ -1,30 +1,31 @@
1
1
  /**
2
- * Memory Store - PGlite + pgvector operations
2
+ * Memory Store - Drizzle-based memory operations
3
3
  *
4
- * Provides CRUD operations and semantic search for memories using
5
- * an existing shared PGlite instance. Does NOT create its own database.
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
- * - Accept DatabaseAdapter via factory parameter (dependency injection)
9
- * - Share PGlite instance with other swarm-mail services
10
- * - Schema migrations handled separately (by migrations task)
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 with PostgreSQL FTS
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
- * ## Vector Search Query
22
- * Uses pgvector's <=> operator for cosine distance, where:
23
- * - 0 = identical vectors
24
- * - 2 = opposite vectors
25
- * - Score = 1 - distance (higher is more similar)
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 { DatabaseAdapter } from "../types/database.js";
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 a shared DatabaseAdapter
54
+ * Create a memory store using Drizzle ORM
54
55
  *
55
- * @param db - DatabaseAdapter instance (shared PGLite, SQLite, PostgreSQL, etc.)
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 { wrapPGlite } from '../pglite.js';
61
- * import { PGlite } from '@electric-sql/pglite';
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: DatabaseAdapter): {
72
+ export declare function createMemoryStore(db: SwarmDb): {
73
73
  /**
74
74
  * Store a memory with its embedding
75
75
  *
76
- * Uses UPSERT (INSERT ... ON CONFLICT DO UPDATE) to handle both
77
- * new memories and updates to existing ones atomically.
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
- * Finds memories with embeddings similar to the query embedding.
88
- * Uses cosine distance (<=> operator) with HNSW index for performance.
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
- * Searches memory content using PostgreSQL's full-text search.
99
- * Uses GIN index on to_tsvector('english', content) for performance.
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 ts_rank
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
- * Cascade delete handles memory_embeddings automatically.
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;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5D,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;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,eAAe;IAcjD;;;;;;;;;OASG;kBACiB,MAAM,aAAa,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC/D;;;;;;;;;OASG;2BAEe,MAAM,EAAE,YACf,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC;IAmD1B;;;;;;;;;OASG;2BAEY,MAAM,YACV,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC;IAqC1B;;;;;OAKG;sBACqB,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAelD;;;;;OAKG;YACW,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ7C;;;;;;OAMG;eACc,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;OAIG;gBACe,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;EActE"}
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