@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.
- package/dist/access-cli.js +39 -38
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +3 -2
- package/dist/access-http.js +19 -19
- package/dist/access-mcp.d.ts +3 -2
- package/dist/access-mcp.js +18 -18
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-DIZRHQ7Q.d.ts → access-service-CdJFd3_b.d.ts} +23 -2
- package/dist/access-service.d.ts +3 -2
- package/dist/access-service.js +16 -16
- package/dist/{auto-sync-54QQHOG5.js → auto-sync-5CJBJMPZ.js} +5 -5
- package/dist/bootstrap.d.ts +2 -1
- package/dist/briefing.js +3 -3
- package/dist/calibration.js +2 -2
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/causal-consolidation.js +6 -6
- package/dist/{chunk-QT4THOLT.js → chunk-2DGQLOOM.js} +1 -1
- package/dist/chunk-2DGQLOOM.js.map +1 -0
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-OAZ5MFUB.js → chunk-3XGWCZ63.js} +45 -28
- package/dist/chunk-3XGWCZ63.js.map +1 -0
- package/dist/{chunk-QKE4LHNR.js → chunk-4HYSMH7D.js} +2 -2
- package/dist/{chunk-DDRNDPX4.js → chunk-4SKKVWLQ.js} +2 -2
- package/dist/chunk-5FOCXX5E.js +34 -0
- package/dist/chunk-5FOCXX5E.js.map +1 -0
- package/dist/{chunk-YAFSTKTH.js → chunk-5V3TAB7D.js} +184 -12
- package/dist/chunk-5V3TAB7D.js.map +1 -0
- package/dist/{chunk-DB5A3NHS.js → chunk-7LWRCOP7.js} +9 -2
- package/dist/chunk-7LWRCOP7.js.map +1 -0
- package/dist/{chunk-FOVPSMGI.js → chunk-7WEB3FLJ.js} +2 -2
- package/dist/{chunk-APJQ6UEA.js → chunk-AGNBY3VG.js} +4 -4
- package/dist/{chunk-4BISW7RX.js → chunk-AJE7FJVE.js} +2 -2
- package/dist/{chunk-ZXWAQFDE.js → chunk-CFOCZPIQ.js} +2 -2
- package/dist/{chunk-NT5TINK5.js → chunk-DHGSZ3UD.js} +2 -2
- package/dist/{chunk-OTC2KOZ2.js → chunk-EHQLDFSH.js} +2 -2
- package/dist/{chunk-RRRCNIPK.js → chunk-GI45G4BK.js} +4 -4
- package/dist/{chunk-AMACWKM4.js → chunk-IJHLC5CH.js} +2 -2
- package/dist/{chunk-OR7R6M5Z.js → chunk-IVYSVAC6.js} +2 -2
- package/dist/{chunk-76QTEJ2Q.js → chunk-JBHXMCYN.js} +2 -2
- package/dist/{chunk-UMKPSD35.js → chunk-JF7SFXTG.js} +2 -2
- package/dist/{chunk-NMIOW7XG.js → chunk-JVRPJ7D4.js} +126 -26
- package/dist/chunk-JVRPJ7D4.js.map +1 -0
- package/dist/{chunk-TQUWNX7C.js → chunk-JX2RINDR.js} +2 -2
- package/dist/{chunk-MCYT2RNT.js → chunk-KJDKZVF3.js} +3 -3
- package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
- package/dist/{chunk-PQFUUXWK.js → chunk-KWM33SPU.js} +2 -2
- package/dist/{chunk-A3BS64GV.js → chunk-LCC5EZTT.js} +4 -4
- package/dist/{chunk-TVOPSKOK.js → chunk-MGGNV3H2.js} +4 -4
- package/dist/{chunk-D6WVJIS3.js → chunk-ORGWWNJG.js} +2 -2
- package/dist/{chunk-Z3PZRDLW.js → chunk-PRQXUSQV.js} +2 -2
- package/dist/{chunk-VWT3F4IV.js → chunk-PS3SYNHP.js} +12 -4
- package/dist/chunk-PS3SYNHP.js.map +1 -0
- package/dist/{chunk-I4COC5XW.js → chunk-PYWNNF2I.js} +47 -9
- package/dist/chunk-PYWNNF2I.js.map +1 -0
- package/dist/{chunk-IMWFHBG2.js → chunk-QWRC7GIO.js} +2 -2
- package/dist/{chunk-U3GQ33JC.js → chunk-SLTKP5WJ.js} +2 -2
- package/dist/{chunk-23RYLGYA.js → chunk-TCX4WLKK.js} +104 -112
- package/dist/chunk-TCX4WLKK.js.map +1 -0
- package/dist/{chunk-6NKAQ74D.js → chunk-UU6MVCJ6.js} +1 -1
- package/dist/chunk-UU6MVCJ6.js.map +1 -0
- package/dist/{chunk-WEPMT6SC.js → chunk-V25ZAOSB.js} +5 -5
- package/dist/{chunk-UMTG2BN2.js → chunk-V4UDXYGG.js} +2 -2
- package/dist/{chunk-TUMH6EDV.js → chunk-WSFNYPAT.js} +26 -26
- package/dist/{chunk-ZT6R3WR3.js → chunk-WTI35CVJ.js} +4 -4
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-OZKZ2TRP.js → chunk-XBIACVCO.js} +9 -2
- package/dist/chunk-XBIACVCO.js.map +1 -0
- package/dist/{chunk-ALUZN7BE.js → chunk-XMN6MMTU.js} +2 -2
- package/dist/{chunk-A4BTPHIN.js → chunk-Y7NWBBHV.js} +6 -6
- package/dist/{chunk-WPCCNSWO.js → chunk-YM3LR4LS.js} +7 -7
- package/dist/{chunk-3IJEQWQX.js → chunk-YOVKPOMD.js} +4 -4
- package/dist/{chunk-M75TBFKQ.js → chunk-Z2OXSMZK.js} +2 -2
- package/dist/{cli-BG4ybtJr.d.ts → cli-DDo7Qgs-.d.ts} +2 -2
- package/dist/cli.d.ts +4 -3
- package/dist/cli.js +34 -34
- package/dist/compounding/engine.js +3 -3
- package/dist/connectors/codex-materialize-runner.js +3 -3
- package/dist/connectors/index.js +3 -3
- package/dist/entity-retrieval.js +3 -3
- package/dist/event-order-recall.js +1 -1
- package/dist/explicit-capture.d.ts +2 -1
- package/dist/explicit-cue-recall.d.ts +7 -0
- package/dist/explicit-cue-recall.js +2 -1
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction.js +3 -3
- package/dist/fallback-llm.js +2 -2
- package/dist/focused-list-recall.d.ts +6 -0
- package/dist/focused-list-recall.js +2 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +87 -86
- package/dist/index.js.map +1 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.js +5 -5
- package/dist/lcm-fallback-read.d.ts +71 -0
- package/dist/lcm-fallback-read.js +10 -0
- package/dist/lcm-fallback-read.js.map +1 -0
- package/dist/maintenance/memory-governance.js +3 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
- package/dist/maintenance/rebuild-memory-projection.js +4 -4
- package/dist/mcp-memory-inspector-app.d.ts +3 -2
- package/dist/namespaces/migrate.js +11 -11
- package/dist/namespaces/search.d.ts +18 -1
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.js +3 -3
- package/dist/operator-toolkit.js +13 -13
- package/dist/{orchestrator-CX-oqwJq.d.ts → orchestrator-8fTZsa0y.d.ts} +2 -0
- package/dist/orchestrator.d.ts +2 -1
- package/dist/orchestrator.js +33 -32
- package/dist/qmd.d.ts +2 -1
- package/dist/qmd.js +2 -2
- package/dist/recall-planner-llm.js +2 -2
- package/dist/response-guidance-recall.d.ts +6 -0
- package/dist/response-guidance-recall.js +2 -1
- package/dist/search/factory.js +6 -6
- package/dist/search/index.js +8 -8
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +6 -0
- package/dist/search/port.js +1 -1
- package/dist/semantic-consolidation.js +4 -4
- package/dist/semantic-rule-promotion.js +3 -3
- package/dist/semantic-rule-verifier.js +3 -3
- package/dist/storage.js +2 -2
- package/dist/summarizer.js +3 -3
- package/dist/targeted-fact-recall.d.ts +6 -0
- package/dist/targeted-fact-recall.js +2 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/import-sqlite.js +2 -2
- package/dist/verified-recall.js +3 -3
- package/package.json +1 -1
- package/src/access-service-health.test.ts +402 -0
- package/src/access-service.ts +274 -2
- package/src/event-order-recall.ts +8 -0
- package/src/explicit-cue-recall.ts +70 -29
- package/src/focused-list-recall.ts +23 -1
- package/src/lcm-fallback-read.ts +113 -0
- package/src/namespaces/search.test.ts +258 -3
- package/src/namespaces/search.ts +184 -30
- package/src/orchestrator.ts +179 -122
- package/src/qmd.test.ts +102 -0
- package/src/qmd.ts +54 -7
- package/src/response-guidance-recall.ts +21 -1
- package/src/search/port.ts +6 -0
- package/src/targeted-fact-recall.ts +24 -3
- package/dist/chunk-23RYLGYA.js.map +0 -1
- package/dist/chunk-6NKAQ74D.js.map +0 -1
- package/dist/chunk-DB5A3NHS.js.map +0 -1
- package/dist/chunk-I4COC5XW.js.map +0 -1
- package/dist/chunk-NMIOW7XG.js.map +0 -1
- package/dist/chunk-OAZ5MFUB.js.map +0 -1
- package/dist/chunk-OZKZ2TRP.js.map +0 -1
- package/dist/chunk-QT4THOLT.js.map +0 -1
- package/dist/chunk-VWT3F4IV.js.map +0 -1
- package/dist/chunk-YAFSTKTH.js.map +0 -1
- /package/dist/{auto-sync-54QQHOG5.js.map → auto-sync-5CJBJMPZ.js.map} +0 -0
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-QKE4LHNR.js.map → chunk-4HYSMH7D.js.map} +0 -0
- /package/dist/{chunk-DDRNDPX4.js.map → chunk-4SKKVWLQ.js.map} +0 -0
- /package/dist/{chunk-FOVPSMGI.js.map → chunk-7WEB3FLJ.js.map} +0 -0
- /package/dist/{chunk-APJQ6UEA.js.map → chunk-AGNBY3VG.js.map} +0 -0
- /package/dist/{chunk-4BISW7RX.js.map → chunk-AJE7FJVE.js.map} +0 -0
- /package/dist/{chunk-ZXWAQFDE.js.map → chunk-CFOCZPIQ.js.map} +0 -0
- /package/dist/{chunk-NT5TINK5.js.map → chunk-DHGSZ3UD.js.map} +0 -0
- /package/dist/{chunk-OTC2KOZ2.js.map → chunk-EHQLDFSH.js.map} +0 -0
- /package/dist/{chunk-RRRCNIPK.js.map → chunk-GI45G4BK.js.map} +0 -0
- /package/dist/{chunk-AMACWKM4.js.map → chunk-IJHLC5CH.js.map} +0 -0
- /package/dist/{chunk-OR7R6M5Z.js.map → chunk-IVYSVAC6.js.map} +0 -0
- /package/dist/{chunk-76QTEJ2Q.js.map → chunk-JBHXMCYN.js.map} +0 -0
- /package/dist/{chunk-UMKPSD35.js.map → chunk-JF7SFXTG.js.map} +0 -0
- /package/dist/{chunk-TQUWNX7C.js.map → chunk-JX2RINDR.js.map} +0 -0
- /package/dist/{chunk-MCYT2RNT.js.map → chunk-KJDKZVF3.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-PQFUUXWK.js.map → chunk-KWM33SPU.js.map} +0 -0
- /package/dist/{chunk-A3BS64GV.js.map → chunk-LCC5EZTT.js.map} +0 -0
- /package/dist/{chunk-TVOPSKOK.js.map → chunk-MGGNV3H2.js.map} +0 -0
- /package/dist/{chunk-D6WVJIS3.js.map → chunk-ORGWWNJG.js.map} +0 -0
- /package/dist/{chunk-Z3PZRDLW.js.map → chunk-PRQXUSQV.js.map} +0 -0
- /package/dist/{chunk-IMWFHBG2.js.map → chunk-QWRC7GIO.js.map} +0 -0
- /package/dist/{chunk-U3GQ33JC.js.map → chunk-SLTKP5WJ.js.map} +0 -0
- /package/dist/{chunk-WEPMT6SC.js.map → chunk-V25ZAOSB.js.map} +0 -0
- /package/dist/{chunk-UMTG2BN2.js.map → chunk-V4UDXYGG.js.map} +0 -0
- /package/dist/{chunk-TUMH6EDV.js.map → chunk-WSFNYPAT.js.map} +0 -0
- /package/dist/{chunk-ZT6R3WR3.js.map → chunk-WTI35CVJ.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-ALUZN7BE.js.map → chunk-XMN6MMTU.js.map} +0 -0
- /package/dist/{chunk-A4BTPHIN.js.map → chunk-Y7NWBBHV.js.map} +0 -0
- /package/dist/{chunk-WPCCNSWO.js.map → chunk-YM3LR4LS.js.map} +0 -0
- /package/dist/{chunk-3IJEQWQX.js.map → chunk-YOVKPOMD.js.map} +0 -0
- /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 =
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
87
|
+
//# sourceMappingURL=chunk-AGNBY3VG.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
118
|
+
//# sourceMappingURL=chunk-AJE7FJVE.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runPostConsolidationMaterialize
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
220
|
+
//# sourceMappingURL=chunk-CFOCZPIQ.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
decryptCapsuleFileInMemory,
|
|
9
9
|
isEncryptedCapsuleFile
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
230
|
+
//# sourceMappingURL=chunk-DHGSZ3UD.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
532
|
+
//# sourceMappingURL=chunk-EHQLDFSH.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NamespaceStorageRouter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ORGWWNJG.js";
|
|
4
4
|
import {
|
|
5
5
|
namespaceCollectionName
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
207
|
+
//# sourceMappingURL=chunk-GI45G4BK.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager,
|
|
3
3
|
normalizeEntityName
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
108
|
+
//# sourceMappingURL=chunk-JF7SFXTG.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSearchBackend
|
|
3
|
-
} from "./chunk-
|
|
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 = (
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
248
|
+
//# sourceMappingURL=chunk-JX2RINDR.js.map
|