brainbank 0.7.0 → 0.8.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 (156) hide show
  1. package/README.md +76 -1398
  2. package/bin/brainbank +5 -1
  3. package/dist/{chunk-N2OJRXSB.js → chunk-3HVCONGF.js} +1 -1
  4. package/dist/{chunk-N2OJRXSB.js.map → chunk-3HVCONGF.js.map} +1 -1
  5. package/dist/{chunk-CCXVL56V.js → chunk-3JZIM5AU.js} +6 -3
  6. package/dist/chunk-3JZIM5AU.js.map +1 -0
  7. package/dist/{chunk-6XOXM7MI.js → chunk-5KU2PP34.js} +2 -2
  8. package/dist/{chunk-6XOXM7MI.js.map → chunk-5KU2PP34.js.map} +1 -1
  9. package/dist/chunk-7JDCHUJV.js +89 -0
  10. package/dist/chunk-7JDCHUJV.js.map +1 -0
  11. package/dist/{chunk-B77KABWH.js → chunk-7T2ZCZQA.js} +17 -15
  12. package/dist/chunk-7T2ZCZQA.js.map +1 -0
  13. package/dist/chunk-E3J37GDA.js +74 -0
  14. package/dist/chunk-E3J37GDA.js.map +1 -0
  15. package/dist/chunk-JEFWMS5Z.js +217 -0
  16. package/dist/chunk-JEFWMS5Z.js.map +1 -0
  17. package/dist/chunk-JRVYSTMP.js +3256 -0
  18. package/dist/chunk-JRVYSTMP.js.map +1 -0
  19. package/dist/chunk-OLDHLOMT.js +69 -0
  20. package/dist/chunk-OLDHLOMT.js.map +1 -0
  21. package/dist/{chunk-424UFCY7.js → chunk-QTZNB6AK.js} +6 -2
  22. package/dist/chunk-QTZNB6AK.js.map +1 -0
  23. package/dist/chunk-RFF7HMP6.js +109 -0
  24. package/dist/chunk-RFF7HMP6.js.map +1 -0
  25. package/dist/{chunk-ZNLN2VWV.js → chunk-TD3TEFI3.js} +1 -1
  26. package/dist/chunk-TD3TEFI3.js.map +1 -0
  27. package/dist/cli.js +1036 -341
  28. package/dist/cli.js.map +1 -1
  29. package/dist/haiku-expander-WOVJIVXD.js +8 -0
  30. package/dist/haiku-pruner-DB77ZQLJ.js +8 -0
  31. package/dist/http-server-GIRELCCL.js +9 -0
  32. package/dist/index.d.ts +1774 -611
  33. package/dist/index.js +282 -70
  34. package/dist/index.js.map +1 -1
  35. package/dist/{local-embedding-ZIMTK6PU.js → local-embedding-2RNCC5EU.js} +2 -2
  36. package/dist/{openai-embedding-VQZCZQYT.js → openai-embedding-Z5I4K4CN.js} +2 -2
  37. package/dist/perplexity-context-embedding-V5YUMXDR.js +9 -0
  38. package/dist/{perplexity-embedding-227WQY4R.js → perplexity-embedding-X2S72OAC.js} +2 -2
  39. package/dist/plugin-FF4Q34TI.js +32 -0
  40. package/dist/{qwen3-reranker-3MHEENT5.js → qwen3-reranker-HVIQOLKS.js} +2 -2
  41. package/dist/{resolve-CUJWY6HP.js → resolve-Q5D6HECY.js} +2 -2
  42. package/package.json +25 -52
  43. package/src/brainbank.ts +620 -0
  44. package/src/cli/commands/collection.ts +77 -0
  45. package/src/cli/commands/context.ts +171 -0
  46. package/src/cli/commands/daemon.ts +100 -0
  47. package/src/cli/commands/docs.ts +71 -0
  48. package/src/cli/commands/files.ts +69 -0
  49. package/src/cli/commands/help.ts +72 -0
  50. package/src/cli/commands/index.ts +282 -0
  51. package/src/cli/commands/kv.ts +140 -0
  52. package/src/cli/commands/mcp.ts +13 -0
  53. package/src/cli/commands/reembed.ts +30 -0
  54. package/src/cli/commands/scan.ts +365 -0
  55. package/src/cli/commands/search.ts +130 -0
  56. package/src/cli/commands/stats.ts +44 -0
  57. package/src/cli/commands/status.ts +47 -0
  58. package/src/cli/commands/watch.ts +43 -0
  59. package/src/cli/factory/brain-context.ts +43 -0
  60. package/src/cli/factory/builtin-registration.ts +123 -0
  61. package/src/cli/factory/config-loader.ts +72 -0
  62. package/src/cli/factory/index.ts +65 -0
  63. package/src/cli/factory/plugin-loader.ts +146 -0
  64. package/src/cli/index.ts +63 -0
  65. package/src/cli/server-client.ts +135 -0
  66. package/src/cli/utils.ts +121 -0
  67. package/src/config.ts +50 -0
  68. package/src/constants.ts +13 -0
  69. package/src/db/adapter.ts +112 -0
  70. package/src/db/metadata.ts +130 -0
  71. package/src/db/migrations.ts +66 -0
  72. package/src/db/sqlite-adapter.ts +208 -0
  73. package/src/db/tracker.ts +91 -0
  74. package/src/engine/index-api.ts +85 -0
  75. package/src/engine/reembed.ts +206 -0
  76. package/src/engine/search-api.ts +222 -0
  77. package/src/index.ts +159 -0
  78. package/src/lib/fts.ts +57 -0
  79. package/src/lib/languages.ts +180 -0
  80. package/src/lib/logger.ts +125 -0
  81. package/src/lib/math.ts +87 -0
  82. package/src/lib/provider-key.ts +20 -0
  83. package/src/lib/prune.ts +71 -0
  84. package/src/lib/rerank.ts +33 -0
  85. package/src/lib/rrf.ts +133 -0
  86. package/src/lib/write-lock.ts +108 -0
  87. package/src/plugin.ts +323 -0
  88. package/src/providers/embeddings/embedding-worker-thread.ts +95 -0
  89. package/src/providers/embeddings/embedding-worker.ts +141 -0
  90. package/src/providers/embeddings/local-embedding.ts +115 -0
  91. package/src/providers/embeddings/openai-embedding.ts +167 -0
  92. package/src/providers/embeddings/perplexity-context-embedding.ts +195 -0
  93. package/src/providers/embeddings/perplexity-embedding.ts +165 -0
  94. package/src/providers/embeddings/resolve.ts +34 -0
  95. package/src/providers/pruners/haiku-expander.ts +152 -0
  96. package/src/providers/pruners/haiku-pruner.ts +112 -0
  97. package/src/providers/rerankers/qwen3-reranker.ts +180 -0
  98. package/src/providers/vector/hnsw-index.ts +174 -0
  99. package/src/providers/vector/hnsw-loader.ts +129 -0
  100. package/src/search/bm25-boost.ts +61 -0
  101. package/src/search/context-builder.ts +298 -0
  102. package/src/search/keyword/composite-bm25-search.ts +62 -0
  103. package/src/search/types.ts +35 -0
  104. package/src/search/vector/composite-vector-search.ts +76 -0
  105. package/src/search/vector/mmr.ts +64 -0
  106. package/src/services/collection.ts +405 -0
  107. package/src/services/daemon.ts +87 -0
  108. package/src/services/http-server.ts +288 -0
  109. package/src/services/kv-service.ts +65 -0
  110. package/src/services/plugin-registry.ts +109 -0
  111. package/src/services/watch.ts +348 -0
  112. package/src/services/webhook-server.ts +100 -0
  113. package/src/types.ts +504 -0
  114. package/dist/base-3SNc_CeY.d.ts +0 -593
  115. package/dist/chunk-424UFCY7.js.map +0 -1
  116. package/dist/chunk-7EZR47JV.js +0 -232
  117. package/dist/chunk-7EZR47JV.js.map +0 -1
  118. package/dist/chunk-B77KABWH.js.map +0 -1
  119. package/dist/chunk-CCXVL56V.js.map +0 -1
  120. package/dist/chunk-DI3H6JVZ.js +0 -2432
  121. package/dist/chunk-DI3H6JVZ.js.map +0 -1
  122. package/dist/chunk-FGL32LUJ.js +0 -754
  123. package/dist/chunk-FGL32LUJ.js.map +0 -1
  124. package/dist/chunk-JRSKWF6K.js +0 -313
  125. package/dist/chunk-JRSKWF6K.js.map +0 -1
  126. package/dist/chunk-U2Q2XGPZ.js +0 -42
  127. package/dist/chunk-U2Q2XGPZ.js.map +0 -1
  128. package/dist/chunk-VQ27YUHH.js +0 -629
  129. package/dist/chunk-VQ27YUHH.js.map +0 -1
  130. package/dist/chunk-VVXYZIIB.js +0 -304
  131. package/dist/chunk-VVXYZIIB.js.map +0 -1
  132. package/dist/chunk-YOLKSYWK.js +0 -79
  133. package/dist/chunk-YOLKSYWK.js.map +0 -1
  134. package/dist/chunk-ZNLN2VWV.js.map +0 -1
  135. package/dist/code.d.ts +0 -33
  136. package/dist/code.js +0 -9
  137. package/dist/docs.d.ts +0 -21
  138. package/dist/docs.js +0 -9
  139. package/dist/git.d.ts +0 -33
  140. package/dist/git.js +0 -9
  141. package/dist/memory.d.ts +0 -17
  142. package/dist/memory.js +0 -9
  143. package/dist/notes.d.ts +0 -17
  144. package/dist/notes.js +0 -10
  145. package/dist/perplexity-context-embedding-KSVSZXMD.js +0 -9
  146. package/dist/resolve-CUJWY6HP.js.map +0 -1
  147. /package/dist/{code.js.map → haiku-expander-WOVJIVXD.js.map} +0 -0
  148. /package/dist/{docs.js.map → haiku-pruner-DB77ZQLJ.js.map} +0 -0
  149. /package/dist/{git.js.map → http-server-GIRELCCL.js.map} +0 -0
  150. /package/dist/{local-embedding-ZIMTK6PU.js.map → local-embedding-2RNCC5EU.js.map} +0 -0
  151. /package/dist/{memory.js.map → openai-embedding-Z5I4K4CN.js.map} +0 -0
  152. /package/dist/{notes.js.map → perplexity-context-embedding-V5YUMXDR.js.map} +0 -0
  153. /package/dist/{openai-embedding-VQZCZQYT.js.map → perplexity-embedding-X2S72OAC.js.map} +0 -0
  154. /package/dist/{perplexity-context-embedding-KSVSZXMD.js.map → plugin-FF4Q34TI.js.map} +0 -0
  155. /package/dist/{perplexity-embedding-227WQY4R.js.map → qwen3-reranker-HVIQOLKS.js.map} +0 -0
  156. /package/dist/{qwen3-reranker-3MHEENT5.js.map → resolve-Q5D6HECY.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,67 +1,94 @@
1
1
  import {
2
- PerplexityContextEmbedding
3
- } from "./chunk-6XOXM7MI.js";
4
- import {
5
- PerplexityEmbedding
6
- } from "./chunk-N2OJRXSB.js";
7
- import {
8
- LocalEmbedding
9
- } from "./chunk-424UFCY7.js";
2
+ HttpServer
3
+ } from "./chunk-JEFWMS5Z.js";
10
4
  import {
11
5
  Qwen3Reranker
12
- } from "./chunk-ZNLN2VWV.js";
6
+ } from "./chunk-TD3TEFI3.js";
13
7
  import {
14
- NoteStore,
15
- notes
16
- } from "./chunk-7EZR47JV.js";
8
+ HaikuPruner
9
+ } from "./chunk-7JDCHUJV.js";
17
10
  import {
18
- Consolidator,
19
- PatternStore,
20
- memory
21
- } from "./chunk-VVXYZIIB.js";
11
+ HaikuExpander
12
+ } from "./chunk-RFF7HMP6.js";
22
13
  import {
23
14
  BrainBank,
24
15
  Collection,
16
+ CompositeBM25Search,
17
+ CompositeVectorSearch,
25
18
  ContextBuilder,
26
19
  DEFAULTS,
20
+ HNSW,
27
21
  HNSWIndex,
28
- KeywordSearch,
29
- VectorSearch,
30
- resolveConfig,
31
- searchMMR
32
- } from "./chunk-DI3H6JVZ.js";
33
- import {
34
- providerKey,
35
- resolveEmbedding
36
- } from "./chunk-B77KABWH.js";
37
- import {
38
- CodeChunker,
39
- CodeWalker,
40
22
  IGNORE_DIRS,
23
+ KVService,
24
+ SQLiteAdapter,
41
25
  SUPPORTED_EXTENSIONS,
42
- code,
26
+ Watcher,
27
+ WebhookServer,
28
+ acquireLock,
29
+ bumpVersion,
30
+ contextFromCLI,
31
+ cosineSimilarity,
32
+ createBrain,
33
+ createTracker,
34
+ escapeLike,
43
35
  getLanguage,
44
- isSupported
45
- } from "./chunk-FGL32LUJ.js";
36
+ getVersion,
37
+ getVersions,
38
+ isIgnoredDir,
39
+ isIgnoredFile,
40
+ isSupported,
41
+ normalize,
42
+ normalizeBM25,
43
+ pruneResults,
44
+ reciprocalRankFusion,
45
+ releaseLock,
46
+ rerank,
47
+ resetFactoryCache,
48
+ resolveConfig,
49
+ sanitizeFTS,
50
+ vecToBuffer,
51
+ withLock
52
+ } from "./chunk-JRVYSTMP.js";
46
53
  import {
47
- CoEditAnalyzer,
48
- GitIndexer,
49
- git
50
- } from "./chunk-JRSKWF6K.js";
54
+ DEFAULT_PORT,
55
+ getServerUrl,
56
+ isServerRunning,
57
+ readPid,
58
+ removePid,
59
+ writePid
60
+ } from "./chunk-OLDHLOMT.js";
51
61
  import {
52
- DocsIndexer,
53
- docs
54
- } from "./chunk-VQ27YUHH.js";
62
+ isBM25SearchPlugin,
63
+ isCoEditPlugin,
64
+ isContextFieldPlugin,
65
+ isContextFormatterPlugin,
66
+ isDocsPlugin,
67
+ isExpandablePlugin,
68
+ isFileResolvable,
69
+ isIndexable,
70
+ isMigratable,
71
+ isReembeddable,
72
+ isSearchable,
73
+ isVectorSearchPlugin,
74
+ isWatchable
75
+ } from "./chunk-E3J37GDA.js";
55
76
  import {
56
- reciprocalRankFusion
57
- } from "./chunk-YOLKSYWK.js";
77
+ OpenAIEmbedding
78
+ } from "./chunk-3JZIM5AU.js";
58
79
  import {
59
- cosineSimilarity,
60
- normalize
61
- } from "./chunk-U2Q2XGPZ.js";
80
+ PerplexityContextEmbedding
81
+ } from "./chunk-5KU2PP34.js";
62
82
  import {
63
- OpenAIEmbedding
64
- } from "./chunk-CCXVL56V.js";
83
+ PerplexityEmbedding
84
+ } from "./chunk-3HVCONGF.js";
85
+ import {
86
+ LocalEmbedding
87
+ } from "./chunk-QTZNB6AK.js";
88
+ import {
89
+ providerKey,
90
+ resolveEmbedding
91
+ } from "./chunk-7T2ZCZQA.js";
65
92
  import {
66
93
  __name
67
94
  } from "./chunk-7QVYU63E.js";
