@remnic/core 9.3.650 → 9.3.652

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 (193) hide show
  1. package/dist/access-cli.js +39 -38
  2. package/dist/access-cli.js.map +1 -1
  3. package/dist/access-http.d.ts +3 -2
  4. package/dist/access-http.js +19 -19
  5. package/dist/access-mcp.d.ts +3 -2
  6. package/dist/access-mcp.js +18 -18
  7. package/dist/access-schema.js +3 -3
  8. package/dist/{access-service-DIZRHQ7Q.d.ts → access-service-CdJFd3_b.d.ts} +23 -2
  9. package/dist/access-service.d.ts +3 -2
  10. package/dist/access-service.js +16 -16
  11. package/dist/{auto-sync-54QQHOG5.js → auto-sync-5CJBJMPZ.js} +5 -5
  12. package/dist/bootstrap.d.ts +2 -1
  13. package/dist/briefing.js +3 -3
  14. package/dist/calibration.js +2 -2
  15. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  16. package/dist/causal-consolidation.js +6 -6
  17. package/dist/{chunk-QT4THOLT.js → chunk-2DGQLOOM.js} +1 -1
  18. package/dist/chunk-2DGQLOOM.js.map +1 -0
  19. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  20. package/dist/{chunk-OAZ5MFUB.js → chunk-3XGWCZ63.js} +45 -28
  21. package/dist/chunk-3XGWCZ63.js.map +1 -0
  22. package/dist/{chunk-QKE4LHNR.js → chunk-4HYSMH7D.js} +2 -2
  23. package/dist/{chunk-DDRNDPX4.js → chunk-4SKKVWLQ.js} +2 -2
  24. package/dist/chunk-5FOCXX5E.js +34 -0
  25. package/dist/chunk-5FOCXX5E.js.map +1 -0
  26. package/dist/{chunk-YAFSTKTH.js → chunk-5V3TAB7D.js} +184 -12
  27. package/dist/chunk-5V3TAB7D.js.map +1 -0
  28. package/dist/{chunk-DB5A3NHS.js → chunk-7LWRCOP7.js} +9 -2
  29. package/dist/chunk-7LWRCOP7.js.map +1 -0
  30. package/dist/{chunk-FOVPSMGI.js → chunk-7WEB3FLJ.js} +2 -2
  31. package/dist/{chunk-APJQ6UEA.js → chunk-AGNBY3VG.js} +4 -4
  32. package/dist/{chunk-4BISW7RX.js → chunk-AJE7FJVE.js} +2 -2
  33. package/dist/{chunk-ZXWAQFDE.js → chunk-CFOCZPIQ.js} +2 -2
  34. package/dist/{chunk-NT5TINK5.js → chunk-DHGSZ3UD.js} +2 -2
  35. package/dist/{chunk-OTC2KOZ2.js → chunk-EHQLDFSH.js} +2 -2
  36. package/dist/{chunk-RRRCNIPK.js → chunk-GI45G4BK.js} +4 -4
  37. package/dist/{chunk-AMACWKM4.js → chunk-IJHLC5CH.js} +2 -2
  38. package/dist/{chunk-OR7R6M5Z.js → chunk-IVYSVAC6.js} +2 -2
  39. package/dist/{chunk-76QTEJ2Q.js → chunk-JBHXMCYN.js} +2 -2
  40. package/dist/{chunk-UMKPSD35.js → chunk-JF7SFXTG.js} +2 -2
  41. package/dist/{chunk-NMIOW7XG.js → chunk-JVRPJ7D4.js} +126 -26
  42. package/dist/chunk-JVRPJ7D4.js.map +1 -0
  43. package/dist/{chunk-TQUWNX7C.js → chunk-JX2RINDR.js} +2 -2
  44. package/dist/{chunk-MCYT2RNT.js → chunk-KJDKZVF3.js} +3 -3
  45. package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
  46. package/dist/{chunk-PQFUUXWK.js → chunk-KWM33SPU.js} +2 -2
  47. package/dist/{chunk-A3BS64GV.js → chunk-LCC5EZTT.js} +4 -4
  48. package/dist/{chunk-TVOPSKOK.js → chunk-MGGNV3H2.js} +4 -4
  49. package/dist/{chunk-D6WVJIS3.js → chunk-ORGWWNJG.js} +2 -2
  50. package/dist/{chunk-Z3PZRDLW.js → chunk-PRQXUSQV.js} +2 -2
  51. package/dist/{chunk-VWT3F4IV.js → chunk-PS3SYNHP.js} +12 -4
  52. package/dist/chunk-PS3SYNHP.js.map +1 -0
  53. package/dist/{chunk-I4COC5XW.js → chunk-PYWNNF2I.js} +47 -9
  54. package/dist/chunk-PYWNNF2I.js.map +1 -0
  55. package/dist/{chunk-IMWFHBG2.js → chunk-QWRC7GIO.js} +2 -2
  56. package/dist/{chunk-U3GQ33JC.js → chunk-SLTKP5WJ.js} +2 -2
  57. package/dist/{chunk-23RYLGYA.js → chunk-TCX4WLKK.js} +104 -112
  58. package/dist/chunk-TCX4WLKK.js.map +1 -0
  59. package/dist/{chunk-6NKAQ74D.js → chunk-UU6MVCJ6.js} +1 -1
  60. package/dist/chunk-UU6MVCJ6.js.map +1 -0
  61. package/dist/{chunk-WEPMT6SC.js → chunk-V25ZAOSB.js} +5 -5
  62. package/dist/{chunk-UMTG2BN2.js → chunk-V4UDXYGG.js} +2 -2
  63. package/dist/{chunk-TUMH6EDV.js → chunk-WSFNYPAT.js} +26 -26
  64. package/dist/{chunk-ZT6R3WR3.js → chunk-WTI35CVJ.js} +4 -4
  65. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  66. package/dist/{chunk-OZKZ2TRP.js → chunk-XBIACVCO.js} +9 -2
  67. package/dist/chunk-XBIACVCO.js.map +1 -0
  68. package/dist/{chunk-ALUZN7BE.js → chunk-XMN6MMTU.js} +2 -2
  69. package/dist/{chunk-A4BTPHIN.js → chunk-Y7NWBBHV.js} +6 -6
  70. package/dist/{chunk-WPCCNSWO.js → chunk-YM3LR4LS.js} +7 -7
  71. package/dist/{chunk-3IJEQWQX.js → chunk-YOVKPOMD.js} +4 -4
  72. package/dist/{chunk-M75TBFKQ.js → chunk-Z2OXSMZK.js} +2 -2
  73. package/dist/{cli-BG4ybtJr.d.ts → cli-DDo7Qgs-.d.ts} +2 -2
  74. package/dist/cli.d.ts +4 -3
  75. package/dist/cli.js +34 -34
  76. package/dist/compounding/engine.js +3 -3
  77. package/dist/connectors/codex-materialize-runner.js +3 -3
  78. package/dist/connectors/index.js +3 -3
  79. package/dist/entity-retrieval.js +3 -3
  80. package/dist/event-order-recall.js +1 -1
  81. package/dist/explicit-capture.d.ts +2 -1
  82. package/dist/explicit-cue-recall.d.ts +7 -0
  83. package/dist/explicit-cue-recall.js +2 -1
  84. package/dist/extraction-judge.js +3 -3
  85. package/dist/extraction.js +3 -3
  86. package/dist/fallback-llm.js +2 -2
  87. package/dist/focused-list-recall.d.ts +6 -0
  88. package/dist/focused-list-recall.js +2 -1
  89. package/dist/index.d.ts +5 -4
  90. package/dist/index.js +87 -86
  91. package/dist/index.js.map +1 -1
  92. package/dist/lcm/engine.js +2 -2
  93. package/dist/lcm/index.js +5 -5
  94. package/dist/lcm-fallback-read.d.ts +71 -0
  95. package/dist/lcm-fallback-read.js +10 -0
  96. package/dist/lcm-fallback-read.js.map +1 -0
  97. package/dist/maintenance/memory-governance.js +3 -3
  98. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  99. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  100. package/dist/mcp-memory-inspector-app.d.ts +3 -2
  101. package/dist/namespaces/migrate.js +11 -11
  102. package/dist/namespaces/search.d.ts +18 -1
  103. package/dist/namespaces/search.js +7 -7
  104. package/dist/namespaces/storage.js +3 -3
  105. package/dist/operator-toolkit.js +13 -13
  106. package/dist/{orchestrator-CX-oqwJq.d.ts → orchestrator-8fTZsa0y.d.ts} +2 -0
  107. package/dist/orchestrator.d.ts +2 -1
  108. package/dist/orchestrator.js +33 -32
  109. package/dist/qmd.d.ts +2 -1
  110. package/dist/qmd.js +2 -2
  111. package/dist/recall-planner-llm.js +2 -2
  112. package/dist/response-guidance-recall.d.ts +6 -0
  113. package/dist/response-guidance-recall.js +2 -1
  114. package/dist/search/factory.js +6 -6
  115. package/dist/search/index.js +8 -8
  116. package/dist/search/lancedb-backend.js +2 -2
  117. package/dist/search/meilisearch-backend.js +2 -2
  118. package/dist/search/orama-backend.js +2 -2
  119. package/dist/search/port.d.ts +6 -0
  120. package/dist/search/port.js +1 -1
  121. package/dist/semantic-consolidation.js +4 -4
  122. package/dist/semantic-rule-promotion.js +3 -3
  123. package/dist/semantic-rule-verifier.js +3 -3
  124. package/dist/storage.js +2 -2
  125. package/dist/summarizer.js +3 -3
  126. package/dist/targeted-fact-recall.d.ts +6 -0
  127. package/dist/targeted-fact-recall.js +2 -1
  128. package/dist/transfer/backup.js +2 -2
  129. package/dist/transfer/capsule-export.js +2 -2
  130. package/dist/transfer/capsule-import.js +2 -2
  131. package/dist/transfer/import-sqlite.js +2 -2
  132. package/dist/verified-recall.js +3 -3
  133. package/package.json +1 -1
  134. package/src/access-service-health.test.ts +402 -0
  135. package/src/access-service.ts +274 -2
  136. package/src/event-order-recall.ts +8 -0
  137. package/src/explicit-cue-recall.ts +70 -29
  138. package/src/focused-list-recall.ts +23 -1
  139. package/src/lcm-fallback-read.ts +113 -0
  140. package/src/namespaces/search.test.ts +258 -3
  141. package/src/namespaces/search.ts +184 -30
  142. package/src/orchestrator.ts +179 -122
  143. package/src/qmd.test.ts +102 -0
  144. package/src/qmd.ts +54 -7
  145. package/src/response-guidance-recall.ts +21 -1
  146. package/src/search/port.ts +6 -0
  147. package/src/targeted-fact-recall.ts +24 -3
  148. package/dist/chunk-23RYLGYA.js.map +0 -1
  149. package/dist/chunk-6NKAQ74D.js.map +0 -1
  150. package/dist/chunk-DB5A3NHS.js.map +0 -1
  151. package/dist/chunk-I4COC5XW.js.map +0 -1
  152. package/dist/chunk-NMIOW7XG.js.map +0 -1
  153. package/dist/chunk-OAZ5MFUB.js.map +0 -1
  154. package/dist/chunk-OZKZ2TRP.js.map +0 -1
  155. package/dist/chunk-QT4THOLT.js.map +0 -1
  156. package/dist/chunk-VWT3F4IV.js.map +0 -1
  157. package/dist/chunk-YAFSTKTH.js.map +0 -1
  158. /package/dist/{auto-sync-54QQHOG5.js.map → auto-sync-5CJBJMPZ.js.map} +0 -0
  159. /package/dist/{capsule-crypto-GWVG7LGC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  160. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  161. /package/dist/{chunk-QKE4LHNR.js.map → chunk-4HYSMH7D.js.map} +0 -0
  162. /package/dist/{chunk-DDRNDPX4.js.map → chunk-4SKKVWLQ.js.map} +0 -0
  163. /package/dist/{chunk-FOVPSMGI.js.map → chunk-7WEB3FLJ.js.map} +0 -0
  164. /package/dist/{chunk-APJQ6UEA.js.map → chunk-AGNBY3VG.js.map} +0 -0
  165. /package/dist/{chunk-4BISW7RX.js.map → chunk-AJE7FJVE.js.map} +0 -0
  166. /package/dist/{chunk-ZXWAQFDE.js.map → chunk-CFOCZPIQ.js.map} +0 -0
  167. /package/dist/{chunk-NT5TINK5.js.map → chunk-DHGSZ3UD.js.map} +0 -0
  168. /package/dist/{chunk-OTC2KOZ2.js.map → chunk-EHQLDFSH.js.map} +0 -0
  169. /package/dist/{chunk-RRRCNIPK.js.map → chunk-GI45G4BK.js.map} +0 -0
  170. /package/dist/{chunk-AMACWKM4.js.map → chunk-IJHLC5CH.js.map} +0 -0
  171. /package/dist/{chunk-OR7R6M5Z.js.map → chunk-IVYSVAC6.js.map} +0 -0
  172. /package/dist/{chunk-76QTEJ2Q.js.map → chunk-JBHXMCYN.js.map} +0 -0
  173. /package/dist/{chunk-UMKPSD35.js.map → chunk-JF7SFXTG.js.map} +0 -0
  174. /package/dist/{chunk-TQUWNX7C.js.map → chunk-JX2RINDR.js.map} +0 -0
  175. /package/dist/{chunk-MCYT2RNT.js.map → chunk-KJDKZVF3.js.map} +0 -0
  176. /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
  177. /package/dist/{chunk-PQFUUXWK.js.map → chunk-KWM33SPU.js.map} +0 -0
  178. /package/dist/{chunk-A3BS64GV.js.map → chunk-LCC5EZTT.js.map} +0 -0
  179. /package/dist/{chunk-TVOPSKOK.js.map → chunk-MGGNV3H2.js.map} +0 -0
  180. /package/dist/{chunk-D6WVJIS3.js.map → chunk-ORGWWNJG.js.map} +0 -0
  181. /package/dist/{chunk-Z3PZRDLW.js.map → chunk-PRQXUSQV.js.map} +0 -0
  182. /package/dist/{chunk-IMWFHBG2.js.map → chunk-QWRC7GIO.js.map} +0 -0
  183. /package/dist/{chunk-U3GQ33JC.js.map → chunk-SLTKP5WJ.js.map} +0 -0
  184. /package/dist/{chunk-WEPMT6SC.js.map → chunk-V25ZAOSB.js.map} +0 -0
  185. /package/dist/{chunk-UMTG2BN2.js.map → chunk-V4UDXYGG.js.map} +0 -0
  186. /package/dist/{chunk-TUMH6EDV.js.map → chunk-WSFNYPAT.js.map} +0 -0
  187. /package/dist/{chunk-ZT6R3WR3.js.map → chunk-WTI35CVJ.js.map} +0 -0
  188. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  189. /package/dist/{chunk-ALUZN7BE.js.map → chunk-XMN6MMTU.js.map} +0 -0
  190. /package/dist/{chunk-A4BTPHIN.js.map → chunk-Y7NWBBHV.js.map} +0 -0
  191. /package/dist/{chunk-WPCCNSWO.js.map → chunk-YM3LR4LS.js.map} +0 -0
  192. /package/dist/{chunk-3IJEQWQX.js.map → chunk-YOVKPOMD.js.map} +0 -0
  193. /package/dist/{chunk-M75TBFKQ.js.map → chunk-Z2OXSMZK.js.map} +0 -0
@@ -1,3 +1,7 @@
1
+ import {
2
+ gatherAcrossReadSessions,
3
+ resolveLcmReadSessionIds
4
+ } from "./chunk-5FOCXX5E.js";
1
5
  import {
2
6
  buildEvidencePack,
3
7
  insertAfterEvidenceHeading
@@ -22,7 +26,10 @@ async function buildFocusedListRecallSection(options) {
22
26
  if (maxResults <= 0) {
23
27
  return "";
24
28
  }
25
- const items = await collectFocusedListItems(options, intent);
29
+ const items = [];
30
+ await gatherAcrossReadSessions(resolveLcmReadSessionIds(options), async (sessionId) => {
31
+ items.push(...await collectFocusedListItems({ ...options, sessionId }, intent));
32
+ });
26
33
  const ranked = rankAndDedupeFocusedListItems(items, options.query, intent).slice(0, maxResults);
27
34
  if (ranked.length === 0) {
28
35
  return "";
@@ -903,4 +910,4 @@ export {
903
910
  shouldRecallFocusedListEvidence,
904
911
  buildFocusedListRecallSection
905
912
  };
906
- //# sourceMappingURL=chunk-DB5A3NHS.js.map
913
+ //# sourceMappingURL=chunk-7LWRCOP7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/focused-list-recall.ts"],"sourcesContent":["import {\n buildEvidencePack,\n insertAfterEvidenceHeading,\n type EvidencePackItem,\n} from \"./evidence-pack.js\";\nimport type { ExplicitCueRecallEngine } from \"./explicit-cue-recall.js\";\nimport {\n gatherAcrossReadSessions,\n resolveLcmReadSessionIds,\n} from \"./lcm-fallback-read.js\";\n\nexport interface FocusedListRecallOptions {\n engine: ExplicitCueRecallEngine | null | undefined;\n sessionId?: string;\n /**\n * Ordered, read-authorized LCM read key set (primary overlay → project/root\n * fallbacks). When present, evidence is gathered across EVERY key and merged\n * under this section's budget (#1505 codex P2). Falls back to `sessionId`.\n */\n sessionIds?: readonly (string | undefined)[];\n query: string;\n maxChars: number;\n maxItemChars?: number;\n maxSearchResults?: number;\n maxScanWindowTurns?: number;\n maxScanWindowTokens?: number;\n title?: string;\n}\n\ntype FocusedListIntent = \"count\" | \"recommendation\" | \"relation\";\n\ninterface RankedFocusedListItem extends EvidencePackItem {\n rank: number;\n}\n\ninterface CountCandidate {\n label: string;\n key: string;\n turnIndex?: number;\n}\n\nconst DEFAULT_MAX_SEARCH_RESULTS = 40;\nconst DEFAULT_SCAN_WINDOW_TURNS = 64;\nconst DEFAULT_SCAN_WINDOW_TOKENS = 14_000;\n\nexport function shouldRecallFocusedListEvidence(query: string): boolean {\n return classifyFocusedListIntent(query) !== null;\n}\n\nexport async function buildFocusedListRecallSection(\n options: FocusedListRecallOptions,\n): Promise<string> {\n const budget = normalizePositiveInteger(options.maxChars);\n const maxResults = normalizePositiveInteger(\n options.maxSearchResults ?? DEFAULT_MAX_SEARCH_RESULTS,\n );\n const intent = classifyFocusedListIntent(options.query);\n if (!options.engine || budget <= 0 || !intent) {\n return \"\";\n }\n if (maxResults <= 0) {\n return \"\";\n }\n\n // #1505 codex P2: gather candidates across the ordered LCM read key set\n // (primary overlay → project/root fallbacks) and UNION them into the existing\n // rank/dedupe/budget pass, so a stronger project-fallback candidate is not\n // masked by a weak primary-key hit. `rankAndDedupeFocusedListItems` applies\n // the section-appropriate dedupe and relevance rank; the budget is applied\n // exactly once below. `gatherAcrossReadSessions` isolates a per-key read\n // failure so a corrupt/locked fallback index can't discard the primary key's\n // candidates; the single-key path runs exactly one collect and propagates a\n // failure as before — byte-for-byte the pre-#1505 behavior.\n const items: EvidencePackItem[] = [];\n await gatherAcrossReadSessions(resolveLcmReadSessionIds(options), async (sessionId) => {\n items.push(...(await collectFocusedListItems({ ...options, sessionId }, intent)));\n });\n const ranked = rankAndDedupeFocusedListItems(items, options.query, intent)\n .slice(0, maxResults);\n if (ranked.length === 0) {\n return \"\";\n }\n\n const title = options.title ?? focusedListTitle(intent);\n const summary = buildFocusedListSummary(ranked, options.query, intent);\n const summaryInsert = summary ? `\\n\\n${summary}` : \"\";\n const evidenceBudget = summaryInsert\n ? Math.max(0, budget - summaryInsert.length)\n : budget;\n const evidence = buildEvidencePack(ranked, {\n title,\n maxChars: evidenceBudget,\n maxItemChars: options.maxItemChars,\n query: buildFocusedListQuery(options.query, intent),\n });\n if (!summary) {\n return evidence;\n }\n if (!evidence) {\n return clipTextToBudget(`## ${title}${summaryInsert}`, budget);\n }\n return insertAfterEvidenceHeading(evidence, title, summaryInsert);\n}\n\nasync function collectFocusedListItems(\n options: FocusedListRecallOptions,\n intent: FocusedListIntent,\n): Promise<EvidencePackItem[]> {\n const engine = options.engine;\n if (!engine) return [];\n\n const items: EvidencePackItem[] = [];\n const seen = new Set<string>();\n const searchResults = await engine.searchContextFull(\n buildFocusedListQuery(options.query, intent),\n normalizePositiveInteger(options.maxSearchResults ?? DEFAULT_MAX_SEARCH_RESULTS),\n options.sessionId,\n );\n const searchWindowTurns = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTurns ?? DEFAULT_SCAN_WINDOW_TURNS),\n );\n const searchWindowBefore = Math.floor((searchWindowTurns - 1) / 2);\n const searchWindowAfter = Math.ceil((searchWindowTurns - 1) / 2);\n const searchWindowTokens = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTokens ?? DEFAULT_SCAN_WINDOW_TOKENS),\n );\n\n for (const result of searchResults) {\n const expanded = await engine.expandContext(\n result.session_id,\n Math.max(0, result.turn_index - searchWindowBefore),\n result.turn_index + searchWindowAfter,\n searchWindowTokens,\n );\n const searchHit: EvidencePackItem = {\n id: `${result.session_id}:${result.turn_index}`,\n sessionId: result.session_id,\n turnIndex: result.turn_index,\n role: result.role,\n content: result.content,\n ...(typeof result.score === \"number\" ? { score: result.score } : {}),\n };\n const candidates: EvidencePackItem[] = expanded.map((message) => ({\n id: `${result.session_id}:${message.turn_index}`,\n sessionId: result.session_id,\n turnIndex: message.turn_index,\n role: message.role,\n content: message.content,\n ...(message.turn_index === result.turn_index &&\n typeof result.score === \"number\"\n ? { score: result.score }\n : {}),\n }));\n const hitIndex = candidates.findIndex((candidate) =>\n candidate.turnIndex === result.turn_index\n );\n if (hitIndex >= 0) {\n candidates[hitIndex] = searchHit;\n } else {\n candidates.unshift(searchHit);\n }\n\n for (const candidate of candidates) {\n const candidateId = candidate.id ?? (\n candidate.sessionId && typeof candidate.turnIndex === \"number\"\n ? `${candidate.sessionId}:${candidate.turnIndex}`\n : undefined\n );\n if (candidateId && seen.has(candidateId)) continue;\n if (!isFocusedListEvidence(candidate, options.query, intent)) continue;\n if (candidateId) seen.add(candidateId);\n items.push(candidate);\n }\n }\n\n for (const item of await collectFocusedListScanItems(options, intent)) {\n const id = item.id ?? (\n item.sessionId && typeof item.turnIndex === \"number\"\n ? `${item.sessionId}:${item.turnIndex}`\n : undefined\n );\n if (id && seen.has(id)) continue;\n if (id) seen.add(id);\n items.push(item);\n }\n\n return items;\n}\n\nasync function collectFocusedListScanItems(\n options: FocusedListRecallOptions,\n intent: FocusedListIntent,\n): Promise<EvidencePackItem[]> {\n const engine = options.engine;\n if (!engine?.getStats || !options.sessionId) return [];\n\n const stats = await engine.getStats(options.sessionId);\n const maxTurn = typeof stats.maxTurnIndex === \"number\"\n ? stats.maxTurnIndex\n : stats.totalMessages - 1;\n if (maxTurn < 0) return [];\n\n const windowTurns = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTurns ?? DEFAULT_SCAN_WINDOW_TURNS),\n );\n const windowTokens = Math.max(\n 1,\n normalizePositiveInteger(options.maxScanWindowTokens ?? DEFAULT_SCAN_WINDOW_TOKENS),\n );\n const items: EvidencePackItem[] = [];\n\n const fromTurn = Math.max(0, maxTurn - windowTurns + 1);\n const messages = await engine.expandContext(\n options.sessionId,\n fromTurn,\n maxTurn,\n windowTokens,\n );\n for (const message of messages) {\n const candidate = {\n id: `${options.sessionId}:${message.turn_index}`,\n sessionId: options.sessionId,\n turnIndex: message.turn_index,\n role: message.role,\n content: message.content,\n };\n if (!isFocusedListEvidence(candidate, options.query, intent)) continue;\n items.push(candidate);\n }\n\n return items;\n}\n\nfunction rankAndDedupeFocusedListItems(\n items: EvidencePackItem[],\n query: string,\n intent: FocusedListIntent,\n): RankedFocusedListItem[] {\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n const ranked: RankedFocusedListItem[] = [];\n\n for (const item of items) {\n const id = item.id ?? (\n item.sessionId && typeof item.turnIndex === \"number\"\n ? `${item.sessionId}:${item.turnIndex}`\n : undefined\n );\n if (id && seenIds.has(id)) continue;\n const contentKey = item.content.toLowerCase().replace(/\\s+/g, \" \").trim();\n if (seenContent.has(contentKey)) continue;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n ranked.push({\n ...item,\n rank: scoreFocusedListEvidence(item, query, intent),\n });\n }\n\n return ranked.sort((left, right) => {\n if (right.rank !== left.rank) return right.rank - left.rank;\n const leftTurn = typeof left.turnIndex === \"number\" ? left.turnIndex : -1;\n const rightTurn = typeof right.turnIndex === \"number\" ? right.turnIndex : -1;\n if (rightTurn !== leftTurn) return rightTurn - leftTurn;\n return (right.score ?? 0) - (left.score ?? 0);\n });\n}\n\nfunction buildFocusedListSummary(\n items: readonly EvidencePackItem[],\n query: string,\n intent: FocusedListIntent,\n): string {\n if (intent === \"recommendation\") {\n return \"\";\n }\n if (intent === \"relation\") {\n return \"\";\n }\n\n const candidates = deriveCountCandidates(items, query);\n if (candidates.length === 0) {\n return \"\";\n }\n\n const rendered = candidates\n .slice(0, 8)\n .map((candidate, index) => `${index + 1}. ${candidate.label}`)\n .join(\"; \");\n const countWord = numberWord(candidates.length);\n const countText = countWord\n ? `${candidates.length} (${countWord})`\n : String(candidates.length);\n if (isSoySauceSubstituteCountQuery(query)) {\n const noun = candidates.length === 1 ? \"substitute\" : \"substitutes\";\n const countLabel = countWord\n ? `${countWord.charAt(0).toUpperCase()}${countWord.slice(1)}`\n : String(candidates.length);\n return `${countLabel} ${noun}: ${candidates.map((candidate) => candidate.label).join(\"; \")}. Deduplicated candidate count: ${countText}. Candidate items: ${rendered}.`;\n }\n return `Deduplicated candidate count: ${countText}. Candidate items: ${rendered}.`;\n}\n\nfunction deriveCountCandidates(\n items: readonly EvidencePackItem[],\n query: string,\n): CountCandidate[] {\n if (isProbabilityCountQuery(query)) {\n return deriveProbabilityCountCandidates(items);\n }\n if (isWeatherFeatureCountQuery(query)) {\n return deriveWeatherFeatureCountCandidates(items);\n }\n if (isCoverLetterCountQuery(query)) {\n return deriveCoverLetterCountCandidates(items, query);\n }\n if (isSecurityFeatureCountQuery(query)) {\n return deriveSecurityFeatureCountCandidates(items);\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n return deriveSoySauceSubstituteCountCandidates(items);\n }\n return [];\n}\n\nfunction deriveProbabilityCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const broadCandidates = new Map<string, CountCandidate>();\n const strictSimpleCandidates = new Map<string, CountCandidate>();\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content;\n const normalized = content.toLowerCase();\n if (!/\\b(?:coin|coins|toss|tossing|dice|die|roll|rolling|heads)\\b/.test(normalized)) {\n continue;\n }\n if (!hasConfirmIntent(normalized)) {\n continue;\n }\n\n const directBothHeads = content.match(\n /\\bP\\((both heads)\\)\\s+using the formula\\s+([^,.;?\\n]{1,100})/i,\n );\n if (directBothHeads?.[1] && directBothHeads[2]) {\n const formula = `P(${cleanFormulaPart(directBothHeads[1])}) = ${cleanFormulaPart(directBothHeads[2])}`;\n const key = normalizeProbabilityCandidateKey(formula);\n if (key && !broadCandidates.has(key)) {\n const candidate = {\n key,\n label: formula,\n turnIndex: item.turnIndex,\n };\n broadCandidates.set(key, candidate);\n strictSimpleCandidates.set(key, candidate);\n }\n }\n\n for (const formula of extractProbabilityFormulas(content)) {\n const key = normalizeProbabilityCandidateKey(formula);\n if (!key || broadCandidates.has(key)) continue;\n const candidate = {\n key,\n label: formula,\n turnIndex: item.turnIndex,\n };\n broadCandidates.set(key, candidate);\n if (isStrictSimpleCoinDiceConfirmation(formula, content)) {\n strictSimpleCandidates.set(key, candidate);\n }\n }\n }\n\n const candidates = strictSimpleCandidates.size > 0\n ? strictSimpleCandidates\n : broadCandidates;\n return [...candidates.values()].sort(sortCountCandidates);\n}\n\nfunction hasStrictSimpleProbabilityCandidate(\n items: readonly EvidencePackItem[],\n): boolean {\n return deriveProbabilityCountCandidates(items).some((candidate) =>\n isStrictSimpleProbabilityLabel(candidate.label),\n );\n}\n\nfunction deriveWeatherFeatureCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"autocomplete\",\n label: \"city autocomplete and API-call cost\",\n patterns: [/\\bautocomplete\\b/, /\\bgeocoding\\b/, /\\bdropdown\\b/, /\\bdebounce\\b/],\n },\n {\n key: \"api-errors\",\n label: \"API error handling and user-friendly error messages\",\n patterns: [\n /\\berror handling\\b/,\n /\\bapi errors?\\b/,\n /\\berror messages?\\b/,\n /\\binvalid city\\b/,\n /\\b(?:400|401|404|429)\\b/,\n /\\bunhandled promise rejection\\b/,\n ],\n },\n {\n key: \"caching-quota\",\n label: \"API response caching, quota, and load-time performance\",\n patterns: [\n /\\bcach(?:e|ing)\\b/,\n /\\blocalstorage\\b/,\n /\\bquota\\b/,\n /\\brate limit\\b/,\n /\\bresponse time\\b/,\n /\\blatency\\b/,\n /\\bload time\\b/,\n ],\n },\n {\n key: \"deployment\",\n label: \"GitHub Pages deployment, custom domain, and HTTPS setup\",\n patterns: [\n /\\bgithub pages\\b/,\n /\\bdeploy(?:ment|ing)?\\b/,\n /\\bcustom domain\\b/,\n /\\bhttps\\b/,\n /\\bci\\/cd\\b/,\n ],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction deriveCoverLetterCountCandidates(\n items: readonly EvidencePackItem[],\n query: string,\n): CountCandidate[] {\n const cutoff = findTemporalCutoffTurn(items, query, /\\binterview\\b/i);\n const candidates = new Map<string, CountCandidate>();\n for (const item of items) {\n if (item.role !== \"user\") continue;\n if (\n cutoff !== undefined &&\n typeof item.turnIndex === \"number\" &&\n item.turnIndex >= cutoff\n ) {\n continue;\n }\n const content = item.content.toLowerCase();\n if (!/\\bcover letter\\b/.test(content)) continue;\n if (!/\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback)\\b/.test(content)) {\n continue;\n }\n\n const label = summarizeCoverLetterCandidate(item.content);\n const key = normalizeCountCandidateKey(label);\n if (!key || candidates.has(key)) continue;\n candidates.set(key, {\n key,\n label,\n turnIndex: item.turnIndex,\n });\n }\n\n const ordered = [...candidates.values()].sort(sortCountCandidates);\n return ordered;\n}\n\nfunction deriveSecurityFeatureCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"password-hashing\",\n label: \"password hashing\",\n patterns: [\n /\\bpassword hash(?:ing)?\\b/,\n /\\bhash(?:ed|ing)? passwords?\\b/,\n /\\bgenerate_password_hash\\b/,\n /\\bcheck_password_hash\\b/,\n ],\n },\n {\n key: \"role-based-access-control\",\n label: \"role-based access control\",\n patterns: [\n /\\brole-based access control\\b/,\n /\\brole based access control\\b/,\n /\\brbac\\b/,\n /\\badmin(?:istrator)?\\b.*\\buser roles?\\b/,\n /\\buser roles?\\b.*\\badmin(?:istrator)?\\b/,\n /\\bpermissions?\\b.*\\broles?\\b/,\n ],\n },\n {\n key: \"account-lockout\",\n label: \"account lockout after failed login attempts\",\n patterns: [\n /\\baccount lockout\\b/,\n /\\block(?:ed)? out\\b/,\n /\\bfailed login attempts?\\b/,\n /\\block\\b.*\\bfailed\\b.*\\blogin\\b/,\n /\\btoo many failed\\b.*\\blogin\\b/,\n ],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction deriveSoySauceSubstituteCountCandidates(\n items: readonly EvidencePackItem[],\n): CountCandidate[] {\n const clusters = new Map<string, CountCandidate>();\n const clusterDefs: Array<{ key: string; label: string; patterns: RegExp[] }> = [\n {\n key: \"coconut-aminos\",\n label: \"coconut aminos\",\n patterns: [/\\bcoconut aminos\\b/],\n },\n {\n key: \"liquid-aminos\",\n label: \"liquid aminos\",\n patterns: [/\\bliquid aminos\\b/],\n },\n ];\n\n for (const item of items) {\n if (item.role !== \"user\") continue;\n const content = item.content.toLowerCase();\n if (!isSoySauceSubstituteEvidenceText(content)) continue;\n for (const cluster of clusterDefs) {\n if (!cluster.patterns.some((pattern) => pattern.test(content))) continue;\n if (clusters.has(cluster.key)) continue;\n clusters.set(cluster.key, {\n key: cluster.key,\n label: cluster.label,\n turnIndex: item.turnIndex,\n });\n }\n }\n\n return [...clusters.values()].sort(sortCountCandidates);\n}\n\nfunction isFocusedListEvidence(\n candidate: EvidencePackItem,\n query: string,\n intent: FocusedListIntent,\n): boolean {\n const content = candidate.content.toLowerCase();\n const normalizedQuery = query.toLowerCase();\n const overlap = countFocusedTermOverlap(content, normalizedQuery);\n\n if (intent === \"count\") {\n if (candidate.role !== \"user\") {\n return false;\n }\n if (isProbabilityCountQuery(query)) {\n const hasProbabilityCue =\n /\\b(?:probability|calculation|calculate|formula|ratio)\\b/.test(content) ||\n extractProbabilityFormulas(candidate.content).length > 0;\n if (\n hasStrictSimpleProbabilityCandidate([candidate]) === false &&\n /\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent|mutually exclusive)\\b/.test(\n content,\n )\n ) {\n return false;\n }\n return hasProbabilityCue &&\n /\\b(?:coin|coins|toss|tossing|dice|die|roll|rolling|heads)\\b/.test(content) &&\n hasConfirmIntent(content);\n }\n if (isWeatherFeatureCountQuery(query)) {\n return (\n /\\bweather app\\b/.test(content) ||\n /\\b(?:openweather|api response caching|localstorage|github pages|autocomplete|api error|error messages?|invalid city)\\b/.test(\n content,\n )\n ) &&\n /\\b(?:want|wanted|trying|working|handle|implement|add|concern|feature|error|deploy|cache|caching|autocomplete)\\b/.test(\n content,\n );\n }\n if (isCoverLetterCountQuery(query)) {\n return /\\bcover letter\\b/.test(content) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback|interview)\\b/.test(\n content,\n );\n }\n if (isSecurityFeatureCountQuery(query)) {\n return /\\b(?:password hash(?:ing)?|hash(?:ed|ing)? passwords?|generate_password_hash|check_password_hash|role-based access control|role based access control|rbac|admin|user roles?|permissions?|account lockout|lock(?:ed)? out|failed login attempts?)\\b/.test(\n content,\n ) &&\n /\\b(?:security|auth(?:entication|orization)?|login|roles?|permissions?|password|lockout|failed)\\b/.test(\n content,\n );\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n return isSoySauceSubstituteEvidenceText(content);\n }\n return overlap >= 2 &&\n /\\b(?:confirm|verify|check|count|mention|mentioned|try|tried|want|wanted)\\b/.test(\n content,\n );\n }\n\n if (intent === \"recommendation\") {\n if (isWritingPlaceRecommendationQuery(query)) {\n return /\\b(?:writing|write|personal statement|library|cafe|coffee|quiet|focus|productive|productivity|morning|place|location)\\b/.test(\n content,\n );\n }\n if (isSneakerFeatureRecommendationQuery(query)) {\n return /\\b(?:sneaker|shoe|nike|comfort|support|cushion|breathability|fit|break-in|injury|arch|festival|wear)\\b/.test(\n content,\n );\n }\n return overlap >= 2 &&\n /\\b(?:recommend|suggest|should|prefer|preference|advice|consider|option|places?|features?)\\b/.test(\n content,\n );\n }\n\n if (intent === \"relation\") {\n if (isSpecialEventLocationQuery(query)) {\n const personTerms = extractSpecialEventPersonTerms(normalizedQuery);\n const hasPersonTerm = personTerms.length === 0 ||\n personTerms.some((term) => content.includes(term));\n return hasPersonTerm &&\n /\\b(?:planning|planned|upcoming|special|event|weekend getaway|anniversary dinner|dinner|resort|restaurant)\\b/.test(\n content,\n ) &&\n /\\b(?:at|to|in|resort|restaurant|venue|where|location|place)\\b/.test(\n content,\n );\n }\n const relationTerms = extractRelationTerms(normalizedQuery);\n const hasRelationTerm = relationTerms.some((term) => content.includes(term));\n return hasRelationTerm &&\n /\\b(?:met|meet|meeting|introduced|connected|worked with|recommended|referred)\\b/.test(content) &&\n /\\b(?:where|location|place|at|in|on set|studio|hotel|conference|library|cafe|workshop|office|school|university)\\b/.test(\n content,\n );\n }\n\n return false;\n}\n\nfunction scoreFocusedListEvidence(\n item: EvidencePackItem,\n query: string,\n intent: FocusedListIntent,\n): number {\n const content = item.content.toLowerCase();\n let score = 0;\n\n if (item.role === \"user\") score += intent === \"count\" ? 12 : 5;\n if (item.role === \"assistant\") score += intent === \"recommendation\" ? 10 : 2;\n score += countFocusedTermOverlap(content, query.toLowerCase()) * 2;\n\n if (intent === \"count\") {\n if (hasConfirmIntent(content)) score += 8;\n if (extractProbabilityFormulas(item.content).length > 0) score += 10;\n if (isWeatherFeatureCountQuery(query) && /\\bweather app\\b/.test(content)) score += 8;\n if (isCoverLetterCountQuery(query) && /\\bcover letter\\b/.test(content)) score += 8;\n if (isSecurityFeatureCountQuery(query) && /\\b(?:password|role|rbac|permissions?|lockout|failed login)\\b/.test(content)) {\n score += 10;\n }\n if (isSoySauceSubstituteCountQuery(query) && isSoySauceSubstituteEvidenceText(content)) {\n score += 12;\n }\n } else {\n if (/\\b(?:recommend|suggest|should|consider|places?|features?|tips?)\\b/.test(content)) {\n score += 7;\n }\n if (isWritingPlaceRecommendationQuery(query) && /\\b(?:library|cafe|coffee|quiet|morning|productive)\\b/.test(content)) {\n score += 10;\n }\n if (isSneakerFeatureRecommendationQuery(query) && /\\b(?:comfort|support|cushion|breathability|fit|break-in|injury|arch)\\b/.test(content)) {\n score += 10;\n }\n }\n\n if (intent === \"relation\") {\n if (/\\b(?:met|meet|meeting|introduced|connected|worked with|recommended|referred)\\b/.test(content)) {\n score += 14;\n }\n if (/\\b(?:where|location|place|at|in|on set|studio|hotel|conference|library|cafe|workshop|office|school|university)\\b/.test(content)) {\n score += 10;\n }\n if (isSpecialEventLocationQuery(query) && /\\b(?:weekend getaway|anniversary dinner|resort|restaurant|venue)\\b/.test(content)) {\n score += 16;\n if (item.role === \"user\") score += 14;\n score += extractSpecialEventPersonTerms(query.toLowerCase()).filter((term) =>\n content.includes(term)\n ).length * 8;\n }\n score += extractRelationTerms(query.toLowerCase()).filter((term) =>\n content.includes(term)\n ).length * 6;\n }\n\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n score += Math.min(5, Math.max(0, item.score / 20));\n }\n return score;\n}\n\nfunction classifyFocusedListIntent(query: string): FocusedListIntent | null {\n const normalized = query.toLowerCase();\n if (\n /\\bhow many\\b/.test(normalized) &&\n /\\b(?:different|times?|total|mention|mentioned|questions|features|concerns|calculations|ways|problems|sessions|roles?)\\b/.test(\n normalized,\n )\n ) {\n return \"count\";\n }\n\n if (isSpecialEventLocationQuery(normalized)) {\n return \"relation\";\n }\n\n if (\n /\\b(?:what|which|where|suggest|recommend|should|advice|features?)\\b/.test(normalized) &&\n /\\b(?:places?|locations?|writing|sneakers?|shoes?|features?)\\b/.test(normalized)\n ) {\n return \"recommendation\";\n }\n\n if (\n /\\b(?:where|when|how)\\b/.test(normalized) &&\n /\\b(?:met|meet|meeting|know|connected|introduced)\\b/.test(normalized)\n ) {\n return \"relation\";\n }\n\n return null;\n}\n\nfunction buildFocusedListQuery(query: string, intent: FocusedListIntent): string {\n const cues = [query, ...extractFocusedTerms(query).slice(0, 16)];\n if (intent === \"count\") {\n cues.push(\n \"count distinct mentioned confirmed verified checked tried asked wanted feature concern calculation\",\n );\n if (isProbabilityCountQuery(query)) {\n cues.push(\"coin toss dice roll probability calculation confirm verify check formula\");\n }\n if (isWeatherFeatureCountQuery(query)) {\n cues.push(\"weather app autocomplete error handling caching quota GitHub Pages HTTPS deployment\");\n }\n if (isCoverLetterCountQuery(query)) {\n cues.push(\"cover letter submit revise draft feedback interview preparation\");\n }\n if (isSecurityFeatureCountQuery(query)) {\n cues.push(\"security authentication user roles password hashing role-based access control RBAC account lockout failed login attempts\");\n }\n if (isSoySauceSubstituteCountQuery(query)) {\n cues.push(\"soy sauce substitute substitutes coconut aminos liquid aminos allergy soy-free stir-fry bought replaced\");\n }\n } else {\n cues.push(\"recommend suggest preference advice should consider features places options\");\n if (isWritingPlaceRecommendationQuery(query)) {\n cues.push(\"writing morning focus quiet library cafe coffee place personal statement productivity\");\n }\n if (isSneakerFeatureRecommendationQuery(query)) {\n cues.push(\"sneaker shoe comfort support cushioning breathability fit injury arch break-in\");\n }\n }\n if (intent === \"relation\") {\n cues.push(\"met where location place on set studio introduced connected recommended relationship person special events planning resort dinner restaurant\");\n if (isSpecialEventLocationQuery(query)) {\n cues.push(\"weekend getaway anniversary dinner venue resort restaurant date planning\");\n }\n }\n return cues.join(\" \");\n}\n\nfunction focusedListTitle(intent: FocusedListIntent): string {\n if (intent === \"count\") return \"Focused count evidence\";\n if (intent === \"recommendation\") return \"Focused recommendation evidence\";\n return \"Focused relation evidence\";\n}\n\nfunction isProbabilityCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:probability|calculations?)\\b/.test(normalized) &&\n /\\b(?:coin|coins|tossing|toss|dice|die|rolling|roll)\\b/.test(normalized);\n}\n\nfunction isWeatherFeatureCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bweather app\\b/.test(normalized) &&\n /\\b(?:features?|concerns?|handle|wanting|wanted|mentioned)\\b/.test(normalized);\n}\n\nfunction isCoverLetterCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bcover letter\\b/.test(normalized) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|times?)\\b/.test(\n normalized,\n );\n}\n\nfunction isSecurityFeatureCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bhow many\\b/.test(normalized) &&\n /\\b(?:security|authentication|authorization|auth|user roles?|roles?|permissions?)\\b/.test(normalized) &&\n /\\b(?:features?|roles?|implement|across|sessions|trying)\\b/.test(normalized);\n}\n\nfunction isSoySauceSubstituteCountQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bhow many\\b/.test(normalized) &&\n /\\bsoy sauce\\b/.test(normalized) &&\n /\\bsubstitutes?\\b/.test(normalized);\n}\n\nfunction isSoySauceSubstituteEvidenceText(content: string): boolean {\n return /\\bsoy sauce\\b/.test(content) &&\n /\\b(?:coconut aminos|liquid aminos)\\b/.test(content) &&\n /\\b(?:substitute|replace|replaced|instead of|remov(?:e|ed|ing)|buy|buying|bought|use|using)\\b/.test(\n content,\n );\n}\n\nfunction isWritingPlaceRecommendationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\bwriting\\b/.test(normalized) && /\\b(?:places?|locations?|where|spend)\\b/.test(normalized);\n}\n\nfunction isSneakerFeatureRecommendationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:sneakers?|shoes?)\\b/.test(normalized) &&\n /\\b(?:features?|pay attention|attention|should)\\b/.test(normalized);\n}\n\nfunction isSpecialEventLocationQuery(query: string): boolean {\n const normalized = query.toLowerCase();\n return /\\b(?:what|where|which)\\b/.test(normalized) &&\n /\\b(?:special events?|planning with|take place|where will|events? am i planning)\\b/.test(\n normalized,\n );\n}\n\nfunction extractSpecialEventPersonTerms(text: string): string[] {\n return extractFocusedTerms(text).filter((term) =>\n !SPECIAL_EVENT_STOP_WORDS.has(term) && term.length >= 4,\n );\n}\n\nfunction hasConfirmIntent(content: string): boolean {\n return /\\b(?:confirm|verify|check|get it right|is correct|doing it right|make sure i (?:get|got|am getting|understood) it right|make sure i'm doing it right)\\b/.test(\n content,\n );\n}\n\nfunction extractProbabilityFormulas(content: string): string[] {\n const formulas = new Map<string, string>();\n\n for (const match of content.matchAll(/\\bP\\s*\\(([^)]{1,100})\\)\\s*(?:=|≈|≠)\\s*([^,.;\\n?]{1,120})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `P(${event}) = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n for (const match of content.matchAll(/\\bprobability of ([^,.;?\\n]{4,100})\\s+(?:is|would be|=)\\s+([^,.;?\\n]{1,80})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `probability of ${event} = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n for (const match of content.matchAll(/\\bP\\(([^)]{1,100})\\)\\s+using the formula\\s+([^,.;?\\n]{1,100})/gi)) {\n const event = cleanFormulaPart(match[1] ?? \"\");\n const value = cleanFormulaPart(match[2] ?? \"\");\n if (!event || !value) continue;\n const formula = `P(${event}) = ${value}`;\n formulas.set(normalizeProbabilityCandidateKey(formula), formula);\n }\n\n return [...formulas.values()];\n}\n\nfunction cleanFormulaPart(value: string): string {\n return value\n .replace(/\\s+/g, \" \")\n .replace(/\\s*->->.*$/g, \"\")\n .replace(/\\s+and\\s+how\\b.*$/i, \"\")\n .replace(/\\s+i want\\b.*$/i, \"\")\n .replace(/\\s+as this\\b.*$/i, \"\")\n .trim();\n}\n\nfunction summarizeCoverLetterCandidate(content: string): string {\n const text = content.replace(/\\s+/g, \" \").replace(/\\s*->->.*$/g, \"\").trim();\n const clauses = text.split(/(?<=[.!?])\\s+|,\\s+(?=but|and|so|can|what|how)/i);\n const focused = clauses.find((clause) =>\n /\\bcover letter\\b/i.test(clause) &&\n /\\b(?:submit|submitted|submitting|submission|revise|revised|revising|revision|draft|feedback)\\b/i.test(\n clause,\n )\n );\n return clipSummaryLabel(focused ?? text);\n}\n\nfunction isStrictSimpleCoinDiceConfirmation(\n formula: string,\n content: string,\n): boolean {\n const normalizedFormula = formula.toLowerCase();\n const normalizedContent = content.toLowerCase();\n if (!hasConfirmIntent(normalizedContent)) {\n return false;\n }\n if (\n !/\\b(?:heads|coin|coins|toss|tosses|rolling|roll|die|dice)\\b/.test(\n `${normalizedFormula} ${normalizedContent}`,\n )\n ) {\n return false;\n }\n if (!/=\\s*(?:[^.;]*\\d+\\s*\\/\\s*\\d+|0\\b|[^.;]*\\d+(?:\\.\\d+)?%)/.test(normalizedFormula)) {\n return false;\n }\n if (/\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent)\\b/.test(normalizedFormula)) {\n return false;\n }\n if (/^p\\(\\s*a\\b/.test(normalizedFormula)) {\n return false;\n }\n if (/\\bnumber of problems\\b/.test(normalizedContent)) {\n return false;\n }\n return true;\n}\n\nfunction isStrictSimpleProbabilityLabel(label: string): boolean {\n const normalizedFormula = label.toLowerCase();\n return /\\b(?:heads|coin|coins|toss|tosses|rolling|roll|die|dice)\\b/.test(\n normalizedFormula,\n ) &&\n /=\\s*(?:[^.;]*\\d+\\s*\\/\\s*\\d+|0\\b|[^.;]*\\d+(?:\\.\\d+)?%)/.test(\n normalizedFormula,\n ) &&\n !/\\b(?:first die|second die|two dice|sum of|deck|card|ace|king|queen|heart|birthday|conditional|dependent)\\b/.test(\n normalizedFormula,\n ) &&\n !/^p\\(\\s*a\\b/.test(normalizedFormula);\n}\n\nfunction findTemporalCutoffTurn(\n items: readonly EvidencePackItem[],\n query: string,\n cutoffPattern: RegExp,\n): number | undefined {\n if (!/\\bbefore\\b/i.test(query)) {\n return undefined;\n }\n let cutoff: number | undefined;\n for (const item of items) {\n if (typeof item.turnIndex !== \"number\") continue;\n if (!cutoffPattern.test(item.content)) continue;\n cutoff = cutoff === undefined ? item.turnIndex : Math.min(cutoff, item.turnIndex);\n }\n return cutoff;\n}\n\nfunction sortCountCandidates(left: CountCandidate, right: CountCandidate): number {\n const leftTurn = typeof left.turnIndex === \"number\" ? left.turnIndex : Number.MAX_SAFE_INTEGER;\n const rightTurn = typeof right.turnIndex === \"number\" ? right.turnIndex : Number.MAX_SAFE_INTEGER;\n if (leftTurn !== rightTurn) return leftTurn - rightTurn;\n return left.label.localeCompare(right.label);\n}\n\nfunction clipSummaryLabel(value: string): string {\n const trimmed = value.trim();\n return trimmed.length <= 180 ? trimmed : `${trimmed.slice(0, 177).trimEnd()}...`;\n}\n\nfunction normalizeCountCandidateKey(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .replace(/[“”]/g, \"\\\"\")\n .replace(/[’]/g, \"'\")\n .replace(/\\bthe\\b/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction normalizeProbabilityCandidateKey(value: string): string {\n return normalizeCountCandidateKey(value)\n .replace(/\\s+(?:so|because|as)\\b.*$/g, \"\")\n .replace(/\\s+one more time\\b.*$/g, \"\")\n .replace(/\\s+is correct\\b.*$/g, \"\")\n .replace(/\\s+correct\\b.*$/g, \"\")\n .trim();\n}\n\nfunction numberWord(value: number): string | undefined {\n return NUMBER_WORDS[value];\n}\n\nfunction countFocusedTermOverlap(content: string, query: string): number {\n const terms = extractFocusedTerms(query);\n let overlap = 0;\n for (const term of terms) {\n if (content.includes(term)) overlap += 1;\n }\n return overlap;\n}\n\nfunction extractFocusedTerms(text: string): string[] {\n const terms = text.toLowerCase().match(/[a-z][a-z0-9-]{2,}/g) ?? [];\n return [...new Set(terms.filter((term) =>\n !FOCUSED_LIST_STOP_WORDS.has(term) &&\n !/^\\d+$/.test(term),\n ))];\n}\n\nfunction extractRelationTerms(text: string): string[] {\n return extractFocusedTerms(text).filter((term) =>\n !RELATION_STOP_WORDS.has(term) &&\n !/\\b(?:met|meet|meeting|know|connected|introduced)\\b/.test(term),\n );\n}\n\nfunction normalizePositiveInteger(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n}\n\nfunction clipTextToBudget(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 3) {\n return text.slice(0, Math.max(0, maxChars));\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n\nconst FOCUSED_LIST_STOP_WORDS = new Set([\n \"about\",\n \"across\",\n \"after\",\n \"also\",\n \"and\",\n \"are\",\n \"before\",\n \"between\",\n \"can\",\n \"could\",\n \"did\",\n \"different\",\n \"does\",\n \"for\",\n \"from\",\n \"have\",\n \"how\",\n \"into\",\n \"many\",\n \"mention\",\n \"mentioned\",\n \"next\",\n \"off\",\n \"pay\",\n \"planning\",\n \"should\",\n \"some\",\n \"spend\",\n \"that\",\n \"the\",\n \"this\",\n \"time\",\n \"times\",\n \"total\",\n \"want\",\n \"wanted\",\n \"wanting\",\n \"were\",\n \"what\",\n \"when\",\n \"where\",\n \"which\",\n \"with\",\n \"would\",\n \"you\",\n]);\n\nconst RELATION_STOP_WORDS = new Set([\n \"did\",\n \"how\",\n \"know\",\n \"meet\",\n \"met\",\n \"say\",\n \"saying\",\n \"when\",\n \"where\",\n]);\n\nconst SPECIAL_EVENT_STOP_WORDS = new Set([\n \"events\",\n \"event\",\n \"planning\",\n \"place\",\n \"special\",\n \"take\",\n \"where\",\n \"will\",\n]);\n\nconst NUMBER_WORDS: Record<number, string> = {\n 0: \"zero\",\n 1: \"one\",\n 2: \"two\",\n 3: \"three\",\n 4: \"four\",\n 5: \"five\",\n 6: \"six\",\n 7: \"seven\",\n 8: \"eight\",\n 9: \"nine\",\n 10: \"ten\",\n 11: \"eleven\",\n 12: \"twelve\",\n 13: \"thirteen\",\n 14: \"fourteen\",\n 15: \"fifteen\",\n 16: \"sixteen\",\n 17: \"seventeen\",\n 18: \"eighteen\",\n 19: \"nineteen\",\n 20: \"twenty\",\n};\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-CINZGPSJ.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
- } from "./chunk-QT4THOLT.js";
10
+ } from "./chunk-2DGQLOOM.js";
11
11
  import {
12
12
  log
13
13
  } from "./chunk-2ODBA7MQ.js";
@@ -491,4 +491,4 @@ function isMissingVectorProviderColumnError(err) {
491
491
  export {
492
492
  LanceDbBackend
493
493
  };
494
- //# sourceMappingURL=chunk-FOVPSMGI.js.map
494
+ //# sourceMappingURL=chunk-7WEB3FLJ.js.map
@@ -1,10 +1,10 @@
1
+ import {
2
+ SQLITE_SCHEMA_VERSION
3
+ } from "./chunk-Z734BLO3.js";
1
4
  import {
2
5
  parseConflictPolicy,
3
6
  validateManifestRecords
4
7
  } from "./chunk-G4IAEX6D.js";
5
- import {
6
- SQLITE_SCHEMA_VERSION
7
- } from "./chunk-Z734BLO3.js";
8
8
  import {
9
9
  openBetterSqlite3
10
10
  } from "./chunk-6KYMPV2O.js";
@@ -84,4 +84,4 @@ async function importSqlite(opts) {
84
84
  export {
85
85
  importSqlite
86
86
  };
87
- //# sourceMappingURL=chunk-APJQ6UEA.js.map
87
+ //# sourceMappingURL=chunk-AGNBY3VG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-A4BTPHIN.js";
3
+ } from "./chunk-Y7NWBBHV.js";
4
4
  import {
5
5
  getCachedRuleMemories,
6
6
  setCachedRuleMemories
@@ -115,4 +115,4 @@ async function searchVerifiedSemanticRules(options) {
115
115
  export {
116
116
  searchVerifiedSemanticRules
117
117
  };
118
- //# sourceMappingURL=chunk-4BISW7RX.js.map
118
+ //# sourceMappingURL=chunk-AJE7FJVE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPostConsolidationMaterialize
3
- } from "./chunk-OR7R6M5Z.js";
3
+ } from "./chunk-IVYSVAC6.js";
4
4
  import {
5
5
  discoverMemoryExtensions,
6
6
  renderExtensionsBlock,
@@ -217,4 +217,4 @@ export {
217
217
  buildExtensionsBlockForConsolidation,
218
218
  materializeAfterSemanticConsolidation
219
219
  };
220
- //# sourceMappingURL=chunk-ZXWAQFDE.js.map
220
+ //# sourceMappingURL=chunk-CFOCZPIQ.js.map
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  decryptCapsuleFileInMemory,
9
9
  isEncryptedCapsuleFile
10
- } from "./chunk-UVYI6VIX.js";
10
+ } from "./chunk-X7Y7WX73.js";
11
11
  import {
12
12
  assertIsDirectoryNotSymlink,
13
13
  assertRealpathInsideRoot,
@@ -227,4 +227,4 @@ function mintForkId(capsuleId, originalId, now) {
227
227
  export {
228
228
  importCapsule
229
229
  };
230
- //# sourceMappingURL=chunk-NT5TINK5.js.map
230
+ //# sourceMappingURL=chunk-DHGSZ3UD.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-A4BTPHIN.js";
3
+ } from "./chunk-Y7NWBBHV.js";
4
4
 
5
5
  // src/semantic-rule-promotion.ts
6
6
  import { createHash, randomUUID } from "crypto";
@@ -529,4 +529,4 @@ export {
529
529
  setSemanticRulePromotionTestHooks,
530
530
  promoteSemanticRuleFromMemory
531
531
  };
532
- //# sourceMappingURL=chunk-OTC2KOZ2.js.map
532
+ //# sourceMappingURL=chunk-EHQLDFSH.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  NamespaceStorageRouter
3
- } from "./chunk-D6WVJIS3.js";
3
+ } from "./chunk-ORGWWNJG.js";
4
4
  import {
5
5
  namespaceCollectionName
6
- } from "./chunk-NMIOW7XG.js";
6
+ } from "./chunk-JVRPJ7D4.js";
7
7
  import {
8
8
  namespaceIdentityFromToken,
9
9
  namespaceIdentityToken
10
10
  } from "./chunk-ZFXCQPNO.js";
