bulkhead-runtime 0.1.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +625 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +43 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.d.ts +29 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +24 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/credentials/index.d.ts +4 -0
  12. package/dist/credentials/index.d.ts.map +1 -0
  13. package/dist/credentials/index.js +3 -0
  14. package/dist/credentials/index.js.map +1 -0
  15. package/dist/credentials/proxy.d.ts +3 -0
  16. package/dist/credentials/proxy.d.ts.map +1 -0
  17. package/dist/credentials/proxy.js +11 -0
  18. package/dist/credentials/proxy.js.map +1 -0
  19. package/dist/credentials/store.d.ts +7 -0
  20. package/dist/credentials/store.d.ts.map +1 -0
  21. package/dist/credentials/store.js +91 -0
  22. package/dist/credentials/store.js.map +1 -0
  23. package/dist/credentials/types.d.ts +14 -0
  24. package/dist/credentials/types.d.ts.map +1 -0
  25. package/dist/credentials/types.js +2 -0
  26. package/dist/credentials/types.js.map +1 -0
  27. package/dist/hooks/index.d.ts +3 -0
  28. package/dist/hooks/index.d.ts.map +1 -0
  29. package/dist/hooks/index.js +2 -0
  30. package/dist/hooks/index.js.map +1 -0
  31. package/dist/hooks/runner.d.ts +7 -0
  32. package/dist/hooks/runner.d.ts.map +1 -0
  33. package/dist/hooks/runner.js +20 -0
  34. package/dist/hooks/runner.js.map +1 -0
  35. package/dist/hooks/types.d.ts +39 -0
  36. package/dist/hooks/types.d.ts.map +1 -0
  37. package/dist/hooks/types.js +2 -0
  38. package/dist/hooks/types.js.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +21 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/infra/env.d.ts +2 -0
  44. package/dist/infra/env.d.ts.map +1 -0
  45. package/dist/infra/env.js +6 -0
  46. package/dist/infra/env.js.map +1 -0
  47. package/dist/infra/warning-filter.d.ts +8 -0
  48. package/dist/infra/warning-filter.d.ts.map +1 -0
  49. package/dist/infra/warning-filter.js +66 -0
  50. package/dist/infra/warning-filter.js.map +1 -0
  51. package/dist/logging/subsystem.d.ts +15 -0
  52. package/dist/logging/subsystem.d.ts.map +1 -0
  53. package/dist/logging/subsystem.js +57 -0
  54. package/dist/logging/subsystem.js.map +1 -0
  55. package/dist/memory/embeddings-debug.d.ts +2 -0
  56. package/dist/memory/embeddings-debug.d.ts.map +1 -0
  57. package/dist/memory/embeddings-debug.js +12 -0
  58. package/dist/memory/embeddings-debug.js.map +1 -0
  59. package/dist/memory/embeddings.d.ts +16 -0
  60. package/dist/memory/embeddings.d.ts.map +1 -0
  61. package/dist/memory/embeddings.js +180 -0
  62. package/dist/memory/embeddings.js.map +1 -0
  63. package/dist/memory/fs-utils.d.ts +12 -0
  64. package/dist/memory/fs-utils.d.ts.map +1 -0
  65. package/dist/memory/fs-utils.js +24 -0
  66. package/dist/memory/fs-utils.js.map +1 -0
  67. package/dist/memory/hybrid.d.ts +46 -0
  68. package/dist/memory/hybrid.d.ts.map +1 -0
  69. package/dist/memory/hybrid.js +81 -0
  70. package/dist/memory/hybrid.js.map +1 -0
  71. package/dist/memory/index.d.ts +12 -0
  72. package/dist/memory/index.d.ts.map +1 -0
  73. package/dist/memory/index.js +12 -0
  74. package/dist/memory/index.js.map +1 -0
  75. package/dist/memory/internal.d.ts +39 -0
  76. package/dist/memory/internal.d.ts.map +1 -0
  77. package/dist/memory/internal.js +292 -0
  78. package/dist/memory/internal.js.map +1 -0
  79. package/dist/memory/manager-search.d.ts +61 -0
  80. package/dist/memory/manager-search.d.ts.map +1 -0
  81. package/dist/memory/manager-search.js +102 -0
  82. package/dist/memory/manager-search.js.map +1 -0
  83. package/dist/memory/mmr.d.ts +63 -0
  84. package/dist/memory/mmr.d.ts.map +1 -0
  85. package/dist/memory/mmr.js +165 -0
  86. package/dist/memory/mmr.js.map +1 -0
  87. package/dist/memory/query-expansion.d.ts +42 -0
  88. package/dist/memory/query-expansion.d.ts.map +1 -0
  89. package/dist/memory/query-expansion.js +776 -0
  90. package/dist/memory/query-expansion.js.map +1 -0
  91. package/dist/memory/simple-manager.d.ts +23 -0
  92. package/dist/memory/simple-manager.d.ts.map +1 -0
  93. package/dist/memory/simple-manager.js +193 -0
  94. package/dist/memory/simple-manager.js.map +1 -0
  95. package/dist/memory/sqlite.d.ts +2 -0
  96. package/dist/memory/sqlite.d.ts.map +1 -0
  97. package/dist/memory/sqlite.js +16 -0
  98. package/dist/memory/sqlite.js.map +1 -0
  99. package/dist/memory/temporal-decay.d.ts +26 -0
  100. package/dist/memory/temporal-decay.d.ts.map +1 -0
  101. package/dist/memory/temporal-decay.js +120 -0
  102. package/dist/memory/temporal-decay.js.map +1 -0
  103. package/dist/memory/types.d.ts +95 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +2 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/package.json +36 -0
  108. package/dist/platform/index.d.ts +3 -0
  109. package/dist/platform/index.d.ts.map +1 -0
  110. package/dist/platform/index.js +2 -0
  111. package/dist/platform/index.js.map +1 -0
  112. package/dist/platform/platform.d.ts +3 -0
  113. package/dist/platform/platform.d.ts.map +1 -0
  114. package/dist/platform/platform.js +68 -0
  115. package/dist/platform/platform.js.map +1 -0
  116. package/dist/platform/types.d.ts +16 -0
  117. package/dist/platform/types.d.ts.map +1 -0
  118. package/dist/platform/types.js +2 -0
  119. package/dist/platform/types.js.map +1 -0
  120. package/dist/runtime/agent.d.ts +28 -0
  121. package/dist/runtime/agent.d.ts.map +1 -0
  122. package/dist/runtime/agent.js +102 -0
  123. package/dist/runtime/agent.js.map +1 -0
  124. package/dist/runtime/index.d.ts +2 -0
  125. package/dist/runtime/index.d.ts.map +1 -0
  126. package/dist/runtime/index.js +2 -0
  127. package/dist/runtime/index.js.map +1 -0
  128. package/dist/sandbox/cgroup.d.ts +17 -0
  129. package/dist/sandbox/cgroup.d.ts.map +1 -0
  130. package/dist/sandbox/cgroup.js +69 -0
  131. package/dist/sandbox/cgroup.js.map +1 -0
  132. package/dist/sandbox/index.d.ts +11 -0
  133. package/dist/sandbox/index.d.ts.map +1 -0
  134. package/dist/sandbox/index.js +9 -0
  135. package/dist/sandbox/index.js.map +1 -0
  136. package/dist/sandbox/ipc.d.ts +23 -0
  137. package/dist/sandbox/ipc.d.ts.map +1 -0
  138. package/dist/sandbox/ipc.js +138 -0
  139. package/dist/sandbox/ipc.js.map +1 -0
  140. package/dist/sandbox/manager.d.ts +5 -0
  141. package/dist/sandbox/manager.d.ts.map +1 -0
  142. package/dist/sandbox/manager.js +245 -0
  143. package/dist/sandbox/manager.js.map +1 -0
  144. package/dist/sandbox/namespace.d.ts +12 -0
  145. package/dist/sandbox/namespace.d.ts.map +1 -0
  146. package/dist/sandbox/namespace.js +120 -0
  147. package/dist/sandbox/namespace.js.map +1 -0
  148. package/dist/sandbox/proxy-tools.d.ts +14 -0
  149. package/dist/sandbox/proxy-tools.d.ts.map +1 -0
  150. package/dist/sandbox/proxy-tools.js +63 -0
  151. package/dist/sandbox/proxy-tools.js.map +1 -0
  152. package/dist/sandbox/rootfs.d.ts +15 -0
  153. package/dist/sandbox/rootfs.d.ts.map +1 -0
  154. package/dist/sandbox/rootfs.js +163 -0
  155. package/dist/sandbox/rootfs.js.map +1 -0
  156. package/dist/sandbox/seccomp.d.ts +13 -0
  157. package/dist/sandbox/seccomp.d.ts.map +1 -0
  158. package/dist/sandbox/seccomp.js +120 -0
  159. package/dist/sandbox/seccomp.js.map +1 -0
  160. package/dist/sandbox/types.d.ts +68 -0
  161. package/dist/sandbox/types.d.ts.map +1 -0
  162. package/dist/sandbox/types.js +8 -0
  163. package/dist/sandbox/types.js.map +1 -0
  164. package/dist/sandbox/worker.d.ts +12 -0
  165. package/dist/sandbox/worker.d.ts.map +1 -0
  166. package/dist/sandbox/worker.js +84 -0
  167. package/dist/sandbox/worker.js.map +1 -0
  168. package/dist/sessions/index.d.ts +2 -0
  169. package/dist/sessions/index.d.ts.map +1 -0
  170. package/dist/sessions/index.js +2 -0
  171. package/dist/sessions/index.js.map +1 -0
  172. package/dist/sessions/store.d.ts +17 -0
  173. package/dist/sessions/store.d.ts.map +1 -0
  174. package/dist/sessions/store.js +48 -0
  175. package/dist/sessions/store.js.map +1 -0
  176. package/dist/skills/enablement.d.ts +10 -0
  177. package/dist/skills/enablement.d.ts.map +1 -0
  178. package/dist/skills/enablement.js +52 -0
  179. package/dist/skills/enablement.js.map +1 -0
  180. package/dist/skills/index.d.ts +4 -0
  181. package/dist/skills/index.d.ts.map +1 -0
  182. package/dist/skills/index.js +4 -0
  183. package/dist/skills/index.js.map +1 -0
  184. package/dist/skills/loader.d.ts +8 -0
  185. package/dist/skills/loader.d.ts.map +1 -0
  186. package/dist/skills/loader.js +8 -0
  187. package/dist/skills/loader.js.map +1 -0
  188. package/dist/skills/registry.d.ts +19 -0
  189. package/dist/skills/registry.d.ts.map +1 -0
  190. package/dist/skills/registry.js +106 -0
  191. package/dist/skills/registry.js.map +1 -0
  192. package/dist/utils/boolean.d.ts +6 -0
  193. package/dist/utils/boolean.d.ts.map +1 -0
  194. package/dist/utils/boolean.js +28 -0
  195. package/dist/utils/boolean.js.map +1 -0
  196. package/dist/utils/run-with-concurrency.d.ts +12 -0
  197. package/dist/utils/run-with-concurrency.d.ts.map +1 -0
  198. package/dist/utils/run-with-concurrency.js +40 -0
  199. package/dist/utils/run-with-concurrency.js.map +1 -0
  200. package/dist/utils.d.ts +3 -0
  201. package/dist/utils.d.ts.map +1 -0
  202. package/dist/utils.js +38 -0
  203. package/dist/utils.js.map +1 -0
  204. package/dist/workspace/index.d.ts +3 -0
  205. package/dist/workspace/index.d.ts.map +1 -0
  206. package/dist/workspace/index.js +2 -0
  207. package/dist/workspace/index.js.map +1 -0
  208. package/dist/workspace/runner.d.ts +19 -0
  209. package/dist/workspace/runner.d.ts.map +1 -0
  210. package/dist/workspace/runner.js +158 -0
  211. package/dist/workspace/runner.js.map +1 -0
  212. package/dist/workspace/types.d.ts +36 -0
  213. package/dist/workspace/types.d.ts.map +1 -0
  214. package/dist/workspace/types.js +2 -0
  215. package/dist/workspace/types.js.map +1 -0
  216. package/dist/workspace/workspace.d.ts +12 -0
  217. package/dist/workspace/workspace.d.ts.map +1 -0
  218. package/dist/workspace/workspace.js +76 -0
  219. package/dist/workspace/workspace.js.map +1 -0
  220. package/package.json +53 -0