@@ -79,10 +106,6 @@ function isDocumentResult(r) {
79
106
  return r.type === "document";
80
107
  }
81
108
  __name(isDocumentResult, "isDocumentResult");
82
- function isPatternResult(r) {
83
- return r.type === "pattern";
84
- }
85
- __name(isPatternResult, "isPatternResult");
86
109
  function isCollectionResult(r) {
87
110
  return r.type === "collection";
88
111
  }
@@ -93,8 +116,6 @@ function matchResult(result, handlers) {
93
116
  return (handlers.code ?? handlers._)?.(result);
94
117
  case "commit":
95
118
  return (handlers.commit ?? handlers._)?.(result);
96
- case "pattern":
97
- return (handlers.pattern ?? handlers._)?.(result);
98
119
  case "document":
99
120
  return (handlers.document ?? handlers._)?.(result);
100
121
  case "collection":
@@ -102,50 +123,241 @@ function matchResult(result, handlers) {
102
123
  }
103
124
  }
104
125
  __name(matchResult, "matchResult");
126
+
127
+ // src/providers/embeddings/embedding-worker.ts
128
+ import { Worker } from "worker_threads";
129
+ import { fileURLToPath } from "url";
130
+ import { join, dirname } from "path";
131
+ var EmbeddingWorkerProxy = class {
132
+ static {
133
+ __name(this, "EmbeddingWorkerProxy");
134
+ }
135
+ _worker;
136
+ _nextId = 1;
137
+ _pending = /* @__PURE__ */ new Map();
138
+ _ready;
139
+ _dims = 0;
140
+ /** Embedding dimensions (available after `ready()` resolves). */
141
+ get dims() {
142
+ return this._dims;
143
+ }
144
+ constructor(providerType, providerOptions = {}) {
145
+ const workerPath = join(
146
+ dirname(fileURLToPath(import.meta.url)),
147
+ "embedding-worker-thread.ts"
148
+ );
149
+ this._worker = new Worker(workerPath, {
150
+ workerData: { providerType, providerOptions },
151
+ execArgv: ["--import", "tsx"]
152
+ });
153
+ this._worker.on("message", (msg) => {
154
+ if (msg.id === 0 && msg.dims) {
155
+ this._dims = msg.dims;
156
+ return;
157
+ }
158
+ const pending = this._pending.get(msg.id);
159
+ if (!pending) return;
160
+ this._pending.delete(msg.id);
161
+ if (msg.type === "error") {
162
+ pending.reject(new Error(`BrainBank: Embedding worker error: ${msg.error}`));
163
+ } else {
164
+ pending.resolve(msg);
165
+ }
166
+ });
167
+ this._worker.on("error", (err) => {
168
+ for (const pending of this._pending.values()) {
169
+ pending.reject(err);
170
+ }
171
+ this._pending.clear();
172
+ });
173
+ this._ready = new Promise((resolve, reject) => {
174
+ const onMsg = /* @__PURE__ */ __name((msg) => {
175
+ if (msg.id === 0 && msg.dims) {
176
+ this._dims = msg.dims;
177
+ this._worker.removeListener("message", onMsg);
178
+ resolve();
179
+ }
180
+ }, "onMsg");
181
+ this._worker.on("message", onMsg);
182
+ this._worker.on("error", reject);
183
+ });
184
+ }
185
+ /** Wait for the worker to be ready (provider loaded). */
186
+ async ready() {
187
+ return this._ready;
188
+ }
189
+ /** Send a request to the worker and wait for the response. */
190
+ _send(req) {
191
+ const id = this._nextId++;
192
+ return new Promise((resolve, reject) => {
193
+ this._pending.set(id, { resolve, reject });
194
+ this._worker.postMessage({ ...req, id });
195
+ });
196
+ }
197
+ /** Embed a single text string. */
198
+ async embed(text) {
199
+ await this._ready;
200
+ const resp = await this._send({ type: "embed", text });
201
+ if (!resp.vector) throw new Error("BrainBank: Worker returned no vector.");
202
+ return new Float32Array(resp.vector);
203
+ }
204
+ /** Embed multiple texts in a batch. */
205
+ async embedBatch(texts) {
206
+ if (texts.length === 0) return [];
207
+ await this._ready;
208
+ const resp = await this._send({ type: "embedBatch", texts });
209
+ if (!resp.vectors) throw new Error("BrainBank: Worker returned no vectors.");
210
+ return resp.vectors.map((buf) => new Float32Array(buf));
211
+ }
212
+ /** Terminate the worker. */
213
+ async close() {
214
+ try {
215
+ await this._send({ type: "close" });
216
+ } catch {
217
+ }
218
+ await this._worker.terminate();
219
+ }
220
+ };
221
+
222
+ // src/db/migrations.ts
223
+ function getPluginVersion(adapter, pluginName) {
224
+ try {
225
+ const row = adapter.prepare(
226
+ "SELECT version FROM plugin_versions WHERE plugin_name = ?"
227
+ ).get(pluginName);
228
+ return row?.version ?? 0;
229
+ } catch {
230
+ return 0;
231
+ }
232
+ }
233
+ __name(getPluginVersion, "getPluginVersion");
234
+ function setPluginVersion(adapter, pluginName, version) {
235
+ adapter.prepare(`
236
+ INSERT OR REPLACE INTO plugin_versions (plugin_name, version, applied_at)
237
+ VALUES (?, ?, unixepoch())
238
+ `).run(pluginName, version);
239
+ }
240
+ __name(setPluginVersion, "setPluginVersion");
241
+ function runPluginMigrations(adapter, pluginName, schemaVersion, migrations) {
242
+ const current = getPluginVersion(adapter, pluginName);
243
+ if (current >= schemaVersion) return;
244
+ const sorted = [...migrations].sort((a, b) => a.version - b.version);
245
+ for (const m of sorted) {
246
+ if (m.version <= current) continue;
247
+ adapter.transaction(() => {
248
+ m.up(adapter);
249
+ setPluginVersion(adapter, pluginName, m.version);
250
+ });
251
+ }
252
+ }
253
+ __name(runPluginMigrations, "runPluginMigrations");
254
+
255
+ // src/search/vector/mmr.ts
256
+ function searchMMR(index, query, vectorCache, k, lambda = 0.7) {
257
+ const candidates = index.search(query, k * 3);
258
+ if (candidates.length <= k) return candidates;
259
+ const selected = [];
260
+ const remaining = [...candidates];
261
+ while (selected.length < k && remaining.length > 0) {
262
+ let bestScore = -Infinity;
263
+ let bestIdx = 0;
264
+ for (let i = 0; i < remaining.length; i++) {
265
+ const relevance = remaining[i].score;
266
+ let maxSim = 0;
267
+ for (const sel of selected) {
268
+ const candidateVec = vectorCache.get(remaining[i].id);
269
+ const selectedVec = vectorCache.get(sel.id);
270
+ if (candidateVec && selectedVec) {
271
+ maxSim = Math.max(maxSim, cosineSimilarity(candidateVec, selectedVec));
272
+ }
273
+ }
274
+ const mmrScore = lambda * relevance - (1 - lambda) * maxSim;
275
+ if (mmrScore > bestScore) {
276
+ bestScore = mmrScore;
277
+ bestIdx = i;
278
+ }
279
+ }
280
+ selected.push(remaining[bestIdx]);
281
+ remaining.splice(bestIdx, 1);
282
+ }
283
+ return selected;
284
+ }
285
+ __name(searchMMR, "searchMMR");
105
286
  export {
106
- KeywordSearch as BM25Search,
107
287
  BrainBank,
108
- CoEditAnalyzer,
109
- CodeChunker,
110
- CodeWalker,
111
288
  Collection,
112
- Consolidator,
289
+ CompositeBM25Search,
290
+ CompositeVectorSearch,
113
291
  ContextBuilder,
114
292
  DEFAULTS,
115
- DocsIndexer,
116
- GitIndexer,
293
+ DEFAULT_PORT,
294
+ EmbeddingWorkerProxy,
295
+ HNSW,
117
296
  HNSWIndex,
297
+ HaikuExpander,
298
+ HaikuPruner,
299
+ HttpServer,
118
300
  IGNORE_DIRS,
119
- KeywordSearch,
301
+ KVService,
120
302
  LocalEmbedding,
121
- VectorSearch as MultiIndexSearch,
122
- NoteStore,
123
303
  OpenAIEmbedding,
124
- PatternStore,
125
304
  PerplexityContextEmbedding,
126
305
  PerplexityEmbedding,
127
306
  Qwen3Reranker,
307
+ SQLiteAdapter,
128
308
  SUPPORTED_EXTENSIONS,
129
- VectorSearch,
130
- code,
309
+ Watcher,
310
+ WebhookServer,
311
+ acquireLock,
312
+ bumpVersion,
313
+ contextFromCLI,
131
314
  cosineSimilarity,
132
- docs,
315
+ createBrain,
316
+ createTracker,
317
+ escapeLike,
133
318
  getLanguage,
134
- git,
319
+ getServerUrl,
320
+ getVersion,
321
+ getVersions,
322
+ isBM25SearchPlugin,
323
+ isCoEditPlugin,
135
324
  isCodeResult,
136
325
  isCollectionResult,
137
326
  isCommitResult,
327
+ isContextFieldPlugin,
328
+ isContextFormatterPlugin,
329
+ isDocsPlugin,
138
330
  isDocumentResult,
139
- isPatternResult,
331
+ isExpandablePlugin,
332
+ isFileResolvable,
333
+ isIgnoredDir,
334
+ isIgnoredFile,
335
+ isIndexable,
336
+ isMigratable,
337
+ isReembeddable,
338
+ isSearchable,
339
+ isServerRunning,
140
340
  isSupported,
341
+ isVectorSearchPlugin,
342
+ isWatchable,
141
343
  matchResult,
142
- memory,
143
344
  normalize,
144
- notes,
345
+ normalizeBM25,
145
346
  providerKey,
347
+ pruneResults,
348
+ readPid,
146
349
  reciprocalRankFusion,
350
+ releaseLock,
351
+ removePid,
352
+ rerank,
353
+ resetFactoryCache,
147
354
  resolveConfig,
148
355
  resolveEmbedding,
149
- searchMMR
356
+ runPluginMigrations,
357
+ sanitizeFTS,
358
+ searchMMR,
359
+ vecToBuffer,
360
+ withLock,
361
+ writePid
150
362
  };
