@pella-labs/pinakes 0.1.10 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +20 -20
  2. package/dist/cli/audit.d.ts +5 -3
  3. package/dist/cli/audit.d.ts.map +1 -1
  4. package/dist/cli/audit.js +3 -24
  5. package/dist/cli/audit.js.map +1 -1
  6. package/dist/cli/contradiction-cli.d.ts +12 -0
  7. package/dist/cli/contradiction-cli.d.ts.map +1 -0
  8. package/dist/cli/contradiction-cli.js +35 -0
  9. package/dist/cli/contradiction-cli.js.map +1 -0
  10. package/dist/cli/contradiction.d.ts +59 -0
  11. package/dist/cli/contradiction.d.ts.map +1 -0
  12. package/dist/cli/contradiction.js +172 -0
  13. package/dist/cli/contradiction.js.map +1 -0
  14. package/dist/cli/export.d.ts +1 -1
  15. package/dist/cli/export.d.ts.map +1 -1
  16. package/dist/cli/export.js +7 -28
  17. package/dist/cli/export.js.map +1 -1
  18. package/dist/cli/import.d.ts +2 -2
  19. package/dist/cli/import.d.ts.map +1 -1
  20. package/dist/cli/import.js +5 -26
  21. package/dist/cli/import.js.map +1 -1
  22. package/dist/cli/index.js +39 -11
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/purge.d.ts +2 -2
  25. package/dist/cli/purge.d.ts.map +1 -1
  26. package/dist/cli/purge.js +2 -23
  27. package/dist/cli/purge.js.map +1 -1
  28. package/dist/cli/rebuild.d.ts +8 -6
  29. package/dist/cli/rebuild.d.ts.map +1 -1
  30. package/dist/cli/rebuild.js +9 -31
  31. package/dist/cli/rebuild.js.map +1 -1
  32. package/dist/cli/serve.d.ts +9 -7
  33. package/dist/cli/serve.d.ts.map +1 -1
  34. package/dist/cli/serve.js +71 -41
  35. package/dist/cli/serve.js.map +1 -1
  36. package/dist/cli/status.d.ts +7 -5
  37. package/dist/cli/status.d.ts.map +1 -1
  38. package/dist/cli/status.js +10 -29
  39. package/dist/cli/status.js.map +1 -1
  40. package/dist/db/client.d.ts +4 -4
  41. package/dist/db/client.js +3 -3
  42. package/dist/db/client.js.map +1 -1
  43. package/dist/db/migrations/migrations/0002_rename_kg_to_pinakes.sql +49 -0
  44. package/dist/db/migrations/migrations/meta/0002_snapshot.json +504 -0
  45. package/dist/db/migrations/migrations/meta/_journal.json +7 -0
  46. package/dist/db/repository.js +5 -5
  47. package/dist/db/repository.js.map +1 -1
  48. package/dist/db/schema.d.ts +84 -84
  49. package/dist/db/schema.d.ts.map +1 -1
  50. package/dist/db/schema.js +49 -49
  51. package/dist/db/schema.js.map +1 -1
  52. package/dist/db/types.d.ts +2 -2
  53. package/dist/db/types.js +1 -1
  54. package/dist/gaps/detector.d.ts +5 -5
  55. package/dist/gaps/detector.js +15 -15
  56. package/dist/gaps/detector.js.map +1 -1
  57. package/dist/ingest/chokidar.js +1 -1
  58. package/dist/ingest/ingester.d.ts +9 -4
  59. package/dist/ingest/ingester.d.ts.map +1 -1
  60. package/dist/ingest/ingester.js +82 -17
  61. package/dist/ingest/ingester.js.map +1 -1
  62. package/dist/ingest/manifest.d.ts +5 -3
  63. package/dist/ingest/manifest.d.ts.map +1 -1
  64. package/dist/ingest/manifest.js +23 -14
  65. package/dist/ingest/manifest.js.map +1 -1
  66. package/dist/ingest/parse/chunk.js +1 -1
  67. package/dist/ingest/parse/markdown.d.ts +2 -2
  68. package/dist/ingest/queue.d.ts +1 -1
  69. package/dist/ingest/queue.js +1 -1
  70. package/dist/ingest/source.d.ts +2 -2
  71. package/dist/ingest/source.d.ts.map +1 -1
  72. package/dist/ingest/source.js +1 -1
  73. package/dist/llm/provider.d.ts +70 -0
  74. package/dist/llm/provider.d.ts.map +1 -0
  75. package/dist/llm/provider.js +235 -0
  76. package/dist/llm/provider.js.map +1 -0
  77. package/dist/mcp/envelope.d.ts +1 -1
  78. package/dist/mcp/tools/execute.d.ts +7 -7
  79. package/dist/mcp/tools/execute.d.ts.map +1 -1
  80. package/dist/mcp/tools/execute.js +41 -59
  81. package/dist/mcp/tools/execute.js.map +1 -1
  82. package/dist/mcp/tools/search.d.ts +13 -8
  83. package/dist/mcp/tools/search.d.ts.map +1 -1
  84. package/dist/mcp/tools/search.js +53 -28
  85. package/dist/mcp/tools/search.js.map +1 -1
  86. package/dist/observability/audit.d.ts +2 -2
  87. package/dist/observability/audit.js +3 -3
  88. package/dist/observability/audit.js.map +1 -1
  89. package/dist/observability/logger.js +4 -4
  90. package/dist/observability/logger.js.map +1 -1
  91. package/dist/observability/metrics.js +1 -1
  92. package/dist/observability/metrics.js.map +1 -1
  93. package/dist/paths.d.ts +61 -0
  94. package/dist/paths.d.ts.map +1 -0
  95. package/dist/paths.js +106 -0
  96. package/dist/paths.js.map +1 -0
  97. package/dist/retrieval/dedup.d.ts +25 -0
  98. package/dist/retrieval/dedup.d.ts.map +1 -0
  99. package/dist/retrieval/dedup.js +97 -0
  100. package/dist/retrieval/dedup.js.map +1 -0
  101. package/dist/retrieval/embedder.d.ts +9 -9
  102. package/dist/retrieval/embedder.d.ts.map +1 -1
  103. package/dist/retrieval/embedder.js +17 -17
  104. package/dist/retrieval/embedder.js.map +1 -1
  105. package/dist/retrieval/expand.d.ts +18 -0
  106. package/dist/retrieval/expand.d.ts.map +1 -0
  107. package/dist/retrieval/expand.js +89 -0
  108. package/dist/retrieval/expand.js.map +1 -0
  109. package/dist/retrieval/fts.d.ts +3 -3
  110. package/dist/retrieval/fts.js +8 -8
  111. package/dist/retrieval/graph.d.ts +47 -0
  112. package/dist/retrieval/graph.d.ts.map +1 -0
  113. package/dist/retrieval/graph.js +144 -0
  114. package/dist/retrieval/graph.js.map +1 -0
  115. package/dist/retrieval/hybrid.d.ts +10 -0
  116. package/dist/retrieval/hybrid.d.ts.map +1 -1
  117. package/dist/retrieval/hybrid.js +57 -2
  118. package/dist/retrieval/hybrid.js.map +1 -1
  119. package/dist/retrieval/vec.d.ts +2 -2
  120. package/dist/retrieval/vec.js +3 -3
  121. package/dist/sandbox/bindings/install.d.ts +5 -5
  122. package/dist/sandbox/bindings/install.d.ts.map +1 -1
  123. package/dist/sandbox/bindings/install.js +3 -3
  124. package/dist/sandbox/bindings/install.js.map +1 -1
  125. package/dist/sandbox/bindings/kg.d.ts.map +1 -1
  126. package/dist/sandbox/bindings/kg.js +10 -0
  127. package/dist/sandbox/bindings/kg.js.map +1 -1
  128. package/dist/sandbox/bindings/pinakes.d.ts +29 -0
  129. package/dist/sandbox/bindings/pinakes.d.ts.map +1 -0
  130. package/dist/sandbox/bindings/pinakes.js +333 -0
  131. package/dist/sandbox/bindings/pinakes.js.map +1 -0
  132. package/dist/sandbox/bindings/write.d.ts +1 -1
  133. package/dist/sandbox/bindings/write.d.ts.map +1 -1
  134. package/dist/sandbox/bindings/write.js +9 -9
  135. package/dist/sandbox/bindings/write.js.map +1 -1
  136. package/dist/sandbox/executor.d.ts +3 -3
  137. package/dist/sandbox/executor.js +6 -6
  138. package/dist/sandbox/executor.js.map +1 -1
  139. package/dist/sandbox/helpers.d.ts +1 -1
  140. package/dist/sandbox/helpers.d.ts.map +1 -1
  141. package/dist/sandbox/helpers.js +2 -2
  142. package/dist/sandbox/vendored-codemode.d.ts +1 -1
  143. package/dist/sandbox/vendored-codemode.js +1 -1
  144. package/dist/server.js +15 -6
  145. package/dist/server.js.map +1 -1
  146. package/package.json +22 -27
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/retrieval/embedder.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,6FAA6F;AAC7F,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,mEAAmE;IACnE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5C;AAQD;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IAKvC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJtC,QAAQ,CAAC,GAAG,OAAiB;IAE7B,OAAO,CAAC,eAAe,CAAmD;gBAE7C,SAAS,GAAE,MAAsB;IAOxD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAclC,WAAW;CAmB1B;AAMD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAKnC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,KAAK,SAAK;gBAEmB,KAAK,EAAE,QAAQ;IAItC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhD,KAAK,IAAI,IAAI;CAGd;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAC9B,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAkBjD;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAwB,EAChD,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBjD;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAiC,EACzD,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBjD;AAMD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,QAAQ,CAyBjE;AAQD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAKzD"}
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/retrieval/embedder.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,6FAA6F;AAC7F,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,mEAAmE;IACnE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5C;AAQD;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IAKvC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJtC,QAAQ,CAAC,GAAG,OAAiB;IAE7B,OAAO,CAAC,eAAe,CAAmD;gBAE7C,SAAS,GAAE,MAAsB;IAOxD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAclC,WAAW;CAmB1B;AAMD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAKnC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,KAAK,SAAK;gBAEmB,KAAK,EAAE,QAAQ;IAItC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKhD,KAAK,IAAI,IAAI;CAGd;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAC9B,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAkBjD;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAwB,EAChD,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBjD;AAMD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAI3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAGF,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAiC,EACzD,GAAG,GAAE,MAAsB;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBjD;AAMD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,QAAQ,CAyBjE;AAQD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAKzD"}
@@ -7,15 +7,15 @@ import { logger } from '../observability/logger.js';
7
7
  * between the ingest path (computing chunk embeddings on insert) and the