@@ -0,0 +1,292 @@
1
+ import crypto from "node:crypto";
2
+ import fsSync from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { runTasksWithConcurrency } from "../utils/run-with-concurrency.js";
6
+ import { isFileMissingError } from "./fs-utils.js";
7
+ export function ensureDir(dir) {
8
+ try {
9
+ fsSync.mkdirSync(dir, { recursive: true });
10
+ }
11
+ catch { }
12
+ return dir;
13
+ }
14
+ export function normalizeRelPath(value) {
15
+ const trimmed = value.trim().replace(/^[./]+/, "");
16
+ return trimmed.replace(/\\/g, "/");
17
+ }
18
+ export function normalizeExtraMemoryPaths(workspaceDir, extraPaths) {
19
+ if (!extraPaths?.length) {
20
+ return [];
21
+ }
22
+ const resolved = extraPaths
23
+ .map((value) => value.trim())
24
+ .filter(Boolean)
25
+ .map((value) => path.isAbsolute(value) ? path.resolve(value) : path.resolve(workspaceDir, value));
26
+ return Array.from(new Set(resolved));
27
+ }
28
+ export function isMemoryPath(relPath) {
29
+ const normalized = normalizeRelPath(relPath);
30
+ if (!normalized) {
31
+ return false;
32
+ }
33
+ if (normalized === "MEMORY.md" || normalized === "memory.md") {
34
+ return true;
35
+ }
36
+ return normalized.startsWith("memory/");
37
+ }
38
+ async function walkDir(dir, files) {
39
+ const entries = await fs.readdir(dir, { withFileTypes: true });
40
+ for (const entry of entries) {
41
+ const full = path.join(dir, entry.name);
42
+ if (entry.isSymbolicLink()) {
43
+ continue;
44
+ }
45
+ if (entry.isDirectory()) {
46
+ await walkDir(full, files);
47
+ continue;
48
+ }
49
+ if (!entry.isFile()) {
50
+ continue;
51
+ }
52
+ if (!entry.name.endsWith(".md")) {
53
+ continue;
54
+ }
55
+ files.push(full);
56
+ }
57
+ }
58
+ export async function listMemoryFiles(workspaceDir, extraPaths) {
59
+ const result = [];
60
+ const memoryFile = path.join(workspaceDir, "MEMORY.md");
61
+ const altMemoryFile = path.join(workspaceDir, "memory.md");
62
+ const memoryDir = path.join(workspaceDir, "memory");
63
+ const addMarkdownFile = async (absPath) => {
64
+ try {
65
+ const stat = await fs.lstat(absPath);
66
+ if (stat.isSymbolicLink() || !stat.isFile()) {
67
+ return;
68
+ }
69
+ if (!absPath.endsWith(".md")) {
70
+ return;
71
+ }
72
+ result.push(absPath);
73
+ }
74
+ catch { }
75
+ };
76
+ await addMarkdownFile(memoryFile);
77
+ await addMarkdownFile(altMemoryFile);
78
+ try {
79
+ const dirStat = await fs.lstat(memoryDir);
80
+ if (!dirStat.isSymbolicLink() && dirStat.isDirectory()) {
81
+ await walkDir(memoryDir, result);
82
+ }
83
+ }
84
+ catch { }
85
+ const normalizedExtraPaths = normalizeExtraMemoryPaths(workspaceDir, extraPaths);
86
+ if (normalizedExtraPaths.length > 0) {
87
+ for (const inputPath of normalizedExtraPaths) {
88
+ try {
89
+ const stat = await fs.lstat(inputPath);
90
+ if (stat.isSymbolicLink()) {
91
+ continue;
92
+ }
93
+ if (stat.isDirectory()) {
94
+ await walkDir(inputPath, result);
95
+ continue;
96
+ }
97
+ if (stat.isFile() && inputPath.endsWith(".md")) {
98
+ result.push(inputPath);
99
+ }
100
+ }
101
+ catch { }
102
+ }
103
+ }
104
+ if (result.length <= 1) {
105
+ return result;
106
+ }
107
+ const seen = new Set();
108
+ const deduped = [];
109
+ for (const entry of result) {
110
+ let key = entry;
111
+ try {
112
+ key = await fs.realpath(entry);
113
+ }
114
+ catch { }
115
+ if (seen.has(key)) {
116
+ continue;
117
+ }
118
+ seen.add(key);
119
+ deduped.push(entry);
120
+ }
121
+ return deduped;
122
+ }
123
+ export function hashText(value) {
124
+ return crypto.createHash("sha256").update(value).digest("hex");
125
+ }
126
+ export async function buildFileEntry(absPath, workspaceDir) {
127
+ let stat;
128
+ try {
129
+ stat = await fs.stat(absPath);
130
+ }
131
+ catch (err) {
132
+ if (isFileMissingError(err)) {
133
+ return null;
134
+ }
135
+ throw err;
136
+ }
137
+ let content;
138
+ try {
139
+ content = await fs.readFile(absPath, "utf-8");
140
+ }
141
+ catch (err) {
142
+ if (isFileMissingError(err)) {
143
+ return null;
144
+ }
145
+ throw err;
146
+ }
147
+ const hash = hashText(content);
148
+ return {
149
+ path: path.relative(workspaceDir, absPath).replace(/\\/g, "/"),
150
+ absPath,
151
+ mtimeMs: stat.mtimeMs,
152
+ size: stat.size,
153
+ hash,
154
+ };
155
+ }
156
+ export function chunkMarkdown(content, chunking) {
157
+ const lines = content.split("\n");
158
+ if (lines.length === 0) {
159
+ return [];
160
+ }
161
+ const maxChars = Math.max(32, chunking.tokens * 4);
162
+ const overlapChars = Math.max(0, chunking.overlap * 4);
163
+ const chunks = [];
164
+ let current = [];
165
+ let currentChars = 0;
166
+ const flush = () => {
167
+ if (current.length === 0) {
168
+ return;
169
+ }
170
+ const firstEntry = current[0];
171
+ const lastEntry = current[current.length - 1];
172
+ if (!firstEntry || !lastEntry) {
173
+ return;
174
+ }
175
+ const text = current.map((entry) => entry.line).join("\n");
176
+ const startLine = firstEntry.lineNo;
177
+ const endLine = lastEntry.lineNo;
178
+ chunks.push({
179
+ startLine,
180
+ endLine,
181
+ text,
182
+ hash: hashText(text),
183
+ });
184
+ };
185
+ const carryOverlap = () => {
186
+ if (overlapChars <= 0 || current.length === 0) {
187
+ current = [];
188
+ currentChars = 0;
189
+ return;
190
+ }
191
+ let acc = 0;
192
+ const kept = [];
193
+ for (let i = current.length - 1; i >= 0; i -= 1) {
194
+ const entry = current[i];
195
+ if (!entry) {
196
+ continue;
197
+ }
198
+ acc += entry.line.length + 1;
199
+ kept.unshift(entry);
200
+ if (acc >= overlapChars) {
201
+ break;
202
+ }
203
+ }
204
+ current = kept;
205
+ currentChars = kept.reduce((sum, entry) => sum + entry.line.length + 1, 0);
206
+ };
207
+ for (let i = 0; i < lines.length; i += 1) {
208
+ const line = lines[i] ?? "";
209
+ const lineNo = i + 1;
210
+ const segments = [];
211
+ if (line.length === 0) {
212
+ segments.push("");
213
+ }
214
+ else {
215
+ for (let start = 0; start < line.length; start += maxChars) {
216
+ segments.push(line.slice(start, start + maxChars));
217
+ }
218
+ }
219
+ for (const segment of segments) {
220
+ const lineSize = segment.length + 1;
221
+ if (currentChars + lineSize > maxChars && current.length > 0) {
222
+ flush();
223
+ carryOverlap();
224
+ }
225
+ current.push({ line: segment, lineNo });
226
+ currentChars += lineSize;
227
+ }
228
+ }
229
+ flush();
230
+ return chunks;
231
+ }
232
+ /**
233
+ * Remap chunk startLine/endLine from content-relative positions to original
234
+ * source file positions using a lineMap. Each entry in lineMap gives the
235
+ * 1-indexed source line for the corresponding 0-indexed content line.
236
+ *
237
+ * This is used for session JSONL files where buildSessionEntry() flattens
238
+ * messages into a plain-text string before chunking. Without remapping the
239
+ * stored line numbers would reference positions in the flattened text rather
240
+ * than the original JSONL file.
241
+ */
242
+ export function remapChunkLines(chunks, lineMap) {
243
+ if (!lineMap || lineMap.length === 0) {
244
+ return;
245
+ }
246
+ for (const chunk of chunks) {
247
+ // startLine/endLine are 1-indexed; lineMap is 0-indexed by content line
248
+ chunk.startLine = lineMap[chunk.startLine - 1] ?? chunk.startLine;
249
+ chunk.endLine = lineMap[chunk.endLine - 1] ?? chunk.endLine;
250
+ }
251
+ }
252
+ export function parseEmbedding(raw) {
253
+ try {
254
+ const parsed = JSON.parse(raw);
255
+ return Array.isArray(parsed) ? parsed : [];
256
+ }
257
+ catch {
258
+ return [];
259
+ }
260
+ }
261
+ export function cosineSimilarity(a, b) {
262
+ if (a.length === 0 || b.length === 0) {
263
+ return 0;
264
+ }
265
+ const len = Math.min(a.length, b.length);
266
+ let dot = 0;
267
+ let normA = 0;
268
+ let normB = 0;
269
+ for (let i = 0; i < len; i += 1) {
270
+ const av = a[i] ?? 0;
271
+ const bv = b[i] ?? 0;
272
+ dot += av * bv;
273
+ normA += av * av;
274
+ normB += bv * bv;
275
+ }
276
+ if (normA === 0 || normB === 0) {
277
+ return 0;
278
+ }
279
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
280
+ }
281
+ export async function runWithConcurrency(tasks, limit) {
282
+ const { results, firstError, hasError } = await runTasksWithConcurrency({
283
+ tasks,
284
+ limit,
285
+ errorMode: "stop",
286
+ });
287
+ if (hasError) {
288
+ throw firstError;
289
+ }
290
+ return results;
291
+ }
292
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/memory/internal.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAiBnD,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,YAAoB,EAAE,UAAqB;IACnF,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU;SACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CACjF,CAAC;IACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAe;IACjD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAoB,EACpB,UAAqB;IAErB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACvD,MAAM,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjF,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,MAAM,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACjC,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,YAAoB;IAEpB,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;QAC9D,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,QAA6C;IAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,OAAO,GAA4C,EAAE,CAAC;IAC1D,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC;YACV,SAAS;YACT,OAAO;YACP,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;SACrB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,IAAI,GAA4C,EAAE,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YACD,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,IAAI,YAAY,GAAG,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,KAAK,EAAE,CAAC;gBACR,YAAY,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACxC,YAAY,IAAI,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB,EAAE,OAA6B;IAClF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,wEAAwE;QACxE,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC;QAClE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA8B,EAC9B,KAAa;IAEb,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC;QACtE,KAAK;QACL,KAAK;QACL,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ export type SearchSource = string;
3
+ export type SearchRowResult = {
4
+ id: string;
5
+ path: string;
6
+ startLine: number;
7
+ endLine: number;
8
+ score: number;
9
+ snippet: string;
10
+ source: SearchSource;
11
+ };
12
+ export declare function searchVector(params: {
13
+ db: DatabaseSync;
14
+ vectorTable: string;
15
+ providerModel: string;
16
+ queryVec: number[];
17
+ limit: number;
18
+ snippetMaxChars: number;
19
+ ensureVectorReady: (dimensions: number) => Promise<boolean>;
20
+ sourceFilterVec: {
21
+ sql: string;
22
+ params: SearchSource[];
23
+ };
24
+ sourceFilterChunks: {
25
+ sql: string;
26
+ params: SearchSource[];
27
+ };
28
+ }): Promise<SearchRowResult[]>;
29
+ export declare function listChunks(params: {
30
+ db: DatabaseSync;
31
+ providerModel: string;
32
+ sourceFilter: {
33
+ sql: string;
34
+ params: SearchSource[];
35
+ };
36
+ }): Array<{
37
+ id: string;
38
+ path: string;
39
+ startLine: number;
40
+ endLine: number;
41
+ text: string;
42
+ embedding: number[];
43
+ source: SearchSource;
44
+ }>;
45
+ export declare function searchKeyword(params: {
46
+ db: DatabaseSync;
47
+ ftsTable: string;
48
+ providerModel: string | undefined;
49
+ query: string;
50
+ limit: number;
51
+ snippetMaxChars: number;
52
+ sourceFilter: {
53
+ sql: string;
54
+ params: SearchSource[];
55
+ };
56
+ buildFtsQuery: (raw: string) => string | null;
57
+ bm25RankToScore: (rank: number) => number;
58
+ }): Promise<Array<SearchRowResult & {
59
+ textScore: number;
60
+ }>>;
61
+ //# sourceMappingURL=manager-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-search.d.ts","sourceRoot":"","sources":["../../src/memory/manager-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,EAAE,EAAE,YAAY,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACzD,kBAAkB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CAC7D,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgE7B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE;IACjC,EAAE,EAAE,YAAY,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CACvD,GAAG,KAAK,CAAC;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC,CA0BD;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,EAAE,EAAE,YAAY,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACtD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA6C1D"}
@@ -0,0 +1,102 @@
1
+ import { truncateUtf16Safe } from "../utils.js";
2
+ import { cosineSimilarity, parseEmbedding } from "./internal.js";
3
+ const vectorToBlob = (embedding) => Buffer.from(new Float32Array(embedding).buffer);
4
+ export async function searchVector(params) {
5
+ if (params.queryVec.length === 0 || params.limit <= 0) {
6
+ return [];
7
+ }
8
+ if (await params.ensureVectorReady(params.queryVec.length)) {
9
+ const rows = params.db
10
+ .prepare(`SELECT c.id, c.path, c.start_line, c.end_line, c.text,\n` +
11
+ ` c.source,\n` +
12
+ ` vec_distance_cosine(v.embedding, ?) AS dist\n` +
13
+ ` FROM ${params.vectorTable} v\n` +
14
+ ` JOIN chunks c ON c.id = v.id\n` +
15
+ ` WHERE c.model = ?${params.sourceFilterVec.sql}\n` +
16
+ ` ORDER BY dist ASC\n` +
17
+ ` LIMIT ?`)
18
+ .all(vectorToBlob(params.queryVec), params.providerModel, ...params.sourceFilterVec.params, params.limit);
19
+ return rows.map((row) => ({
20
+ id: row.id,
21
+ path: row.path,
22
+ startLine: row.start_line,
23
+ endLine: row.end_line,
24
+ score: 1 - row.dist,
25
+ snippet: truncateUtf16Safe(row.text, params.snippetMaxChars),
26
+ source: row.source,
27
+ }));
28
+ }
29
+ const candidates = listChunks({
30
+ db: params.db,
31
+ providerModel: params.providerModel,
32
+ sourceFilter: params.sourceFilterChunks,
33
+ });
34
+ const scored = candidates
35
+ .map((chunk) => ({
36
+ chunk,
37
+ score: cosineSimilarity(params.queryVec, chunk.embedding),
38
+ }))
39
+ .filter((entry) => Number.isFinite(entry.score));
40
+ return scored
41
+ .toSorted((a, b) => b.score - a.score)
42
+ .slice(0, params.limit)
43
+ .map((entry) => ({
44
+ id: entry.chunk.id,
45
+ path: entry.chunk.path,
46
+ startLine: entry.chunk.startLine,
47
+ endLine: entry.chunk.endLine,
48
+ score: entry.score,
49
+ snippet: truncateUtf16Safe(entry.chunk.text, params.snippetMaxChars),
50
+ source: entry.chunk.source,
51
+ }));
52
+ }
53
+ export function listChunks(params) {
54
+ const rows = params.db
55
+ .prepare(`SELECT id, path, start_line, end_line, text, embedding, source\n` +
56
+ ` FROM chunks\n` +
57
+ ` WHERE model = ?${params.sourceFilter.sql}`)
58
+ .all(params.providerModel, ...params.sourceFilter.params);
59
+ return rows.map((row) => ({
60
+ id: row.id,
61
+ path: row.path,
62
+ startLine: row.start_line,
63
+ endLine: row.end_line,
64
+ text: row.text,
65
+ embedding: parseEmbedding(row.embedding),
66
+ source: row.source,
67
+ }));
68
+ }
69
+ export async function searchKeyword(params) {
70
+ if (params.limit <= 0) {
71
+ return [];
72
+ }
73
+ const ftsQuery = params.buildFtsQuery(params.query);
74
+ if (!ftsQuery) {
75
+ return [];
76
+ }
77
+ // When providerModel is undefined (FTS-only mode), search all models
78
+ const modelClause = params.providerModel ? " AND model = ?" : "";
79
+ const modelParams = params.providerModel ? [params.providerModel] : [];
80
+ const rows = params.db
81
+ .prepare(`SELECT id, path, source, start_line, end_line, text,\n` +
82
+ ` bm25(${params.ftsTable}) AS rank\n` +
83
+ ` FROM ${params.ftsTable}\n` +
84
+ ` WHERE ${params.ftsTable} MATCH ?${modelClause}${params.sourceFilter.sql}\n` +
85
+ ` ORDER BY rank ASC\n` +
86
+ ` LIMIT ?`)
87
+ .all(ftsQuery, ...modelParams, ...params.sourceFilter.params, params.limit);
88
+ return rows.map((row) => {
89
+ const textScore = params.bm25RankToScore(row.rank);
90
+ return {
91
+ id: row.id,
92
+ path: row.path,
93
+ startLine: row.start_line,
94
+ endLine: row.end_line,
95
+ score: textScore,
96
+ textScore,
97
+ snippet: truncateUtf16Safe(row.text, params.snippetMaxChars),
98
+ source: row.source,
99
+ };
100
+ });
101
+ }
102
+ //# sourceMappingURL=manager-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-search.js","sourceRoot":"","sources":["../../src/memory/manager-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Maximal Marginal Relevance (MMR) re-ranking algorithm.
3
+ *
4
+ * MMR balances relevance with diversity by iteratively selecting results
5
+ * that maximize: λ * relevance - (1-λ) * max_similarity_to_selected
6
+ *
7
+ * @see Carbonell & Goldstein, "The Use of MMR, Diversity-Based Reranking" (1998)
8
+ */
9
+ export type MMRItem = {
10
+ id: string;
11
+ score: number;
12
+ content: string;
13
+ };
14
+ export type MMRConfig = {
15
+ /** Enable/disable MMR re-ranking. Default: false (opt-in) */
16
+ enabled: boolean;
17
+ /** Lambda parameter: 0 = max diversity, 1 = max relevance. Default: 0.7 */
18
+ lambda: number;
19
+ };
20
+ export declare const DEFAULT_MMR_CONFIG: MMRConfig;
21
+ /**
22
+ * Tokenize text for Jaccard similarity computation.
23
+ * Extracts alphanumeric tokens and normalizes to lowercase.
24
+ */
25
+ export declare function tokenize(text: string): Set<string>;
26
+ /**
27
+ * Compute Jaccard similarity between two token sets.
28
+ * Returns a value in [0, 1] where 1 means identical sets.
29
+ */
30
+ export declare function jaccardSimilarity(setA: Set<string>, setB: Set<string>): number;
31
+ /**
32
+ * Compute text similarity between two content strings using Jaccard on tokens.
33
+ */
34
+ export declare function textSimilarity(contentA: string, contentB: string): number;
35
+ /**
36
+ * Compute MMR score for a candidate item.
37
+ * MMR = λ * relevance - (1-λ) * max_similarity_to_selected
38
+ */
39
+ export declare function computeMMRScore(relevance: number, maxSimilarity: number, lambda: number): number;
40
+ /**
41
+ * Re-rank items using Maximal Marginal Relevance (MMR).
42
+ *
43
+ * The algorithm iteratively selects items that balance relevance with diversity:
44
+ * 1. Start with the highest-scoring item
45
+ * 2. For each remaining slot, select the item that maximizes the MMR score
46
+ * 3. MMR score = λ * relevance - (1-λ) * max_similarity_to_already_selected
47
+ *
48
+ * @param items - Items to re-rank, must have score and content
49
+ * @param config - MMR configuration (lambda, enabled)
50
+ * @returns Re-ranked items in MMR order
51
+ */
52
+ export declare function mmrRerank<T extends MMRItem>(items: T[], config?: Partial<MMRConfig>): T[];
53
+ /**
54
+ * Apply MMR re-ranking to hybrid search results.
55
+ * Adapts the generic MMR function to work with the hybrid search result format.
56
+ */
57
+ export declare function applyMMRToHybridResults<T extends {
58
+ score: number;
59
+ snippet: string;
60
+ path: string;
61
+ startLine: number;
62
+ }>(results: T[], config?: Partial<MMRConfig>): T[];
63
+ //# sourceMappingURL=mmr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmr.d.ts","sourceRoot":"","sources":["../../src/memory/mmr.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,SAGhC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAGlD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAoB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,CAAC,EAAE,CAmE7F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC7E,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,CAAC,EAAE,CAuBpD"}