151
363
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * BrainBank — Type Definitions\n * \n * All interfaces and types for the semantic knowledge bank.\n */\n\n\n\n// ── Configuration ───────────────────────────────────\n\nexport interface BrainBankConfig {\n /** Root path of the repository to index. Default: '.' */\n repoPath?: string;\n /** SQLite database path. Default: '.brainbank/brainbank.db' */\n dbPath?: string;\n\n /** Max git commits to index. Default: 500 */\n gitDepth?: number;\n /** Max file size in bytes to index. Default: 512_000 (500KB) */\n maxFileSize?: number;\n /** Max diff bytes per commit. Default: 8192 */\n maxDiffBytes?: number;\n /** HNSW M parameter (connections per node). Default: 16 */\n hnswM?: number;\n /** HNSW efConstruction (build-time candidates). Default: 200 */\n hnswEfConstruction?: number;\n /** HNSW efSearch (query-time candidates). Default: 50 */\n hnswEfSearch?: number;\n /** Embedding dimensions. Default: 384 */\n embeddingDims?: number;\n /** Max HNSW elements. Default: 2_000_000 */\n maxElements?: number;\n /** Custom embedding provider (default: local WASM model) */\n embeddingProvider?: EmbeddingProvider;\n /** Optional reranker for improved search quality */\n reranker?: Reranker;\n}\n\nexport interface ResolvedConfig {\n repoPath: string;\n dbPath: string;\n gitDepth: number;\n maxFileSize: number;\n maxDiffBytes: number;\n hnswM: number;\n hnswEfConstruction: number;\n hnswEfSearch: number;\n embeddingDims: number;\n maxElements: number;\n embeddingProvider?: EmbeddingProvider;\n reranker?: Reranker;\n}\n\n// ── Embedding Provider ──────────────────────────────\n\nexport interface EmbeddingProvider {\n /** Vector dimensions produced by this provider. */\n readonly dims: number;\n /** Embed a single text string. */\n embed(text: string): Promise<Float32Array>;\n /** Embed multiple texts (batch). */\n embedBatch(texts: string[]): Promise<Float32Array[]>;\n /** Release resources. */\n close(): Promise<void>;\n}\n\n// ── Reranker ────────────────────────────────────────\n\nexport interface Reranker {\n /**\n * Score each document's relevance to the query.\n * @param query - The search query\n * @param documents - Document contents to rank\n * @returns Relevance scores (0.0 - 1.0) in same order as documents\n */\n rank(query: string, documents: string[]): Promise<number[]>;\n /** Release resources (e.g. unload model). */\n close?(): Promise<void>;\n}\n\n// ── Vector Index ────────────────────────────────────\n\nexport interface SearchHit {\n id: number;\n score: number;\n}\n\nexport interface VectorIndex {\n /** Initialize the index. Must be called before add/search. */\n init(): Promise<this>;\n /** Add a vector with an integer ID. Idempotent: duplicate IDs are skipped. */\n add(vector: Float32Array, id: number): void;\n /** Mark a vector as deleted so it no longer appears in searches. */\n remove(id: number): void;\n /** Search for k nearest neighbors. */\n search(query: Float32Array, k: number): SearchHit[];\n /** Clear all vectors and reset to empty state. */\n reinit(): void;\n /** Number of vectors in the index. */\n readonly size: number;\n}\n\n// ── Code Chunking ───────────────────────────────────\n\nexport interface CodeChunk {\n /** Auto-incremented DB id (set after insert) */\n id?: number;\n /** Relative file path from repo root */\n filePath: string;\n /** Chunk type: 'file' | 'function' | 'class' | 'block' */\n chunkType: string;\n /** Function/class name (if detected) */\n name?: string;\n /** Start line (1-indexed) */\n startLine: number;\n /** End line (1-indexed, inclusive) */\n endLine: number;\n /** Raw content of the chunk */\n content: string;\n /** Language identifier */\n language: string;\n}\n\n// ── Git ─────────────────────────────────────────────\n\nexport interface GitCommitRecord {\n id?: number;\n hash: string;\n shortHash: string;\n message: string;\n author: string;\n date: string;\n timestamp: number;\n filesChanged: string[];\n diff?: string;\n additions: number;\n deletions: number;\n isMerge: boolean;\n}\n\n// ── Agent Learning ─────────────────────────────────────────\n\nexport interface LearningPattern {\n id?: number;\n /** Category (e.g. 'api', 'refactor', 'debug') */\n taskType: string;\n /** What was the task */\n task: string;\n /** How it was approached */\n approach: string;\n /** What happened */\n outcome?: string;\n /** 0.0 – 1.0 */\n successRate: number;\n /** Lessons learned */\n critique?: string;\n /** Tokens consumed (optional tracking) */\n tokensUsed?: number;\n /** Latency in ms (optional tracking) */\n latencyMs?: number;\n}\n\nexport interface DistilledStrategy {\n taskType: string;\n strategy: string;\n confidence: number;\n updatedAt: number;\n}\n\n// ── Search Results ──────────────────────────────────\n\nexport type SearchResultType = 'code' | 'commit' | 'pattern' | 'document' | 'collection';\n\n// Typed metadata per result type\n\nexport interface CodeResultMetadata {\n chunkType: string;\n name?: string;\n startLine: number;\n endLine: number;\n language: string;\n searchType?: string;\n}\n\nexport interface CommitResultMetadata {\n hash: string;\n shortHash: string;\n author: string;\n date: string;\n files: string[];\n additions?: number;\n deletions?: number;\n diff?: string;\n searchType?: string;\n}\n\nexport interface PatternResultMetadata {\n taskType: string;\n task: string;\n outcome?: string;\n successRate: number;\n critique?: string;\n searchType?: string;\n}\n\nexport interface DocumentResultMetadata {\n collection?: string;\n title?: string;\n seq?: number;\n path?: string;\n searchType?: string;\n /** Internal chunk ID used by hybrid search to map fused results. */\n chunkId?: number;\n}\n\n// Discriminated union\n\nexport interface CodeResult {\n type: 'code';\n score: number;\n filePath: string;\n content: string;\n context?: string;\n metadata: CodeResultMetadata;\n}\n\nexport interface CommitResult {\n type: 'commit';\n score: number;\n filePath?: string;\n content: string;\n context?: string;\n metadata: CommitResultMetadata;\n}\n\nexport interface PatternResult {\n type: 'pattern';\n score: number;\n filePath?: string;\n content: string;\n context?: string;\n metadata: PatternResultMetadata;\n}\n\nexport interface DocumentResult {\n type: 'document';\n score: number;\n filePath: string;\n content: string;\n context?: string;\n metadata: DocumentResultMetadata;\n}\n\nexport interface CollectionResult {\n type: 'collection';\n score: number;\n filePath?: string;\n content: string;\n context?: string;\n metadata: Record<string, any>;\n}\n\nexport type SearchResult = CodeResult | CommitResult | PatternResult | DocumentResult | CollectionResult;\n\n// ── Type Guards ──────────────────────────────────────\n\n/** Narrow a SearchResult to CodeResult. */\nexport function isCodeResult(r: SearchResult): r is CodeResult {\n return r.type === 'code';\n}\n/** Narrow a SearchResult to CommitResult. */\nexport function isCommitResult(r: SearchResult): r is CommitResult {\n return r.type === 'commit';\n}\n/** Narrow a SearchResult to DocumentResult. */\nexport function isDocumentResult(r: SearchResult): r is DocumentResult {\n return r.type === 'document';\n}\n/** Narrow a SearchResult to PatternResult. */\nexport function isPatternResult(r: SearchResult): r is PatternResult {\n return r.type === 'pattern';\n}\n/** Narrow a SearchResult to CollectionResult. */\nexport function isCollectionResult(r: SearchResult): r is CollectionResult {\n return r.type === 'collection';\n}\n\n// ── Match Helper ─────────────────────────────────────\n\ntype MatchHandlers<T> = {\n code?: (r: CodeResult) => T;\n commit?: (r: CommitResult) => T;\n pattern?: (r: PatternResult) => T;\n document?: (r: DocumentResult) => T;\n collection?: (r: CollectionResult) => T;\n _?: (r: SearchResult) => T;\n};\n\n/**\n * Pattern-match on SearchResult type. Calls the matching handler\n * or the `_` fallback. Returns undefined if no handler matches.\n */\nexport function matchResult<T>(\n result: SearchResult,\n handlers: MatchHandlers<T>,\n): T | undefined {\n switch (result.type) {\n case 'code': return (handlers.code ?? handlers._)?.(result);\n case 'commit': return (handlers.commit ?? handlers._)?.(result);\n case 'pattern': return (handlers.pattern ?? handlers._)?.(result);\n case 'document': return (handlers.document ?? handlers._)?.(result);\n case 'collection': return (handlers.collection ?? handlers._)?.(result);\n }\n}\n\n// ── Context Builder ─────────────────────────────────\n\nexport interface ContextOptions {\n /** Max code chunks to include. Default: 6 */\n codeResults?: number;\n /** Max git commits to include. Default: 5 */\n gitResults?: number;\n /** Max memory patterns to include. Default: 4 */\n patternResults?: number;\n /** Files the agent is about to modify (improves co-edit suggestions) */\n affectedFiles?: string[];\n /** Minimum similarity score threshold. Default: 0.25 */\n minScore?: number;\n /** Use MMR for diversity. Default: true */\n useMMR?: boolean;\n /** MMR lambda (0 = diversity, 1 = relevance). Default: 0.7 */\n mmrLambda?: number;\n}\n\n// ── Document Collections ────────────────────────────\n\nexport interface DocumentCollection {\n /** Collection name (e.g. 'notes', 'docs') */\n name: string;\n /** Directory path to index */\n path: string;\n /** Glob pattern for files (default: all markdown) */\n pattern?: string;\n /** Glob patterns to ignore */\n ignore?: string[];\n /** Context description for this collection */\n context?: string;\n}\n\nexport interface DocChunk {\n id?: number;\n /** Collection name */\n collection: string;\n /** Relative file path within the collection */\n filePath: string;\n /** Document title (first heading or filename) */\n title: string;\n /** Chunk content */\n content: string;\n /** Chunk sequence within the document (0, 1, 2...) */\n seq: number;\n /** Character position in original document */\n pos: number;\n /** Content hash for incremental updates */\n contentHash: string;\n}\n\n// ── Stats ───────────────────────────────────────────\n\nexport interface IndexStats {\n code?: {\n files: number;\n chunks: number;\n hnswSize: number;\n };\n git?: {\n commits: number;\n filesTracked: number;\n coEdits: number;\n hnswSize: number;\n };\n memory?: {\n patterns: number;\n avgSuccess: number;\n hnswSize: number;\n };\n documents?: {\n collections: number;\n documents: number;\n chunks: number;\n hnswSize: number;\n };\n notes?: {\n total: number;\n short: number;\n long: number;\n };\n}\n\n// ── Index Progress ──────────────────────────────────\n\n/** File-level progress (used by indexers). */\nexport type ProgressCallback = (file: string, current: number, total: number) => void;\n\n/** Stage-level progress (used by BrainBank.index() orchestrator). */\nexport type StageProgressCallback = (stage: string, message: string) => void;\n\nexport interface IndexResult {\n indexed: number;\n skipped: number;\n chunks?: number;\n}\n\n// ── Co-Edits ────────────────────────────────────────\n\nexport interface CoEditSuggestion {\n file: string;\n count: number;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2QO,SAAS,aAAa,GAAkC;AAC3D,SAAO,EAAE,SAAS;AACtB;AAFgB;AAIT,SAAS,eAAe,GAAoC;AAC/D,SAAO,EAAE,SAAS;AACtB;AAFgB;AAIT,SAAS,iBAAiB,GAAsC;AACnE,SAAO,EAAE,SAAS;AACtB;AAFgB;AAIT,SAAS,gBAAgB,GAAqC;AACjE,SAAO,EAAE,SAAS;AACtB;AAFgB;AAIT,SAAS,mBAAmB,GAAwC;AACvE,SAAO,EAAE,SAAS;AACtB;AAFgB;AAmBT,SAAS,YACZ,QACA,UACa;AACb,UAAQ,OAAO,MAAM;AAAA,IACjB,KAAK;AAAc,cAAQ,SAAS,QAAc,SAAS,KAAK,MAAM;AAAA,IACtE,KAAK;AAAc,cAAQ,SAAS,UAAc,SAAS,KAAK,MAAM;AAAA,IACtE,KAAK;AAAc,cAAQ,SAAS,WAAc,SAAS,KAAK,MAAM;AAAA,IACtE,KAAK;AAAc,cAAQ,SAAS,YAAc,SAAS,KAAK,MAAM;AAAA,IACtE,KAAK;AAAc,cAAQ,SAAS,cAAc,SAAS,KAAK,MAAM;AAAA,EAC1E;AACJ;AAXgB;","names":[]}
1
+ {"version":3,"sources":["../src/types.ts","../src/providers/embeddings/embedding-worker.ts","../src/db/migrations.ts","../src/search/vector/mmr.ts"],"sourcesContent":["/**\n * BrainBank — Type Definitions\n * \n * All interfaces and types for the semantic knowledge bank.\n */\n\n\nimport type { CollectionItem, CollectionSearchOptions, CollectionAddOptions } from './services/collection.ts';\n\n// Re-export collection types so consumers don't need to import from services/\nexport type { CollectionItem, CollectionSearchOptions, CollectionAddOptions };\n\n\n/** Public contract for a KV collection. Plugins depend on this interface, not the concrete class. */\nexport interface ICollection {\n /** Collection name. */\n readonly name: string;\n /** Add an item. Returns its ID. */\n add(content: string, options?: CollectionAddOptions | Record<string, unknown>): Promise<number>;\n /** Update an item's content (re-embeds). Returns the new ID. */\n update(id: number, content: string, options?: CollectionAddOptions): Promise<number>;\n /** Add multiple items. Returns their IDs. */\n addMany(items: { content: string; metadata?: Record<string, unknown>; tags?: string[]; ttl?: string }[]): Promise<number[]>;\n /** Search this collection. */\n search(query: string, options?: CollectionSearchOptions): Promise<CollectionItem[]>;\n /** List items (newest first). */\n list(options?: { limit?: number; offset?: number; tags?: string[] }): CollectionItem[];\n /** Count items in this collection. */\n count(): number;\n /** Keep only the N most recent items. */\n trim(options: { keep: number }): Promise<{ removed: number }>;\n /** Remove items older than a duration string. */\n prune(options: { olderThan: string }): Promise<{ removed: number }>;\n /** Remove a specific item by ID. */\n remove(id: number): void;\n /** Clear all items in this collection. */\n clear(): void;\n}\n\n\nexport interface BrainBankConfig {\n /** Root path of the repository to index. Default: '.' */\n repoPath?: string;\n /** SQLite database path. Default: '.brainbank/data/brainbank.db' */\n dbPath?: string;\n\n /** Max git commits to index. Default: 500 */\n gitDepth?: number;\n /** Max file size in bytes to index. Default: 512_000 (500KB) */\n maxFileSize?: number;\n /** Max diff bytes per commit. Default: 8192 */\n maxDiffBytes?: number;\n /** HNSW M parameter (connections per node). Default: 16 */\n hnswM?: number;\n /** HNSW efConstruction (build-time candidates). Default: 200 */\n hnswEfConstruction?: number;\n /** HNSW efSearch (query-time candidates). Default: 50 */\n hnswEfSearch?: number;\n /** Embedding dimensions. Default: 384 */\n embeddingDims?: number;\n /** Max HNSW elements. Default: 2_000_000 */\n maxElements?: number;\n /** Custom embedding provider (default: local WASM model) */\n embeddingProvider?: EmbeddingProvider;\n /** Optional reranker for improved search quality */\n reranker?: Reranker;\n /** Optional LLM noise filter — drops irrelevant results before formatting */\n pruner?: Pruner;\n /** Optional LLM context expander — discovers additional relevant chunks after pruning */\n expander?: Expander;\n /** Port for optional webhook server (enables push-based watch plugins). */\n webhookPort?: number;\n /** Context field defaults from config.json \"context\" section. */\n contextFields?: Record<string, unknown>;\n}\n\nexport interface ResolvedConfig {\n repoPath: string;\n dbPath: string;\n gitDepth: number;\n maxFileSize: number;\n maxDiffBytes: number;\n hnswM: number;\n hnswEfConstruction: number;\n hnswEfSearch: number;\n embeddingDims: number;\n maxElements: number;\n embeddingProvider?: EmbeddingProvider;\n reranker?: Reranker;\n pruner?: Pruner;\n expander?: Expander;\n webhookPort?: number;\n /** Context field defaults from config.json \"context\" section. */\n contextFields?: Record<string, unknown>;\n}\n\n\nexport interface EmbeddingProvider {\n /** Vector dimensions produced by this provider. */\n readonly dims: number;\n /** Embed a single text string. */\n embed(text: string): Promise<Float32Array>;\n /** Embed multiple texts (batch). */\n embedBatch(texts: string[]): Promise<Float32Array[]>;\n /** Release resources. */\n close(): Promise<void>;\n}\n\n\nexport interface Reranker {\n /**\n * Score each document's relevance to the query.\n * @param query - The search query\n * @param documents - Document contents to rank\n * @returns Relevance scores (0.0 - 1.0) in same order as documents\n */\n rank(query: string, documents: string[]): Promise<number[]>;\n /** Release resources (e.g. unload model). */\n close?(): Promise<void>;\n}\n\n\n/** Item passed to the pruner for noise classification. */\nexport interface PrunerItem {\n /** Positional index (used to map back to SearchResult[]) */\n id: number;\n /** File path — primary signal for relevance */\n filePath: string;\n /** Trimmed content preview */\n preview: string;\n /** Chunk metadata (type, name, language, lines, etc.) */\n metadata: Record<string, unknown>;\n}\n\nexport interface Pruner {\n /**\n * Filter noise from search results and order by semantic relevance.\n * @param query - The search query\n * @param items - Items to evaluate (filePath + metadata + trimmed preview)\n * @returns Array of item IDs to KEEP, ordered by relevance to the query\n * (most relevant first). Everything else is dropped.\n */\n prune(query: string, items: PrunerItem[]): Promise<number[]>;\n /** Release resources. */\n close?(): Promise<void>;\n}\n\n/** Lightweight chunk descriptor for the expander manifest. */\nexport interface ExpanderManifestItem {\n /** Chunk ID (code_chunks.id) */\n id: number;\n /** File path */\n filePath: string;\n /** Chunk name (e.g. function/class name) */\n name: string;\n /** Chunk type (function, class, method, etc.) */\n chunkType: string;\n /** Line range (e.g. \"L45-L89\") */\n lines: string;\n}\n\n/** Result from the expander: chunk IDs to add + optional free-text note. */\nexport interface ExpanderResult {\n /** Additional chunk IDs to splice into results. */\n ids: number[];\n /** Brief observation for the agent (e.g. \"file X not found\", \"module Y is deprecated\"). */\n note?: string;\n}\n\nexport interface Expander {\n /**\n * Given a task and a manifest of available chunks,\n * return additional chunk IDs + an optional contextual note.\n * Runs after pruning. Fail-open: errors return empty result.\n *\n * @param query - The search query / task description\n * @param currentIds - IDs of chunks already in results (from search + prune)\n * @param manifest - All available chunks (lightweight descriptors)\n * @returns Chunk IDs to add + optional note\n */\n expand(query: string, currentIds: number[], manifest: ExpanderManifestItem[]): Promise<ExpanderResult>;\n /** Release resources. */\n close?(): Promise<void>;\n}\n\n\nexport interface SearchHit {\n id: number;\n score: number;\n}\n\nexport interface VectorIndex {\n /** Initialize the index. Must be called before add/search. */\n init(): Promise<this>;\n /** Add a vector with an integer ID. Idempotent: duplicate IDs are skipped. */\n add(vector: Float32Array, id: number): void;\n /** Mark a vector as deleted so it no longer appears in searches. */\n remove(id: number): void;\n /** Search for k nearest neighbors. */\n search(query: Float32Array, k: number): SearchHit[];\n /** Clear all vectors and reset to empty state. */\n reinit(): void;\n /** Number of vectors in the index. */\n readonly size: number;\n}\n\n\nexport interface CodeChunk {\n /** Auto-incremented DB id (set after insert) */\n id?: number;\n /** Relative file path from repo root */\n filePath: string;\n /** Chunk type: 'file' | 'function' | 'class' | 'block' */\n chunkType: string;\n /** Function/class name (if detected) */\n name?: string;\n /** Start line (1-indexed) */\n startLine: number;\n /** End line (1-indexed, inclusive) */\n endLine: number;\n /** Raw content of the chunk */\n content: string;\n /** Language identifier */\n language: string;\n}\n\n\nexport interface GitCommitRecord {\n id?: number;\n hash: string;\n shortHash: string;\n message: string;\n author: string;\n date: string;\n timestamp: number;\n filesChanged: string[];\n diff?: string;\n additions: number;\n deletions: number;\n isMerge: boolean;\n}\n\n\n\n\n\nexport type SearchResultType = 'code' | 'commit' | 'document' | 'collection';\n\n// Typed metadata per result type\n\nexport interface CodeResultMetadata {\n /** Database chunk ID (used by call graph annotations). */\n id?: number;\n /** File path (may duplicate CodeResult.filePath for metadata-only access). */\n filePath?: string;\n /** Adjacent chunk IDs from the same file (used by context expansion). */\n chunkIds?: number[];\n chunkType: string;\n name?: string;\n startLine: number;\n endLine: number;\n language: string;\n searchType?: string;\n rrfScore?: number;\n}\n\nexport interface CommitResultMetadata {\n hash: string;\n shortHash: string;\n author: string;\n date: string;\n files: string[];\n additions?: number;\n deletions?: number;\n diff?: string;\n searchType?: string;\n rrfScore?: number;\n}\n\n\n\nexport interface DocumentResultMetadata {\n collection?: string;\n title?: string;\n seq?: number;\n path?: string;\n searchType?: string;\n /** Internal chunk ID used by hybrid search to map fused results. */\n chunkId?: number;\n rrfScore?: number;\n}\n\n// Discriminated union\n\nexport interface CodeResult {\n type: 'code';\n score: number;\n filePath: string;\n content: string;\n context?: string;\n metadata: CodeResultMetadata;\n}\n\nexport interface CommitResult {\n type: 'commit';\n score: number;\n filePath?: string;\n content: string;\n context?: string;\n metadata: CommitResultMetadata;\n}\n\n\n\nexport interface DocumentResult {\n type: 'document';\n score: number;\n filePath: string;\n content: string;\n context?: string;\n metadata: DocumentResultMetadata;\n}\n\nexport interface CollectionResultMetadata {\n id?: number;\n collection?: string;\n rrfScore?: number;\n [key: string]: unknown;\n}\n\nexport interface CollectionResult {\n type: 'collection';\n score: number;\n filePath?: string;\n content: string;\n context?: string;\n metadata: CollectionResultMetadata;\n}\n\nexport type SearchResult = CodeResult | CommitResult | DocumentResult | CollectionResult;\n\n\n/** Narrow a SearchResult to CodeResult. */\nexport function isCodeResult(r: SearchResult): r is CodeResult {\n return r.type === 'code';\n}\n/** Narrow a SearchResult to CommitResult. */\nexport function isCommitResult(r: SearchResult): r is CommitResult {\n return r.type === 'commit';\n}\n/** Narrow a SearchResult to DocumentResult. */\nexport function isDocumentResult(r: SearchResult): r is DocumentResult {\n return r.type === 'document';\n}\n\n/** Narrow a SearchResult to CollectionResult. */\nexport function isCollectionResult(r: SearchResult): r is CollectionResult {\n return r.type === 'collection';\n}\n\n\ntype MatchHandlers<T> = {\n code?: (r: CodeResult) => T;\n commit?: (r: CommitResult) => T;\n document?: (r: DocumentResult) => T;\n collection?: (r: CollectionResult) => T;\n _?: (r: SearchResult) => T;\n};\n\n/**\n * Pattern-match on SearchResult type. Calls the matching handler\n * or the `_` fallback. Returns undefined if no handler matches.\n */\nexport function matchResult<T>(\n result: SearchResult,\n handlers: MatchHandlers<T>,\n): T | undefined {\n switch (result.type) {\n case 'code': return (handlers.code ?? handlers._)?.(result);\n case 'commit': return (handlers.commit ?? handlers._)?.(result);\n case 'document': return (handlers.document ?? handlers._)?.(result);\n case 'collection': return (handlers.collection ?? handlers._)?.(result);\n }\n}\n\n\nexport interface ContextOptions {\n /** Per-source result limits. Built-in: 'code', 'git'. Default: { code: 6, git: 5 } */\n sources?: Record<string, number>;\n /** Files the agent is about to modify (improves co-edit suggestions) */\n affectedFiles?: string[];\n /** Minimum similarity score threshold. Default: 0.25 */\n minScore?: number;\n /** Use MMR for diversity. Default: true */\n useMMR?: boolean;\n /** MMR lambda (0 = diversity, 1 = relevance). Default: 0.7 */\n mmrLambda?: number;\n /** Filter results to files under this path prefix (e.g. 'src/services/'). */\n pathPrefix?: string;\n /** File paths to exclude from results (e.g. files already returned in a previous query). */\n excludeFiles?: Set<string>;\n /** Optional per-request pruner override (e.g. HaikuPruner for LLM noise filtering). */\n pruner?: Pruner;\n /** Caller origin for debug logging. */\n source?: 'cli' | 'mcp' | 'daemon' | 'api';\n /**\n * Context field overrides. Merged on top of config.json \"context\" defaults.\n * Plugin-defined fields like `lines`, `callTree`, `symbols`, `compact`, `imports`.\n * Example: `{ lines: true, callTree: { depth: 3 }, symbols: true }`\n */\n fields?: Record<string, unknown>;\n}\n\n\nexport interface DocumentCollection {\n /** Collection name (e.g. 'notes', 'docs') */\n name: string;\n /** Directory path to index */\n path: string;\n /** Glob pattern for files (default: all markdown) */\n pattern?: string;\n /** Glob patterns to ignore */\n ignore?: string[];\n /** Context description for this collection */\n context?: string;\n}\n\nexport interface DocChunk {\n id?: number;\n /** Collection name */\n collection: string;\n /** Relative file path within the collection */\n filePath: string;\n /** Document title (first heading or filename) */\n title: string;\n /** Chunk content */\n content: string;\n /** Chunk sequence within the document (0, 1, 2...) */\n seq: number;\n /** Character position in original document */\n pos: number;\n /** Content hash for incremental updates */\n contentHash: string;\n}\n\n\n/** Plugin-provided stats. Key is the plugin name. */\nexport interface IndexStats {\n [pluginName: string]: Record<string, number | string> | undefined;\n}\n\n\n/** File-level progress (used by indexers). */\nexport type ProgressCallback = (file: string, current: number, total: number) => void;\n\n/** Stage-level progress (used by BrainBank.index() orchestrator). */\nexport type StageProgressCallback = (stage: string, message: string) => void;\n\nexport interface IndexResult {\n indexed: number;\n skipped: number;\n chunks?: number;\n removed?: number;\n}\n\n\nexport interface CoEditSuggestion {\n file: string;\n count: number;\n}\n\n\n/** Generalized watch event — works for files, APIs, webhooks. */\nexport interface WatchEvent {\n /** Event type. 'sync' is for batch/poll sources that don't distinguish CRUD. */\n type: 'create' | 'update' | 'delete' | 'sync';\n /** Unique ID of the changed item (file path, PR#123, PROJ-456, etc.). */\n sourceId: string;\n /** Source descriptor (e.g. 'file', 'github:pr', 'jira:card'). */\n sourceName: string;\n /** Optional raw payload to avoid re-fetching. */\n payload?: unknown;\n}\n\n/** Callback that plugins invoke when they detect a change. */\nexport type WatchEventHandler = (event: WatchEvent) => void;\n\n/** Lifecycle handle returned by WatchablePlugin.watch(). */\nexport interface WatchHandle {\n /** Stop watching and release resources. */\n stop(): Promise<void>;\n /** Whether the watcher is still active. */\n readonly active: boolean;\n}\n\n/** Optional hints from plugin to core — debounce, batching, priority. */\nexport interface WatchConfig {\n /** Debounce interval in ms. 0 = process immediately. Default: inherited from WatchOptions. */\n debounceMs?: number;\n /** Max events to batch before triggering re-index. Default: unlimited. */\n batchSize?: number;\n /** Processing priority. Default: 'realtime'. */\n priority?: 'realtime' | 'background';\n}\n","/**\n * BrainBank — Embedding Worker Proxy\n *\n * Drop-in replacement for any EmbeddingProvider that offloads\n * embedding computation to a dedicated worker thread.\n * The main thread's event loop stays free for serving searches.\n *\n * Usage:\n * const proxy = new EmbeddingWorkerProxy('local', { model: '...' });\n * await proxy.ready();\n * const vec = await proxy.embed('hello');\n */\n\nimport type { EmbeddingProvider } from '@/types.ts';\n\nimport { Worker } from 'node:worker_threads';\nimport { fileURLToPath } from 'node:url';\nimport { join, dirname } from 'node:path';\n\n/** Message sent to the worker. */\ninterface WorkerRequest {\n id: number;\n type: 'embed' | 'embedBatch' | 'close';\n text?: string;\n texts?: string[];\n}\n\n/** Message received from the worker. */\ninterface WorkerResponse {\n id: number;\n type: 'result' | 'error';\n vector?: ArrayBuffer;\n vectors?: ArrayBuffer[];\n dims?: number;\n error?: string;\n}\n\nexport class EmbeddingWorkerProxy implements EmbeddingProvider {\n private _worker: Worker;\n private _nextId = 1;\n private _pending = new Map<number, { resolve: (v: WorkerResponse) => void; reject: (e: Error) => void }>();\n private _ready: Promise<void>;\n private _dims = 0;\n\n /** Embedding dimensions (available after `ready()` resolves). */\n get dims(): number { return this._dims; }\n\n constructor(\n providerType: string,\n providerOptions: Record<string, unknown> = {},\n ) {\n const workerPath = join(\n dirname(fileURLToPath(import.meta.url)),\n 'embedding-worker-thread.ts',\n );\n\n this._worker = new Worker(workerPath, {\n workerData: { providerType, providerOptions },\n execArgv: ['--import', 'tsx'],\n });\n\n this._worker.on('message', (msg: WorkerResponse) => {\n // Initial ready signal (id === 0)\n if (msg.id === 0 && msg.dims) {\n this._dims = msg.dims;\n return;\n }\n\n const pending = this._pending.get(msg.id);\n if (!pending) return;\n this._pending.delete(msg.id);\n\n if (msg.type === 'error') {\n pending.reject(new Error(`BrainBank: Embedding worker error: ${msg.error}`));\n } else {\n pending.resolve(msg);\n }\n });\n\n this._worker.on('error', (err: Error) => {\n for (const pending of this._pending.values()) {\n pending.reject(err);\n }\n this._pending.clear();\n });\n\n // Wait for the worker to signal ready\n this._ready = new Promise<void>((resolve, reject) => {\n const onMsg = (msg: WorkerResponse) => {\n if (msg.id === 0 && msg.dims) {\n this._dims = msg.dims;\n this._worker.removeListener('message', onMsg);\n resolve();\n }\n };\n this._worker.on('message', onMsg);\n this._worker.on('error', reject);\n });\n }\n\n /** Wait for the worker to be ready (provider loaded). */\n async ready(): Promise<void> {\n return this._ready;\n }\n\n /** Send a request to the worker and wait for the response. */\n private _send(req: Omit<WorkerRequest, 'id'>): Promise<WorkerResponse> {\n const id = this._nextId++;\n return new Promise<WorkerResponse>((resolve, reject) => {\n this._pending.set(id, { resolve, reject });\n this._worker.postMessage({ ...req, id } satisfies WorkerRequest);\n });\n }\n\n /** Embed a single text string. */\n async embed(text: string): Promise<Float32Array> {\n await this._ready;\n const resp = await this._send({ type: 'embed', text });\n if (!resp.vector) throw new Error('BrainBank: Worker returned no vector.');\n return new Float32Array(resp.vector);\n }\n\n /** Embed multiple texts in a batch. */\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (texts.length === 0) return [];\n await this._ready;\n const resp = await this._send({ type: 'embedBatch', texts });\n if (!resp.vectors) throw new Error('BrainBank: Worker returned no vectors.');\n return resp.vectors.map(buf => new Float32Array(buf));\n }\n\n /** Terminate the worker. */\n async close(): Promise<void> {\n try {\n await this._send({ type: 'close' });\n } catch {\n // Worker may already be terminated\n }\n await this._worker.terminate();\n }\n}\n","/**\n * BrainBank — Plugin Migration System\n *\n * Per-plugin versioned schema migrations.\n * Each plugin declares a schemaVersion + ordered migrations array.\n * Core stores applied versions in `plugin_versions` table.\n *\n * Plugins call `runPluginMigrations()` at the top of their `initialize()`.\n * Migrations use `IF NOT EXISTS` so first run on an existing DB is a no-op.\n */\n\nimport type { DatabaseAdapter } from './adapter.ts';\n\n/** A single migration step. */\nexport interface Migration {\n /** Version this migration brings the schema to. */\n version: number;\n /** Apply the migration. Must be idempotent (use IF NOT EXISTS). */\n up(adapter: DatabaseAdapter): void;\n}\n\n/** Get the currently stored schema version for a plugin. Returns 0 if no record. */\nexport function getPluginVersion(adapter: DatabaseAdapter, pluginName: string): number {\n try {\n const row = adapter.prepare(\n 'SELECT version FROM plugin_versions WHERE plugin_name = ?'\n ).get(pluginName) as { version: number } | undefined;\n return row?.version ?? 0;\n } catch {\n return 0;\n }\n}\n\n/** Set the schema version for a plugin. */\nexport function setPluginVersion(adapter: DatabaseAdapter, pluginName: string, version: number): void {\n adapter.prepare(`\n INSERT OR REPLACE INTO plugin_versions (plugin_name, version, applied_at)\n VALUES (?, ?, unixepoch())\n `).run(pluginName, version);\n}\n\n/**\n * Run pending migrations for a plugin.\n * Skips migrations whose version <= stored version.\n * Each migration runs in its own transaction.\n */\nexport function runPluginMigrations(\n adapter: DatabaseAdapter,\n pluginName: string,\n schemaVersion: number,\n migrations: Migration[],\n): void {\n const current = getPluginVersion(adapter, pluginName);\n if (current >= schemaVersion) return;\n\n const sorted = [...migrations].sort((a, b) => a.version - b.version);\n\n for (const m of sorted) {\n if (m.version <= current) continue;\n\n adapter.transaction(() => {\n m.up(adapter);\n setPluginVersion(adapter, pluginName, m.version);\n });\n }\n}\n","/**\n * BrainBank — Maximum Marginal Relevance (MMR)\n * \n * Diversifies vector search results to avoid returning redundant items.\n * λ=1.0 → pure relevance, λ=0.0 → pure diversity.\n * Default λ=0.7 balances both.\n */\n\nimport type { VectorIndex, SearchHit } from '@/types.ts';\nimport { cosineSimilarity } from '@/lib/math.ts';\n\n/**\n * Search with Maximum Marginal Relevance for diversified results.\n * \n * Algorithm:\n * 1. Get 3x candidates from HNSW\n * 2. Greedily select items that maximize: λ * relevance - (1-λ) * max_sim_to_selected\n */\nexport function searchMMR(\n index: VectorIndex,\n query: Float32Array,\n vectorCache: Map<number, Float32Array>,\n k: number,\n lambda: number = 0.7,\n): SearchHit[] {\n // Get more candidates than needed\n const candidates = index.search(query, k * 3);\n if (candidates.length <= k) return candidates;\n\n const selected: SearchHit[] = [];\n const remaining = [...candidates];\n\n while (selected.length < k && remaining.length > 0) {\n let bestScore = -Infinity;\n let bestIdx = 0;\n\n for (let i = 0; i < remaining.length; i++) {\n const relevance = remaining[i].score;\n\n // Max similarity to any already-selected item\n let maxSim = 0;\n for (const sel of selected) {\n const candidateVec = vectorCache.get(remaining[i].id);\n const selectedVec = vectorCache.get(sel.id);\n if (candidateVec && selectedVec) {\n maxSim = Math.max(maxSim, cosineSimilarity(candidateVec, selectedVec));\n }\n }\n\n // MMR score: balance relevance vs diversity\n const mmrScore = lambda * relevance - (1 - lambda) * maxSim;\n\n if (mmrScore > bestScore) {\n bestScore = mmrScore;\n bestIdx = i;\n }\n }\n\n selected.push(remaining[bestIdx]);\n remaining.splice(bestIdx, 1);\n }\n\n return selected;\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  LocalEmbedding
3
- } from "./chunk-424UFCY7.js";
3
+ } from "./chunk-QTZNB6AK.js";
4
4
  import "./chunk-7QVYU63E.js";