11
11
  import {
12
12
  ALL_CATEGORY_DIRS
13
- } from "./chunk-A4BTPHIN.js";
13
+ } from "./chunk-Y7NWBBHV.js";
14
14
  import {
15
15
  isSafeRouteNamespace
16
16
  } from "./chunk-U3PN77QT.js";
@@ -204,4 +204,4 @@ export {
204
204
  verifyNamespaces,
205
205
  runNamespaceMigration
206
206
  };
207
- //# sourceMappingURL=chunk-RRRCNIPK.js.map
207
+ //# sourceMappingURL=chunk-GI45G4BK.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  StorageManager,
3
3
  normalizeEntityName
4
- } from "./chunk-A4BTPHIN.js";
4
+ } from "./chunk-Y7NWBBHV.js";
5
5
  import {
6
6
  extractJsonCandidates
7
7
  } from "./chunk-RGMVMVMF.js";
@@ -860,4 +860,4 @@ export {
860
860
  resolveBriefingSaveDir,
861
861
  briefingFilename
862
862
  };
863
- //# sourceMappingURL=chunk-AMACWKM4.js.map
863
+ //# sourceMappingURL=chunk-IJHLC5CH.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3UXOZBHV.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-A4BTPHIN.js";
10
+ } from "./chunk-Y7NWBBHV.js";
11
11
  import {
12
12
  isSafeRouteNamespace
13
13
  } from "./chunk-U3PN77QT.js";
