ctxpkg 0.0.1 → 0.0.4

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 (242) hide show
  1. package/bin/cli.js +1 -1
  2. package/bin/daemon.js +1 -1
  3. package/dist/agent/agent.d.ts +65 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +291 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/agent.prompts.d.ts +13 -0
  8. package/dist/agent/agent.prompts.d.ts.map +1 -0
  9. package/{src/agent/agent.prompts.ts → dist/agent/agent.prompts.js} +11 -12
  10. package/dist/agent/agent.prompts.js.map +1 -0
  11. package/dist/agent/agent.test-runner.d.ts +73 -0
  12. package/dist/agent/agent.test-runner.d.ts.map +1 -0
  13. package/dist/agent/agent.test-runner.js +316 -0
  14. package/dist/agent/agent.test-runner.js.map +1 -0
  15. package/dist/agent/agent.test-runner.schemas.d.ts +382 -0
  16. package/dist/agent/agent.test-runner.schemas.d.ts.map +1 -0
  17. package/dist/agent/agent.test-runner.schemas.js +110 -0
  18. package/dist/agent/agent.test-runner.schemas.js.map +1 -0
  19. package/dist/agent/agent.types.d.ts +122 -0
  20. package/dist/agent/agent.types.d.ts.map +1 -0
  21. package/dist/agent/agent.types.js +19 -0
  22. package/dist/agent/agent.types.js.map +1 -0
  23. package/dist/backend/backend.d.ts +16 -0
  24. package/dist/backend/backend.d.ts.map +1 -0
  25. package/dist/backend/backend.js +79 -0
  26. package/dist/backend/backend.js.map +1 -0
  27. package/dist/backend/backend.protocol.d.ts +74 -0
  28. package/dist/backend/backend.protocol.d.ts.map +1 -0
  29. package/dist/backend/backend.protocol.js +46 -0
  30. package/dist/backend/backend.protocol.js.map +1 -0
  31. package/dist/backend/backend.schemas.d.ts +141 -0
  32. package/dist/backend/backend.schemas.d.ts.map +1 -0
  33. package/dist/backend/backend.schemas.js +59 -0
  34. package/dist/backend/backend.schemas.js.map +1 -0
  35. package/dist/backend/backend.services.d.ts +290 -0
  36. package/dist/backend/backend.services.d.ts.map +1 -0
  37. package/dist/backend/backend.services.js +103 -0
  38. package/dist/backend/backend.services.js.map +1 -0
  39. package/dist/backend/backend.types.d.ts +25 -0
  40. package/dist/backend/backend.types.d.ts.map +1 -0
  41. package/dist/backend/backend.types.js +6 -0
  42. package/dist/backend/backend.types.js.map +1 -0
  43. package/dist/cli/cli.agent.d.ts +4 -0
  44. package/dist/cli/cli.agent.d.ts.map +1 -0
  45. package/dist/cli/cli.agent.js +158 -0
  46. package/dist/cli/cli.agent.js.map +1 -0
  47. package/dist/cli/cli.chat.d.ts +4 -0
  48. package/dist/cli/cli.chat.d.ts.map +1 -0
  49. package/dist/cli/cli.chat.js +311 -0
  50. package/dist/cli/cli.chat.js.map +1 -0
  51. package/dist/cli/cli.client.d.ts +11 -0
  52. package/dist/cli/cli.client.d.ts.map +1 -0
  53. package/dist/cli/cli.client.js +40 -0
  54. package/dist/cli/cli.client.js.map +1 -0
  55. package/dist/cli/cli.collections.d.ts +4 -0
  56. package/dist/cli/cli.collections.d.ts.map +1 -0
  57. package/dist/cli/cli.collections.js +411 -0
  58. package/dist/cli/cli.collections.js.map +1 -0
  59. package/dist/cli/cli.config.d.ts +4 -0
  60. package/dist/cli/cli.config.d.ts.map +1 -0
  61. package/dist/cli/cli.config.js +192 -0
  62. package/dist/cli/cli.config.js.map +1 -0
  63. package/dist/cli/cli.d.ts +4 -0
  64. package/dist/cli/cli.d.ts.map +1 -0
  65. package/dist/cli/cli.daemon.d.ts +4 -0
  66. package/dist/cli/cli.daemon.d.ts.map +1 -0
  67. package/dist/cli/cli.daemon.js +116 -0
  68. package/dist/cli/cli.daemon.js.map +1 -0
  69. package/dist/cli/cli.documents.d.ts +4 -0
  70. package/dist/cli/cli.documents.d.ts.map +1 -0
  71. package/dist/cli/cli.documents.js +332 -0
  72. package/dist/cli/cli.documents.js.map +1 -0
  73. package/dist/cli/cli.js +23 -0
  74. package/dist/cli/cli.js.map +1 -0
  75. package/dist/cli/cli.mcp.d.ts +4 -0
  76. package/dist/cli/cli.mcp.d.ts.map +1 -0
  77. package/dist/cli/cli.mcp.js +146 -0
  78. package/dist/cli/cli.mcp.js.map +1 -0
  79. package/dist/cli/cli.utils.d.ts +51 -0
  80. package/dist/cli/cli.utils.d.ts.map +1 -0
  81. package/dist/cli/cli.utils.js +95 -0
  82. package/dist/cli/cli.utils.js.map +1 -0
  83. package/dist/client/client.adapters.d.ts +38 -0
  84. package/dist/client/client.adapters.d.ts.map +1 -0
  85. package/dist/client/client.adapters.js +233 -0
  86. package/dist/client/client.adapters.js.map +1 -0
  87. package/dist/client/client.d.ts +16 -0
  88. package/dist/client/client.d.ts.map +1 -0
  89. package/dist/client/client.js +74 -0
  90. package/dist/client/client.js.map +1 -0
  91. package/dist/client/client.types.d.ts +10 -0
  92. package/dist/client/client.types.d.ts.map +1 -0
  93. package/dist/client/client.types.js +2 -0
  94. package/dist/client/client.types.js.map +1 -0
  95. package/dist/collections/collections.d.ts +219 -0
  96. package/dist/collections/collections.d.ts.map +1 -0
  97. package/dist/collections/collections.js +933 -0
  98. package/dist/collections/collections.js.map +1 -0
  99. package/dist/collections/collections.schemas.d.ts +298 -0
  100. package/dist/collections/collections.schemas.d.ts.map +1 -0
  101. package/dist/collections/collections.schemas.js +117 -0
  102. package/dist/collections/collections.schemas.js.map +1 -0
  103. package/dist/config/config.d.ts +29 -0
  104. package/dist/config/config.d.ts.map +1 -0
  105. package/dist/config/config.js +112 -0
  106. package/dist/config/config.js.map +1 -0
  107. package/dist/daemon/daemon.config.d.ts +6 -0
  108. package/dist/daemon/daemon.config.d.ts.map +1 -0
  109. package/dist/daemon/daemon.config.js +19 -0
  110. package/dist/daemon/daemon.config.js.map +1 -0
  111. package/dist/daemon/daemon.d.ts +10 -0
  112. package/dist/daemon/daemon.d.ts.map +1 -0
  113. package/dist/daemon/daemon.js +173 -0
  114. package/dist/daemon/daemon.js.map +1 -0
  115. package/dist/daemon/daemon.manager.d.ts +20 -0
  116. package/dist/daemon/daemon.manager.d.ts.map +1 -0
  117. package/dist/daemon/daemon.manager.js +176 -0
  118. package/dist/daemon/daemon.manager.js.map +1 -0
  119. package/dist/daemon/daemon.schemas.d.ts +38 -0
  120. package/dist/daemon/daemon.schemas.d.ts.map +1 -0
  121. package/dist/daemon/daemon.schemas.js +15 -0
  122. package/dist/daemon/daemon.schemas.js.map +1 -0
  123. package/dist/database/database.d.ts +10 -0
  124. package/dist/database/database.d.ts.map +1 -0
  125. package/dist/database/database.js +52 -0
  126. package/dist/database/database.js.map +1 -0
  127. package/dist/database/migrations/migrations.001-init.d.ts +9 -0
  128. package/dist/database/migrations/migrations.001-init.d.ts.map +1 -0
  129. package/dist/database/migrations/migrations.001-init.js +46 -0
  130. package/dist/database/migrations/migrations.001-init.js.map +1 -0
  131. package/dist/database/migrations/migrations.002-fts5.d.ts +11 -0
  132. package/dist/database/migrations/migrations.002-fts5.d.ts.map +1 -0
  133. package/dist/database/migrations/migrations.002-fts5.js +29 -0
  134. package/dist/database/migrations/migrations.002-fts5.js.map +1 -0
  135. package/dist/database/migrations/migrations.d.ts +11 -0
  136. package/dist/database/migrations/migrations.d.ts.map +1 -0
  137. package/dist/database/migrations/migrations.js +14 -0
  138. package/dist/database/migrations/migrations.js.map +1 -0
  139. package/dist/database/migrations/migrations.types.d.ts +8 -0
  140. package/dist/database/migrations/migrations.types.d.ts.map +1 -0
  141. package/dist/database/migrations/migrations.types.js +2 -0
  142. package/dist/database/migrations/migrations.types.js.map +1 -0
  143. package/dist/documents/documents.d.ts +58 -0
  144. package/dist/documents/documents.d.ts.map +1 -0
  145. package/dist/documents/documents.js +597 -0
  146. package/dist/documents/documents.js.map +1 -0
  147. package/dist/documents/documents.schemas.d.ts +418 -0
  148. package/dist/documents/documents.schemas.d.ts.map +1 -0
  149. package/dist/documents/documents.schemas.js +111 -0
  150. package/dist/documents/documents.schemas.js.map +1 -0
  151. package/dist/embedder/embedder.d.ts +22 -0
  152. package/dist/embedder/embedder.d.ts.map +1 -0
  153. package/dist/embedder/embedder.js +46 -0
  154. package/dist/embedder/embedder.js.map +1 -0
  155. package/dist/exports.d.ts +2 -0
  156. package/dist/exports.d.ts.map +1 -0
  157. package/dist/exports.js +2 -0
  158. package/dist/exports.js.map +1 -0
  159. package/dist/mcp/mcp.d.ts +44 -0
  160. package/dist/mcp/mcp.d.ts.map +1 -0
  161. package/dist/mcp/mcp.js +62 -0
  162. package/dist/mcp/mcp.js.map +1 -0
  163. package/dist/tools/agent/agent.d.ts +14 -0
  164. package/dist/tools/agent/agent.d.ts.map +1 -0
  165. package/dist/tools/agent/agent.js +31 -0
  166. package/dist/tools/agent/agent.js.map +1 -0
  167. package/dist/tools/documents/documents.d.ts +28 -0
  168. package/dist/tools/documents/documents.d.ts.map +1 -0
  169. package/dist/tools/documents/documents.js +336 -0
  170. package/dist/tools/documents/documents.js.map +1 -0
  171. package/dist/tools/tools.langchain.d.ts +11 -0
  172. package/dist/tools/tools.langchain.d.ts.map +1 -0
  173. package/dist/tools/tools.langchain.js +30 -0
  174. package/dist/tools/tools.langchain.js.map +1 -0
  175. package/dist/tools/tools.mcp.d.ts +12 -0
  176. package/dist/tools/tools.mcp.d.ts.map +1 -0
  177. package/dist/tools/tools.mcp.js +38 -0
  178. package/dist/tools/tools.mcp.js.map +1 -0
  179. package/{src/tools/tools.types.ts → dist/tools/tools.types.d.ts} +10 -16
  180. package/dist/tools/tools.types.d.ts.map +1 -0
  181. package/dist/tools/tools.types.js +7 -0
  182. package/dist/tools/tools.types.js.map +1 -0
  183. package/dist/tsconfig.tsbuildinfo +1 -0
  184. package/dist/utils/utils.services.d.ts +14 -0
  185. package/dist/utils/utils.services.d.ts.map +1 -0
  186. package/dist/utils/utils.services.js +33 -0
  187. package/dist/utils/utils.services.js.map +1 -0
  188. package/package.json +5 -2
  189. package/src/agent/AGENTS.md +0 -249
  190. package/src/agent/agent.test-runner.schemas.ts +0 -158
  191. package/src/agent/agent.test-runner.ts +0 -436
  192. package/src/agent/agent.ts +0 -371
  193. package/src/agent/agent.types.ts +0 -94
  194. package/src/backend/AGENTS.md +0 -112
  195. package/src/backend/backend.protocol.ts +0 -95
  196. package/src/backend/backend.schemas.ts +0 -123
  197. package/src/backend/backend.services.ts +0 -151
  198. package/src/backend/backend.ts +0 -111
  199. package/src/backend/backend.types.ts +0 -34
  200. package/src/cli/AGENTS.md +0 -213
  201. package/src/cli/cli.agent.ts +0 -197
  202. package/src/cli/cli.chat.ts +0 -369
  203. package/src/cli/cli.client.ts +0 -55
  204. package/src/cli/cli.collections.ts +0 -491
  205. package/src/cli/cli.config.ts +0 -252
  206. package/src/cli/cli.daemon.ts +0 -160
  207. package/src/cli/cli.documents.ts +0 -413
  208. package/src/cli/cli.mcp.ts +0 -177
  209. package/src/cli/cli.ts +0 -28
  210. package/src/cli/cli.utils.ts +0 -122
  211. package/src/client/AGENTS.md +0 -135
  212. package/src/client/client.adapters.ts +0 -279
  213. package/src/client/client.ts +0 -86
  214. package/src/client/client.types.ts +0 -17
  215. package/src/collections/AGENTS.md +0 -185
  216. package/src/collections/collections.schemas.ts +0 -195
  217. package/src/collections/collections.ts +0 -1160
  218. package/src/config/config.ts +0 -118
  219. package/src/daemon/AGENTS.md +0 -168
  220. package/src/daemon/daemon.config.ts +0 -23
  221. package/src/daemon/daemon.manager.ts +0 -215
  222. package/src/daemon/daemon.schemas.ts +0 -22
  223. package/src/daemon/daemon.ts +0 -205
  224. package/src/database/AGENTS.md +0 -211
  225. package/src/database/database.ts +0 -64
  226. package/src/database/migrations/migrations.001-init.ts +0 -56
  227. package/src/database/migrations/migrations.002-fts5.ts +0 -32
  228. package/src/database/migrations/migrations.ts +0 -20
  229. package/src/database/migrations/migrations.types.ts +0 -9
  230. package/src/documents/AGENTS.md +0 -301
  231. package/src/documents/documents.schemas.ts +0 -190
  232. package/src/documents/documents.ts +0 -734
  233. package/src/embedder/embedder.ts +0 -53
  234. package/src/exports.ts +0 -0
  235. package/src/mcp/AGENTS.md +0 -264
  236. package/src/mcp/mcp.ts +0 -105
  237. package/src/tools/AGENTS.md +0 -228
  238. package/src/tools/agent/agent.ts +0 -45
  239. package/src/tools/documents/documents.ts +0 -401
  240. package/src/tools/tools.langchain.ts +0 -37
  241. package/src/tools/tools.mcp.ts +0 -46
  242. package/src/utils/utils.services.ts +0 -46