5
5
  export {
6
6
  LocalEmbedding
7
7
  };
8
- //# sourceMappingURL=local-embedding-ZIMTK6PU.js.map
8
+ //# sourceMappingURL=local-embedding-2RNCC5EU.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  OpenAIEmbedding
3
- } from "./chunk-CCXVL56V.js";
3
+ } from "./chunk-3JZIM5AU.js";
4
4
  import "./chunk-7QVYU63E.js";
5
5
  export {
6
6
  OpenAIEmbedding
7
7
  };
8
- //# sourceMappingURL=openai-embedding-VQZCZQYT.js.map
8
+ //# sourceMappingURL=openai-embedding-Z5I4K4CN.js.map
@@ -0,0 +1,9 @@
1
+ import {
2
+ PerplexityContextEmbedding
3
+ } from "./chunk-5KU2PP34.js";
4
+ import "./chunk-3HVCONGF.js";
5
+ import "./chunk-7QVYU63E.js";
6
+ export {
7
+ PerplexityContextEmbedding
8
+ };
9
+ //# sourceMappingURL=perplexity-context-embedding-V5YUMXDR.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  PerplexityEmbedding,
3
3
  decodeBase64Int8
4
- } from "./chunk-N2OJRXSB.js";
4
+ } from "./chunk-3HVCONGF.js";
5
5
  import "./chunk-7QVYU63E.js";