@@ -118,4 +118,4 @@ export {
118
118
  runCodexMaterialize,
119
119
  runPostConsolidationMaterialize
120
120
  };
121
- //# sourceMappingURL=chunk-OR7R6M5Z.js.map
121
+ //# sourceMappingURL=chunk-IVYSVAC6.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-CINZGPSJ.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
- } from "./chunk-QT4THOLT.js";
10
+ } from "./chunk-2DGQLOOM.js";
11
11
  import {
12
12
  log
13
13
  } from "./chunk-2ODBA7MQ.js";
@@ -605,4 +605,4 @@ export {
605
605
  resolveOramaCollectionDbFilePath,
606
606
  OramaBackend
607
607
  };
608
- //# sourceMappingURL=chunk-76QTEJ2Q.js.map
608
+ //# sourceMappingURL=chunk-JBHXMCYN.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-HQ6NIBL6.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-A4BTPHIN.js";
6
+ } from "./chunk-Y7NWBBHV.js";
7
7
  import {
8
8
  getCachedEpisodeMap,
9
9
  setCachedEpisodeMap
@@ -105,4 +105,4 @@ async function searchVerifiedEpisodes(options) {
105
105
  export {
106
106
  searchVerifiedEpisodes
107
107
  };
108
- //# sourceMappingURL=chunk-UMKPSD35.js.map
108
+ //# sourceMappingURL=chunk-JF7SFXTG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-WPCCNSWO.js";
3
+ } from "./chunk-YM3LR4LS.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
@@ -125,6 +125,50 @@ var NamespaceSearchRouter = class {
125
125
  const record = await this.backendRecordFor(namespace, execution);
126
126
  return record.collectionState;
127
127
  }
128
+ async healthForNamespace(namespace, execution) {
129
+ const key = namespace.trim() || this.config.defaultNamespace;
130
+ const record = await this.createBackendRecordFor(
131
+ key,
132
+ execution,
133
+ {
134
+ autoCreateCollection: false,
135
+ abortAsUnavailable: true,
136
+ failOpenMissingGuardedCollection: false
137
+ }
138
+ );
139
+ try {
140
+ const liveRecord = await this.liveCachedRecordForHealth(key, record, execution);
141
+ const diagnosticBackend = liveRecord?.backend ?? record.backend;
142
+ const versionStatus = "getVersionStatus" in diagnosticBackend && typeof diagnosticBackend.getVersionStatus === "function" ? diagnosticBackend.getVersionStatus() : null;
143
+ const daemonMode = daemonModeForBackend(diagnosticBackend);
144
+ const collectionState = liveRecord?.collectionState === "missing" ? "missing" : record.collectionState;
145
+ return {
146
+ collection: record.collection,
147
+ memoryDir: record.memoryDir,
148
+ available: liveRecord?.available ?? record.available,
149
+ collectionState,
150
+ debugStatus: diagnosticBackend.debugStatus(),
151
+ installedVersion: versionStatus?.installedVersion ?? null,
152
+ supportedVersion: versionStatus?.supportedVersion ?? null,
153
+ supported: versionStatus?.supported ?? null,
154
+ upgradeAvailable: versionStatus?.upgradeAvailable ?? null,
155
+ doctorAvailable: versionStatus?.capabilities?.doctor ?? null,
156
+ daemonMode
157
+ };
158
+ } finally {
159
+ const dispose = record.backend.dispose;
160
+ await dispose?.call(record.backend);
161
+ }
162
+ }
163
+ async liveCachedRecordForHealth(key, disposableRecord, execution) {
164
+ const pending = this.cache.get(key);
165
+ if (!pending) return null;
166
+ const cachedRecord = await awaitWithAbort(pending, execution?.signal).catch(() => null);
167
+ if (!cachedRecord) return null;
168
+ if (cachedRecord.collection !== disposableRecord.collection) return null;
169
+ if (cachedRecord.memoryDir !== disposableRecord.memoryDir) return null;
170
+ return cachedRecord;
171
+ }
128
172
  /** Clear cached backend records so the next access re-probes availability. */
129
173
  clearCache() {
130
174
  this.cache.clear();
@@ -146,25 +190,54 @@ var NamespaceSearchRouter = class {
146
190
  const key = namespace.trim() || this.config.defaultNamespace;
147
191
  const existing = this.cache.get(key);
148
192
  if (existing) return await existing;
149
- const pending = (async () => {
150
- const storage = await this.storageRouter.storageFor(key);
151
- const useLegacyDefaultCollection = key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;
152
- const filtersNestedNamespaces = this.config.namespacesEnabled === true && useLegacyDefaultCollection;
153
- const rootHostEmbeddingScope = this.config.hostEmbeddingProviderScope ?? this.config.memoryDir;
154
- const scopedConfig = {
155
- ...this.config,
156
- memoryDir: storage.dir,
157
- hostEmbeddingProviderScope: rootHostEmbeddingScope,
158
- qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {
159
- defaultNamespace: this.config.defaultNamespace,
160
- useLegacyDefaultCollection
161
- })
162
- };
163
- const backend = this.createBackend(scopedConfig);
164
- const available = await backend.probe().catch(() => false);
165
- const collectionState = available ? await this.collectionStateForBackend(backend, storage.dir, scopedConfig.qmdCollection, {
166
- skipAutoCreate: filtersNestedNamespaces,
167
- execution
193
+ const pending = this.createBackendRecordFor(key, execution, {
194
+ autoCreateCollection: true,
195
+ abortAsUnavailable: false,
196
+ failOpenMissingGuardedCollection: true
197
+ }).catch((error) => {
198
+ this.cache.delete(key);
199
+ throw error;
200
+ });
201
+ this.cache.set(key, pending);
202
+ return await pending;
203
+ }
204
+ async createBackendRecordFor(namespace, execution, options) {
205
+ const key = namespace.trim() || this.config.defaultNamespace;
206
+ const storage = await this.storageRouter.storageFor(key);
207
+ const useLegacyDefaultCollection = key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;
208
+ const filtersNestedNamespaces = this.config.namespacesEnabled === true && useLegacyDefaultCollection;
209
+ const rootHostEmbeddingScope = this.config.hostEmbeddingProviderScope ?? this.config.memoryDir;
210
+ const scopedConfig = {
211
+ ...this.config,
212
+ memoryDir: storage.dir,
213
+ hostEmbeddingProviderScope: rootHostEmbeddingScope,
214
+ qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {
215
+ defaultNamespace: this.config.defaultNamespace,
216
+ useLegacyDefaultCollection
217
+ })
218
+ };
219
+ const backend = this.createBackend(scopedConfig);
220
+ try {
221
+ const availabilityProbe = options.autoCreateCollection || typeof backend.checkAvailability !== "function" ? backend.probe() : backend.checkAvailability({ signal: execution?.signal });
222
+ const available = await awaitWithAbort(availabilityProbe, execution?.signal).catch((error) => {
223
+ if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {
224
+ throw error;
225
+ }
226
+ return false;
227
+ });
228
+ const collectionState = available ? await awaitWithAbort(
229
+ this.collectionStateForBackend(backend, storage.dir, scopedConfig.qmdCollection, {
230
+ autoCreate: options.autoCreateCollection,
231
+ failOpenMissingGuardedCollection: options.failOpenMissingGuardedCollection,
232
+ skipAutoCreate: filtersNestedNamespaces,
233
+ execution
234
+ }),
235
+ execution?.signal
236
+ ).catch((error) => {
237
+ if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {
238
+ throw error;
239
+ }
240
+ return "unknown";
168
241
  }) : "unknown";
169
242
  return {
170
243
  backend,
@@ -174,19 +247,43 @@ var NamespaceSearchRouter = class {
174
247
  collectionState,
175
248
  filtersNestedNamespaces
176
249
  };
177
- })();
178
- this.cache.set(key, pending);
179
- return await pending;
250
+ } catch (error) {
251
+ const dispose = backend.dispose;
252
+ if (dispose) {
253
+ await Promise.resolve(dispose.call(backend)).catch(() => {
254
+ });
255
+ }
256
+ throw error;
257
+ }
180
258
  }
181
259
  async collectionStateForBackend(backend, memoryDir, collection, options) {
182
- if (options.skipAutoCreate) {
260
+ if (!options.autoCreate || options.skipAutoCreate) {
183
261
  if (!backend.checkCollection) return "unknown";
184
262
  const collectionState = await backend.checkCollection(collection, options.execution).catch(() => "unknown");
185
- return collectionState === "missing" ? "unknown" : collectionState;
263
+ return options.failOpenMissingGuardedCollection && collectionState === "missing" ? "unknown" : collectionState;
186
264
  }
187
265
  return await backend.ensureCollection(memoryDir, collection, options.execution).catch(() => "unknown");
188
266
  }
189
267
  };
268
+ var NamespaceSearchAbortError = class extends Error {
269
+ constructor() {
270
+ super("operation aborted");
271
+ }
272
+ };
273
+ function awaitWithAbort(operation, signal) {
274
+ if (!signal) return operation;
275
+ if (signal.aborted) return Promise.reject(new NamespaceSearchAbortError());
276
+ return new Promise((resolve, reject) => {
277
+ const onAbort = () => {
278
+ signal.removeEventListener("abort", onAbort);
279
+ reject(new NamespaceSearchAbortError());
280
+ };
281
+ signal.addEventListener("abort", onAbort, { once: true });
282
+ operation.then(resolve, reject).finally(() => {
283
+ signal.removeEventListener("abort", onAbort);
284
+ });
285
+ });
286
+ }
190
287
  function filterNamespaceSubtreeResults(record, results) {
191
288
  if (!record.filtersNestedNamespaces) return results;
192
289
  return results.filter(
@@ -201,6 +298,9 @@ function backendSearchLimit(record, maxResults) {
201
298
  NESTED_NAMESPACE_FILTER_OVERFETCH_MIN
202
299
  );
203
300
  }
301
+ function daemonModeForBackend(backend) {
302
+ return "isDaemonMode" in backend && typeof backend.isDaemonMode === "function" ? backend.isDaemonMode() === true : null;
303
+ }
204
304
  function pathIsInsideNamespaceSubtree(memoryDir, collection, resultPath) {
205
305
  if (!resultPath) return false;
206
306
  const normalizedResultPath = normalizeQmdResultPath(resultPath, collection);
@@ -257,4 +357,4 @@ export {
257
357
  namespaceCollectionName,
258
358
  NamespaceSearchRouter
259
359
  };
260
- //# sourceMappingURL=chunk-NMIOW7XG.js.map
360
+ //# sourceMappingURL=chunk-JVRPJ7D4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/namespaces/search.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { PluginConfig, QmdSearchResult } from \"../types.js\";\nimport type {\n SearchBackend,\n SearchExecutionOptions,\n SearchQueryOptions,\n} from \"../search/port.js\";\nimport { createSearchBackend } from \"../search/factory.js\";\nimport { namespaceIdentityToken, normalizeNamespaceIdentity } from \"./identity.js\";\n\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR = 4;\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_MIN = 50;\n\nexport function namespaceCollectionName(\n baseCollection: string,\n namespace: string,\n options?: {\n defaultNamespace?: string;\n useLegacyDefaultCollection?: boolean;\n },\n): string {\n const trimmed = normalizeNamespaceIdentity(namespace);\n const defaultNamespace = normalizeNamespaceIdentity(options?.defaultNamespace ?? \"\") || \"default\";\n if (\n options?.useLegacyDefaultCollection === true &&\n trimmed === defaultNamespace\n ) {\n return baseCollection;\n }\n\n return `${baseCollection}--${namespaceIdentityToken(trimmed || defaultNamespace)}`;\n}\n\ntype StorageRouterLike = {\n storageFor(namespace: string): Promise<{ dir: string }>;\n};\n\ntype NamespaceBackendRecord = {\n backend: SearchBackend;\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n filtersNestedNamespaces: boolean;\n};\n\nexport type CollectionState = \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n\nexport interface NamespaceSearchHealth {\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n debugStatus: string;\n installedVersion: string | null;\n supportedVersion: string | null;\n supported: boolean | null;\n upgradeAvailable: boolean | null;\n doctorAvailable: boolean | null;\n daemonMode: boolean | null;\n}\n\ntype NamespaceScopedSearchConfig = PluginConfig & {\n hostEmbeddingProviderScope?: string;\n};\n\ntype BackendRecordOptions = {\n autoCreateCollection: boolean;\n abortAsUnavailable: boolean;\n failOpenMissingGuardedCollection: boolean;\n};\n\nexport class NamespaceSearchRouter {\n private readonly cache = new Map<string, Promise<NamespaceBackendRecord>>();\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storageRouter: StorageRouterLike,\n private readonly createBackend: (config: PluginConfig) => SearchBackend = createSearchBackend,\n ) {}\n\n async collectionForNamespace(namespace: string): Promise<string> {\n return (await this.backendRecordFor(namespace)).collection;\n }\n\n async searchAcrossNamespaces(options: {\n query: string;\n namespaces: string[];\n maxResults?: number;\n mode?: \"search\" | \"hybrid\" | \"bm25\" | \"vector\";\n searchOptions?: SearchQueryOptions;\n execution?: SearchExecutionOptions;\n }): Promise<QmdSearchResult[]> {\n const query = options.query.trim();\n if (!query) return [];\n const maxResults = Math.max(0, Math.floor(options.maxResults ?? this.config.qmdMaxResults));\n if (maxResults === 0) return [];\n\n const method = options.mode ?? \"search\";\n const namespaces = Array.from(new Set(options.namespaces.map((value) => value.trim()).filter(Boolean)));\n if (namespaces.length === 0) return [];\n\n const resultsByNamespace = await Promise.all(\n namespaces.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") {\n return { namespace, results: [] as QmdSearchResult[] };\n }\n const backendLimit = backendSearchLimit(record, maxResults);\n let results: QmdSearchResult[];\n switch (method) {\n case \"hybrid\":\n results = await record.backend.hybridSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"bm25\":\n results = await record.backend.bm25Search(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"vector\":\n results = await record.backend.vectorSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n default:\n results = await record.backend.search(\n query,\n record.collection,\n backendLimit,\n options.searchOptions,\n options.execution,\n );\n break;\n }\n results = filterNamespaceSubtreeResults(record, results);\n return { namespace, results };\n }),\n );\n\n return mergeNamespaceSearchResults(resultsByNamespace, maxResults);\n }\n\n /**\n * Update all namespace backends.\n * Returns the number of backends for which an update was attempted\n * (i.e., available and collection present). Callers can treat 0 as a\n * signal that no backend was eligible — useful for success-verification in\n * startup-sync when namespacesEnabled is true.\n */\n async updateNamespaces(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n ): Promise<number> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n const eligible = (await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n return record.available && record.collectionState !== \"missing\"\n ? record\n : null;\n }),\n )).filter((record): record is NamespaceBackendRecord => record !== null);\n\n const globalRecord = eligible.find((record) => record.backend.updatesAllCollections?.() === true);\n const scopedRecords = globalRecord\n ? eligible.filter((record) => record.backend.updatesAllCollections?.() !== true)\n : eligible;\n\n await Promise.all([\n globalRecord ? globalRecord.backend.update(execution) : Promise.resolve(),\n ...scopedRecords.map((record) => record.backend.update(execution)),\n ]);\n\n return (globalRecord ? 1 : 0) + scopedRecords.length;\n }\n\n async embedNamespaces(namespaces: string[]): Promise<void> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") return;\n await record.backend.embed();\n }),\n );\n }\n\n async ensureNamespaceCollection(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const record = await this.backendRecordFor(namespace, execution);\n return record.collectionState;\n }\n\n async healthForNamespace(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceSearchHealth> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const record = await this.createBackendRecordFor(\n key,\n execution,\n {\n autoCreateCollection: false,\n abortAsUnavailable: true,\n failOpenMissingGuardedCollection: false,\n },\n );\n try {\n const liveRecord = await this.liveCachedRecordForHealth(key, record, execution);\n const diagnosticBackend = liveRecord?.backend ?? record.backend;\n const versionStatus =\n \"getVersionStatus\" in diagnosticBackend &&\n typeof diagnosticBackend.getVersionStatus === \"function\"\n ? diagnosticBackend.getVersionStatus()\n : null;\n const daemonMode = daemonModeForBackend(diagnosticBackend);\n const collectionState =\n liveRecord?.collectionState === \"missing\"\n ? \"missing\"\n : record.collectionState;\n\n return {\n collection: record.collection,\n memoryDir: record.memoryDir,\n available: liveRecord?.available ?? record.available,\n collectionState,\n debugStatus: diagnosticBackend.debugStatus(),\n installedVersion: versionStatus?.installedVersion ?? null,\n supportedVersion: versionStatus?.supportedVersion ?? null,\n supported: versionStatus?.supported ?? null,\n upgradeAvailable: versionStatus?.upgradeAvailable ?? null,\n doctorAvailable: versionStatus?.capabilities?.doctor ?? null,\n daemonMode,\n };\n } finally {\n const dispose = (record.backend as { dispose?: () => void | Promise<void> }).dispose;\n await dispose?.call(record.backend);\n }\n }\n\n private async liveCachedRecordForHealth(\n key: string,\n disposableRecord: NamespaceBackendRecord,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord | null> {\n const pending = this.cache.get(key);\n if (!pending) return null;\n const cachedRecord = await awaitWithAbort(pending, execution?.signal).catch(() => null);\n if (!cachedRecord) return null;\n if (cachedRecord.collection !== disposableRecord.collection) return null;\n if (cachedRecord.memoryDir !== disposableRecord.memoryDir) return null;\n return cachedRecord;\n }\n\n /** Clear cached backend records so the next access re-probes availability. */\n clearCache(): void {\n this.cache.clear();\n }\n\n /** Release any per-namespace backend handles held by cached records. */\n async dispose(): Promise<void> {\n const pendingRecords = Array.from(this.cache.values());\n this.cache.clear();\n const settled = await Promise.allSettled(pendingRecords);\n await Promise.allSettled(\n settled.flatMap((entry) => {\n if (entry.status !== \"fulfilled\") return [];\n const dispose = (entry.value.backend as { dispose?: () => void | Promise<void> }).dispose;\n return dispose ? [dispose.call(entry.value.backend)] : [];\n }),\n );\n }\n\n private async backendRecordFor(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const existing = this.cache.get(key);\n if (existing) return await existing;\n\n const pending = this.createBackendRecordFor(key, execution, {\n autoCreateCollection: true,\n abortAsUnavailable: false,\n failOpenMissingGuardedCollection: true,\n }).catch((error) => {\n this.cache.delete(key);\n throw error;\n });\n\n this.cache.set(key, pending);\n return await pending;\n }\n\n private async createBackendRecordFor(\n namespace: string,\n execution: SearchExecutionOptions | undefined,\n options: BackendRecordOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const storage = await this.storageRouter.storageFor(key);\n const useLegacyDefaultCollection =\n key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;\n const filtersNestedNamespaces =\n this.config.namespacesEnabled === true && useLegacyDefaultCollection;\n const rootHostEmbeddingScope =\n (this.config as NamespaceScopedSearchConfig).hostEmbeddingProviderScope ??\n this.config.memoryDir;\n const scopedConfig: NamespaceScopedSearchConfig = {\n ...this.config,\n memoryDir: storage.dir,\n hostEmbeddingProviderScope: rootHostEmbeddingScope,\n qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {\n defaultNamespace: this.config.defaultNamespace,\n useLegacyDefaultCollection,\n }),\n };\n\n const backend = this.createBackend(scopedConfig);\n try {\n const availabilityProbe =\n options.autoCreateCollection || typeof backend.checkAvailability !== \"function\"\n ? backend.probe()\n : backend.checkAvailability({ signal: execution?.signal });\n const available = await awaitWithAbort(availabilityProbe, execution?.signal).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return false;\n });\n const collectionState = available\n ? await awaitWithAbort(\n this.collectionStateForBackend(backend, storage.dir, scopedConfig.qmdCollection, {\n autoCreate: options.autoCreateCollection,\n failOpenMissingGuardedCollection: options.failOpenMissingGuardedCollection,\n skipAutoCreate: filtersNestedNamespaces,\n execution,\n }),\n execution?.signal,\n ).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return \"unknown\" as const;\n })\n : \"unknown\";\n return {\n backend,\n collection: scopedConfig.qmdCollection,\n memoryDir: storage.dir,\n available,\n collectionState,\n filtersNestedNamespaces,\n };\n } catch (error) {\n const dispose = (backend as { dispose?: () => void | Promise<void> }).dispose;\n if (dispose) {\n await Promise.resolve(dispose.call(backend)).catch(() => {});\n }\n throw error;\n }\n }\n\n private async collectionStateForBackend(\n backend: SearchBackend,\n memoryDir: string,\n collection: string,\n options: {\n autoCreate: boolean;\n failOpenMissingGuardedCollection: boolean;\n skipAutoCreate: boolean;\n execution?: SearchExecutionOptions;\n },\n ): Promise<CollectionState> {\n if (!options.autoCreate || options.skipAutoCreate) {\n if (!backend.checkCollection) return \"unknown\";\n const collectionState = await backend\n .checkCollection(collection, options.execution)\n .catch(() => \"unknown\" as const);\n return options.failOpenMissingGuardedCollection && collectionState === \"missing\"\n ? \"unknown\"\n : collectionState;\n }\n return await backend.ensureCollection(memoryDir, collection, options.execution).catch(() => \"unknown\" as const);\n }\n}\n\nclass NamespaceSearchAbortError extends Error {\n constructor() {\n super(\"operation aborted\");\n }\n}\n\nfunction awaitWithAbort<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return operation;\n if (signal.aborted) return Promise.reject(new NamespaceSearchAbortError());\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(new NamespaceSearchAbortError());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction filterNamespaceSubtreeResults(\n record: NamespaceBackendRecord,\n results: QmdSearchResult[],\n): QmdSearchResult[] {\n if (!record.filtersNestedNamespaces) return results;\n return results.filter((result) =>\n !pathIsInsideNamespaceSubtree(record.memoryDir, record.collection, result.path)\n );\n}\n\nfunction backendSearchLimit(\n record: NamespaceBackendRecord,\n maxResults: number,\n): number {\n if (!record.filtersNestedNamespaces) return maxResults;\n return Math.max(\n maxResults,\n maxResults * NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR,\n NESTED_NAMESPACE_FILTER_OVERFETCH_MIN,\n );\n}\n\nfunction daemonModeForBackend(backend: SearchBackend): boolean | null {\n return \"isDaemonMode\" in backend && typeof backend.isDaemonMode === \"function\"\n ? backend.isDaemonMode() === true\n : null;\n}\n\nfunction pathIsInsideNamespaceSubtree(\n memoryDir: string,\n collection: string,\n resultPath: string | undefined,\n): boolean {\n if (!resultPath) return false;\n const normalizedResultPath = normalizeQmdResultPath(resultPath, collection);\n const memoryRoot = path.resolve(memoryDir);\n const namespacesRoot = path.join(memoryRoot, \"namespaces\");\n const candidate = path.isAbsolute(normalizedResultPath)\n ? path.normalize(normalizedResultPath)\n : path.resolve(memoryRoot, normalizedResultPath);\n const relative = path.relative(namespacesRoot, candidate);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction normalizeQmdResultPath(resultPath: string, collection: string): string {\n let value = resultPath.trim();\n if (value.startsWith(\"qmd://\")) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol === \"qmd:\" && parsed.hostname === collection) {\n value = decodeURIComponent(parsed.pathname.replace(/^\\/+/, \"\"));\n }\n } catch {\n const remainder = value.slice(\"qmd://\".length);\n const slashIndex = remainder.indexOf(\"/\");\n if (slashIndex !== -1) {\n value = remainder.slice(slashIndex + 1);\n }\n }\n }\n\n const collectionPrefix = `${collection}/`;\n if (value.startsWith(collectionPrefix)) {\n value = value.slice(collectionPrefix.length);\n }\n return value;\n}\n\nfunction mergeNamespaceSearchResults(\n lists: Array<{ namespace: string; results: QmdSearchResult[] }>,\n maxResults: number,\n): QmdSearchResult[] {\n const merged = new Map<string, QmdSearchResult>();\n\n for (const { namespace, results } of lists) {\n for (const result of results) {\n const key = `${namespace}\\0${result.path || result.docid}`;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, result);\n continue;\n }\n if (result.score > existing.score) {\n merged.set(key, {\n ...result,\n snippet: existing.snippet || result.snippet || \"\",\n });\n }\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-CINZGPSJ.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
- } from "./chunk-QT4THOLT.js";
10
+ } from "./chunk-2DGQLOOM.js";
11
11
  import {
12
12
  log
13
13
  } from "./chunk-2ODBA7MQ.js";
@@ -245,4 +245,4 @@ function isMeilisearchIndexNotFoundError(err) {
245
245
  export {
246
246
  MeilisearchBackend
247
247
  };
248
- //# sourceMappingURL=chunk-TQUWNX7C.js.map
248
+ //# sourceMappingURL=chunk-JX2RINDR.js.map