8
8
  * future query path in Phase 4 (computing query embeddings for vector
9
9
  * search). Putting it under `retrieval/` keeps the code-mode bindings'
10
- * mental model consistent — `kg.vec()` and ingest both call into the same
10
+ * mental model consistent — `pinakes.vec()` and ingest both call into the same
11
11
  * factory.
12
12
  *
13
13
  * **Provider strategy** (CLAUDE.md §AI Rules #3): Phase 2 ships only the
14
14
  * bundled MiniLM provider. Phase 4 adds the env-driven factory:
15
- * - `KG_EMBED_PROVIDER=transformers` (default, this file)
16
- * - `KG_EMBED_PROVIDER=ollama` (HTTP, user-controlled)
17
- * - `KG_EMBED_PROVIDER=voyage` (HTTPS, paid)
18
- * - `KG_EMBED_PROVIDER=openai` (HTTPS, paid)
15
+ * - `PINAKES_EMBED_PROVIDER=transformers` (default, this file)
16
+ * - `PINAKES_EMBED_PROVIDER=ollama` (HTTP, user-controlled)
17
+ * - `PINAKES_EMBED_PROVIDER=voyage` (HTTPS, paid)
18
+ * - `PINAKES_EMBED_PROVIDER=openai` (HTTPS, paid)
19
19
  *
20
20
  * **Failure mode** (CLAUDE.md §AI Rules #4): if the embedder fails during
21
21
  * ingest, the ingester logs a warning and inserts the node + chunks WITHOUT
@@ -123,7 +123,7 @@ export class CountingEmbedder {
123
123
  // ----------------------------------------------------------------------------
124
124
  /**
125
125
  * Ollama embedder via HTTP POST to `/api/embeddings`.
126
- * Requires `KG_OLLAMA_URL` and `KG_OLLAMA_MODEL` env vars.
126
+ * Requires `PINAKES_OLLAMA_URL` and `PINAKES_OLLAMA_MODEL` env vars.
127
127
  */
128
128
  export class OllamaEmbedder {
129
129
  baseUrl;
@@ -159,7 +159,7 @@ export class OllamaEmbedder {
159
159
  // ----------------------------------------------------------------------------
160
160
  /**
161
161
  * Voyage AI embedder via HTTPS POST to `https://api.voyageai.com/v1/embeddings`.
162
- * Requires `KG_VOYAGE_API_KEY` env var.
162
+ * Requires `PINAKES_VOYAGE_API_KEY` env var.
163
163
  */
164
164
  export class VoyageEmbedder {
165
165
  apiKey;
@@ -196,7 +196,7 @@ export class VoyageEmbedder {
196
196
  // ----------------------------------------------------------------------------
197
197
  /**
198
198
  * OpenAI embedder via HTTPS POST to `https://api.openai.com/v1/embeddings`.
199
- * Requires `KG_OPENAI_API_KEY` env var.
199
+ * Requires `PINAKES_OPENAI_API_KEY` env var.
200
200
  */
201
201
  export class OpenAIEmbedder {
202
202
  apiKey;
@@ -234,25 +234,25 @@ export class OpenAIEmbedder {
234
234
  * provider is unrecognized.
235
235
  */
236
236
  export function createEmbedder(provider) {
237
- const p = provider ?? process.env['KG_EMBED_PROVIDER'] ?? 'transformers';
237
+ const p = provider ?? process.env['PINAKES_EMBED_PROVIDER'] ?? 'transformers';
238
238
  switch (p) {
239
239
  case 'ollama': {
240
- const url = process.env['KG_OLLAMA_URL'] ?? 'http://localhost:11434';
241
- const model = process.env['KG_OLLAMA_MODEL'] ?? 'nomic-embed-text';
240
+ const url = process.env['PINAKES_OLLAMA_URL'] ?? 'http://localhost:11434';
241
+ const model = process.env['PINAKES_OLLAMA_MODEL'] ?? 'nomic-embed-text';
242
242
  return new OllamaEmbedder(url, model);
243
243
  }
244
244
  case 'voyage': {
245
- const key = process.env['KG_VOYAGE_API_KEY'];
245
+ const key = process.env['PINAKES_VOYAGE_API_KEY'];
246
246
  if (!key)
247
- throw new Error('KG_VOYAGE_API_KEY is required for voyage embedder');
248
- const model = process.env['KG_EMBED_MODEL'] ?? 'voyage-code-3';
247
+ throw new Error('PINAKES_VOYAGE_API_KEY is required for voyage embedder');
248
+ const model = process.env['PINAKES_EMBED_MODEL'] ?? 'voyage-code-3';
249
249
  return new VoyageEmbedder(key, model);
250
250
  }
251
251
  case 'openai': {
252
- const key = process.env['KG_OPENAI_API_KEY'];
252
+ const key = process.env['PINAKES_OPENAI_API_KEY'];
253
253
  if (!key)
254
- throw new Error('KG_OPENAI_API_KEY is required for openai embedder');
255
- const model = process.env['KG_EMBED_MODEL'] ?? 'text-embedding-3-small';
254
+ throw new Error('PINAKES_OPENAI_API_KEY is required for openai embedder');
255
+ const model = process.env['PINAKES_EMBED_MODEL'] ?? 'text-embedding-3-small';
256
256
  return new OpenAIEmbedder(key, model);
257
257
  }
258
258
  case 'transformers':
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/retrieval/embedder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/retrieval/embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LlmProvider } from '../llm/provider.js';
2
+ export interface ExpandResult {
3
+ original: string;
4
+ alternatives: string[];
5
+ }
6
+ /**
7
+ * Expand a query into 2 alternative phrasings via an LLM.
8
+ *
9
+ * Returns `{ original, alternatives: [] }` if:
10
+ * - Provider is not available
11
+ * - Query is too short (< 3 words — expansion adds noise for short queries)
12
+ * - LLM call fails (non-fatal)
13
+ * - Response can't be parsed as a JSON array of strings
14
+ */
15
+ export declare function expandQuery(query: string, provider: LlmProvider): Promise<ExpandResult>;
16
+ /** Clear the cache — test-only. */
17
+ export declare function __clearExpansionCacheForTests(): void;
18
+ //# sourceMappingURL=expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/retrieval/expand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoBtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC,CAwCvB;AA0BD,mCAAmC;AACnC,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -0,0 +1,89 @@
1
+ import { logger } from '../observability/logger.js';
2
+ /**
3
+ * Multi-query expansion (D38, GBrain-inspired).
4
+ *
5
+ * Uses an LLM to generate 2 alternative phrasings of a search query,
6
+ * improving recall for ambiguous or jargon-heavy queries. Results from
7
+ * all query variants are merged via RRF in the caller.
8
+ *
9
+ * Non-fatal: if the provider is unavailable or the call fails, returns
10
+ * empty alternatives and the caller uses the original query only.
11
+ */
12
+ const EXPANSION_SYSTEM = `You generate alternative search phrasings. Given a query, produce exactly 2 alternative phrasings that could help find relevant results. Return ONLY a JSON array of exactly 2 strings, no explanation.`;
13
+ /** Module-level cache: query → alternatives. Max 100 entries, no TTL. */
14
+ const cache = new Map();
15
+ const MAX_CACHE = 100;
16
+ /**
17
+ * Expand a query into 2 alternative phrasings via an LLM.
18
+ *
19
+ * Returns `{ original, alternatives: [] }` if:
20
+ * - Provider is not available
21
+ * - Query is too short (< 3 words — expansion adds noise for short queries)
22
+ * - LLM call fails (non-fatal)
23
+ * - Response can't be parsed as a JSON array of strings
24
+ */
25
+ export async function expandQuery(query, provider) {
26
+ const original = query.trim();
27
+ // Short queries don't benefit from expansion
28
+ if (original.split(/\s+/).length < 3) {
29
+ return { original, alternatives: [] };
30
+ }
31
+ if (!provider.available()) {
32
+ return { original, alternatives: [] };
33
+ }
34
+ // Check cache
35
+ const cached = cache.get(original);
36
+ if (cached) {
37
+ return { original, alternatives: cached };
38
+ }
39
+ try {
40
+ const response = await provider.complete({
41
+ system: EXPANSION_SYSTEM,
42
+ prompt: original,
43
+ maxTokens: 100,
44
+ });
45
+ const alternatives = parseAlternatives(response);
46
+ if (alternatives.length > 0) {
47
+ // LRU-ish eviction: delete oldest entry if at capacity
48
+ if (cache.size >= MAX_CACHE) {
49
+ const firstKey = cache.keys().next().value;
50
+ if (firstKey !== undefined)
51
+ cache.delete(firstKey);
52
+ }
53
+ cache.set(original, alternatives);
54
+ }
55
+ return { original, alternatives };
56
+ }
57
+ catch (err) {
58
+ logger.warn({ err, query: original }, 'query expansion failed (non-fatal)');
59
+ return { original, alternatives: [] };
60
+ }
61
+ }
62
+ /**
63
+ * Parse the LLM response as a JSON array of 2 strings.
64
+ * Returns empty array on any parse failure.
65
+ */
66
+ function parseAlternatives(response) {
67
+ try {
68
+ // Try to extract JSON array from the response (may have surrounding text)
69
+ const match = response.match(/\[[\s\S]*\]/);
70
+ if (!match)
71
+ return [];
72
+ const parsed = JSON.parse(match[0]);
73
+ if (!Array.isArray(parsed))
74
+ return [];
75
+ const strings = parsed
76
+ .filter((item) => typeof item === 'string' && item.trim().length > 0)
77
+ .map((s) => s.trim())
78
+ .slice(0, 2);
79
+ return strings;
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ }
85
+ /** Clear the cache — test-only. */
86
+ export function __clearExpansionCacheForTests() {
87
+ cache.clear();
88
+ }
89
+ //# sourceMappingURL=expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/retrieval/expand.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,8 @@ import type { Database as BetterSqliteDatabase } from 'better-sqlite3';
2
2
  /**
3
3
  * FTS5 full-text search with BM25 ranking and optional snippet extraction.
4
4
  *
5
- * Extracted from `src/sandbox/bindings/kg.ts` so both the sandbox bindings
6
- * and the `kg_search` MCP tool can share the same query logic. The binding
5
+ * Extracted from `src/sandbox/bindings/pinakes.ts` so both the sandbox bindings
6
+ * and the `pinakes_search` MCP tool can share the same query logic. The binding
7
7
  * delegates here; the MCP tool calls `hybridSearch` which calls here.
8
8
  *
9
9
  * **Tokenizer**: `unicode61 remove_diacritics 2` (set in the migration).
@@ -27,7 +27,7 @@ export interface FtsResult {
27
27
  * Run an FTS5 MATCH query with BM25 ranking and snippet extraction.
28
28
  *
29
29
  * @param reader A read-only `better-sqlite3` connection (from the read pool).
30
- * @param scope `'project'` or `'personal'` — filters by `kg_nodes.scope`.
30
+ * @param scope `'project'` or `'personal'` — filters by `pinakes_nodes.scope`.
31
31
  * @param query Raw user/LLM query string (will be escaped).
32
32
  * @param limit Max results (clamped to 1..100 by callers).
33
33
  * @returns Results ranked by BM25 (lower rank = better match).
@@ -2,7 +2,7 @@
2
2
  * Run an FTS5 MATCH query with BM25 ranking and snippet extraction.
3
3
  *
4
4
  * @param reader A read-only `better-sqlite3` connection (from the read pool).
5
- * @param scope `'project'` or `'personal'` — filters by `kg_nodes.scope`.
5
+ * @param scope `'project'` or `'personal'` — filters by `pinakes_nodes.scope`.
6
6
  * @param query Raw user/LLM query string (will be escaped).
7
7
  * @param limit Max results (clamped to 1..100 by callers).
8
8
  * @returns Results ranked by BM25 (lower rank = better match).
@@ -13,18 +13,18 @@ export function ftsQuery(reader, scope, query, limit) {
13
13
  return [];
14
14
  const rows = reader
15
15
  .prepare(`SELECT c.id AS id, c.text AS text,
16
- snippet(kg_chunks_fts, 0, '', '', '…', 64) AS snippet,
16
+ snippet(pinakes_chunks_fts, 0, '', '', '…', 64) AS snippet,
17
17
  n.source_uri AS source_uri,
18
- n.id AS node_id, bm25(kg_chunks_fts) AS rank,
18
+ n.id AS node_id, bm25(pinakes_chunks_fts) AS rank,
19
19
  n.confidence AS confidence,
20
20
  n.title AS title,
21
21
  n.section_path AS section_path
22
- FROM kg_chunks_fts f
23
- JOIN kg_chunks c ON c.rowid = f.rowid
24
- JOIN kg_nodes n ON c.node_id = n.id
22
+ FROM pinakes_chunks_fts f
23
+ JOIN pinakes_chunks c ON c.rowid = f.rowid
24
+ JOIN pinakes_nodes n ON c.node_id = n.id
25
25
  WHERE n.scope = ?
26
- AND kg_chunks_fts MATCH ?
27
- ORDER BY bm25(kg_chunks_fts)
26
+ AND pinakes_chunks_fts MATCH ?
27
+ ORDER BY bm25(pinakes_chunks_fts)
28
28
  LIMIT ?`)
29
29
  .all(scope, escaped, limit);
30
30
  return rows;
@@ -0,0 +1,47 @@
1
+ import type { Database as BetterSqliteDatabase } from 'better-sqlite3';
2
+ /**
3
+ * Graph algorithms over the `pinakes_edges` table (D40).
4
+ *
5
+ * - **PageRank**: iterative power method (d=0.85, 20 iterations).
6
+ * - **Connected components**: BFS on undirected edge interpretation.
7
+ *
8
+ * Both implementations are pure JS over SQL-loaded adjacency data.
9
+ * No new dependencies.
10
+ */
11
+ export interface PageRankOpts {
12
+ /** Damping factor (default 0.85). */
13
+ damping?: number;
14
+ /** Number of iterations (default 20, max 100). */
15
+ iterations?: number;
16
+ /** Max results to return (default 20, max 100). */
17
+ limit?: number;
18
+ }
19
+ export interface PageRankResult {
20
+ id: string;
21
+ source_uri: string;
22
+ title: string | null;
23
+ score: number;
24
+ }
25
+ /**
26
+ * Compute PageRank over the knowledge graph for a given scope.
27
+ *
28
+ * Uses the iterative power method:
29
+ * PR(v) = (1-d)/N + d * Σ PR(u)/out(u) for u in in-neighbors(v)
30
+ *
31
+ * Dangling nodes (no outgoing edges) redistribute their rank evenly.
32
+ */
33
+ export declare function pagerank(reader: BetterSqliteDatabase, scope: string, opts?: PageRankOpts): PageRankResult[];
34
+ export interface ComponentResult {
35
+ component_id: number;
36
+ nodes: Array<{
37
+ id: string;
38
+ source_uri: string;
39
+ title: string | null;
40
+ }>;
41
+ }
42
+ /**
43
+ * Find connected components in the knowledge graph (undirected).
44
+ * Returns components sorted by size descending.
45
+ */
46
+ export declare function connectedComponents(reader: BetterSqliteDatabase, scope: string): ComponentResult[];
47
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/retrieval/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEvE;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAClB,cAAc,EAAE,CA2FlB;AAMD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM,GACZ,eAAe,EAAE,CAmEnB"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Compute PageRank over the knowledge graph for a given scope.
3
+ *
4
+ * Uses the iterative power method:
5
+ * PR(v) = (1-d)/N + d * Σ PR(u)/out(u) for u in in-neighbors(v)
6
+ *
7
+ * Dangling nodes (no outgoing edges) redistribute their rank evenly.
8
+ */
9
+ export function pagerank(reader, scope, opts) {
10
+ const d = opts?.damping ?? 0.85;
11
+ const iterations = Math.min(Math.max(opts?.iterations ?? 20, 1), 100);
12
+ const limit = Math.min(Math.max(opts?.limit ?? 20, 1), 100);
13
+ // Load all nodes
14
+ const nodes = reader
15
+ .prepare(`SELECT id, source_uri, title FROM pinakes_nodes WHERE scope = ?`)
16
+ .all(scope);
17
+ if (nodes.length === 0)
18
+ return [];
19
+ const N = nodes.length;
20
+ const nodeSet = new Set(nodes.map((n) => n.id));
21
+ // Load edges (only between nodes in this scope)
22
+ const edges = reader
23
+ .prepare(`SELECT e.src_id, e.dst_id FROM pinakes_edges e
24
+ JOIN pinakes_nodes ns ON e.src_id = ns.id
25
+ JOIN pinakes_nodes nd ON e.dst_id = nd.id
26
+ WHERE ns.scope = ? AND nd.scope = ?`)
27
+ .all(scope, scope);
28
+ // Build adjacency: outgoing edges and incoming edges
29
+ const outDegree = new Map();
30
+ const inEdges = new Map();
31
+ for (const nodeId of nodeSet) {
32
+ outDegree.set(nodeId, 0);
33
+ inEdges.set(nodeId, []);
34
+ }
35
+ for (const e of edges) {
36
+ if (!nodeSet.has(e.src_id) || !nodeSet.has(e.dst_id))
37
+ continue;
38
+ outDegree.set(e.src_id, (outDegree.get(e.src_id) ?? 0) + 1);
39
+ inEdges.get(e.dst_id).push(e.src_id);
40
+ }
41
+ // Initialize ranks
42
+ let ranks = new Map();
43
+ for (const nodeId of nodeSet) {
44
+ ranks.set(nodeId, 1 / N);
45
+ }
46
+ // Iterate
47
+ for (let iter = 0; iter < iterations; iter++) {
48
+ const newRanks = new Map();
49
+ // Collect dangling node rank sum
50
+ let danglingSum = 0;
51
+ for (const nodeId of nodeSet) {
52
+ if ((outDegree.get(nodeId) ?? 0) === 0) {
53
+ danglingSum += ranks.get(nodeId);
54
+ }
55
+ }
56
+ for (const nodeId of nodeSet) {
57
+ let inSum = 0;
58
+ for (const src of inEdges.get(nodeId)) {
59
+ inSum += ranks.get(src) / (outDegree.get(src) ?? 1);
60
+ }
61
+ // Add dangling redistribution
62
+ const pr = (1 - d) / N + d * (inSum + danglingSum / N);
63
+ newRanks.set(nodeId, pr);
64
+ }
65
+ ranks = newRanks;
66
+ }
67
+ // Build results, sort by descending score
68
+ const nodeMap = new Map(nodes.map((n) => [n.id, n]));
69
+ const results = [];
70
+ for (const [id, score] of ranks) {
71
+ const node = nodeMap.get(id);
72
+ if (node) {
73
+ results.push({
74
+ id: node.id,
75
+ source_uri: node.source_uri,
76
+ title: node.title,
77
+ score,
78
+ });
79
+ }
80
+ }
81
+ results.sort((a, b) => b.score - a.score);
82
+ return results.slice(0, limit);
83
+ }
84
+ /**
85
+ * Find connected components in the knowledge graph (undirected).
86
+ * Returns components sorted by size descending.
87
+ */
88
+ export function connectedComponents(reader, scope) {
89
+ // Load all nodes
90
+ const nodes = reader
91
+ .prepare(`SELECT id, source_uri, title FROM pinakes_nodes WHERE scope = ?`)
92
+ .all(scope);
93
+ if (nodes.length === 0)
94
+ return [];
95
+ // Load edges (undirected: add both directions)
96
+ const edges = reader
97
+ .prepare(`SELECT e.src_id, e.dst_id FROM pinakes_edges e
98
+ JOIN pinakes_nodes ns ON e.src_id = ns.id
99
+ JOIN pinakes_nodes nd ON e.dst_id = nd.id
100
+ WHERE ns.scope = ? AND nd.scope = ?`)
101
+ .all(scope, scope);
102
+ // Build undirected adjacency list
103
+ const adj = new Map();
104
+ for (const n of nodes) {
105
+ adj.set(n.id, new Set());
106
+ }
107
+ for (const e of edges) {
108
+ adj.get(e.src_id)?.add(e.dst_id);
109
+ adj.get(e.dst_id)?.add(e.src_id);
110
+ }
111
+ // BFS to find components
112
+ const visited = new Set();
113
+ const components = [];
114
+ let componentId = 0;
115
+ for (const node of nodes) {
116
+ if (visited.has(node.id))
117
+ continue;
118
+ const component = [];
119
+ const queue = [node.id];
120
+ visited.add(node.id);
121
+ while (queue.length > 0) {
122
+ const current = queue.shift();
123
+ component.push(current);
124
+ for (const neighbor of adj.get(current) ?? []) {
125
+ if (!visited.has(neighbor)) {
126
+ visited.add(neighbor);
127
+ queue.push(neighbor);
128
+ }
129
+ }
130
+ }
131
+ const nodeMap = new Map(nodes.map((n) => [n.id, n]));
132
+ components.push({
133
+ component_id: componentId++,
134
+ nodes: component.map((id) => {
135
+ const n = nodeMap.get(id);
136
+ return { id: n.id, source_uri: n.source_uri, title: n.title };
137
+ }),
138
+ });
139
+ }
140
+ // Sort by component size descending
141
+ components.sort((a, b) => b.nodes.length - a.nodes.length);
142
+ return components;
143
+ }
144
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/retrieval/graph.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ export interface HybridResult {
16
16
  export interface HybridSearchOpts {
17
17
  limit?: number;
18
18
  rrf_k?: number;
19
+ /** Set to false to disable post-RRF dedup (default: true). */
20
+ dedup?: boolean;
19
21
  }
20
22
  /**
21
23
  * Run a hybrid FTS5 + vector search with RRF fusion.
@@ -40,4 +42,12 @@ export declare function hybridSearch(reader: BetterSqliteDatabase, scope: string
40
42
  * Exported for direct testing — `hybridSearch` is the normal entry point.
41
43
  */
42
44
  export declare function rrfFuse(ftsResults: FtsResult[], vecResults: VecResult[], rrfK: number, limit: number): HybridResult[];
45
+ /**
46
+ * Fuse N lists of HybridResult via RRF (D38, multi-query expansion).
47
+ *
48
+ * Generalizes the 2-list `rrfFuse` to arbitrary N lists. Each list
49
+ * assigns 1-based ranks; scores accumulate across all lists a result
50
+ * appears in.
51
+ */
52
+ export declare function rrfFuseMulti(lists: HybridResult[][], rrfK: number, limit: number): HybridResult[];
43
53
  //# sourceMappingURL=hybrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/retrieval/hybrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAuBrD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAczB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,SAAS,EAAE,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAiEhB"}
1
+ {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/retrieval/hybrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAuBrD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAoBzB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,SAAS,EAAE,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAiEhB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EAAE,EAAE,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAyChB"}
@@ -1,3 +1,4 @@
1
+ import { dedupResults } from './dedup.js';
1
2
  import { ftsQuery } from './fts.js';
2
3
  import { vecSearch } from './vec.js';
3
4
  /**
@@ -35,14 +36,20 @@ const DEFAULT_RRF_K = 60;
35
36
  export async function hybridSearch(reader, scope, query, embedder, opts) {
36
37
  const limit = Math.min(Math.max(opts?.limit ?? 20, 1), 100);
37
38
  const rrfK = opts?.rrf_k ?? DEFAULT_RRF_K;
39
+ const shouldDedup = opts?.dedup !== false;
38
40
  // Over-fetch from each source so RRF has good coverage.
39
- const fetchLimit = Math.min(limit * 2, 100);
41
+ // When dedup is on, fetch extra since dedup will remove some results.
42
+ const dedupOverfetch = shouldDedup ? 3 : 2;
43
+ const fetchLimit = Math.min(limit * dedupOverfetch, 100);
40
44
  // Run both queries. Vec is async (embedding), FTS is sync.
41
45
  const [ftsResults, vecResults] = await Promise.all([
42
46
  Promise.resolve(ftsQuery(reader, scope, query, fetchLimit)),
43
47
  vecSearch(reader, scope, query, embedder, fetchLimit),
44
48
  ]);
45
- return rrfFuse(ftsResults, vecResults, rrfK, limit);
49
+ const fused = rrfFuse(ftsResults, vecResults, rrfK, shouldDedup ? limit * 2 : limit);
50
+ if (!shouldDedup)
51
+ return fused;
52
+ return dedupResults(fused).slice(0, limit);
46
53
  }
47
54
  /**
48
55
  * Fuse FTS and vec results via equal-weight Reciprocal Rank Fusion.
@@ -117,4 +124,52 @@ export function rrfFuse(ftsResults, vecResults, rrfK, limit) {
117
124
  section_path: r.section_path,
118
125
  }));
119
126
  }
127
+ /**
128
+ * Fuse N lists of HybridResult via RRF (D38, multi-query expansion).
129
+ *
130
+ * Generalizes the 2-list `rrfFuse` to arbitrary N lists. Each list
131
+ * assigns 1-based ranks; scores accumulate across all lists a result
132
+ * appears in.
133
+ */
134
+ export function rrfFuseMulti(lists, rrfK, limit) {
135
+ const merged = new Map();
136
+ for (const list of lists) {
137
+ for (let i = 0; i < list.length; i++) {
138
+ const r = list[i];
139
+ const rrfScore = 1 / (rrfK + (i + 1));
140
+ const existing = merged.get(r.id);
141
+ if (existing) {
142
+ existing._rrfScore += rrfScore;
143
+ if (r.snippet && !existing.snippet)
144
+ existing.snippet = r.snippet;
145
+ }
146
+ else {
147
+ merged.set(r.id, {
148
+ id: r.id,
149
+ text: r.text,
150
+ source_uri: r.source_uri,
151
+ node_id: r.node_id,
152
+ score: 0,
153
+ snippet: r.snippet,
154
+ confidence: r.confidence,
155
+ title: r.title ?? null,
156
+ section_path: r.section_path ?? '',
157
+ _rrfScore: rrfScore,
158
+ });
159
+ }
160
+ }
161
+ }
162
+ const sorted = [...merged.values()].sort((a, b) => b._rrfScore - a._rrfScore);
163
+ return sorted.slice(0, limit).map((r) => ({
164
+ id: r.id,
165
+ text: r.text,
166
+ source_uri: r.source_uri,
167
+ node_id: r.node_id,
168
+ score: r._rrfScore,
169
+ snippet: r.snippet,
170
+ confidence: r.confidence,
171
+ title: r.title,
172
+ section_path: r.section_path,
173
+ }));
174
+ }
120
175
  //# sourceMappingURL=hybrid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/retrieval/hybrid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/retrieval/hybrid.ts"],"names":[],"mappings":"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"}