6
6
  export {
7
7
  PerplexityEmbedding,
8
8
  decodeBase64Int8
9
9
  };
10
- //# sourceMappingURL=perplexity-embedding-227WQY4R.js.map
10
+ //# sourceMappingURL=perplexity-embedding-X2S72OAC.js.map
@@ -0,0 +1,32 @@
1
+ import {
2
+ isBM25SearchPlugin,
3
+ isCoEditPlugin,
4
+ isContextFieldPlugin,
5
+ isContextFormatterPlugin,
6
+ isDocsPlugin,
7
+ isExpandablePlugin,
8
+ isFileResolvable,
9
+ isIndexable,
10
+ isMigratable,
11
+ isReembeddable,
12
+ isSearchable,
13
+ isVectorSearchPlugin,
14
+ isWatchable
15
+ } from "./chunk-E3J37GDA.js";
16
+ import "./chunk-7QVYU63E.js";
17
+ export {
18
+ isBM25SearchPlugin,
19
+ isCoEditPlugin,
20
+ isContextFieldPlugin,
21
+ isContextFormatterPlugin,
22
+ isDocsPlugin,
23
+ isExpandablePlugin,
24
+ isFileResolvable,
25
+ isIndexable,
26
+ isMigratable,
27
+ isReembeddable,
28
+ isSearchable,
29
+ isVectorSearchPlugin,
30
+ isWatchable
31
+ };
32
+ //# sourceMappingURL=plugin-FF4Q34TI.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Qwen3Reranker
3
- } from "./chunk-ZNLN2VWV.js";
3
+ } from "./chunk-TD3TEFI3.js";
4
4
  import "./chunk-7QVYU63E.js";
5
5
  export {
6
6
  Qwen3Reranker
7
7
  };
8
- //# sourceMappingURL=qwen3-reranker-3MHEENT5.js.map
8
+ //# sourceMappingURL=qwen3-reranker-HVIQOLKS.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  providerKey,
3
3
  resolveEmbedding
4
- } from "./chunk-B77KABWH.js";
4
+ } from "./chunk-7T2ZCZQA.js";
5
5
  import "./chunk-7QVYU63E.js";
6
6
  export {
7
7
  providerKey,
8
8
  resolveEmbedding
9
9
  };
10
- //# sourceMappingURL=resolve-CUJWY6HP.js.map
10
+ //# sourceMappingURL=resolve-Q5D6HECY.js.map