ctxpkg 0.0.3 → 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 +2 -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,597 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { glob, readFile } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { TokenTextSplitter } from '@langchain/textsplitters';
5
+ import { pipeline, cos_sim } from '@huggingface/transformers';
6
+ import { searchChunkItemSchema, } from './documents.schemas.js';
7
+ import { DatabaseService, tableNames } from '#root/database/database.js';
8
+ import { EmbedderService } from '#root/embedder/embedder.js';
9
+ // Chunking configuration
10
+ const CHUNK_SIZE = 400;
11
+ const CHUNK_OVERLAP = 80;
12
+ // Search configuration
13
+ const RRF_K = 60; // Reciprocal Rank Fusion constant
14
+ const RERANK_CANDIDATES_MULTIPLIER = 3; // Fetch 3x candidates for re-ranking
15
+ class DocumentsService {
16
+ #services;
17
+ #reranker;
18
+ constructor(services) {
19
+ this.#services = services;
20
+ }
21
+ /**
22
+ * Lazily initialize the re-ranker model.
23
+ * Uses a smaller, faster model for re-ranking candidates.
24
+ */
25
+ #getReranker = async () => {
26
+ if (!this.#reranker) {
27
+ // Use a smaller model for fast re-ranking
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ const loadPipeline = pipeline;
30
+ this.#reranker = loadPipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
31
+ }
32
+ return this.#reranker;
33
+ };
34
+ /**
35
+ * Extract document title from markdown content.
36
+ */
37
+ #extractTitle = (content, fallback) => {
38
+ const titleMatch = content.match(/^#\s+(.+)$/m);
39
+ return titleMatch?.[1]?.trim() || fallback;
40
+ };
41
+ /**
42
+ * Extract the nearest preceding heading for a chunk position.
43
+ */
44
+ #extractSectionHeading = (content, chunkStart) => {
45
+ const beforeChunk = content.slice(0, chunkStart);
46
+ const headings = beforeChunk.match(/^#{1,6}\s+.+$/gm);
47
+ return headings?.[headings.length - 1]?.replace(/^#+\s+/, '') || null;
48
+ };
49
+ listCollections = async () => {
50
+ const databaseService = this.#services.get(DatabaseService);
51
+ const database = await databaseService.getInstance();
52
+ // Get document counts per collection
53
+ const docCounts = await database(tableNames.referenceDocuments)
54
+ .select('collection', database.raw('COUNT(*) as document_count'))
55
+ .groupBy('collection')
56
+ .orderBy('collection', 'asc');
57
+ // Get collection metadata (description, version) from collections table
58
+ const collectionIds = docCounts.map((c) => c.collection);
59
+ const collectionMeta = await database(tableNames.collections)
60
+ .select('id', 'description', 'version')
61
+ .whereIn('id', collectionIds);
62
+ // Build a map of collection ID -> metadata
63
+ const metaMap = new Map();
64
+ for (const meta of collectionMeta) {
65
+ metaMap.set(meta.id, { description: meta.description, version: meta.version });
66
+ }
67
+ // Merge counts with metadata
68
+ return docCounts.map((c) => {
69
+ const meta = metaMap.get(c.collection);
70
+ return {
71
+ collection: c.collection,
72
+ document_count: c.document_count,
73
+ description: meta?.description ?? null,
74
+ version: meta?.version ?? null,
75
+ };
76
+ });
77
+ };
78
+ dropCollection = async (collection) => {
79
+ const databaseService = this.#services.get(DatabaseService);
80
+ const database = await databaseService.getInstance();
81
+ await database.transaction(async (trx) => {
82
+ await trx(tableNames.referenceDocumentChunks).delete().where({ collection });
83
+ await trx(tableNames.referenceDocumentChunksFts).delete().where({ collection });
84
+ await trx(tableNames.referenceDocuments).delete().where({ collection });
85
+ });
86
+ };
87
+ updateCollectionFromGlob = async (options) => {
88
+ const { pattern, collection, cwd } = options;
89
+ for await (const file of glob(pattern, { cwd })) {
90
+ const fullPath = resolve(cwd, file);
91
+ const content = await readFile(fullPath, 'utf8');
92
+ await this.updateDocument({
93
+ collection: collection || cwd,
94
+ id: file,
95
+ content,
96
+ });
97
+ }
98
+ };
99
+ updateDocument = async (document) => {
100
+ const databaseService = this.#services.get(DatabaseService);
101
+ const database = await databaseService.getInstance();
102
+ const hash = createHash('sha256').update(document.content).digest('hex');
103
+ const [current] = await database(tableNames.referenceDocuments)
104
+ .where({ collection: document.collection, id: document.id })
105
+ .limit(1);
106
+ if (current && current.hash === hash) {
107
+ return;
108
+ }
109
+ await database.transaction(async (trx) => {
110
+ // Clean up existing chunks (both vector and FTS)
111
+ if (current) {
112
+ await trx(tableNames.referenceDocumentChunks).delete().where({
113
+ collection: document.collection,
114
+ document: document.id,
115
+ });
116
+ await trx(tableNames.referenceDocumentChunksFts).delete().where({
117
+ collection: document.collection,
118
+ document: document.id,
119
+ });
120
+ await trx(tableNames.referenceDocuments)
121
+ .update({
122
+ hash,
123
+ content: document.content,
124
+ })
125
+ .where({
126
+ collection: document.collection,
127
+ id: document.id,
128
+ });
129
+ }
130
+ else {
131
+ await trx(tableNames.referenceDocuments).insert({
132
+ collection: document.collection,
133
+ id: document.id,
134
+ hash,
135
+ content: document.content,
136
+ });
137
+ }
138
+ // Create chunks with improved settings
139
+ const splitter = new TokenTextSplitter({
140
+ encodingName: 'cl100k_base',
141
+ chunkSize: CHUNK_SIZE,
142
+ chunkOverlap: CHUNK_OVERLAP,
143
+ });
144
+ const chunks = (await splitter.createDocuments([document.content]));
145
+ // Extract document title for context
146
+ const title = this.#extractTitle(document.content, document.id);
147
+ // Create contextualized chunks with document and section context
148
+ const contextualizedChunks = chunks.map((chunk) => {
149
+ // Find the character position approximately (using line info if available)
150
+ const lines = document.content.split('\n');
151
+ let charPos = 0;
152
+ const startLine = chunk.metadata?.loc?.lines?.from ?? 0;
153
+ for (let i = 0; i < startLine && i < lines.length; i++) {
154
+ charPos += lines[i].length + 1;
155
+ }
156
+ const sectionHeading = this.#extractSectionHeading(document.content, charPos);
157
+ // Build context prefix
158
+ let contextPrefix = `Document: ${title}`;
159
+ if (sectionHeading && sectionHeading !== title) {
160
+ contextPrefix += `\nSection: ${sectionHeading}`;
161
+ }
162
+ return {
163
+ // Embed with context for better semantic understanding
164
+ textForEmbedding: `${contextPrefix}\n\n${chunk.pageContent}`,
165
+ // Store original content for display
166
+ originalContent: chunk.pageContent,
167
+ };
168
+ });
169
+ // Create embeddings using document embedding method (no query instruction)
170
+ const embedder = this.#services.get(EmbedderService);
171
+ const embeddings = await embedder.createDocumentEmbeddings(contextualizedChunks.map((c) => c.textForEmbedding));
172
+ // Insert chunks into vector table
173
+ const chunkRecords = embeddings.map((embedding, i) => ({
174
+ id: randomUUID(),
175
+ collection: document.collection,
176
+ document: document.id,
177
+ content: contextualizedChunks[i].originalContent,
178
+ embedding: JSON.stringify(embedding),
179
+ }));
180
+ await trx(tableNames.referenceDocumentChunks).insert(chunkRecords);
181
+ // Insert into FTS5 table for hybrid search
182
+ await trx(tableNames.referenceDocumentChunksFts).insert(chunkRecords.map((record) => ({
183
+ id: record.id,
184
+ collection: record.collection,
185
+ document: record.document,
186
+ content: record.content,
187
+ })));
188
+ });
189
+ };
190
+ search = async (options) => {
191
+ const { query, collections, limit = 10, maxDistance, hybridSearch = true, rerank = false } = options;
192
+ const databaseService = this.#services.get(DatabaseService);
193
+ const database = await databaseService.getInstance();
194
+ // Determine how many candidates to fetch
195
+ const candidateLimit = rerank ? limit * RERANK_CANDIDATES_MULTIPLIER : limit;
196
+ // 1. Vector similarity search using cosine distance
197
+ const embedder = this.#services.get(EmbedderService);
198
+ const queryEmbedding = await embedder.createQueryEmbedding(query);
199
+ // Build vector search query
200
+ // Note: We use a subquery to filter by computed distance since SQLite
201
+ // doesn't support HAVING without GROUP BY
202
+ let vectorQuery = database(tableNames.referenceDocumentChunks)
203
+ .select('id', 'collection', 'document', 'content')
204
+ .select(database.raw('vec_distance_cosine(?, embedding) as distance', [JSON.stringify(queryEmbedding)]));
205
+ if (collections) {
206
+ vectorQuery = vectorQuery.whereIn('collection', collections);
207
+ }
208
+ vectorQuery = vectorQuery.orderBy('distance', 'asc').limit(candidateLimit);
209
+ let vectorResults = await vectorQuery;
210
+ // Filter by maxDistance if specified (done in JS since SQLite doesn't support HAVING on computed columns)
211
+ if (maxDistance !== undefined) {
212
+ vectorResults = vectorResults.filter((row) => row.distance <= maxDistance);
213
+ }
214
+ // 2. Keyword search using FTS5 (if hybrid search enabled)
215
+ let keywordResults = [];
216
+ if (hybridSearch) {
217
+ // Escape special FTS5 characters and create search query
218
+ const ftsQuery = query
219
+ .replace(/['"(){}[\]*:^~\\]/g, ' ')
220
+ .split(/\s+/)
221
+ .filter((term) => term.length > 0)
222
+ .map((term) => `"${term}"`)
223
+ .join(' OR ');
224
+ if (ftsQuery) {
225
+ let ftsDbQuery = database(tableNames.referenceDocumentChunksFts)
226
+ .select('id', 'collection', 'document', 'content')
227
+ .select(database.raw('rank as rank'))
228
+ .whereRaw(`${tableNames.referenceDocumentChunksFts} MATCH ?`, [ftsQuery]);
229
+ if (collections) {
230
+ ftsDbQuery = ftsDbQuery.whereIn('collection', collections);
231
+ }
232
+ ftsDbQuery = ftsDbQuery.orderBy('rank', 'asc').limit(candidateLimit);
233
+ try {
234
+ keywordResults = await ftsDbQuery;
235
+ }
236
+ catch {
237
+ // FTS query might fail for edge cases, fall back to vector-only
238
+ keywordResults = [];
239
+ }
240
+ }
241
+ }
242
+ // 3. Merge results using Reciprocal Rank Fusion (RRF)
243
+ let mergedResults;
244
+ if (hybridSearch && keywordResults.length > 0) {
245
+ mergedResults = this.#reciprocalRankFusion(vectorResults, keywordResults, candidateLimit);
246
+ }
247
+ else {
248
+ // Vector-only results
249
+ mergedResults = vectorResults.map((row) => ({
250
+ id: row.id,
251
+ document: row.document,
252
+ collection: row.collection,
253
+ content: row.content,
254
+ distance: row.distance,
255
+ score: 1 / (RRF_K + 1), // Single source score
256
+ }));
257
+ }
258
+ // 4. Re-rank using cross-encoder (if enabled)
259
+ if (rerank && mergedResults.length > 0) {
260
+ mergedResults = await this.#rerankResults(query, mergedResults);
261
+ }
262
+ // 5. Apply final limit and return
263
+ return mergedResults.slice(0, limit).map((row) => searchChunkItemSchema.parse(row));
264
+ };
265
+ /**
266
+ * Merge vector and keyword search results using Reciprocal Rank Fusion.
267
+ * RRF score = sum(1 / (k + rank)) for each result across all rankings.
268
+ */
269
+ #reciprocalRankFusion = (vectorResults, keywordResults, limit) => {
270
+ const scoreMap = new Map();
271
+ // Add vector results with RRF scores
272
+ vectorResults.forEach((item, rank) => {
273
+ const rrfScore = 1 / (RRF_K + rank + 1);
274
+ scoreMap.set(item.id, {
275
+ item: {
276
+ id: item.id,
277
+ document: item.document,
278
+ collection: item.collection,
279
+ content: item.content,
280
+ distance: item.distance,
281
+ },
282
+ score: rrfScore,
283
+ });
284
+ });
285
+ // Add keyword results with RRF scores
286
+ keywordResults.forEach((item, rank) => {
287
+ const rrfScore = 1 / (RRF_K + rank + 1);
288
+ const existing = scoreMap.get(item.id);
289
+ if (existing) {
290
+ // Combine scores if item appears in both result sets
291
+ existing.score += rrfScore;
292
+ }
293
+ else {
294
+ scoreMap.set(item.id, {
295
+ item: {
296
+ id: item.id,
297
+ document: item.document,
298
+ collection: item.collection,
299
+ content: item.content,
300
+ distance: 1, // Default distance for keyword-only results
301
+ },
302
+ score: rrfScore,
303
+ });
304
+ }
305
+ });
306
+ // Sort by combined RRF score (higher is better)
307
+ const sorted = Array.from(scoreMap.values())
308
+ .sort((a, b) => b.score - a.score)
309
+ .slice(0, limit);
310
+ return sorted.map(({ item, score }) => ({ ...item, score }));
311
+ };
312
+ /**
313
+ * Re-rank results using a secondary embedding model for higher precision.
314
+ * Uses cosine similarity with a different model to diversify ranking signals.
315
+ */
316
+ #rerankResults = async (query, results) => {
317
+ if (results.length === 0)
318
+ return results;
319
+ const reranker = await this.#getReranker();
320
+ // Get embeddings for query and all result contents
321
+ const queryEmbedding = await reranker(query, { pooling: 'mean', normalize: true });
322
+ const contentEmbeddings = await reranker(results.map((r) => r.content), { pooling: 'mean', normalize: true });
323
+ // Compute cosine similarity scores
324
+ const queryVec = queryEmbedding.tolist()[0];
325
+ const contentVecs = contentEmbeddings.tolist();
326
+ const scored = results.map((result, i) => {
327
+ const similarity = cos_sim(queryVec, contentVecs[i]);
328
+ return { ...result, score: similarity };
329
+ });
330
+ // Sort by re-ranker score (higher similarity is better)
331
+ return scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
332
+ };
333
+ getDocument = async (collection, id) => {
334
+ const databaseService = this.#services.get(DatabaseService);
335
+ const database = await databaseService.getInstance();
336
+ const [document] = await database(tableNames.referenceDocuments)
337
+ .select('collection', 'id', 'content')
338
+ .where({ collection, id })
339
+ .limit(1);
340
+ if (!document) {
341
+ return null;
342
+ }
343
+ return {
344
+ collection: document.collection,
345
+ id: document.id,
346
+ content: document.content,
347
+ };
348
+ };
349
+ /**
350
+ * Get all document IDs and hashes in a collection.
351
+ */
352
+ getDocumentIds = async (collection) => {
353
+ const databaseService = this.#services.get(DatabaseService);
354
+ const database = await databaseService.getInstance();
355
+ const documents = await database(tableNames.referenceDocuments).select('id', 'hash').where({ collection });
356
+ return documents.map((doc) => ({ id: doc.id, hash: doc.hash }));
357
+ };
358
+ /**
359
+ * Delete a specific document from a collection.
360
+ */
361
+ deleteDocument = async (collection, id) => {
362
+ const databaseService = this.#services.get(DatabaseService);
363
+ const database = await databaseService.getInstance();
364
+ await database.transaction(async (trx) => {
365
+ await trx(tableNames.referenceDocumentChunks).delete().where({
366
+ collection,
367
+ document: id,
368
+ });
369
+ await trx(tableNames.referenceDocumentChunksFts).delete().where({
370
+ collection,
371
+ document: id,
372
+ });
373
+ await trx(tableNames.referenceDocuments).delete().where({
374
+ collection,
375
+ id,
376
+ });
377
+ });
378
+ };
379
+ /**
380
+ * Delete multiple documents from a collection.
381
+ */
382
+ deleteDocuments = async (collection, ids) => {
383
+ if (ids.length === 0)
384
+ return;
385
+ const databaseService = this.#services.get(DatabaseService);
386
+ const database = await databaseService.getInstance();
387
+ await database.transaction(async (trx) => {
388
+ await trx(tableNames.referenceDocumentChunks).delete().where({ collection }).whereIn('document', ids);
389
+ await trx(tableNames.referenceDocumentChunksFts).delete().where({ collection }).whereIn('document', ids);
390
+ await trx(tableNames.referenceDocuments).delete().where({ collection }).whereIn('id', ids);
391
+ });
392
+ };
393
+ // === New methods for MCP tools v2 ===
394
+ /**
395
+ * List documents in a collection with pagination.
396
+ */
397
+ listDocuments = async (params) => {
398
+ const { collection, limit = 100, offset = 0 } = params;
399
+ const databaseService = this.#services.get(DatabaseService);
400
+ const database = await databaseService.getInstance();
401
+ // Get total count
402
+ const [{ count: total }] = await database(tableNames.referenceDocuments).where({ collection }).count('* as count');
403
+ // Get documents with pagination
404
+ const documents = await database(tableNames.referenceDocuments)
405
+ .select('id', 'content')
406
+ .where({ collection })
407
+ .orderBy('id', 'asc')
408
+ .limit(limit)
409
+ .offset(offset);
410
+ const documentInfos = documents.map((doc) => ({
411
+ id: doc.id,
412
+ title: this.#extractTitle(doc.content, doc.id),
413
+ size: doc.content.length,
414
+ }));
415
+ return {
416
+ documents: documentInfos,
417
+ total: Number(total),
418
+ hasMore: offset + documents.length < Number(total),
419
+ };
420
+ };
421
+ /**
422
+ * Get the outline (heading structure) of a document.
423
+ */
424
+ getOutline = async (params) => {
425
+ const { collection, document: documentId, maxDepth = 3 } = params;
426
+ const doc = await this.getDocument(collection, documentId);
427
+ if (!doc) {
428
+ return null;
429
+ }
430
+ const title = this.#extractTitle(doc.content, documentId);
431
+ const outline = this.#parseOutline(doc.content, maxDepth);
432
+ return { title, outline };
433
+ };
434
+ /**
435
+ * Parse markdown content to extract heading outline.
436
+ */
437
+ #parseOutline = (content, maxDepth) => {
438
+ const lines = content.split('\n');
439
+ const outline = [];
440
+ for (let i = 0; i < lines.length; i++) {
441
+ const line = lines[i];
442
+ const match = line.match(/^(#{1,6})\s+(.+)$/);
443
+ if (match) {
444
+ const level = match[1].length;
445
+ if (level <= maxDepth) {
446
+ outline.push({
447
+ level,
448
+ text: match[2].trim(),
449
+ line: i + 1, // 1-indexed line numbers
450
+ });
451
+ }
452
+ }
453
+ }
454
+ return outline;
455
+ };
456
+ /**
457
+ * Get a specific section of a document by heading.
458
+ */
459
+ getSection = async (params) => {
460
+ const { collection, document: documentId, section, includeSubsections = true } = params;
461
+ const doc = await this.getDocument(collection, documentId);
462
+ if (!doc) {
463
+ return null;
464
+ }
465
+ const lines = doc.content.split('\n');
466
+ let startLine = -1;
467
+ let endLine = lines.length;
468
+ let matchedHeading = '';
469
+ let headingLevel = 0;
470
+ // Find the section heading (case-insensitive substring match)
471
+ const sectionLower = section.toLowerCase();
472
+ for (let i = 0; i < lines.length; i++) {
473
+ const line = lines[i];
474
+ const match = line.match(/^(#{1,6})\s+(.+)$/);
475
+ if (match) {
476
+ const level = match[1].length;
477
+ const text = match[2].trim();
478
+ if (startLine === -1) {
479
+ // Looking for the start
480
+ if (text.toLowerCase().includes(sectionLower)) {
481
+ startLine = i;
482
+ matchedHeading = text;
483
+ headingLevel = level;
484
+ }
485
+ }
486
+ else {
487
+ // Looking for the end
488
+ if (includeSubsections) {
489
+ // Stop at same or higher level heading
490
+ if (level <= headingLevel) {
491
+ endLine = i;
492
+ break;
493
+ }
494
+ }
495
+ else {
496
+ // Stop at any heading
497
+ endLine = i;
498
+ break;
499
+ }
500
+ }
501
+ }
502
+ }
503
+ if (startLine === -1) {
504
+ return null;
505
+ }
506
+ const sectionContent = lines.slice(startLine, endLine).join('\n');
507
+ return {
508
+ section: matchedHeading,
509
+ level: headingLevel,
510
+ content: sectionContent,
511
+ startLine: startLine + 1, // 1-indexed
512
+ endLine: endLine, // 1-indexed (exclusive)
513
+ };
514
+ };
515
+ /**
516
+ * Find content related to a document or chunk.
517
+ */
518
+ findRelated = async (params) => {
519
+ const { collection, document: documentId, chunk, limit = 5, sameDocument = false } = params;
520
+ const databaseService = this.#services.get(DatabaseService);
521
+ const database = await databaseService.getInstance();
522
+ const embedder = this.#services.get(EmbedderService);
523
+ let queryEmbedding;
524
+ if (chunk) {
525
+ // Embed the provided chunk
526
+ queryEmbedding = await embedder.createQueryEmbedding(chunk);
527
+ }
528
+ else {
529
+ // Compute centroid of document's chunk embeddings
530
+ const chunks = await database(tableNames.referenceDocumentChunks)
531
+ .select('embedding')
532
+ .where({ collection, document: documentId });
533
+ if (chunks.length === 0) {
534
+ return [];
535
+ }
536
+ // Parse embeddings and compute mean
537
+ const embeddings = chunks.map((c) => JSON.parse(c.embedding));
538
+ const dimensions = embeddings[0].length;
539
+ const centroid = new Array(dimensions).fill(0);
540
+ for (const emb of embeddings) {
541
+ for (let i = 0; i < dimensions; i++) {
542
+ centroid[i] += emb[i];
543
+ }
544
+ }
545
+ for (let i = 0; i < dimensions; i++) {
546
+ centroid[i] /= embeddings.length;
547
+ }
548
+ queryEmbedding = centroid;
549
+ }
550
+ // Search for similar chunks
551
+ let query = database(tableNames.referenceDocumentChunks)
552
+ .select('id', 'collection', 'document', 'content')
553
+ .select(database.raw('vec_distance_cosine(?, embedding) as distance', [JSON.stringify(queryEmbedding)]));
554
+ // Exclude source document unless sameDocument is true
555
+ if (!sameDocument) {
556
+ // Use explicit whereNot with function to ensure correct SQL generation
557
+ query = query.whereNot(function () {
558
+ this.where('collection', collection).andWhere('document', documentId);
559
+ });
560
+ }
561
+ // When sameDocument is true, we include all chunks (no exclusion)
562
+ query = query.orderBy('distance', 'asc').limit(limit);
563
+ const results = await query;
564
+ return results.map((row) => ({
565
+ id: row.id,
566
+ document: row.document,
567
+ collection: row.collection,
568
+ content: row.content,
569
+ distance: row.distance,
570
+ score: 1 - row.distance, // Convert distance to similarity score
571
+ }));
572
+ };
573
+ /**
574
+ * Execute multiple search queries in batch.
575
+ */
576
+ searchBatch = async (params) => {
577
+ const { queries, limit = 5, maxDistance, hybridSearch = true } = params;
578
+ const results = [];
579
+ for (const q of queries) {
580
+ const searchResults = await this.search({
581
+ query: q.query,
582
+ collections: q.collections,
583
+ limit,
584
+ maxDistance,
585
+ hybridSearch,
586
+ rerank: false, // Don't rerank in batch for performance
587
+ });
588
+ results.push({
589
+ query: q.query,
590
+ results: searchResults,
591
+ });
592
+ }
593
+ return { results };
594
+ };
595
+ }
596
+ export { DocumentsService };
597
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/documents/documents.ts"],"names":[],"mappings":"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"}