@remnic/core 10.0.52 → 10.0.53
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-admin-ops-surface.js +24 -24
- package/dist/access-authorization-probe.js +25 -25
- package/dist/access-boundary.js +24 -24
- package/dist/access-cli.js +65 -65
- package/dist/access-extraction-force-flush.js +24 -24
- package/dist/access-http-briefing.js +25 -25
- package/dist/access-http-query.js +26 -26
- package/dist/access-http.js +40 -40
- package/dist/access-identity-continuity-surface.js +24 -24
- package/dist/access-lcm-surface.js +24 -24
- package/dist/access-mcp.js +33 -33
- package/dist/access-namespace-preflight.js +24 -24
- package/dist/access-observe-write-surface.js +24 -24
- package/dist/access-operations-batch.js +25 -25
- package/dist/access-operations.js +32 -32
- package/dist/access-recall-concurrency.js +24 -24
- package/dist/access-recall-response.js +24 -24
- package/dist/access-recall-surface.js +24 -24
- package/dist/access-service.js +24 -24
- package/dist/access-surface-catalog.js +26 -26
- package/dist/active-recall.js +9 -9
- package/dist/briefing.js +10 -10
- package/dist/buffer.js +5 -5
- package/dist/causal-consolidation.js +11 -11
- package/dist/{chunk-3NL4ALUP.js → chunk-24SIB3EW.js} +3 -3
- package/dist/{chunk-Y3T5KQCR.js → chunk-2EYCW2ET.js} +2 -2
- package/dist/{chunk-AHGOOZUC.js → chunk-34UVJNSG.js} +2 -2
- package/dist/{chunk-2EXF6IIB.js → chunk-3632XJMR.js} +2 -2
- package/dist/{chunk-KETS5A62.js → chunk-3H3PNQEF.js} +2 -2
- package/dist/{chunk-SFRBUBUZ.js → chunk-3LNAQLW4.js} +3 -3
- package/dist/{chunk-75BK4XGV.js → chunk-4BUJICMI.js} +10 -10
- package/dist/{chunk-KIWO4327.js → chunk-4W5B5Z6P.js} +2 -2
- package/dist/{chunk-B35EQQ7L.js → chunk-53OFDW3P.js} +3 -3
- package/dist/{chunk-2ONKXEC7.js → chunk-5LBBXI2A.js} +2 -2
- package/dist/{chunk-UCLJTGP3.js → chunk-65B5RFKQ.js} +2 -2
- package/dist/{chunk-KAJYSO3U.js → chunk-6CDNOREO.js} +2 -2
- package/dist/{chunk-POJRFSJM.js → chunk-7XGNGLAN.js} +2 -2
- package/dist/{chunk-A6JDT6QF.js → chunk-AO5ZOD32.js} +2 -2
- package/dist/{chunk-RA7YRL6H.js → chunk-AOSCGNIC.js} +3 -3
- package/dist/{chunk-LWMLBVGB.js → chunk-B43P3DTC.js} +2 -2
- package/dist/{chunk-UM3ZLT2X.js → chunk-CA6X37OB.js} +31 -28
- package/dist/chunk-CA6X37OB.js.map +1 -0
- package/dist/{chunk-VUMWVYMR.js → chunk-CIMD2MUR.js} +3 -3
- package/dist/{chunk-XRFLR3XF.js → chunk-DLZGSZVC.js} +22 -9
- package/dist/chunk-DLZGSZVC.js.map +1 -0
- package/dist/{chunk-5CWH2LKL.js → chunk-DOJBV6WR.js} +29 -14
- package/dist/chunk-DOJBV6WR.js.map +1 -0
- package/dist/{chunk-44EUCSG4.js → chunk-FFQNNFHX.js} +2 -2
- package/dist/{chunk-HEF4BRMT.js → chunk-FZLZUDJJ.js} +2 -2
- package/dist/{chunk-L3EFYRYK.js → chunk-GGFQAGOT.js} +7 -7
- package/dist/{chunk-ZLCBLDJO.js → chunk-GIRWNTMV.js} +2 -2
- package/dist/{chunk-EC2KVA27.js → chunk-H4DWSOBQ.js} +169 -105
- package/dist/chunk-H4DWSOBQ.js.map +1 -0
- package/dist/{chunk-SHNM7RIT.js → chunk-HJ4X4BGS.js} +2 -2
- package/dist/{chunk-MUNYUSBU.js → chunk-HJQ4NKKO.js} +2 -2
- package/dist/{chunk-V6Z4NAJZ.js → chunk-HM3ZTDAX.js} +2 -2
- package/dist/{chunk-EZS6QJNC.js → chunk-IFOCK3OJ.js} +2 -2
- package/dist/{chunk-LXXIV7Y2.js → chunk-JEX2JL3U.js} +7 -2
- package/dist/{chunk-LXXIV7Y2.js.map → chunk-JEX2JL3U.js.map} +1 -1
- package/dist/{chunk-DF6ZF2BN.js → chunk-LIVNX7WK.js} +2 -2
- package/dist/{chunk-WY66J4PI.js → chunk-LRVFS4KA.js} +2 -2
- package/dist/{chunk-LMB47UM6.js → chunk-LTDK6HBV.js} +2 -2
- package/dist/{chunk-HCIRR3BA.js → chunk-M4U25HLR.js} +2 -2
- package/dist/{chunk-YK7ZJPQM.js → chunk-MGN2RQRG.js} +2 -2
- package/dist/{chunk-G26YNEOC.js → chunk-NWA6IXR3.js} +1 -1
- package/dist/{chunk-G26YNEOC.js.map → chunk-NWA6IXR3.js.map} +1 -1
- package/dist/{chunk-JIJAWTRK.js → chunk-OCXDZJL4.js} +264 -194
- package/dist/chunk-OCXDZJL4.js.map +1 -0
- package/dist/{chunk-IUQXRRJB.js → chunk-OMWQO7H6.js} +2 -2
- package/dist/{chunk-7VO6E5UD.js → chunk-OVZIYLBZ.js} +6 -2
- package/dist/chunk-OVZIYLBZ.js.map +1 -0
- package/dist/{chunk-SPTPBKZX.js → chunk-OWNAWY6D.js} +2 -2
- package/dist/{chunk-XKDQTDXN.js → chunk-PFUXPTBT.js} +36 -15
- package/dist/chunk-PFUXPTBT.js.map +1 -0
- package/dist/{chunk-DQOGZZJA.js → chunk-QAHP5SBG.js} +3 -3
- package/dist/{chunk-GBGU5OZP.js → chunk-QF5EJ5VP.js} +13 -13
- package/dist/{chunk-FT75AQ74.js → chunk-QS5DUSBM.js} +2 -2
- package/dist/{chunk-72CBJ5VP.js → chunk-R3WZ74B2.js} +3 -3
- package/dist/{chunk-PDTNQLPC.js → chunk-RG3I2663.js} +2 -2
- package/dist/{chunk-CK6GCGMX.js → chunk-RTJJPW3C.js} +2 -2
- package/dist/{chunk-RJDYDF5K.js → chunk-TRAOZ2WP.js} +2 -2
- package/dist/{chunk-6ZAU7LAR.js → chunk-TTTPTQ6S.js} +2 -2
- package/dist/{chunk-JS44PBCM.js → chunk-U2A56LLF.js} +6 -6
- package/dist/{chunk-MC7PXJDP.js → chunk-UBOWDOL5.js} +5 -5
- package/dist/{chunk-4FM35YIA.js → chunk-UQYBPPVC.js} +2 -2
- package/dist/{chunk-OCRLJJOV.js → chunk-V4VCBFAL.js} +3 -3
- package/dist/{chunk-FNNGWN3O.js → chunk-VGE4PUY6.js} +2 -2
- package/dist/{chunk-5DVOBBTV.js → chunk-VV73XT3A.js} +2 -2
- package/dist/{chunk-GE3ZX6YK.js → chunk-W7NKMRAF.js} +2 -2
- package/dist/{chunk-AJJPXUE6.js → chunk-WBN66HPI.js} +2 -2
- package/dist/{chunk-XWJUFER3.js → chunk-WGFEGBFB.js} +2 -2
- package/dist/{chunk-43TUWQNR.js → chunk-XDKEHZUC.js} +2 -2
- package/dist/{chunk-ROAKLYOL.js → chunk-XHEKS4UN.js} +2 -2
- package/dist/{chunk-ZKK3VMWU.js → chunk-XVTB6BZS.js} +2 -2
- package/dist/{chunk-AZLD4CKG.js → chunk-Y56D5FSD.js} +17 -17
- package/dist/{chunk-MPWOAIIH.js → chunk-YDT3OEYF.js} +2 -2
- package/dist/{chunk-IN6U2BS5.js → chunk-YJHOVA42.js} +2 -2
- package/dist/{chunk-TC55M5PO.js → chunk-YLN4ZQV4.js} +2 -2
- package/dist/cli.js +50 -50
- package/dist/coding/export-okf-codegraph.js +9 -9
- package/dist/compounding/engine.js +11 -11
- package/dist/config.js +9 -9
- package/dist/connectors/codex-materialize-runner.js +10 -10
- package/dist/connectors/index.js +10 -10
- package/dist/convergence-refresh.js +12 -12
- package/dist/corpus-watermark.js +12 -12
- package/dist/entity-retrieval.js +10 -10
- package/dist/external-wiki-access.js +25 -25
- package/dist/extraction.js +14 -14
- package/dist/harmonic-retrieval.js +10 -10
- package/dist/index.js +65 -65
- package/dist/location/index.js +12 -12
- package/dist/maintenance/memory-governance.js +10 -10
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
- package/dist/maintenance/rebuild-memory-projection-runner.js +12 -12
- package/dist/maintenance/rebuild-memory-projection.js +11 -11
- package/dist/memory-browse-operations.js +25 -25
- package/dist/memory-browse.js +5 -5
- package/dist/namespaces/migrate.js +11 -11
- package/dist/namespaces/search.d.ts.map +1 -1
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.js +10 -10
- package/dist/operator-doctor-corpus.js +13 -13
- package/dist/operator-toolkit.js +18 -18
- package/dist/orchestration/lifecycle-pending-fallback-drain.d.ts +18 -0
- package/dist/orchestration/lifecycle-pending-fallback-drain.d.ts.map +1 -0
- package/dist/orchestration/maintenance.d.ts +11 -13
- package/dist/orchestration/maintenance.d.ts.map +1 -1
- package/dist/orchestration/maintenance.js +20 -20
- package/dist/orchestration/qmd-maintenance-completion.d.ts +20 -0
- package/dist/orchestration/qmd-maintenance-completion.d.ts.map +1 -0
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +65 -65
- package/dist/qmd.js +2 -2
- package/dist/recall-composition-decision.js +2 -2
- package/dist/recall-navigation-operations.js +25 -25
- package/dist/recall-navigation.js +24 -24
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +5 -5
- package/dist/resume-bundles.js +9 -9
- package/dist/search/factory.js +7 -7
- package/dist/search/index.js +7 -7
- package/dist/search/lancedb-backend.d.ts +3 -0
- package/dist/search/lancedb-backend.d.ts.map +1 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +3 -0
- package/dist/search/meilisearch-backend.d.ts.map +1 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.d.ts +3 -0
- package/dist/search/orama-backend.d.ts.map +1 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +7 -0
- package/dist/search/port.d.ts.map +1 -1
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +2 -0
- package/dist/search/remote-backend.d.ts.map +1 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/semantic-consolidation.js +11 -11
- package/dist/semantic-rule-promotion.js +10 -10
- package/dist/semantic-rule-verifier.js +10 -10
- package/dist/source-agent-qualifier.js +13 -13
- package/dist/standup/build.js +10 -10
- package/dist/storage/entity-canonical-id-migration-adapter.d.ts +7 -1
- package/dist/storage/entity-canonical-id-migration-adapter.d.ts.map +1 -1
- package/dist/storage/entity-migration-maintenance-pending.d.ts +31 -0
- package/dist/storage/entity-migration-maintenance-pending.d.ts.map +1 -0
- package/dist/storage.d.ts +2 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +9 -9
- package/dist/support-passport/index.js +27 -27
- package/dist/transfer/export-okf.js +10 -10
- package/dist/verified-recall.js +10 -10
- package/dist/who-knows-cli.js +11 -11
- package/dist/who-knows.js +10 -10
- package/package.json +2 -2
- package/src/namespaces/search.test.ts +121 -0
- package/src/namespaces/search.ts +8 -0
- package/src/orchestration/lifecycle-pending-fallback-drain.ts +97 -0
- package/src/orchestration/maintenance.test.ts +443 -1
- package/src/orchestration/maintenance.ts +73 -95
- package/src/orchestration/qmd-maintenance-completion.ts +32 -0
- package/src/orchestrator.ts +8 -1
- package/src/search/lancedb-backend.ts +29 -12
- package/src/search/meilisearch-backend.test.ts +148 -0
- package/src/search/meilisearch-backend.ts +41 -14
- package/src/search/orama-backend.test.ts +75 -1
- package/src/search/orama-backend.ts +22 -7
- package/src/search/port.ts +7 -0
- package/src/search/remote-backend.ts +4 -0
- package/src/storage/entity-canonical-id-migration-adapter.ts +44 -9
- package/src/storage/entity-migration-maintenance-pending-helpers.test.ts +87 -0
- package/src/storage/entity-migration-maintenance-pending.test.ts +242 -0
- package/src/storage/entity-migration-maintenance-pending.ts +89 -0
- package/src/storage.ts +2 -2
- package/dist/chunk-5CWH2LKL.js.map +0 -1
- package/dist/chunk-7VO6E5UD.js.map +0 -1
- package/dist/chunk-EC2KVA27.js.map +0 -1
- package/dist/chunk-JIJAWTRK.js.map +0 -1
- package/dist/chunk-UM3ZLT2X.js.map +0 -1
- package/dist/chunk-XKDQTDXN.js.map +0 -1
- package/dist/chunk-XRFLR3XF.js.map +0 -1
- /package/dist/{chunk-3NL4ALUP.js.map → chunk-24SIB3EW.js.map} +0 -0
- /package/dist/{chunk-Y3T5KQCR.js.map → chunk-2EYCW2ET.js.map} +0 -0
- /package/dist/{chunk-AHGOOZUC.js.map → chunk-34UVJNSG.js.map} +0 -0
- /package/dist/{chunk-2EXF6IIB.js.map → chunk-3632XJMR.js.map} +0 -0
- /package/dist/{chunk-KETS5A62.js.map → chunk-3H3PNQEF.js.map} +0 -0
- /package/dist/{chunk-SFRBUBUZ.js.map → chunk-3LNAQLW4.js.map} +0 -0
- /package/dist/{chunk-75BK4XGV.js.map → chunk-4BUJICMI.js.map} +0 -0
- /package/dist/{chunk-KIWO4327.js.map → chunk-4W5B5Z6P.js.map} +0 -0
- /package/dist/{chunk-B35EQQ7L.js.map → chunk-53OFDW3P.js.map} +0 -0
- /package/dist/{chunk-2ONKXEC7.js.map → chunk-5LBBXI2A.js.map} +0 -0
- /package/dist/{chunk-UCLJTGP3.js.map → chunk-65B5RFKQ.js.map} +0 -0
- /package/dist/{chunk-KAJYSO3U.js.map → chunk-6CDNOREO.js.map} +0 -0
- /package/dist/{chunk-POJRFSJM.js.map → chunk-7XGNGLAN.js.map} +0 -0
- /package/dist/{chunk-A6JDT6QF.js.map → chunk-AO5ZOD32.js.map} +0 -0
- /package/dist/{chunk-RA7YRL6H.js.map → chunk-AOSCGNIC.js.map} +0 -0
- /package/dist/{chunk-LWMLBVGB.js.map → chunk-B43P3DTC.js.map} +0 -0
- /package/dist/{chunk-VUMWVYMR.js.map → chunk-CIMD2MUR.js.map} +0 -0
- /package/dist/{chunk-44EUCSG4.js.map → chunk-FFQNNFHX.js.map} +0 -0
- /package/dist/{chunk-HEF4BRMT.js.map → chunk-FZLZUDJJ.js.map} +0 -0
- /package/dist/{chunk-L3EFYRYK.js.map → chunk-GGFQAGOT.js.map} +0 -0
- /package/dist/{chunk-ZLCBLDJO.js.map → chunk-GIRWNTMV.js.map} +0 -0
- /package/dist/{chunk-SHNM7RIT.js.map → chunk-HJ4X4BGS.js.map} +0 -0
- /package/dist/{chunk-MUNYUSBU.js.map → chunk-HJQ4NKKO.js.map} +0 -0
- /package/dist/{chunk-V6Z4NAJZ.js.map → chunk-HM3ZTDAX.js.map} +0 -0
- /package/dist/{chunk-EZS6QJNC.js.map → chunk-IFOCK3OJ.js.map} +0 -0
- /package/dist/{chunk-DF6ZF2BN.js.map → chunk-LIVNX7WK.js.map} +0 -0
- /package/dist/{chunk-WY66J4PI.js.map → chunk-LRVFS4KA.js.map} +0 -0
- /package/dist/{chunk-LMB47UM6.js.map → chunk-LTDK6HBV.js.map} +0 -0
- /package/dist/{chunk-HCIRR3BA.js.map → chunk-M4U25HLR.js.map} +0 -0
- /package/dist/{chunk-YK7ZJPQM.js.map → chunk-MGN2RQRG.js.map} +0 -0
- /package/dist/{chunk-IUQXRRJB.js.map → chunk-OMWQO7H6.js.map} +0 -0
- /package/dist/{chunk-SPTPBKZX.js.map → chunk-OWNAWY6D.js.map} +0 -0
- /package/dist/{chunk-DQOGZZJA.js.map → chunk-QAHP5SBG.js.map} +0 -0
- /package/dist/{chunk-GBGU5OZP.js.map → chunk-QF5EJ5VP.js.map} +0 -0
- /package/dist/{chunk-FT75AQ74.js.map → chunk-QS5DUSBM.js.map} +0 -0
- /package/dist/{chunk-72CBJ5VP.js.map → chunk-R3WZ74B2.js.map} +0 -0
- /package/dist/{chunk-PDTNQLPC.js.map → chunk-RG3I2663.js.map} +0 -0
- /package/dist/{chunk-CK6GCGMX.js.map → chunk-RTJJPW3C.js.map} +0 -0
- /package/dist/{chunk-RJDYDF5K.js.map → chunk-TRAOZ2WP.js.map} +0 -0
- /package/dist/{chunk-6ZAU7LAR.js.map → chunk-TTTPTQ6S.js.map} +0 -0
- /package/dist/{chunk-JS44PBCM.js.map → chunk-U2A56LLF.js.map} +0 -0
- /package/dist/{chunk-MC7PXJDP.js.map → chunk-UBOWDOL5.js.map} +0 -0
- /package/dist/{chunk-4FM35YIA.js.map → chunk-UQYBPPVC.js.map} +0 -0
- /package/dist/{chunk-OCRLJJOV.js.map → chunk-V4VCBFAL.js.map} +0 -0
- /package/dist/{chunk-FNNGWN3O.js.map → chunk-VGE4PUY6.js.map} +0 -0
- /package/dist/{chunk-5DVOBBTV.js.map → chunk-VV73XT3A.js.map} +0 -0
- /package/dist/{chunk-GE3ZX6YK.js.map → chunk-W7NKMRAF.js.map} +0 -0
- /package/dist/{chunk-AJJPXUE6.js.map → chunk-WBN66HPI.js.map} +0 -0
- /package/dist/{chunk-XWJUFER3.js.map → chunk-WGFEGBFB.js.map} +0 -0
- /package/dist/{chunk-43TUWQNR.js.map → chunk-XDKEHZUC.js.map} +0 -0
- /package/dist/{chunk-ROAKLYOL.js.map → chunk-XHEKS4UN.js.map} +0 -0
- /package/dist/{chunk-ZKK3VMWU.js.map → chunk-XVTB6BZS.js.map} +0 -0
- /package/dist/{chunk-AZLD4CKG.js.map → chunk-Y56D5FSD.js.map} +0 -0
- /package/dist/{chunk-MPWOAIIH.js.map → chunk-YDT3OEYF.js.map} +0 -0
- /package/dist/{chunk-IN6U2BS5.js.map → chunk-YJHOVA42.js.map} +0 -0
- /package/dist/{chunk-TC55M5PO.js.map → chunk-YLN4ZQV4.js.map} +0 -0
|
@@ -21,13 +21,13 @@ import {
|
|
|
21
21
|
defineOperation,
|
|
22
22
|
parseNamespacePreflightWriteOp,
|
|
23
23
|
resolveAuthorizedNamespaceWritablePreflight
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-QF5EJ5VP.js";
|
|
25
25
|
import {
|
|
26
26
|
parseSharedWriteOutputControls
|
|
27
27
|
} from "./chunk-IFBSZGW3.js";
|
|
28
28
|
import {
|
|
29
29
|
validateBriefingFormat
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-AO5ZOD32.js";
|
|
31
31
|
import {
|
|
32
32
|
parseDeepRecallMaxSteps
|
|
33
33
|
} from "./chunk-AJG2TAMR.js";
|
|
@@ -618,4 +618,4 @@ defineOperation({ name: "graph_events", description: "SSE graph events.", schema
|
|
|
618
618
|
defineOperation({ name: "chat_message", description: "Chat message.", schema: strictSchema({ message: S.str, chatSessionId: S.str }), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
|
|
619
619
|
defineOperation({ name: "chat_events", description: "SSE chat events.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { stream: "sse" } }) });
|
|
620
620
|
defineOperation({ name: "adapters_status", description: "Adapter registry metadata (issue #1850 round 5). Marker op: the HTTP transport builds the response from its own adapterRegistry, but the op still must be registered so it appears in listRegisteredOperations and enforceTokenOp can gate it for scoped tokens.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
|
|
621
|
-
//# sourceMappingURL=chunk-
|
|
621
|
+
//# sourceMappingURL=chunk-CIMD2MUR.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
reportSearchDegradation,
|
|
10
10
|
resolveEnsureCollectionArgs
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-NWA6IXR3.js";
|
|
12
12
|
import {
|
|
13
13
|
expandUnsegmentableRecallNGrams,
|
|
14
14
|
isUnsegmentableRecallChar
|
|
@@ -212,13 +212,25 @@ var OramaBackend = class {
|
|
|
212
212
|
await this.updateCollectionFromDir(collection, this.memoryDir, execution);
|
|
213
213
|
}
|
|
214
214
|
async updateCollectionFromDir(collection, memoryDir, execution) {
|
|
215
|
-
|
|
215
|
+
await this.refreshCollection(collection, memoryDir, execution);
|
|
216
|
+
}
|
|
217
|
+
async updateCompleted(execution) {
|
|
218
|
+
try {
|
|
219
|
+
return await this.refreshCollection(this.collection, this.memoryDir, execution);
|
|
220
|
+
} catch (err) {
|
|
221
|
+
log.debug(`OramaBackend update did not complete: ${err}`);
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/** Brings the collection up to date; true only when it ran to completion (false: aborted, unavailable, skipped or failed). */
|
|
226
|
+
async refreshCollection(collection, memoryDir, execution) {
|
|
227
|
+
if (isSearchAborted(execution)) return false;
|
|
216
228
|
const db = await this.ensureDbForCollection(collection);
|
|
217
|
-
if (isSearchAborted(execution)) return;
|
|
218
|
-
if (!db) return;
|
|
229
|
+
if (isSearchAborted(execution)) return false;
|
|
230
|
+
if (!db) return false;
|
|
219
231
|
const { search: oramaSearch, insert, remove, count, getByID } = this.oramaModule;
|
|
220
232
|
const docs = await scanMemoryDir(memoryDir);
|
|
221
|
-
if (isSearchAborted(execution)) return;
|
|
233
|
+
if (isSearchAborted(execution)) return false;
|
|
222
234
|
const docMap = new Map(docs.map((d) => [d.docid, d]));
|
|
223
235
|
const { update: oramaUpdate } = this.oramaModule;
|
|
224
236
|
const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();
|
|
@@ -231,7 +243,7 @@ var OramaBackend = class {
|
|
|
231
243
|
limit: existingCount + 100
|
|
232
244
|
});
|
|
233
245
|
for (const hit of allHits.hits) {
|
|
234
|
-
if (isSearchAborted(execution)) return;
|
|
246
|
+
if (isSearchAborted(execution)) return false;
|
|
235
247
|
const storedDocument = typeof getByID === "function" ? await getByID(db, hit.id) : hit.document;
|
|
236
248
|
const document = storedDocument ?? hit.document ?? {};
|
|
237
249
|
if (!docMap.has(document.id)) {
|
|
@@ -246,7 +258,7 @@ var OramaBackend = class {
|
|
|
246
258
|
}
|
|
247
259
|
}
|
|
248
260
|
for (const doc of docs) {
|
|
249
|
-
if (isSearchAborted(execution)) return;
|
|
261
|
+
if (isSearchAborted(execution)) return false;
|
|
250
262
|
const existing = existingDocs.get(doc.docid);
|
|
251
263
|
if (existing) {
|
|
252
264
|
const payload = {
|
|
@@ -295,13 +307,14 @@ var OramaBackend = class {
|
|
|
295
307
|
}
|
|
296
308
|
}
|
|
297
309
|
}
|
|
298
|
-
if (isSearchAborted(execution)) return;
|
|
310
|
+
if (isSearchAborted(execution)) return false;
|
|
299
311
|
await this.persistDbForCollection(db, collection);
|
|
300
312
|
this.rememberVectorProviderCompatibility(
|
|
301
313
|
db,
|
|
302
314
|
embeddingProviderIdentity,
|
|
303
315
|
allRowsCompatible
|
|
304
316
|
);
|
|
317
|
+
return true;
|
|
305
318
|
}
|
|
306
319
|
async embed() {
|
|
307
320
|
await this.embedCollection(this.collection);
|
|
@@ -776,4 +789,4 @@ export {
|
|
|
776
789
|
resolveOramaCollectionDbFilePath,
|
|
777
790
|
OramaBackend
|
|
778
791
|
};
|
|
779
|
-
//# sourceMappingURL=chunk-
|
|
792
|
+
//# sourceMappingURL=chunk-DLZGSZVC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/search/orama-backend.ts","../src/search/orama-cjk-tokenizer.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, readdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { log } from \"../logger.js\";\nimport {\n reportSearchDegradation,\n resolveEnsureCollectionArgs,\n type SearchBackend,\n type SearchExecutionOptions,\n type SearchQueryOptions,\n type SearchResult,\n} from \"./port.js\";\n import type { EmbedHelper, EmbedProviderIdentity, EmbedWithProviderResult } from \"./embed-helper.js\";\n import { scanMemoryDir } from \"./document-scanner.js\";\n import { isSearchAborted, throwIfSearchAborted } from \"./abort.js\";\nimport {\n containsNonLegacyTokenizerChars,\n createCjkCapableTokenizer,\n ORAMA_CJK_TOKENIZER_LANGUAGE,\n} from \"./orama-cjk-tokenizer.js\";\n \n export interface OramaBackendOptions {\n dbPath: string;\n collection: string;\n embedHelper: EmbedHelper;\n memoryDir: string;\n embeddingDimension: number;\n /**\n * Segment space-free scripts (CJK/Thai) in the lexical index. Default\n * `true`; `false` restores the stock English-only tokenizer (issue #2187).\n */\n cjkSegmentationEnabled?: boolean;\n }\n\n\nconst ORAMA_COLLECTION_FILENAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction pathIsInside(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nexport function resolveOramaCollectionDbFilePath(dbPath: string, collection: string): string {\n if (!ORAMA_COLLECTION_FILENAME_PATTERN.test(collection)) {\n throw new Error(\n `Invalid Orama collection name ${JSON.stringify(collection)}. ` +\n \"Collection names must match [A-Za-z0-9][A-Za-z0-9._-]*.\",\n );\n }\n const resolvedDbPath = path.resolve(dbPath);\n const filePath = path.resolve(resolvedDbPath, `${collection}.msp`);\n if (!pathIsInside(resolvedDbPath, filePath)) {\n throw new Error(\n `Invalid Orama collection path for ${JSON.stringify(collection)}: resolved outside dbPath.`,\n );\n }\n return filePath;\n}\n\n/**\n * Orama search backend — embedded hybrid FTS+vector, pure JS.\n *\n * Uses @orama/orama for full-text search with optional vector support.\n * Persists data to JSON files via @orama/plugin-data-persistence.\n */\nexport class OramaBackend implements SearchBackend {\n private readonly dbPath: string;\n private readonly collection: string;\n private readonly embedHelper: EmbedHelper;\n private readonly memoryDir: string;\n private readonly embeddingDimension: number;\n private readonly cjkSegmentationEnabled: boolean;\n private available = false;\n private db: any = null;\n private oramaModule: any = null;\n private persistModule: any = null;\n private readonly vectorProviderCompatibility = new WeakMap<\n object,\n { providerIdentity: EmbedProviderIdentity; compatible: boolean }\n >();\n\n constructor(opts: OramaBackendOptions) {\n this.dbPath = opts.dbPath;\n this.collection = opts.collection;\n this.embedHelper = opts.embedHelper;\n this.memoryDir = opts.memoryDir;\n this.embeddingDimension = opts.embeddingDimension;\n this.cjkSegmentationEnabled = opts.cjkSegmentationEnabled !== false;\n }\n\n async probe(): Promise<boolean> {\n try {\n await this.ensureModules();\n await this.ensureDb();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`OramaBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=orama available=${this.available} dbPath=${this.dbPath}`;\n }\n\n async search(\n query: string,\n _collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return this.hybridSearch(query, _collection, maxResults, execution);\n }\n\n async searchGlobal(query: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const limit = maxResults ?? 10;\n if (!this.available) return [];\n try {\n throwIfSearchAborted(execution, \"OramaBackend global search aborted\");\n const files = await this.listDbFiles();\n const allResults: SearchResult[] = [];\n for (const file of files) {\n throwIfSearchAborted(execution, \"OramaBackend global search aborted\");\n const db = await this.loadDbFromFile(file);\n if (!db) continue;\n const results = await this.searchDb(db, query, \"hybrid\", limit, execution);\n allResults.push(...results);\n }\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`OramaBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n /**\n * Full-text (FTS) search only. With the stock tokenizer this cannot match\n * space-free CJK/Thai text lexically — hybrid or vector search provides\n * the fallback for those scripts (issue #2187).\n */\n async bm25Search(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!db) return [];\n return this.searchDb(db, query, \"fulltext\", maxResults ?? 10, execution);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!db) return [];\n return this.searchDb(db, query, \"vector\", maxResults ?? 10, execution);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!db) return [];\n return this.searchDb(db, query, \"hybrid\", maxResults ?? 10, execution);\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollection(this.collection, execution);\n }\n\n async updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollectionFromDir(collection, this.memoryDir, execution);\n }\n\n async updateCollectionFromDir(collection: string, memoryDir: string, execution?: SearchExecutionOptions): Promise<void> {\n await this.refreshCollection(collection, memoryDir, execution);\n }\n\n async updateCompleted(execution?: SearchExecutionOptions): Promise<boolean> {\n try {\n return await this.refreshCollection(this.collection, this.memoryDir, execution);\n } catch (err) {\n log.debug(`OramaBackend update did not complete: ${err}`);\n return false;\n }\n }\n\n /** Brings the collection up to date; true only when it ran to completion (false: aborted, unavailable, skipped or failed). */\n private async refreshCollection(collection: string, memoryDir: string, execution?: SearchExecutionOptions): Promise<boolean> {\n if (isSearchAborted(execution)) return false;\n const db = await this.ensureDbForCollection(collection);\n if (isSearchAborted(execution)) return false;\n if (!db) return false;\n const { search: oramaSearch, insert, remove, count, getByID } = this.oramaModule;\n\n const docs = await scanMemoryDir(memoryDir);\n if (isSearchAborted(execution)) return false;\n const docMap = new Map(docs.map((d) => [d.docid, d]));\n const { update: oramaUpdate } = this.oramaModule;\n\n const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();\n let allRowsCompatible = !!embeddingProviderIdentity && docs.length > 0;\n // Get existing docs to diff — map user doc ID → { internalId, vector }\n const existingDocs = new Map<string, {\n internalId: string;\n vector?: number[];\n vectorProvider?: string;\n }>();\n const existingCount = await count(db);\n if (existingCount > 0) {\n const allHits = await oramaSearch(db, {\n term: \"\",\n limit: existingCount + 100,\n });\n for (const hit of allHits.hits) {\n if (isSearchAborted(execution)) return false;\n const storedDocument =\n typeof getByID === \"function\"\n ? await getByID(db, hit.id)\n : hit.document;\n const document = storedDocument ?? hit.document ?? {};\n if (!docMap.has(document.id)) {\n await remove(db, hit.id);\n } else {\n existingDocs.set(document.id, {\n internalId: hit.id,\n vector: this.normalizeStoredVector(document.vector) ?? undefined,\n vectorProvider:\n typeof document.vectorProvider === \"string\"\n ? document.vectorProvider\n : undefined,\n });\n }\n }\n }\n\n // Insert new docs, update existing ones (preserving vectors since update is remove+insert)\n for (const doc of docs) {\n if (isSearchAborted(execution)) return false;\n const existing = existingDocs.get(doc.docid);\n if (existing) {\n const payload: Record<string, unknown> = {\n id: doc.docid,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n };\n const preservesCompatibleProvider =\n !!embeddingProviderIdentity &&\n existing.vectorProvider === embeddingProviderIdentity;\n if (preservesCompatibleProvider) {\n if (this.isCompatibleStoredVector(existing.vector)) {\n payload.vector = existing.vector;\n payload.vectorProvider = existing.vectorProvider ?? \"\";\n } else {\n payload.vector = this.zeroVector();\n payload.vectorProvider = \"\";\n allRowsCompatible = false;\n }\n } else if (!embeddingProviderIdentity && this.isCompatibleStoredVector(existing.vector)) {\n payload.vector = existing.vector;\n payload.vectorProvider = existing.vectorProvider ?? \"\";\n allRowsCompatible = false;\n } else {\n payload.vector = this.zeroVector();\n payload.vectorProvider = \"\";\n allRowsCompatible = false;\n }\n try {\n await oramaUpdate(db, existing.internalId, payload);\n } catch {\n allRowsCompatible = false;\n // Update failed — skip and continue with remaining docs\n }\n } else {\n allRowsCompatible = false;\n try {\n await insert(db, {\n id: doc.docid,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n vector: this.zeroVector(),\n vectorProvider: \"\",\n });\n } catch {\n allRowsCompatible = false;\n // Duplicate id edge case — skip\n }\n }\n }\n\n if (isSearchAborted(execution)) return false;\n await this.persistDbForCollection(db, collection);\n this.rememberVectorProviderCompatibility(\n db,\n embeddingProviderIdentity,\n allRowsCompatible,\n );\n return true;\n }\n\n async embed(): Promise<void> {\n await this.embedCollection(this.collection);\n }\n\n async embedCollection(collection: string): Promise<void> {\n if (!this.embedHelper.isAvailable()) return;\n\n const db = await this.ensureDbForCollection(collection);\n if (!db) return;\n const { search: oramaSearch, update: oramaUpdate, count } = this.oramaModule;\n\n const existingCount = await count(db);\n if (existingCount === 0) return;\n\n const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();\n // Find docs without vectors or with vectors from a different provider.\n const allHits = await oramaSearch(db, { term: \"\", limit: existingCount + 100 });\n const needsEmbed = allHits.hits.filter((h: any) => {\n const vector = this.normalizeStoredVector(h.document?.vector);\n return (\n (embeddingProviderIdentity &&\n h.document?.vectorProvider !== embeddingProviderIdentity) ||\n !this.isCompatibleStoredVector(vector)\n );\n });\n\n if (needsEmbed.length === 0) {\n this.rememberVectorProviderCompatibility(db, embeddingProviderIdentity, true);\n return;\n }\n\n let rowsToEmbed = needsEmbed;\n let embedResult = await this.embedHelper.embedBatchWithProvider(\n rowsToEmbed.map((h: any) => h.document.content as string),\n );\n if (!embedResult) return;\n if (\n embeddingProviderIdentity &&\n embedResult.providerIdentity !== embeddingProviderIdentity\n ) {\n const effectiveProviderIdentity = embedResult.providerIdentity;\n const originalIds = new Set(rowsToEmbed.map((h: any) => h.id));\n const effectiveNeedsEmbed = allHits.hits.filter((h: any) => {\n const vector = this.normalizeStoredVector(h.document?.vector);\n return (\n h.document?.vectorProvider !== effectiveProviderIdentity ||\n !this.isCompatibleStoredVector(vector)\n );\n });\n const sameRows =\n effectiveNeedsEmbed.length === rowsToEmbed.length &&\n effectiveNeedsEmbed.every((h: any) => originalIds.has(h.id));\n if (!sameRows) {\n const effectiveTexts = effectiveNeedsEmbed.map((h: any) => h.document.content as string);\n const effectiveEmbedResult = await this.embedHelper.embedBatchWithProvider(effectiveTexts);\n if (effectiveEmbedResult) {\n rowsToEmbed = effectiveNeedsEmbed;\n embedResult = effectiveEmbedResult;\n }\n }\n }\n const { vectors, providerIdentity } = embedResult;\n\n let allEmbedded = true;\n for (let i = 0; i < rowsToEmbed.length; i++) {\n const vec = vectors[i];\n if (!this.isExpectedDimensionVector(vec)) {\n allEmbedded = false;\n continue;\n }\n // Orama update is remove+insert — must include all fields to avoid data loss\n const doc = rowsToEmbed[i].document;\n await oramaUpdate(db, rowsToEmbed[i].id, {\n id: doc.id,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n vector: vec,\n vectorProvider: providerIdentity,\n });\n }\n\n await this.persistDbForCollection(db, collection);\n if (allEmbedded) {\n this.rememberVectorProviderCompatibility(db, providerIdentity, true);\n } else {\n this.rememberVectorProviderCompatibility(db, providerIdentity, false);\n }\n }\n\n async ensureCollection(\n _memoryDir: string,\n collectionOrExecution?: string | SearchExecutionOptions,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const { collection, execution: effectiveExecution } = resolveEnsureCollectionArgs(\n collectionOrExecution,\n execution,\n );\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n try {\n await this.ensureModules();\n await this.ensureDbForCollection(collection ?? this.collection);\n return \"present\";\n } catch {\n return \"missing\";\n }\n }\n\n private async ensureModules(): Promise<void> {\n if (this.oramaModule && this.persistModule) return;\n this.oramaModule = await import(\"@orama/orama\");\n this.persistModule = await import(\"@orama/plugin-data-persistence\");\n }\n\n private async ensureDb(): Promise<any> {\n if (this.db) return this.db;\n await this.ensureModules();\n\n await mkdir(this.dbPath, { recursive: true });\n const filePath = this.dbFilePath(this.collection);\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n // No existing DB — create fresh\n this.db = await this.createDb();\n return this.db;\n }\n\n this.db = await this.applyTokenizerVersion(\n await this.migrateLegacyVectorProviderSchema(\n await this.persistModule.restore(\"json\", raw),\n this.collection,\n ),\n this.collection,\n );\n return this.db;\n }\n\n private async ensureDbForCollection(collection: string): Promise<any> {\n // For the default collection, use the cached instance\n if (collection === this.collection) return this.ensureDb();\n\n await this.ensureModules();\n await mkdir(this.dbPath, { recursive: true });\n const filePath = this.dbFilePath(collection);\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n // No existing DB — create fresh\n return await this.createDb();\n }\n\n return await this.applyTokenizerVersion(\n await this.migrateLegacyVectorProviderSchema(\n await this.persistModule.restore(\"json\", raw),\n collection,\n ),\n collection,\n );\n }\n\n private async createDb(): Promise<any> {\n const { create } = this.oramaModule;\n const schema: Record<string, string> = {\n id: \"string\",\n path: \"string\",\n content: \"string\",\n snippet: \"string\",\n vectorProvider: \"string\",\n vector: `vector[${this.embeddingDimension}]`,\n };\n if (!this.cjkSegmentationEnabled) {\n return await create({ schema });\n }\n return await create({\n schema,\n components: { tokenizer: createCjkCapableTokenizer(this.oramaModule) },\n });\n }\n\n /**\n * Attach the CJK-capable tokenizer to a restored index and rebuild the\n * full-text index when it predates CJK tokenization. Orama persists\n * `tokenizer.language` with the index, so a marker other than\n * `ORAMA_CJK_TOKENIZER_LANGUAGE` identifies an index whose terms were\n * produced by the stock English tokenizer. Corpora whose content the stock\n * tokenizer and this tokenizer treat identically (pure legacy Latin) need\n * no re-indexing — only the version marker is rewritten for them.\n */\n private async applyTokenizerVersion(db: any, collection: string): Promise<any> {\n const persistedLanguage =\n db?.tokenizer?.language && typeof db.tokenizer.language === \"string\"\n ? db.tokenizer.language\n : \"\";\n if (this.cjkSegmentationEnabled) {\n db.tokenizer = createCjkCapableTokenizer(this.oramaModule);\n if (persistedLanguage === ORAMA_CJK_TOKENIZER_LANGUAGE) return db;\n } else {\n // Segmentation disabled: a database persisted under the CJK tokenizer\n // keeps its CJK terms unless it is re-indexed under the stock one, so\n // downgrade it instead of returning it unchanged (issue #2187 round 2).\n if (persistedLanguage !== ORAMA_CJK_TOKENIZER_LANGUAGE) return db;\n db.tokenizer = this.oramaModule.components.tokenizer.createTokenizer({ language: \"english\" });\n }\n\n\n try {\n const { search: oramaSearch, count, update: oramaUpdate } = this.oramaModule;\n const existingCount = await count(db);\n if (existingCount === 0) {\n await this.persistDbForCollection(db, collection);\n return db;\n }\n const allHits = await oramaSearch(db, { term: \"\", limit: existingCount + 100 });\n const hits = allHits.hits ?? [];\n const hasNonLegacyContent = hits.some((hit: any) => {\n const doc = this.getStoredDocument(db, hit);\n // Orama full-text queries every string field by default, so every\n // indexed string field gates the rebuild — non-Latin text that only\n // rides in snippet/path/id would otherwise keep stale terms\n // (issue #2187 review round 2).\n for (const field of [doc.content, doc.snippet, doc.path, doc.id, doc.vectorProvider]) {\n if (typeof field === \"string\" && containsNonLegacyTokenizerChars(field)) return true;\n }\n return false;\n });\n if (hasNonLegacyContent) {\n // Re-index every document in place (Orama update is remove+insert,\n // so content is re-tokenized; vectors are carried through). A single\n // failing document must not block the rest of the corpus: it keeps\n // its pre-upgrade terms, which is no worse than before the upgrade.\n for (const hit of hits) {\n try {\n const doc = this.getStoredDocument(db, hit);\n const vector = this.getStoredVector(db, hit, doc);\n await oramaUpdate(db, hit.id, {\n id: typeof doc.id === \"string\" && doc.id.length > 0 ? doc.id : String(hit.id),\n path: typeof doc.path === \"string\" ? doc.path : \"\",\n content: typeof doc.content === \"string\" ? doc.content : \"\",\n snippet:\n typeof doc.snippet === \"string\"\n ? doc.snippet\n : typeof doc.content === \"string\"\n ? doc.content.slice(0, 200)\n : \"\",\n vectorProvider: typeof doc.vectorProvider === \"string\" ? doc.vectorProvider : \"\",\n vector: vector ?? this.zeroVector(),\n });\n } catch (docErr) {\n log.debug(\n `OramaBackend tokenizer-version re-index skipped document ${hit.id} in ${collection}: ${docErr}`,\n );\n }\n }\n }\n await this.persistDbForCollection(db, collection);\n } catch (err) {\n log.debug(`OramaBackend tokenizer-version rebuild for ${collection} failed: ${err}`);\n }\n return db;\n }\n\n private async migrateLegacyVectorProviderSchema(db: any, collection: string): Promise<any> {\n const { search: oramaSearch, count, insert } = this.oramaModule;\n const existingCount = await count(db);\n if (existingCount === 0) {\n const migrated = await this.createDb();\n await this.persistDbForCollection(migrated, collection);\n return migrated;\n }\n\n const allHits = await oramaSearch(db, { term: \"\", limit: existingCount + 100 });\n const hits = allHits.hits ?? [];\n const needsMigration = hits.some((hit: any) =>\n typeof hit.document?.vectorProvider !== \"string\"\n );\n if (!needsMigration) return db;\n\n const migrated = await this.createDb();\n for (const hit of hits) {\n const doc = this.getStoredDocument(db, hit);\n const vector = this.getStoredVector(db, hit, doc);\n const payload: Record<string, unknown> = {\n id: typeof doc.id === \"string\" && doc.id.length > 0 ? doc.id : String(hit.id),\n path: typeof doc.path === \"string\" ? doc.path : \"\",\n content: typeof doc.content === \"string\" ? doc.content : \"\",\n snippet:\n typeof doc.snippet === \"string\"\n ? doc.snippet\n : typeof doc.content === \"string\"\n ? doc.content.slice(0, 200)\n : \"\",\n vectorProvider:\n typeof doc.vectorProvider === \"string\" ? doc.vectorProvider : \"\",\n };\n if (vector) {\n payload.vector = vector;\n } else {\n payload.vector = this.zeroVector();\n }\n await insert(migrated, payload);\n }\n await this.persistDbForCollection(migrated, collection);\n return migrated;\n }\n\n private async persistDbForCollection(db: any, collection: string): Promise<void> {\n const data = await this.persistModule.persist(db, \"json\");\n const filePath = this.dbFilePath(collection);\n await mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n try {\n await writeFile(tempPath, data, \"utf-8\");\n await rename(tempPath, filePath);\n } catch (err) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw err;\n }\n }\n\n private dbFilePath(collection: string): string {\n return resolveOramaCollectionDbFilePath(this.dbPath, collection);\n }\n\n private async listDbFiles(): Promise<string[]> {\n try {\n const entries = await readdir(this.dbPath);\n return entries\n .filter((e) => e.endsWith(\".msp\"))\n .map((e) => path.join(this.dbPath, e));\n } catch {\n return [];\n }\n }\n\n private async loadDbFromFile(filePath: string): Promise<any> {\n try {\n await this.ensureModules();\n const raw = await readFile(filePath, \"utf-8\");\n const collection = path.basename(filePath, \".msp\");\n return await this.applyTokenizerVersion(\n await this.migrateLegacyVectorProviderSchema(\n await this.persistModule.restore(\"json\", raw),\n collection,\n ),\n collection,\n );\n } catch (err) {\n log.debug(`OramaBackend failed to load ${filePath}: ${err}`);\n return null;\n }\n }\n\n private async searchDb(\n db: any,\n query: string,\n mode: \"fulltext\" | \"vector\" | \"hybrid\",\n limit: number,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n const { search: oramaSearch } = this.oramaModule;\n\n try {\n throwIfSearchAborted(execution, `OramaBackend ${mode} search aborted`);\n let searchParams: any;\n\n if (mode === \"fulltext\") {\n searchParams = { term: query, limit };\n } else if (mode === \"vector\") {\n const embedResult = await this.resolveCompatibleQueryEmbedding(db, query, execution);\n throwIfSearchAborted(execution, `OramaBackend ${mode} search aborted`);\n if (!embedResult) {\n // Fall back to fulltext if no embeddings available\n searchParams = { term: query, limit };\n } else {\n searchParams = { mode: \"vector\", vector: { value: embedResult.vector, property: \"vector\" }, limit };\n }\n } else {\n // hybrid\n const embedResult = await this.resolveCompatibleQueryEmbedding(db, query, execution);\n throwIfSearchAborted(execution, `OramaBackend ${mode} search aborted`);\n if (!embedResult) {\n searchParams = { term: query, limit };\n } else {\n searchParams = { mode: \"hybrid\", term: query, vector: { value: embedResult.vector, property: \"vector\" }, limit };\n }\n }\n\n throwIfSearchAborted(execution, `OramaBackend ${mode} search aborted`);\n const result = await oramaSearch(db, searchParams);\n throwIfSearchAborted(execution, `OramaBackend ${mode} search aborted`);\n return (result.hits ?? []).map((hit: any) => ({\n docid: hit.document?.id ?? \"\",\n path: hit.document?.path ?? \"\",\n snippet: hit.document?.snippet ?? hit.document?.content?.slice(0, 200) ?? \"\",\n score: hit.score ?? 0,\n }));\n } catch (err) {\n log.debug(`OramaBackend search (${mode}) failed: ${err}`);\n if (!isSearchAborted(execution)) {\n reportSearchDegradation(execution, {\n backend: \"orama\",\n code: \"backend_error\",\n detail: err instanceof Error ? err.name : typeof err,\n });\n }\n return [];\n }\n }\n\n private async resolveCompatibleQueryEmbedding(\n db: any,\n query: string,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedWithProviderResult | null> {\n const embedResult = await this.embedHelper.embedWithProvider(query, { signal: execution?.signal });\n throwIfSearchAborted(execution, \"OramaBackend query embedding aborted\");\n if (!embedResult || !this.isExpectedDimensionVector(embedResult.vector)) return null;\n\n const storedProviderIdentity = await this.findCompatibleStoredVectorProvider(db, execution);\n if (!storedProviderIdentity) {\n this.rememberVectorProviderCompatibility(db, embedResult.providerIdentity, false);\n return null;\n }\n if (storedProviderIdentity === embedResult.providerIdentity) return embedResult;\n\n const fallbackEmbed = await this.embedQueryWithStoredFallbackProvider(query, storedProviderIdentity, execution);\n throwIfSearchAborted(execution, \"OramaBackend fallback query embedding aborted\");\n if (\n fallbackEmbed &&\n fallbackEmbed.providerIdentity === storedProviderIdentity &&\n this.isExpectedDimensionVector(fallbackEmbed.vector)\n ) {\n return fallbackEmbed;\n }\n\n this.rememberVectorProviderCompatibility(db, embedResult.providerIdentity, false);\n return null;\n }\n\n private async embedQueryWithStoredFallbackProvider(\n query: string,\n providerIdentity: EmbedProviderIdentity,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedWithProviderResult | null> {\n const embedWithIdentity = (this.embedHelper as unknown as {\n embedWithFallbackProviderIdentity?: (\n text: string,\n identity: EmbedProviderIdentity,\n options?: { signal?: AbortSignal },\n ) => Promise<EmbedWithProviderResult | null>;\n }).embedWithFallbackProviderIdentity;\n if (typeof embedWithIdentity !== \"function\") return null;\n return embedWithIdentity.call(this.embedHelper, query, providerIdentity, { signal: execution?.signal });\n }\n\n private async findCompatibleStoredVectorProvider(\n db: any,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedProviderIdentity | null> {\n const { search: oramaSearch, count } = this.oramaModule;\n try {\n const cached = this.vectorProviderCompatibility.get(db);\n if (cached?.compatible) return cached.providerIdentity;\n const existingCount = await count(db);\n if (existingCount === 0) return null;\n const allHits = await oramaSearch(db, {\n term: \"\",\n limit: existingCount + 100,\n properties: [\"vectorProvider\"],\n });\n let providerIdentity: EmbedProviderIdentity | null = null;\n let compatible = (allHits.hits ?? []).length > 0;\n for (const hit of allHits.hits ?? []) {\n throwIfSearchAborted(execution, \"OramaBackend vector provider check aborted\");\n const doc = this.getStoredDocument(db, hit);\n if (\n typeof doc.vectorProvider !== \"string\" ||\n doc.vectorProvider.length === 0 ||\n !this.isCompatibleStoredVector(this.getStoredVector(db, hit, doc))\n ) {\n compatible = false;\n break;\n }\n if (providerIdentity && doc.vectorProvider !== providerIdentity) {\n compatible = false;\n break;\n }\n providerIdentity = doc.vectorProvider as EmbedProviderIdentity;\n }\n if (compatible && providerIdentity) {\n this.vectorProviderCompatibility.set(db, {\n providerIdentity,\n compatible: true,\n });\n return providerIdentity;\n }\n return null;\n } catch (err) {\n if (isSearchAborted(execution)) throw err;\n log.debug(`OramaBackend stored vector provider check failed: ${err}`);\n return null;\n }\n }\n\n private async dbHasCompatibleVectors(\n db: any,\n providerIdentity: EmbedProviderIdentity,\n execution?: SearchExecutionOptions,\n ): Promise<boolean> {\n const { search: oramaSearch, count } = this.oramaModule;\n try {\n const cached = this.vectorProviderCompatibility.get(db);\n if (cached?.providerIdentity === providerIdentity) return cached.compatible;\n const existingCount = await count(db);\n if (existingCount === 0) return false;\n const allHits = await oramaSearch(db, {\n term: \"\",\n limit: existingCount + 100,\n properties: [\"vectorProvider\"],\n });\n let compatible = (allHits.hits ?? []).length > 0;\n for (const hit of allHits.hits ?? []) {\n throwIfSearchAborted(execution, \"OramaBackend vector provider check aborted\");\n const doc = this.getStoredDocument(db, hit);\n if (\n doc.vectorProvider !== providerIdentity ||\n !this.isCompatibleStoredVector(this.getStoredVector(db, hit, doc))\n ) {\n compatible = false;\n break;\n }\n }\n this.vectorProviderCompatibility.set(db, { providerIdentity, compatible });\n return compatible;\n } catch (err) {\n if (isSearchAborted(execution)) throw err;\n log.debug(`OramaBackend vector provider check failed: ${err}`);\n return false;\n }\n }\n\n private rememberVectorProviderCompatibility(\n db: unknown,\n providerIdentity: EmbedProviderIdentity | null,\n compatible: boolean,\n ): void {\n if (!db || typeof db !== \"object\") return;\n if (!providerIdentity) {\n this.vectorProviderCompatibility.delete(db);\n return;\n }\n this.vectorProviderCompatibility.set(db, { providerIdentity, compatible });\n }\n\n private getStoredDocument(db: any, hit: any): Record<string, unknown> {\n const internalId = this.getInternalDocumentId(db, hit);\n const internalDoc =\n internalId !== undefined && internalId !== null\n ? db?.data?.docs?.docs?.[String(internalId)]\n : undefined;\n if (internalDoc && typeof internalDoc === \"object\") {\n return internalDoc as Record<string, unknown>;\n }\n return hit?.document && typeof hit.document === \"object\"\n ? hit.document as Record<string, unknown>\n : {};\n }\n\n private getStoredVector(db: any, hit: any, doc: Record<string, unknown>): number[] | null {\n const documentVector = this.normalizeStoredVector(doc.vector);\n if (documentVector) return documentVector;\n const internalId = this.getInternalDocumentId(db, hit);\n if (internalId === undefined || internalId === null) return null;\n const vectorEntry = db?.data?.index?.vectorIndexes?.vector?.node?.vectors?.get?.(internalId);\n const vector = Array.isArray(vectorEntry) ? vectorEntry[1] : vectorEntry;\n return this.normalizeStoredVector(vector);\n }\n\n private getInternalDocumentId(db: any, hit: any): unknown {\n const publicId =\n typeof hit?.id === \"string\"\n ? hit.id\n : typeof hit?.document?.id === \"string\"\n ? hit.document.id\n : undefined;\n return publicId && typeof db?.internalDocumentIDStore?.idToInternalId?.get === \"function\"\n ? db.internalDocumentIDStore.idToInternalId.get(publicId)\n : undefined;\n }\n\n private isExpectedDimensionVector(vector: number[] | null | undefined): vector is number[] {\n return Array.isArray(vector) && vector.length === this.embeddingDimension;\n }\n\n private isCompatibleStoredVector(vector: unknown): vector is number[] {\n if (!vector || typeof vector !== \"object\") return false;\n const arr = Array.from(vector as ArrayLike<number>);\n return (\n arr.length === this.embeddingDimension &&\n arr.every((value) => Number.isFinite(value)) &&\n arr.some((value) => value !== 0)\n );\n }\n\n private zeroVector(): number[] {\n return Array.from({ length: this.embeddingDimension }, () => 0);\n }\n\n private normalizeStoredVector(vector: unknown): number[] | null {\n const values =\n Array.isArray(vector)\n ? vector\n : ArrayBuffer.isView(vector) && !(vector instanceof DataView)\n ? Array.from(vector as unknown as ArrayLike<unknown>)\n : null;\n if (!values || values.length !== this.embeddingDimension) return null;\n const normalized = values.map((value) => Number(value));\n return normalized.every((value) => Number.isFinite(value)) ? normalized : null;\n }\n}\n","import { expandUnsegmentableRecallNGrams, isUnsegmentableRecallChar } from \"../recall-tokenization.js\";\n\n/**\n * Language marker persisted inside Orama index files (`.msp`). Orama persists\n * `tokenizer.language` with the index, so this doubles as the tokenization\n * version: `OramaBackend` detects any other marker on restore and rebuilds\n * the full-text index (issue #2187). Bump the suffix whenever tokenization\n * changes.\n */\nexport const ORAMA_CJK_TOKENIZER_LANGUAGE = \"english+cjk-v1\";\n\n/** Minimal structural surface of `@orama/orama` this module consumes. */\nexport interface OramaTokenizerComponents {\n components: {\n tokenizer: {\n createTokenizer: (config: { language: string }) => OramaTokenizer;\n };\n };\n}\n\nexport interface OramaTokenizer {\n language: string;\n normalizationCache: Map<string, string>;\n tokenize: (raw: string, language?: string, prop?: string, withCache?: boolean) => string[];\n}\n\nconst THAI_SCRIPT_CHAR = /[\\p{Script=Thai}]/u;\nconst WORD_CHAR = /[\\p{L}\\p{N}\\p{M}]/u;\nconst COMBINING_MARK = /\\p{M}/u;\nconst WHITESPACE_CHAR = /\\s/u;\n/**\n * Chars the stock English tokenizer keeps inside a token. Input made only of\n * these (plus whitespace) is delegated to the stock tokenizer byte-for-byte so\n * existing English indexes stay term-compatible.\n */\nconst LEGACY_TOKENIZER_CHAR = /[A-Za-zàèéìòóù0-9_'-]/u;\n\n/**\n * Space-free scripts: CJK per the shared recall segmentation strategy, plus\n * Thai. Runs in these scripts are indexed as character n-grams so phrase\n * queries match without word boundaries.\n */\nexport function isSpaceFreeScriptChar(char: string): boolean {\n return isUnsegmentableRecallChar(char) || THAI_SCRIPT_CHAR.test(char);\n}\n\n/**\n * True when tokenizing the value differs from the stock English tokenizer —\n * i.e. the value contains characters outside the stock keep-set that this\n * tokenizer still indexes as token material: word characters (whole-word\n * non-ASCII scripts), combining marks (attached to runs), and space-free\n * scripts (CJK/Thai n-grams). Symbols and punctuation that are separators in\n * BOTH tokenizers do not count. `OramaBackend` uses this to decide whether a\n * stale pre-CJK index needs re-indexing on upgrade.\n */\nexport function containsNonLegacyTokenizerChars(value: string): boolean {\n for (const ch of value) {\n if (LEGACY_TOKENIZER_CHAR.test(ch) || WHITESPACE_CHAR.test(ch)) continue;\n if (WORD_CHAR.test(ch) || COMBINING_MARK.test(ch) || isSpaceFreeScriptChar(ch)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Orama tokenizer component that segments space-free scripts (CJK, Thai).\n *\n * - CJK/Thai runs expand to the same n-gram set the recall query-side\n * tokenizer (`recall-tokenization.ts`) produces, so index-side and\n * query-side tokens agree.\n * - Other non-Latin scripts (Hangul, Cyrillic, Greek, Arabic, ...) are kept\n * as whole words instead of being dropped by the English splitter.\n * - Legacy Latin content tokenizes exactly like the stock English tokenizer;\n * content with other characters keeps every stock token and additionally\n * indexes non-ASCII words whole (e.g. \"über\" adds \"über\" beside \"ber\").\n */\nexport function createCjkCapableTokenizer(oramaModule: OramaTokenizerComponents): OramaTokenizer {\n const base = oramaModule.components.tokenizer.createTokenizer({ language: \"english\" });\n\n const tokenize = (raw: string, _language?: string, prop?: string, withCache?: boolean): string[] => {\n if (typeof raw !== \"string\") return [];\n const normalized = raw.normalize(\"NFC\");\n\n if (!containsNonLegacyTokenizerChars(normalized)) {\n return base.tokenize(normalized, \"english\", prop, withCache);\n }\n\n // The stock tokenizer treats every non-legacy char as a separator, so its\n // output over the raw input already carries the legacy-Latin tokens\n // (e.g. the \"nebula-472\" in \"Nebula-472 東京都庁\").\n const tokens = base.tokenize(normalized, \"english\", prop, withCache);\n const seen = new Set(tokens);\n\n const pushToken = (token: string) => {\n if (token && !seen.has(token)) {\n seen.add(token);\n tokens.push(token);\n }\n };\n\n let spaceFreeRun = \"\";\n let wordRun = \"\";\n const flushSpaceFreeRun = () => {\n if (!spaceFreeRun) return;\n for (const token of expandUnsegmentableRecallNGrams(spaceFreeRun)) {\n pushToken(token);\n }\n spaceFreeRun = \"\";\n };\n const flushWordRun = () => {\n if (!wordRun) return;\n pushToken(wordRun.toLowerCase());\n wordRun = \"\";\n };\n\n for (const ch of normalized) {\n if (isSpaceFreeScriptChar(ch)) {\n flushWordRun();\n spaceFreeRun += ch;\n } else if (COMBINING_MARK.test(ch)) {\n if (spaceFreeRun) spaceFreeRun += ch;\n else if (wordRun) wordRun += ch;\n } else if (WORD_CHAR.test(ch) && !LEGACY_TOKENIZER_CHAR.test(ch)) {\n flushSpaceFreeRun();\n wordRun += ch;\n } else {\n flushSpaceFreeRun();\n flushWordRun();\n }\n }\n flushSpaceFreeRun();\n flushWordRun();\n\n return tokens;\n };\n\n return {\n language: ORAMA_CJK_TOKENIZER_LANGUAGE,\n normalizationCache: base.normalizationCache,\n tokenize,\n };\n}\n"],"mappings":"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","names":["migrated"]}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
reportSearchDegradation,
|
|
10
10
|
resolveEnsureCollectionArgs
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-NWA6IXR3.js";
|
|
12
12
|
import {
|
|
13
13
|
log
|
|
14
14
|
} from "./chunk-3WCASNQZ.js";
|
|
@@ -103,34 +103,47 @@ var LanceDbBackend = class {
|
|
|
103
103
|
await this.updateCollectionFromDir(collection, this.memoryDir, execution);
|
|
104
104
|
}
|
|
105
105
|
async updateCollectionFromDir(collection, memoryDir, execution) {
|
|
106
|
-
|
|
106
|
+
await this.refreshCollection(collection, memoryDir, execution);
|
|
107
|
+
}
|
|
108
|
+
async updateCompleted(execution) {
|
|
109
|
+
try {
|
|
110
|
+
return await this.refreshCollection(this.collection, this.memoryDir, execution);
|
|
111
|
+
} catch (err) {
|
|
112
|
+
log.debug(`LanceDbBackend update did not complete: ${err}`);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Brings the collection up to date; true only when it ran to completion (false: aborted, unavailable, skipped or failed). */
|
|
117
|
+
async refreshCollection(collection, memoryDir, execution) {
|
|
118
|
+
if (isSearchAborted(execution)) return false;
|
|
107
119
|
let table = await this.ensureTableForCollection(collection);
|
|
108
|
-
if (isSearchAborted(execution)) return;
|
|
109
|
-
if (!table) return;
|
|
120
|
+
if (isSearchAborted(execution)) return false;
|
|
121
|
+
if (!table) return false;
|
|
110
122
|
const docs = await scanMemoryDir(memoryDir);
|
|
111
|
-
if (isSearchAborted(execution)) return;
|
|
123
|
+
if (isSearchAborted(execution)) return false;
|
|
112
124
|
if (docs.length === 0) {
|
|
113
125
|
try {
|
|
114
126
|
const db = await this.ensureDb();
|
|
115
127
|
await db.dropTable(collection).catch(() => {
|
|
116
128
|
});
|
|
117
129
|
if (collection === this.collection) this.table = null;
|
|
130
|
+
return true;
|
|
118
131
|
} catch {
|
|
119
132
|
}
|
|
120
|
-
return;
|
|
133
|
+
return false;
|
|
121
134
|
}
|
|
122
135
|
const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();
|
|
123
136
|
const existingVectors = /* @__PURE__ */ new Map();
|
|
124
137
|
const vectorProviderColumnState = await this.tableVectorProviderColumnState(table);
|
|
125
138
|
if (vectorProviderColumnState === "missing") {
|
|
126
139
|
table = await this.recreateTableForCollection(collection);
|
|
127
|
-
if (isSearchAborted(execution)) return;
|
|
128
|
-
if (!table) return;
|
|
140
|
+
if (isSearchAborted(execution)) return false;
|
|
141
|
+
if (!table) return false;
|
|
129
142
|
} else if (vectorProviderColumnState === "present") {
|
|
130
143
|
try {
|
|
131
144
|
const existingRows = await table.query().select(["docid", "vector", "vectorProvider"]).toArray();
|
|
132
145
|
for (const row of existingRows ?? []) {
|
|
133
|
-
if (isSearchAborted(execution)) return;
|
|
146
|
+
if (isSearchAborted(execution)) return false;
|
|
134
147
|
const docid = row.docid;
|
|
135
148
|
if (typeof docid !== "string") continue;
|
|
136
149
|
const vector = row.vector;
|
|
@@ -142,11 +155,11 @@ var LanceDbBackend = class {
|
|
|
142
155
|
}
|
|
143
156
|
} catch {
|
|
144
157
|
log.debug("LanceDbBackend skipped refresh after vector preservation failed");
|
|
145
|
-
return;
|
|
158
|
+
return false;
|
|
146
159
|
}
|
|
147
160
|
} else {
|
|
148
161
|
log.debug("LanceDbBackend skipped vector preservation after vectorProvider probe failed");
|
|
149
|
-
return;
|
|
162
|
+
return false;
|
|
150
163
|
}
|
|
151
164
|
const rows = docs.map((d) => {
|
|
152
165
|
const existing = existingVectors.get(d.docid);
|
|
@@ -161,18 +174,20 @@ var LanceDbBackend = class {
|
|
|
161
174
|
};
|
|
162
175
|
});
|
|
163
176
|
try {
|
|
164
|
-
if (isSearchAborted(execution)) return;
|
|
177
|
+
if (isSearchAborted(execution)) return false;
|
|
165
178
|
await table.add(rows, { mode: "overwrite" });
|
|
166
179
|
this.rememberVectorProviderCompatibility(
|
|
167
180
|
table,
|
|
168
181
|
embeddingProviderIdentity,
|
|
169
182
|
rows.length > 0 && rows.every((row) => row.vectorProvider === embeddingProviderIdentity)
|
|
170
183
|
);
|
|
171
|
-
if (isSearchAborted(execution)) return;
|
|
184
|
+
if (isSearchAborted(execution)) return false;
|
|
172
185
|
await this.createFtsIndex(table);
|
|
173
186
|
if (collection === this.collection) this.table = table;
|
|
187
|
+
return true;
|
|
174
188
|
} catch (err) {
|
|
175
189
|
log.debug(`LanceDbBackend update failed: ${err}`);
|
|
190
|
+
return false;
|
|
176
191
|
}
|
|
177
192
|
}
|
|
178
193
|
async embed() {
|
|
@@ -508,4 +523,4 @@ function isMissingVectorProviderColumnError(err) {
|
|
|
508
523
|
export {
|
|
509
524
|
LanceDbBackend
|
|
510
525
|
};
|
|
511
|
-
//# sourceMappingURL=chunk-
|
|
526
|
+
//# sourceMappingURL=chunk-DOJBV6WR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/search/lancedb-backend.ts"],"sourcesContent":["import { log } from \"../logger.js\";\nimport {\n reportSearchDegradation,\n resolveEnsureCollectionArgs,\n type SearchBackend,\n type SearchExecutionOptions,\n type SearchQueryOptions,\n type SearchResult,\n} from \"./port.js\";\nimport type { EmbedHelper, EmbedProviderIdentity, EmbedWithProviderResult } from \"./embed-helper.js\";\nimport { scanMemoryDir } from \"./document-scanner.js\";\nimport { isSearchAborted, throwIfSearchAborted } from \"./abort.js\";\n\nexport interface LanceDbBackendOptions {\n dbPath: string;\n collection: string;\n embedHelper: EmbedHelper;\n memoryDir: string;\n embeddingDimension: number;\n}\n\n/**\n * LanceDB search backend — embedded hybrid FTS+vector with RRF reranking.\n *\n * Uses @lancedb/lancedb for native Arrow-backed storage.\n * One table per collection. Supports full-text, vector, and hybrid search.\n */\nexport class LanceDbBackend implements SearchBackend {\n private readonly dbPath: string;\n private readonly collection: string;\n private readonly embedHelper: EmbedHelper;\n private readonly memoryDir: string;\n private readonly embeddingDimension: number;\n private available = false;\n private db: any = null;\n private lanceModule: any = null;\n private readonly vectorProviderCompatibility = new WeakMap<\n object,\n { providerIdentity: EmbedProviderIdentity; compatible: boolean }\n >();\n\n constructor(opts: LanceDbBackendOptions) {\n this.dbPath = opts.dbPath;\n this.collection = opts.collection;\n this.embedHelper = opts.embedHelper;\n this.memoryDir = opts.memoryDir;\n this.embeddingDimension = opts.embeddingDimension;\n }\n\n async probe(): Promise<boolean> {\n try {\n await this.ensureDb();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`LanceDbBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=lancedb available=${this.available} dbPath=${this.dbPath}`;\n }\n\n async search(\n query: string,\n _collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return this.hybridSearch(query, _collection, maxResults, execution);\n }\n\n async searchGlobal(query: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const limit = maxResults ?? 10;\n if (!this.available) return [];\n\n try {\n throwIfSearchAborted(execution, \"LanceDbBackend global search aborted\");\n const db = await this.ensureDb();\n const tableNames = await db.tableNames();\n const allResults: SearchResult[] = [];\n\n for (const name of tableNames) {\n throwIfSearchAborted(execution, \"LanceDbBackend global search aborted\");\n try {\n const table = await db.openTable(name);\n const results = await this.searchTable(table, query, \"hybrid\", limit, execution);\n allResults.push(...results);\n } catch {\n // Skip tables that fail\n }\n }\n\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`LanceDbBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!table) return [];\n return this.searchTable(table, query, \"fts\", maxResults ?? 10, execution);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!table) return [];\n return this.searchTable(table, query, \"vector\", maxResults ?? 10, execution);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (isSearchAborted(execution)) return [];\n if (!table) return [];\n return this.searchTable(table, query, \"hybrid\", maxResults ?? 10, execution);\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollection(this.collection, execution);\n }\n\n async updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollectionFromDir(collection, this.memoryDir, execution);\n }\n\n async updateCollectionFromDir(collection: string, memoryDir: string, execution?: SearchExecutionOptions): Promise<void> {\n await this.refreshCollection(collection, memoryDir, execution);\n }\n\n async updateCompleted(execution?: SearchExecutionOptions): Promise<boolean> {\n try {\n return await this.refreshCollection(this.collection, this.memoryDir, execution);\n } catch (err) {\n log.debug(`LanceDbBackend update did not complete: ${err}`);\n return false;\n }\n }\n\n /** Brings the collection up to date; true only when it ran to completion (false: aborted, unavailable, skipped or failed). */\n private async refreshCollection(collection: string, memoryDir: string, execution?: SearchExecutionOptions): Promise<boolean> {\n if (isSearchAborted(execution)) return false;\n let table = await this.ensureTableForCollection(collection);\n if (isSearchAborted(execution)) return false;\n if (!table) return false;\n\n const docs = await scanMemoryDir(memoryDir);\n if (isSearchAborted(execution)) return false;\n if (docs.length === 0) {\n // Clear stale data when no docs remain\n try {\n const db = await this.ensureDb();\n await db.dropTable(collection).catch(() => {});\n if (collection === this.collection) this.table = null;\n return true;\n } catch {\n // Best-effort cleanup\n }\n return false;\n }\n\n const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();\n const existingVectors = new Map<string, {\n vector: number[];\n providerIdentity?: string;\n }>();\n const vectorProviderColumnState = await this.tableVectorProviderColumnState(table);\n if (vectorProviderColumnState === \"missing\") {\n table = await this.recreateTableForCollection(collection);\n if (isSearchAborted(execution)) return false;\n if (!table) return false;\n } else if (vectorProviderColumnState === \"present\") {\n try {\n const existingRows = await table.query().select([\"docid\", \"vector\", \"vectorProvider\"]).toArray();\n for (const row of existingRows ?? []) {\n if (isSearchAborted(execution)) return false;\n const docid = row.docid;\n if (typeof docid !== \"string\") continue;\n const vector = row.vector;\n if (!vector || typeof vector !== \"object\") continue;\n existingVectors.set(docid, {\n vector: Array.from(vector as ArrayLike<number>),\n providerIdentity: typeof row.vectorProvider === \"string\" ? row.vectorProvider : undefined,\n });\n }\n } catch {\n log.debug(\"LanceDbBackend skipped refresh after vector preservation failed\");\n return false;\n }\n } else {\n log.debug(\"LanceDbBackend skipped vector preservation after vectorProvider probe failed\");\n return false;\n }\n\n const rows = docs.map((d) => {\n const existing = existingVectors.get(d.docid);\n const canPreserveVector =\n existing &&\n this.isCompatibleStoredVector(existing.vector) &&\n (!embeddingProviderIdentity ||\n existing.providerIdentity === embeddingProviderIdentity);\n return {\n docid: d.docid,\n path: d.path,\n content: d.content,\n snippet: d.snippet,\n vector: canPreserveVector\n ? existing.vector\n : new Array(this.embeddingDimension).fill(0),\n vectorProvider: canPreserveVector\n ? existing.providerIdentity ?? \"\"\n : \"\",\n };\n });\n\n try {\n if (isSearchAborted(execution)) return false;\n await table.add(rows, { mode: \"overwrite\" });\n this.rememberVectorProviderCompatibility(\n table,\n embeddingProviderIdentity,\n rows.length > 0 && rows.every((row) => row.vectorProvider === embeddingProviderIdentity),\n );\n if (isSearchAborted(execution)) return false;\n // FTS index on the content column.\n await this.createFtsIndex(table);\n if (collection === this.collection) this.table = table;\n return true;\n } catch (err) {\n log.debug(`LanceDbBackend update failed: ${err}`);\n return false;\n }\n }\n\n async embed(): Promise<void> {\n await this.embedCollection(this.collection);\n }\n\n async embedCollection(collection: string): Promise<void> {\n if (!this.embedHelper.isAvailable()) return;\n\n const table = await this.ensureTableForCollection(collection);\n if (!table) return;\n\n try {\n const embeddingProviderIdentity = this.embedHelper.getProviderIdentity();\n const allRows = await table.query().select([\"docid\", \"content\", \"vector\", \"vectorProvider\"]).toArray();\n const needsEmbed = allRows.filter((row: any) => {\n if (embeddingProviderIdentity && row.vectorProvider !== embeddingProviderIdentity) {\n return true;\n }\n return !this.isCompatibleStoredVector(row.vector);\n });\n\n if (needsEmbed.length === 0) {\n this.rememberVectorProviderCompatibility(table, embeddingProviderIdentity, true);\n return;\n }\n\n let rowsToEmbed = needsEmbed;\n let embedResult = await this.embedHelper.embedBatchWithProvider(\n rowsToEmbed.map((row: any) => row.content as string),\n );\n if (!embedResult) return;\n if (\n embeddingProviderIdentity &&\n embedResult.providerIdentity !== embeddingProviderIdentity\n ) {\n const effectiveProviderIdentity = embedResult.providerIdentity;\n const originalDocids = new Set(rowsToEmbed.map((row: any) => row.docid));\n const effectiveNeedsEmbed = allRows.filter((row: any) => (\n row.vectorProvider !== effectiveProviderIdentity ||\n !this.isCompatibleStoredVector(row.vector)\n ));\n const sameRows =\n effectiveNeedsEmbed.length === rowsToEmbed.length &&\n effectiveNeedsEmbed.every((row: any) => originalDocids.has(row.docid));\n if (!sameRows) {\n const effectiveTexts = effectiveNeedsEmbed.map((row: any) => row.content as string);\n const effectiveEmbedResult = await this.embedHelper.embedBatchWithProvider(effectiveTexts);\n if (effectiveEmbedResult) {\n rowsToEmbed = effectiveNeedsEmbed;\n embedResult = effectiveEmbedResult;\n }\n }\n }\n const { vectors, providerIdentity } = embedResult;\n\n let allEmbedded = true;\n for (let i = 0; i < rowsToEmbed.length; i++) {\n const vec = vectors[i];\n if (!this.isExpectedDimensionVector(vec)) {\n allEmbedded = false;\n continue;\n }\n const docid = rowsToEmbed[i].docid;\n await table.update({\n where: `docid = '${docid.replace(/'/g, \"''\")}'`,\n values: { vector: vec, vectorProvider: providerIdentity },\n });\n }\n if (allEmbedded) {\n this.rememberVectorProviderCompatibility(table, providerIdentity, true);\n } else {\n this.rememberVectorProviderCompatibility(table, providerIdentity, false);\n }\n } catch (err) {\n log.debug(`LanceDbBackend embed failed: ${err}`);\n }\n }\n\n async ensureCollection(\n _memoryDir: string,\n collectionOrExecution?: string | SearchExecutionOptions,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const { collection, execution: effectiveExecution } = resolveEnsureCollectionArgs(\n collectionOrExecution,\n execution,\n );\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n try {\n await this.ensureTableForCollection(collection ?? this.collection);\n return \"present\";\n } catch {\n return \"missing\";\n }\n }\n\n private table: any = null;\n\n private get lanceIndex(): any {\n return this.lanceModule.Index ?? this.lanceModule.default?.Index;\n }\n\n private async ensureDb(): Promise<any> {\n if (this.db) return this.db;\n if (!this.lanceModule) {\n this.lanceModule = await import(\"@lancedb/lancedb\");\n }\n const connect = this.lanceModule.connect ?? this.lanceModule.default?.connect;\n this.db = await connect(this.dbPath);\n return this.db;\n }\n\n private async ensureTableForCollection(collection: string): Promise<any> {\n // For the default collection, use the cached instance\n if (collection === this.collection) return this.ensureTable();\n\n const db = await this.ensureDb();\n const tables = await db.tableNames();\n\n if (tables.includes(collection)) {\n return await db.openTable(collection);\n }\n\n // Create empty table with schema\n const emptyRow = {\n docid: \"__placeholder__\",\n path: \"\",\n content: \"\",\n snippet: \"\",\n vector: new Array(this.embeddingDimension).fill(0),\n vectorProvider: \"\",\n };\n const newTable = await db.createTable(collection, [emptyRow]);\n await this.createFtsIndex(newTable);\n try {\n await newTable.delete(\"docid = '__placeholder__'\");\n } catch {\n // May fail if delete isn't supported on empty-ish tables\n }\n return newTable;\n }\n\n private async recreateTableForCollection(collection: string): Promise<any> {\n const db = await this.ensureDb();\n try {\n await db.dropTable(collection).catch(() => {});\n } catch {\n // Best-effort legacy schema migration; table creation below may still recover.\n }\n if (collection === this.collection) this.table = null;\n return this.ensureTableForCollection(collection);\n }\n\n private async tableVectorProviderColumnState(table: any): Promise<\"present\" | \"missing\" | \"unknown\"> {\n try {\n await table.query().select([\"vectorProvider\"]).toArray();\n return \"present\";\n } catch (err) {\n if (isMissingVectorProviderColumnError(err)) {\n return \"missing\";\n }\n log.debug(`LanceDbBackend vectorProvider column probe failed: ${err}`);\n return \"unknown\";\n }\n }\n\n private async ensureTable(): Promise<any> {\n if (this.table) return this.table;\n\n const db = await this.ensureDb();\n const tables = await db.tableNames();\n\n if (tables.includes(this.collection)) {\n this.table = await db.openTable(this.collection);\n return this.table;\n }\n\n // Create empty table with schema\n const emptyRow = {\n docid: \"__placeholder__\",\n path: \"\",\n content: \"\",\n snippet: \"\",\n vector: new Array(this.embeddingDimension).fill(0),\n vectorProvider: \"\",\n };\n this.table = await db.createTable(this.collection, [emptyRow]);\n // Create FTS index on content column\n await this.createFtsIndex(this.table);\n // Remove placeholder row\n try {\n await this.table.delete(\"docid = '__placeholder__'\");\n } catch {\n // May fail if delete isn't supported on empty-ish tables\n }\n return this.table;\n }\n\n /**\n * Create the FTS index on the content column with the default tokenizer.\n *\n * Known limitation (issue #2187): tantivy's default tokenizer does not\n * segment space-free scripts (CJK/Thai), so lexical recall over those\n * scripts is near zero here. LanceDB's `baseTokenizer: \"ngram\"` option is\n * not script-aware — it would n-gram English content too, degrading\n * precision and bloating the index — so no CJK-capable configuration is\n * available in the current @lancedb/lancedb API. Non-English lexical recall\n * on this backend rides on the vector tier instead. See\n * docs/search-backends.md (\"Non-English content\").\n */\n private async createFtsIndex(table: any): Promise<void> {\n try {\n await table.createIndex(\"content\", { config: this.lanceIndex.fts() });\n } catch {\n // FTS index creation may fail on some platforms — degrade gracefully\n }\n }\n\n private async searchTable(\n table: any,\n query: string,\n mode: \"fts\" | \"vector\" | \"hybrid\",\n limit: number,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n try {\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n if (mode === \"fts\") {\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n }\n\n if (mode === \"vector\") {\n const embedResult = await this.resolveCompatibleQueryEmbedding(table, query, execution);\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n if (!embedResult) {\n // Fall back to FTS\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n }\n const results = await table.search(embedResult.vector).limit(limit).toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n }\n\n // hybrid — try FTS+vector with RRF reranking\n const embedResult = await this.resolveCompatibleQueryEmbedding(table, query, execution);\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n if (!embedResult) {\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n }\n\n try {\n const results = await table\n .search(query, \"hybrid\")\n .vector(embedResult.vector)\n .limit(limit)\n .toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n } catch {\n // Hybrid may not be supported in all LanceDB versions — fall back to vector\n const results = await table.search(embedResult.vector).limit(limit).toArray();\n throwIfSearchAborted(execution, `LanceDbBackend ${mode} search aborted`);\n return this.mapRows(results);\n }\n } catch (err) {\n log.debug(`LanceDbBackend search (${mode}) failed: ${err}`);\n if (!isSearchAborted(execution)) {\n reportSearchDegradation(execution, {\n backend: \"lancedb\",\n code: \"backend_error\",\n detail: err instanceof Error ? err.name : typeof err,\n });\n }\n return [];\n }\n }\n\n private async resolveCompatibleQueryEmbedding(\n table: any,\n query: string,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedWithProviderResult | null> {\n const embedResult = await this.embedHelper.embedWithProvider(query, { signal: execution?.signal });\n throwIfSearchAborted(execution, \"LanceDbBackend query embedding aborted\");\n if (!embedResult || !this.isExpectedDimensionVector(embedResult.vector)) return null;\n\n const storedProviderIdentity = await this.findCompatibleStoredVectorProvider(table, execution);\n if (!storedProviderIdentity) {\n this.rememberVectorProviderCompatibility(table, embedResult.providerIdentity, false);\n return null;\n }\n if (storedProviderIdentity === embedResult.providerIdentity) return embedResult;\n\n const fallbackEmbed = await this.embedQueryWithStoredFallbackProvider(query, storedProviderIdentity, execution);\n throwIfSearchAborted(execution, \"LanceDbBackend fallback query embedding aborted\");\n if (\n fallbackEmbed &&\n fallbackEmbed.providerIdentity === storedProviderIdentity &&\n this.isExpectedDimensionVector(fallbackEmbed.vector)\n ) {\n return fallbackEmbed;\n }\n\n this.rememberVectorProviderCompatibility(table, embedResult.providerIdentity, false);\n return null;\n }\n\n private async embedQueryWithStoredFallbackProvider(\n query: string,\n providerIdentity: EmbedProviderIdentity,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedWithProviderResult | null> {\n const embedWithIdentity = (this.embedHelper as unknown as {\n embedWithFallbackProviderIdentity?: (\n text: string,\n identity: EmbedProviderIdentity,\n options?: { signal?: AbortSignal },\n ) => Promise<EmbedWithProviderResult | null>;\n }).embedWithFallbackProviderIdentity;\n if (typeof embedWithIdentity !== \"function\") return null;\n return embedWithIdentity.call(this.embedHelper, query, providerIdentity, { signal: execution?.signal });\n }\n\n private async findCompatibleStoredVectorProvider(\n table: any,\n execution?: SearchExecutionOptions,\n ): Promise<EmbedProviderIdentity | null> {\n try {\n const cached = this.vectorProviderCompatibility.get(table);\n if (cached?.compatible) return cached.providerIdentity;\n const rows = await table.query().select([\"vector\", \"vectorProvider\"]).toArray();\n let providerIdentity: EmbedProviderIdentity | null = null;\n let compatible = rows.length > 0;\n for (const row of rows ?? []) {\n throwIfSearchAborted(execution, \"LanceDbBackend vector provider check aborted\");\n if (\n typeof row.vectorProvider !== \"string\" ||\n row.vectorProvider.length === 0 ||\n !this.isCompatibleStoredVector(row.vector)\n ) {\n compatible = false;\n break;\n }\n if (providerIdentity && row.vectorProvider !== providerIdentity) {\n compatible = false;\n break;\n }\n providerIdentity = row.vectorProvider as EmbedProviderIdentity;\n }\n if (compatible && providerIdentity) {\n this.vectorProviderCompatibility.set(table, {\n providerIdentity,\n compatible: true,\n });\n return providerIdentity;\n }\n return null;\n } catch (err) {\n if (isSearchAborted(execution)) throw err;\n log.debug(`LanceDbBackend stored vector provider check failed: ${err}`);\n return null;\n }\n }\n\n private mapRows(rows: any[]): SearchResult[] {\n return (rows ?? [])\n .filter((row) => row.docid && row.docid !== \"__placeholder__\")\n .map((row) => ({\n docid: row.docid ?? \"\",\n path: row.path ?? \"\",\n snippet: row.snippet ?? row.content?.slice(0, 200) ?? \"\",\n score: row._relevance_score ?? (row._distance != null ? 1 / (1 + (row._distance ?? 0)) : 0.5),\n }));\n }\n\n private async tableHasCompatibleVectors(\n table: any,\n providerIdentity: EmbedProviderIdentity,\n execution?: SearchExecutionOptions,\n ): Promise<boolean> {\n try {\n const cached = this.vectorProviderCompatibility.get(table);\n if (cached?.providerIdentity === providerIdentity) return cached.compatible;\n const rows = await table.query().select([\"vector\", \"vectorProvider\"]).toArray();\n let compatible = rows.length > 0;\n for (const row of rows ?? []) {\n throwIfSearchAborted(execution, \"LanceDbBackend vector provider check aborted\");\n if (\n row.vectorProvider !== providerIdentity ||\n !this.isCompatibleStoredVector(row.vector)\n ) {\n compatible = false;\n break;\n }\n }\n this.vectorProviderCompatibility.set(table, { providerIdentity, compatible });\n return compatible;\n } catch (err) {\n if (isSearchAborted(execution)) throw err;\n log.debug(`LanceDbBackend vector provider check failed: ${err}`);\n return false;\n }\n }\n\n private rememberVectorProviderCompatibility(\n table: unknown,\n providerIdentity: EmbedProviderIdentity | null,\n compatible: boolean,\n ): void {\n if (!table || typeof table !== \"object\") return;\n if (!providerIdentity) {\n this.vectorProviderCompatibility.delete(table);\n return;\n }\n this.vectorProviderCompatibility.set(table, { providerIdentity, compatible });\n }\n\n private isExpectedDimensionVector(vector: number[] | null | undefined): vector is number[] {\n return Array.isArray(vector) && vector.length === this.embeddingDimension;\n }\n\n private isCompatibleStoredVector(vector: unknown): boolean {\n if (!vector || typeof vector !== \"object\") return false;\n const arr = Array.from(vector as ArrayLike<number>);\n return (\n arr.length === this.embeddingDimension &&\n arr.every((value) => Number.isFinite(value)) &&\n arr.some((value) => value !== 0)\n );\n }\n}\n\nfunction isMissingVectorProviderColumnError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n return /\\bvectorProvider\\b/i.test(message) &&\n /\\b(column|field|schema|missing|not found|not exist|does not exist|unknown)\\b/i.test(message);\n}\n"],"mappings":"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","names":["embedResult","results"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rebuildMemoryProjection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QAHP5SBG.js";
|
|
4
4
|
|
|
5
5
|
// src/convergence-refresh.ts
|
|
6
6
|
async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, getStorage, searchEnabled) {
|
|
@@ -32,4 +32,4 @@ async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, get
|
|
|
32
32
|
export {
|
|
33
33
|
refreshConvergedNamespaces
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-FFQNNFHX.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineOperation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QF5EJ5VP.js";
|
|
4
4
|
import {
|
|
5
5
|
EngramAccessInputError
|
|
6
6
|
} from "./chunk-LGEH473S.js";
|
|
@@ -71,4 +71,4 @@ defineOperation({
|
|
|
71
71
|
})
|
|
72
72
|
})
|
|
73
73
|
});
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-FZLZUDJJ.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
readNamespaceMaintenanceLastRanStatuses,
|
|
4
4
|
readNamespaceMaintenanceStatuses,
|
|
5
5
|
runNamespaceMaintenancePlan
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-R3WZ74B2.js";
|
|
7
7
|
import {
|
|
8
8
|
analyzeSessionIntegrity,
|
|
9
9
|
applySessionRepair,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-CMTINOFS.js";
|
|
15
15
|
import {
|
|
16
16
|
summarizeCorpusAndReplica
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-M4U25HLR.js";
|
|
18
18
|
import {
|
|
19
19
|
readJudgeVerdictStats
|
|
20
20
|
} from "./chunk-OZKOPQCM.js";
|
|
@@ -41,14 +41,14 @@ import {
|
|
|
41
41
|
} from "./chunk-Y77FXULH.js";
|
|
42
42
|
import {
|
|
43
43
|
readAggregateExtractionWatermark
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-QS5DUSBM.js";
|
|
45
45
|
import {
|
|
46
46
|
listMemoryGovernanceRuns,
|
|
47
47
|
readMemoryGovernanceRunArtifact
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-TTTPTQ6S.js";
|
|
49
49
|
import {
|
|
50
50
|
listNamespaces
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-AOSCGNIC.js";
|
|
52
52
|
import {
|
|
53
53
|
analyzeGraphHealth
|
|
54
54
|
} from "./chunk-KRAMCBIW.js";
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
} from "./chunk-AWD36R4D.js";
|
|
58
58
|
import {
|
|
59
59
|
StorageManager
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-OCXDZJL4.js";
|
|
61
61
|
import {
|
|
62
62
|
lintWorkspaceFiles
|
|
63
63
|
} from "./chunk-DM2T26WE.js";
|
|
@@ -1683,4 +1683,4 @@ export {
|
|
|
1683
1683
|
runBenchmarkRecall,
|
|
1684
1684
|
runOperatorRepair
|
|
1685
1685
|
};
|
|
1686
|
-
//# sourceMappingURL=chunk-
|
|
1686
|
+
//# sourceMappingURL=chunk-GGFQAGOT.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isGenericRecallExcludedPath
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VV73XT3A.js";
|
|
4
4
|
import {
|
|
5
5
|
normalizeProjectionPreview
|
|
6
6
|
} from "./chunk-SCU65EZI.js";
|
|
@@ -209,4 +209,4 @@ export {
|
|
|
209
209
|
browsePatternMatches,
|
|
210
210
|
runMemoryBrowse
|
|
211
211
|
};
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
212
|
+
//# sourceMappingURL=chunk-GIRWNTMV.js.map
|