@@ -0,0 +1,19 @@
1
+ import { config } from '#root/config/config.js';
2
+ const getSocketPath = () => {
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ return config.get('daemon.socketPath');
5
+ };
6
+ const getPidFile = () => {
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ return config.get('daemon.pidFile');
9
+ };
10
+ const getIdleTimeout = () => {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ return config.get('daemon.idleTimeout');
13
+ };
14
+ const getAutoStart = () => {
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ return config.get('daemon.autoStart');
17
+ };
18
+ export { getSocketPath, getPidFile, getIdleTimeout, getAutoStart };
19
+ //# sourceMappingURL=daemon.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.config.js","sourceRoot":"","sources":["../../src/daemon/daemon.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,8DAA8D;IAC9D,OAAQ,MAAc,CAAC,GAAG,CAAC,mBAAmB,CAAW,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAW,EAAE;IAC9B,8DAA8D;IAC9D,OAAQ,MAAc,CAAC,GAAG,CAAC,gBAAgB,CAAW,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAW,EAAE;IAClC,8DAA8D;IAC9D,OAAQ,MAAc,CAAC,GAAG,CAAC,oBAAoB,CAAW,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAY,EAAE;IACjC,8DAA8D;IAC9D,OAAQ,MAAc,CAAC,GAAG,CAAC,kBAAkB,CAAY,CAAC;AAC5D,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DaemonOptions, DaemonStatus } from './daemon.schemas.js';
2
+ declare class Daemon {
3
+ #private;
4
+ constructor(options?: DaemonOptions);
5
+ start(): Promise<void>;
6
+ stop(): Promise<void>;
7
+ getStatus(): DaemonStatus;
8
+ }
9
+ export { Daemon };
10
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKvE,cAAM,MAAM;;gBAYE,OAAO,CAAC,EAAE,aAAa;IAO7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+GtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD3B,SAAS,IAAI,YAAY;CAS1B;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,173 @@
1
+ import { createServer } from 'node:http';
2
+ import { mkdir, rm, writeFile, unlink } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { WebSocketServer, WebSocket } from 'ws';
5
+ import { getSocketPath, getPidFile, getIdleTimeout } from './daemon.config.js';
6
+ import { Backend } from '#root/backend/backend.js';
7
+ import { destroy } from '#root/utils/utils.services.js';
8
+ class Daemon {
9
+ #backend;
10
+ #httpServer = null;
11
+ #wsServer = null;
12
+ #connections = new Set();
13
+ #idleTimer = null;
14
+ #startTime = 0;
15
+ #socketPath;
16
+ #pidFile;
17
+ #idleTimeout;
18
+ #isShuttingDown = false;
19
+ constructor(options) {
20
+ this.#socketPath = options?.socketPath ?? getSocketPath();
21
+ this.#pidFile = options?.pidFile ?? getPidFile();
22
+ this.#idleTimeout = options?.idleTimeout ?? getIdleTimeout();
23
+ this.#backend = new Backend();
24
+ }
25
+ async start() {
26
+ // Ensure data directory exists
27
+ await mkdir(dirname(this.#socketPath), { recursive: true });
28
+ // Remove existing socket file if present
29
+ try {
30
+ await rm(this.#socketPath, { force: true });
31
+ }
32
+ catch {
33
+ // Ignore errors
34
+ }
35
+ // Write PID file
36
+ await writeFile(this.#pidFile, String(process.pid));
37
+ // Create HTTP server listening on Unix socket
38
+ this.#httpServer = createServer();
39
+ // Create WebSocket server attached to HTTP server
40
+ this.#wsServer = new WebSocketServer({ server: this.#httpServer });
41
+ this.#startTime = Date.now();
42
+ this.#wsServer.on('connection', (socket) => {
43
+ this.#handleConnection(socket);
44
+ });
45
+ this.#wsServer.on('error', (error) => {
46
+ console.error('[daemon] WebSocket server error:', error);
47
+ });
48
+ this.#httpServer.on('error', (error) => {
49
+ console.error('[daemon] HTTP server error:', error);
50
+ });
51
+ // Start listening on Unix socket
52
+ await new Promise((resolve, reject) => {
53
+ this.#httpServer?.listen(this.#socketPath, () => {
54
+ resolve();
55
+ });
56
+ this.#httpServer?.on('error', reject);
57
+ });
58
+ // Start idle timer if no connections
59
+ this.#resetIdleTimer();
60
+ // Handle shutdown signals
61
+ process.on('SIGTERM', () => this.stop());
62
+ process.on('SIGINT', () => this.stop());
63
+ console.log(`[daemon] Started on ${this.#socketPath} (PID: ${process.pid})`);
64
+ }
65
+ #handleConnection(socket) {
66
+ this.#connections.add(socket);
67
+ this.#backend.setConnectionCount(this.#connections.size);
68
+ this.#clearIdleTimer();
69
+ console.log(`[daemon] Client connected (${this.#connections.size} total)`);
70
+ socket.on('message', async (data) => {
71
+ try {
72
+ const request = JSON.parse(data.toString());
73
+ const response = await this.#backend.handleRequest(request);
74
+ socket.send(JSON.stringify(response));
75
+ }
76
+ catch (error) {
77
+ const errorResponse = {
78
+ id: 'unknown',
79
+ error: {
80
+ code: -32700,
81
+ message: error instanceof Error ? error.message : 'Parse error',
82
+ },
83
+ };
84
+ socket.send(JSON.stringify(errorResponse));
85
+ }
86
+ });
87
+ socket.on('close', () => {
88
+ this.#connections.delete(socket);
89
+ this.#backend.setConnectionCount(this.#connections.size);
90
+ console.log(`[daemon] Client disconnected (${this.#connections.size} remaining)`);
91
+ if (this.#connections.size === 0) {
92
+ this.#resetIdleTimer();
93
+ }
94
+ });
95
+ socket.on('error', (error) => {
96
+ console.error('[daemon] Socket error:', error);
97
+ this.#connections.delete(socket);
98
+ this.#backend.setConnectionCount(this.#connections.size);
99
+ });
100
+ }
101
+ #resetIdleTimer() {
102
+ this.#clearIdleTimer();
103
+ if (this.#idleTimeout > 0 && this.#connections.size === 0) {
104
+ console.log(`[daemon] Starting idle timer (${this.#idleTimeout / 1000}s)`);
105
+ this.#idleTimer = setTimeout(() => {
106
+ console.log('[daemon] Idle timeout reached, shutting down');
107
+ this.stop();
108
+ }, this.#idleTimeout);
109
+ }
110
+ }
111
+ #clearIdleTimer() {
112
+ if (this.#idleTimer) {
113
+ clearTimeout(this.#idleTimer);
114
+ this.#idleTimer = null;
115
+ }
116
+ }
117
+ async stop() {
118
+ if (this.#isShuttingDown)
119
+ return;
120
+ this.#isShuttingDown = true;
121
+ console.log('[daemon] Shutting down...');
122
+ this.#clearIdleTimer();
123
+ // Close all WebSocket connections
124
+ for (const socket of this.#connections) {
125
+ socket.close(1000, 'Server shutting down');
126
+ }
127
+ this.#connections.clear();
128
+ // Close WebSocket server
129
+ const wsServer = this.#wsServer;
130
+ if (wsServer) {
131
+ await new Promise((resolve) => {
132
+ wsServer.close(() => resolve());
133
+ });
134
+ this.#wsServer = null;
135
+ }
136
+ // Close HTTP server
137
+ const httpServer = this.#httpServer;
138
+ if (httpServer) {
139
+ await new Promise((resolve) => {
140
+ httpServer.close(() => resolve());
141
+ });
142
+ this.#httpServer = null;
143
+ }
144
+ // Cleanup backend
145
+ await this.#backend[destroy]();
146
+ // Remove socket and PID files
147
+ try {
148
+ await unlink(this.#socketPath);
149
+ }
150
+ catch {
151
+ // Ignore
152
+ }
153
+ try {
154
+ await unlink(this.#pidFile);
155
+ }
156
+ catch {
157
+ // Ignore
158
+ }
159
+ console.log('[daemon] Stopped');
160
+ process.exit(0);
161
+ }
162
+ getStatus() {
163
+ return {
164
+ running: this.#httpServer !== null,
165
+ socketPath: this.#socketPath,
166
+ pid: process.pid,
167
+ uptime: Date.now() - this.#startTime,
168
+ connections: this.#connections.size,
169
+ };
170
+ }
171
+ }
172
+ export { Daemon };
173
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { DaemonStatus } from './daemon.schemas.js';
2
+ type DaemonManagerOptions = {
3
+ socketPath?: string;
4
+ pidFile?: string;
5
+ autoStart?: boolean;
6
+ startTimeout?: number;
7
+ };
8
+ declare class DaemonManager {
9
+ #private;
10
+ constructor(options?: DaemonManagerOptions);
11
+ getSocketPath(): string;
12
+ isRunning(): Promise<boolean>;
13
+ ensureRunning(): Promise<void>;
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ getStatus(): Promise<DaemonStatus | null>;
17
+ }
18
+ export { DaemonManager };
19
+ export type { DaemonManagerOptions };
20
+ //# sourceMappingURL=daemon.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.manager.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon.manager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,oBAAoB,GAAG;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,cAAM,aAAa;;gBAML,OAAO,CAAC,EAAE,oBAAoB;IAO1C,aAAa,IAAI,MAAM;IAIjB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAwC7B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCrB,SAAS,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAkDhD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { access, readFile } from 'node:fs/promises';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { WebSocket } from 'ws';
6
+ import { getSocketPath, getPidFile, getAutoStart } from './daemon.config.js';
7
+ class DaemonManager {
8
+ #socketPath;
9
+ #pidFile;
10
+ #autoStart;
11
+ #startTimeout;
12
+ constructor(options) {
13
+ this.#socketPath = options?.socketPath ?? getSocketPath();
14
+ this.#pidFile = options?.pidFile ?? getPidFile();
15
+ this.#autoStart = options?.autoStart ?? getAutoStart();
16
+ this.#startTimeout = options?.startTimeout ?? 30000;
17
+ }
18
+ getSocketPath() {
19
+ return this.#socketPath;
20
+ }
21
+ async isRunning() {
22
+ // Check if socket file exists
23
+ try {
24
+ await access(this.#socketPath);
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ // Try to connect and ping
30
+ return new Promise((resolve) => {
31
+ const socket = new WebSocket(`ws+unix://${this.#socketPath}:/.`);
32
+ const timeout = setTimeout(() => {
33
+ socket.close();
34
+ resolve(false);
35
+ }, 2000);
36
+ socket.on('open', () => {
37
+ // Send ping request
38
+ socket.send(JSON.stringify({ id: 'ping', method: 'system.ping', params: {} }));
39
+ });
40
+ socket.on('message', (data) => {
41
+ clearTimeout(timeout);
42
+ try {
43
+ const response = JSON.parse(data.toString());
44
+ socket.close();
45
+ resolve(response.result?.pong === true);
46
+ }
47
+ catch {
48
+ socket.close();
49
+ resolve(false);
50
+ }
51
+ });
52
+ socket.on('error', () => {
53
+ clearTimeout(timeout);
54
+ resolve(false);
55
+ });
56
+ });
57
+ }
58
+ async ensureRunning() {
59
+ if (await this.isRunning()) {
60
+ return;
61
+ }
62
+ if (!this.#autoStart) {
63
+ throw new Error('Daemon is not running and autoStart is disabled');
64
+ }
65
+ await this.start();
66
+ }
67
+ async start() {
68
+ if (await this.isRunning()) {
69
+ return;
70
+ }
71
+ // Find the daemon entry point
72
+ const currentFile = fileURLToPath(import.meta.url);
73
+ const projectRoot = dirname(dirname(dirname(currentFile)));
74
+ const daemonScript = join(projectRoot, 'bin', 'daemon.js');
75
+ // Spawn detached daemon process
76
+ const child = spawn(process.execPath, [daemonScript], {
77
+ detached: true,
78
+ stdio: 'ignore',
79
+ env: {
80
+ ...process.env,
81
+ AI_ASSIST_DAEMON: '1',
82
+ },
83
+ });
84
+ child.unref();
85
+ // Wait for socket to become available
86
+ await this.#waitForSocket();
87
+ }
88
+ async #waitForSocket() {
89
+ const startTime = Date.now();
90
+ const pollInterval = 100;
91
+ while (Date.now() - startTime < this.#startTimeout) {
92
+ if (await this.isRunning()) {
93
+ return;
94
+ }
95
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
96
+ }
97
+ throw new Error(`Daemon failed to start within ${this.#startTimeout}ms`);
98
+ }
99
+ async stop() {
100
+ if (!(await this.isRunning())) {
101
+ return;
102
+ }
103
+ // Send shutdown command
104
+ return new Promise((resolve, reject) => {
105
+ const socket = new WebSocket(`ws+unix://${this.#socketPath}:/.`);
106
+ const timeout = setTimeout(() => {
107
+ socket.close();
108
+ reject(new Error('Shutdown request timed out'));
109
+ }, 5000);
110
+ socket.on('open', () => {
111
+ socket.send(JSON.stringify({ id: 'shutdown', method: 'system.shutdown', params: {} }));
112
+ });
113
+ socket.on('message', () => {
114
+ clearTimeout(timeout);
115
+ socket.close();
116
+ resolve();
117
+ });
118
+ socket.on('error', (error) => {
119
+ clearTimeout(timeout);
120
+ reject(error);
121
+ });
122
+ socket.on('close', () => {
123
+ clearTimeout(timeout);
124
+ resolve();
125
+ });
126
+ });
127
+ }
128
+ async getStatus() {
129
+ if (!(await this.isRunning())) {
130
+ return null;
131
+ }
132
+ return new Promise((resolve) => {
133
+ const socket = new WebSocket(`ws+unix://${this.#socketPath}:/.`);
134
+ const timeout = setTimeout(() => {
135
+ socket.close();
136
+ resolve(null);
137
+ }, 2000);
138
+ socket.on('open', () => {
139
+ socket.send(JSON.stringify({ id: 'status', method: 'system.status', params: {} }));
140
+ });
141
+ socket.on('message', async (data) => {
142
+ clearTimeout(timeout);
143
+ try {
144
+ const response = JSON.parse(data.toString());
145
+ socket.close();
146
+ // Read PID from file
147
+ let pid = 0;
148
+ try {
149
+ const pidContent = await readFile(this.#pidFile, 'utf8');
150
+ pid = parseInt(pidContent, 10);
151
+ }
152
+ catch {
153
+ // Ignore
154
+ }
155
+ resolve({
156
+ running: true,
157
+ socketPath: this.#socketPath,
158
+ pid,
159
+ uptime: response.result?.uptime ?? 0,
160
+ connections: response.result?.connections ?? 0,
161
+ });
162
+ }
163
+ catch {
164
+ socket.close();
165
+ resolve(null);
166
+ }
167
+ });
168
+ socket.on('error', () => {
169
+ clearTimeout(timeout);
170
+ resolve(null);
171
+ });
172
+ });
173
+ }
174
+ }
175
+ export { DaemonManager };
176
+ //# sourceMappingURL=daemon.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.manager.js","sourceRoot":"","sources":["../../src/daemon/daemon.manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ declare const daemonStatusSchema: z.ZodObject<{
3
+ running: z.ZodBoolean;
4
+ socketPath: z.ZodString;
5
+ pid: z.ZodNumber;
6
+ uptime: z.ZodNumber;
7
+ connections: z.ZodNumber;
8
+ }, "strip", z.ZodTypeAny, {
9
+ uptime: number;
10
+ connections: number;
11
+ socketPath: string;
12
+ running: boolean;
13
+ pid: number;
14
+ }, {
15
+ uptime: number;
16
+ connections: number;
17
+ socketPath: string;
18
+ running: boolean;
19
+ pid: number;
20
+ }>;
21
+ type DaemonStatus = z.infer<typeof daemonStatusSchema>;
22
+ declare const daemonOptionsSchema: z.ZodObject<{
23
+ socketPath: z.ZodOptional<z.ZodString>;
24
+ idleTimeout: z.ZodDefault<z.ZodNumber>;
25
+ pidFile: z.ZodOptional<z.ZodString>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ idleTimeout: number;
28
+ socketPath?: string | undefined;
29
+ pidFile?: string | undefined;
30
+ }, {
31
+ socketPath?: string | undefined;
32
+ pidFile?: string | undefined;
33
+ idleTimeout?: number | undefined;
34
+ }>;
35
+ type DaemonOptions = z.infer<typeof daemonOptionsSchema>;
36
+ export type { DaemonStatus, DaemonOptions };
37
+ export { daemonStatusSchema, daemonOptionsSchema };
38
+ //# sourceMappingURL=daemon.schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.schemas.d.ts","sourceRoot":"","sources":["../../src/daemon/daemon.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,QAAA,MAAM,mBAAmB;;;;;;;;;;;;EAIvB,CAAC;AAEH,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ const daemonStatusSchema = z.object({
3
+ running: z.boolean(),
4
+ socketPath: z.string(),
5
+ pid: z.number(),
6
+ uptime: z.number(),
7
+ connections: z.number(),
8
+ });
9
+ const daemonOptionsSchema = z.object({
10
+ socketPath: z.string().optional(),
11
+ idleTimeout: z.number().default(300000), // 5 minutes
12
+ pidFile: z.string().optional(),
13
+ });
14
+ export { daemonStatusSchema, daemonOptionsSchema };
15
+ //# sourceMappingURL=daemon.schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.schemas.js","sourceRoot":"","sources":["../../src/daemon/daemon.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAIH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY;IACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAKH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import knex from 'knex';
2
+ import { destroy } from '#root/utils/utils.services.js';
3
+ declare class DatabaseService {
4
+ #private;
5
+ getInstance: () => Promise<knex.Knex<any, any[]>>;
6
+ [destroy]: () => Promise<void>;
7
+ }
8
+ export { tableNames } from './migrations/migrations.js';
9
+ export { DatabaseService };
10
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAGA,OAAO,IAAmB,MAAM,MAAM,CAAC;AAMvC,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,cAAM,eAAe;;IAmCZ,WAAW,uCAKhB;IAEF,CAAC,OAAO,CAAC,sBAMP;CACH;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { mkdirSync, existsSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import knex, {} from 'knex';
4
+ import { migrationSource } from './migrations/migrations.js';
5
+ import { config } from '#root/config/config.js';
6
+ import { destroy } from '#root/utils/utils.services.js';
7
+ class DatabaseService {
8
+ #instance;
9
+ #setup = async () => {
10
+ const sqliteVec = await import('sqlite-vec');
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const dbPath = config.get('database.path');
13
+ // Ensure directory exists
14
+ const dbDir = dirname(dbPath);
15
+ if (!existsSync(dbDir)) {
16
+ mkdirSync(dbDir, { recursive: true });
17
+ }
18
+ const db = knex({
19
+ client: 'better-sqlite3',
20
+ connection: {
21
+ filename: dbPath,
22
+ },
23
+ useNullAsDefault: true,
24
+ pool: {
25
+ afterCreate: (conn, done) => {
26
+ sqliteVec.load(conn);
27
+ done(null, conn);
28
+ },
29
+ },
30
+ });
31
+ await db.migrate.latest({
32
+ migrationSource,
33
+ });
34
+ return db;
35
+ };
36
+ getInstance = async () => {
37
+ if (!this.#instance) {
38
+ this.#instance = this.#setup();
39
+ }
40
+ return await this.#instance;
41
+ };
42
+ [destroy] = async () => {
43
+ if (!this.#instance) {
44
+ return;
45
+ }
46
+ const database = await this.#instance;
47
+ await database.destroy();
48
+ };
49
+ }
50
+ export { tableNames } from './migrations/migrations.js';
51
+ export { DatabaseService };
52
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,IAAI,EAAE,EAAa,MAAM,MAAM,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,MAAM,eAAe;IACnB,SAAS,CAAiB;IAE1B,MAAM,GAAG,KAAK,IAAI,EAAE;QAClB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC7C,8DAA8D;QAC9D,MAAM,MAAM,GAAI,MAAc,CAAC,GAAG,CAAC,eAAe,CAAW,CAAC;QAE9D,0BAA0B;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC;YACd,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE;gBACV,QAAQ,EAAE,MAAM;aACjB;YACD,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE;gBACJ,WAAW,EAAE,CAAC,IAAQ,EAAE,IAAsC,EAAE,EAAE;oBAChE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnB,CAAC;aACF;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB,eAAe;SAChB,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEK,WAAW,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC;IAC9B,CAAC,CAAC;IAEF,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;QACtC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;CACH;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Migration } from './migrations.types.js';
2
+ declare const tableNames: {
3
+ collections: string;
4
+ referenceDocuments: string;
5
+ referenceDocumentChunks: string;
6
+ };
7
+ declare const init: Migration;
8
+ export { init, tableNames };
9
+ //# sourceMappingURL=migrations.001-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.001-init.d.ts","sourceRoot":"","sources":["../../../src/database/migrations/migrations.001-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAA,MAAM,UAAU;;;;CAIf,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,SA6CX,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,46 @@
1
+ const tableNames = {
2
+ collections: 'collections',
3
+ referenceDocuments: 'reference_documents',
4
+ referenceDocumentChunks: 'reference_documentchunks',
5
+ };
6
+ const init = {
7
+ name: 'init',
8
+ up: async (knex) => {
9
+ await knex.schema.createTable(tableNames.collections, (table) => {
10
+ table.string('id').primary();
11
+ table.text('url').notNullable();
12
+ // manifest metadata
13
+ table.string('name').nullable();
14
+ table.string('version').nullable();
15
+ table.text('description').nullable();
16
+ table.string('manifest_hash').nullable();
17
+ // sync state
18
+ table.string('last_sync_at').nullable();
19
+ table.string('created_at').notNullable();
20
+ table.string('updated_at').notNullable();
21
+ });
22
+ await knex.schema.createTable(tableNames.referenceDocuments, (table) => {
23
+ table.string('collection').notNullable();
24
+ table.string('id').notNullable().index();
25
+ table.string('hash').notNullable().index();
26
+ table.text('content').notNullable();
27
+ table.primary(['collection', 'id']);
28
+ });
29
+ await knex.schema.createTable(tableNames.referenceDocumentChunks, (table) => {
30
+ table.string('id').primary();
31
+ table.string('document').notNullable();
32
+ table.string('collection').notNullable();
33
+ table.text('content').notNullable();
34
+ table.specificType('embedding', 'vector(1024)').notNullable();
35
+ table.index(['collection']);
36
+ table.index(['collection', 'document']);
37
+ });
38
+ },
39
+ down: async (knex) => {
40
+ await knex.schema.dropTable(tableNames.referenceDocumentChunks);
41
+ await knex.schema.dropTable(tableNames.referenceDocuments);
42
+ await knex.schema.dropTable(tableNames.collections);
43
+ },
44
+ };
45
+ export { init, tableNames };
46
+ //# sourceMappingURL=migrations.001-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.001-init.js","sourceRoot":"","sources":["../../../src/database/migrations/migrations.001-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Migration } from './migrations.types.js';
2
+ declare const ftsTableNames: {
3
+ referenceDocumentChunksFts: string;
4
+ };
5
+ /**
6
+ * Migration to add FTS5 virtual table for hybrid search.
7
+ * This enables keyword-based search alongside vector similarity search.
8
+ */
9
+ declare const fts5: Migration;
10
+ export { fts5, ftsTableNames };
11
+ //# sourceMappingURL=migrations.002-fts5.d.ts.map