@remnic/core 10.0.52 → 10.0.54
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-UM3ZLT2X.js → chunk-2GU6XS4L.js} +31 -28
- package/dist/chunk-2GU6XS4L.js.map +1 -0
- 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-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-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-EC2KVA27.js → chunk-PVG7TCUG.js} +186 -105
- package/dist/chunk-PVG7TCUG.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 +25 -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 +582 -1
- package/src/orchestration/maintenance.ts +82 -95
- package/src/orchestration/qmd-maintenance-completion.ts +44 -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
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-QA3Y2O6H.js";
|
|
11
11
|
import {
|
|
12
12
|
deriveSourceConnector
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XDKEHZUC.js";
|
|
14
14
|
import {
|
|
15
15
|
resolvePipelineProcessingCapabilities
|
|
16
16
|
} from "./chunk-C5LWPYS3.js";
|
|
@@ -112,4 +112,4 @@ export {
|
|
|
112
112
|
renderExtractionConversation,
|
|
113
113
|
applyGroundingWithConnector
|
|
114
114
|
};
|
|
115
|
-
//# sourceMappingURL=chunk-
|
|
115
|
+
//# sourceMappingURL=chunk-OMWQO7H6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
reportSearchDegradation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NWA6IXR3.js";
|
|
4
4
|
import {
|
|
5
5
|
log
|
|
6
6
|
} from "./chunk-3WCASNQZ.js";
|
|
@@ -56,6 +56,10 @@ var RemoteSearchBackend = class {
|
|
|
56
56
|
}
|
|
57
57
|
async update(_execution) {
|
|
58
58
|
}
|
|
59
|
+
/** The remote service owns its own indexing, so there is no local re-index that could be left incomplete. */
|
|
60
|
+
async updateCompleted(_execution) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
59
63
|
async updateCollection(_collection, _execution) {
|
|
60
64
|
}
|
|
61
65
|
async embed() {
|
|
@@ -121,4 +125,4 @@ var RemoteSearchBackend = class {
|
|
|
121
125
|
export {
|
|
122
126
|
RemoteSearchBackend
|
|
123
127
|
};
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
128
|
+
//# sourceMappingURL=chunk-OVZIYLBZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/search/remote-backend.ts"],"sourcesContent":["import { log } from \"../logger.js\";\nimport {\n reportSearchDegradation,\n type SearchBackend,\n type SearchExecutionOptions,\n type SearchQueryOptions,\n type SearchResult,\n} from \"./port.js\";\n\nexport interface RemoteSearchBackendOptions {\n baseUrl: string;\n apiKey?: string;\n timeoutMs?: number;\n}\n\n/**\n * HTTP REST search backend adapter.\n *\n * Delegates search to a remote service. Maintenance methods are no-ops\n * (remote backends manage their own indexing).\n */\nexport class RemoteSearchBackend implements SearchBackend {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private available = false;\n\n constructor(opts: RemoteSearchBackendOptions) {\n let url = opts.baseUrl;\n while (url.endsWith(\"/\")) url = url.slice(0, -1);\n this.baseUrl = url;\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async probe(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/health`, {\n method: \"GET\",\n headers: this.headers(),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n this.available = res.ok;\n return this.available;\n } catch (err) {\n log.debug(`RemoteSearchBackend 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=remote available=${this.available} baseUrl=${this.baseUrl}`;\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.post(\"/search/deep\", { query, collection, maxResults }, execution);\n }\n\n async searchGlobal(query: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/deep\", { query, maxResults }, execution);\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/bm25\", { query, collection, maxResults }, execution);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/vector\", { query, collection, maxResults }, execution);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/hybrid\", { query, collection, maxResults }, execution);\n }\n\n async update(_execution?: SearchExecutionOptions): Promise<void> {}\n /** The remote service owns its own indexing, so there is no local re-index that could be left incomplete. */\n async updateCompleted(_execution?: SearchExecutionOptions): Promise<boolean> {\n return true;\n }\n async updateCollection(_collection: string, _execution?: SearchExecutionOptions): Promise<void> {}\n async embed(): Promise<void> {}\n async embedCollection(_collection: string): Promise<void> {}\n\n async ensureCollection(\n _memoryDir: string,\n _collectionOrExecution?: string | SearchExecutionOptions,\n _execution?: SearchExecutionOptions,\n ): Promise<\"skipped\"> {\n return \"skipped\";\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (this.apiKey) {\n h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n return h;\n }\n\n private async post(\n endpoint: string,\n body: Record<string, unknown>,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n if (!this.available) {\n reportSearchDegradation(execution, {\n backend: \"remote\",\n code: \"backend_unavailable\",\n });\n return [];\n }\n try {\n const res = await fetch(`${this.baseUrl}${endpoint}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(body),\n signal: execution?.signal\n ? AbortSignal.any([execution.signal, AbortSignal.timeout(this.timeoutMs)])\n : AbortSignal.timeout(this.timeoutMs),\n });\n if (!res.ok) {\n log.debug(`RemoteSearchBackend ${endpoint} returned ${res.status}`);\n reportSearchDegradation(execution, {\n backend: \"remote\",\n code: \"remote_error\",\n detail: `HTTP ${res.status}`,\n });\n return [];\n }\n const data = await res.json();\n if (!Array.isArray(data)) {\n reportSearchDegradation(execution, {\n backend: \"remote\",\n code: \"remote_error\",\n detail: \"invalid response body\",\n });\n return [];\n }\n return data as SearchResult[];\n } catch (err) {\n log.debug(`RemoteSearchBackend ${endpoint} failed: ${err}`);\n reportSearchDegradation(execution, {\n backend: \"remote\",\n code: \"remote_error\",\n detail: err instanceof Error ? err.name : typeof err,\n });\n return [];\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OCXDZJL4.js";
|
|
4
4
|
import {
|
|
5
5
|
getCachedRuleMemories,
|
|
6
6
|
setCachedRuleMemories
|
|
@@ -119,4 +119,4 @@ export {
|
|
|
119
119
|
compareVerifiedSemanticRuleResults,
|
|
120
120
|
searchVerifiedSemanticRules
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-OWNAWY6D.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
|
log
|
|
14
14
|
} from "./chunk-3WCASNQZ.js";
|
|
@@ -104,16 +104,25 @@ var MeilisearchBackend = class {
|
|
|
104
104
|
await this.updateCollectionFromDir(collection, this.memoryDir, execution);
|
|
105
105
|
}
|
|
106
106
|
async updateCollectionFromDir(collection, memoryDir, execution) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
await this.refreshCollection(collection, memoryDir, execution);
|
|
108
|
+
}
|
|
109
|
+
async updateCompleted(execution) {
|
|
110
|
+
if (!this.autoIndex) return true;
|
|
111
|
+
if (!this.memoryDir) return false;
|
|
112
|
+
return this.refreshCollection(this.collection, this.memoryDir, execution);
|
|
113
|
+
}
|
|
114
|
+
/** Brings the collection up to date; true only when it ran to completion (false: aborted, unavailable, skipped or failed). */
|
|
115
|
+
async refreshCollection(collection, memoryDir, execution) {
|
|
116
|
+
if (!this.autoIndex) return false;
|
|
117
|
+
if (!this.available) return false;
|
|
118
|
+
if (isSearchAborted(execution)) return false;
|
|
110
119
|
try {
|
|
111
120
|
const ensured = await this.ensureCollection(memoryDir, collection, execution);
|
|
112
|
-
if (ensured === "skipped" || ensured === "missing") return;
|
|
121
|
+
if (ensured === "skipped" || ensured === "missing") return false;
|
|
113
122
|
const client = await this.ensureClient();
|
|
114
|
-
if (isSearchAborted(execution)) return;
|
|
123
|
+
if (isSearchAborted(execution)) return false;
|
|
115
124
|
const docs = await scanMemoryDir(memoryDir);
|
|
116
|
-
if (isSearchAborted(execution)) return;
|
|
125
|
+
if (isSearchAborted(execution)) return false;
|
|
117
126
|
const index = client.index(collection);
|
|
118
127
|
const meilDocs = docs.map((d) => ({
|
|
119
128
|
id: d.docid,
|
|
@@ -121,10 +130,14 @@ var MeilisearchBackend = class {
|
|
|
121
130
|
content: d.content,
|
|
122
131
|
snippet: d.snippet
|
|
123
132
|
}));
|
|
124
|
-
if (isSearchAborted(execution)) return;
|
|
133
|
+
if (isSearchAborted(execution)) return false;
|
|
125
134
|
const addTask = await index.addDocuments(meilDocs, { primaryKey: "id" });
|
|
126
|
-
await client.waitForTask(addTask.taskUid, { timeOutMs: this.timeoutMs });
|
|
127
|
-
if (
|
|
135
|
+
const added = await client.waitForTask(addTask.taskUid, { timeOutMs: this.timeoutMs });
|
|
136
|
+
if (added.status !== "succeeded") {
|
|
137
|
+
log.debug(`MeilisearchBackend add task finished with status ${added.status}`);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
if (isSearchAborted(execution)) return false;
|
|
128
141
|
const currentIds = new Set(docs.map((d) => d.docid));
|
|
129
142
|
try {
|
|
130
143
|
const PAGE_SIZE = 1e3;
|
|
@@ -132,7 +145,7 @@ var MeilisearchBackend = class {
|
|
|
132
145
|
let staleIds = [];
|
|
133
146
|
let hasMore = true;
|
|
134
147
|
while (hasMore) {
|
|
135
|
-
if (isSearchAborted(execution)) return;
|
|
148
|
+
if (isSearchAborted(execution)) return false;
|
|
136
149
|
const page = await index.getDocuments({ limit: PAGE_SIZE, offset, fields: ["id"] });
|
|
137
150
|
const results = page.results ?? [];
|
|
138
151
|
for (const doc of results) {
|
|
@@ -143,14 +156,22 @@ var MeilisearchBackend = class {
|
|
|
143
156
|
hasMore = results.length === PAGE_SIZE;
|
|
144
157
|
}
|
|
145
158
|
if (staleIds.length > 0) {
|
|
146
|
-
if (isSearchAborted(execution)) return;
|
|
159
|
+
if (isSearchAborted(execution)) return false;
|
|
147
160
|
const delTask = await index.deleteDocuments(staleIds);
|
|
148
|
-
await client.waitForTask(delTask.taskUid, { timeOutMs: this.timeoutMs });
|
|
161
|
+
const deleted = await client.waitForTask(delTask.taskUid, { timeOutMs: this.timeoutMs });
|
|
162
|
+
if (deleted.status !== "succeeded") {
|
|
163
|
+
log.debug(`MeilisearchBackend stale-document deletion finished with status ${deleted.status}`);
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
149
166
|
}
|
|
150
|
-
} catch {
|
|
167
|
+
} catch (err) {
|
|
168
|
+
log.debug(`MeilisearchBackend stale-document deletion failed: ${err}`);
|
|
169
|
+
return false;
|
|
151
170
|
}
|
|
171
|
+
return true;
|
|
152
172
|
} catch (err) {
|
|
153
173
|
log.debug(`MeilisearchBackend update failed: ${err}`);
|
|
174
|
+
return false;
|
|
154
175
|
}
|
|
155
176
|
}
|
|
156
177
|
async embed() {
|
|
@@ -253,4 +274,4 @@ function isMeilisearchIndexNotFoundError(err) {
|
|
|
253
274
|
export {
|
|
254
275
|
MeilisearchBackend
|
|
255
276
|
};
|
|
256
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-PFUXPTBT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/search/meilisearch-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 { scanMemoryDir } from \"./document-scanner.js\";\nimport { isSearchAborted, throwIfSearchAborted } from \"./abort.js\";\n\nexport interface MeilisearchBackendOptions {\n host: string;\n apiKey?: string;\n collection: string;\n timeoutMs?: number;\n autoIndex?: boolean;\n memoryDir?: string;\n}\n\n/**\n * Meilisearch search backend — server-based SDK client.\n *\n * Requires a running Meilisearch instance. Uses the official `meilisearch` SDK.\n * When `autoIndex` is true, update() pushes docs from the local memory directory.\n */\nexport class MeilisearchBackend implements SearchBackend {\n private readonly host: string;\n private readonly apiKey?: string;\n private readonly collection: string;\n private readonly timeoutMs: number;\n private readonly autoIndex: boolean;\n private readonly memoryDir?: string;\n private available = false;\n private client: any = null;\n private meiliModule: any = null;\n\n constructor(opts: MeilisearchBackendOptions) {\n this.host = opts.host;\n this.apiKey = opts.apiKey;\n this.collection = opts.collection;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.autoIndex = opts.autoIndex ?? false;\n this.memoryDir = opts.memoryDir;\n }\n\n async probe(): Promise<boolean> {\n try {\n const client = await this.ensureClient();\n await client.health();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`MeilisearchBackend 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=meilisearch available=${this.available} host=${this.host}`;\n }\n\n async search(\n query: string,\n collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n if (isSearchAborted(execution)) return [];\n // Try hybrid first; fall back to plain FTS only if hybrid throws (e.g. no embedder configured)\n try {\n return await this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 0.5, embedder: \"default\" } }, collection, true, execution);\n } catch {\n if (isSearchAborted(execution)) return [];\n return this.bm25Search(query, collection, maxResults, execution);\n }\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, \"MeilisearchBackend global search aborted\");\n const client = await this.ensureClient();\n const indexes = await client.getIndexes();\n throwIfSearchAborted(execution, \"MeilisearchBackend global search aborted\");\n const queries = (indexes.results ?? []).map((idx: any) => ({\n indexUid: idx.uid,\n q: query,\n limit,\n showRankingScore: true,\n }));\n if (queries.length === 0) return [];\n\n const multiResult = await client.multiSearch({ queries });\n throwIfSearchAborted(execution, \"MeilisearchBackend global search aborted\");\n const allResults: SearchResult[] = [];\n for (const result of multiResult.results ?? []) {\n allResults.push(...this.mapHits(result.hits ?? []));\n }\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`MeilisearchBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, undefined, collection, false, execution);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 1.0, embedder: \"default\" } }, collection, false, execution);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 0.5, embedder: \"default\" } }, collection, false, 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 if (!this.memoryDir) return;\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 // autoIndex is off by default: the Meilisearch server is managed outside Remnic and\n // nothing is pushed by configuration, so there is no re-index that could be left incomplete.\n if (!this.autoIndex) return true;\n if (!this.memoryDir) return false;\n return this.refreshCollection(this.collection, this.memoryDir, execution);\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 (!this.autoIndex) return false;\n if (!this.available) return false;\n if (isSearchAborted(execution)) return false;\n\n try {\n const ensured = await this.ensureCollection(memoryDir, collection, execution);\n if (ensured === \"skipped\" || ensured === \"missing\") return false;\n const client = await this.ensureClient();\n if (isSearchAborted(execution)) return false;\n const docs = await scanMemoryDir(memoryDir);\n if (isSearchAborted(execution)) return false;\n const index = client.index(collection);\n\n const meilDocs = docs.map((d) => ({\n id: d.docid,\n path: d.path,\n content: d.content,\n snippet: d.snippet,\n }));\n\n // Upsert current docs and wait for the task to complete\n if (isSearchAborted(execution)) return false;\n const addTask = await index.addDocuments(meilDocs, { primaryKey: \"id\" });\n // waitForTask resolves with a failed or canceled task and rejects only on timeout.\n const added = await client.waitForTask(addTask.taskUid, { timeOutMs: this.timeoutMs });\n if (added.status !== \"succeeded\") {\n log.debug(`MeilisearchBackend add task finished with status ${added.status}`);\n return false;\n }\n if (isSearchAborted(execution)) return false;\n\n // Remove docs that no longer exist on disk (paginated to handle large indexes)\n const currentIds = new Set(docs.map((d) => d.docid));\n try {\n const PAGE_SIZE = 1000;\n let offset = 0;\n let staleIds: string[] = [];\n let hasMore = true;\n while (hasMore) {\n if (isSearchAborted(execution)) return false;\n const page = await index.getDocuments({ limit: PAGE_SIZE, offset, fields: [\"id\"] });\n const results = page.results ?? [];\n for (const doc of results) {\n const id = doc.id as string;\n if (!currentIds.has(id)) staleIds.push(id);\n }\n offset += results.length;\n hasMore = results.length === PAGE_SIZE;\n }\n if (staleIds.length > 0) {\n if (isSearchAborted(execution)) return false;\n const delTask = await index.deleteDocuments(staleIds);\n // The deletion is part of completion: a stale document left searchable is not an\n // up-to-date index, and waitForTask resolves failed/canceled tasks without throwing.\n const deleted = await client.waitForTask(delTask.taskUid, { timeOutMs: this.timeoutMs });\n if (deleted.status !== \"succeeded\") {\n log.debug(`MeilisearchBackend stale-document deletion finished with status ${deleted.status}`);\n return false;\n }\n }\n } catch (err) {\n log.debug(`MeilisearchBackend stale-document deletion failed: ${err}`);\n return false;\n }\n return true;\n } catch (err) {\n log.debug(`MeilisearchBackend update failed: ${err}`);\n return false;\n }\n }\n\n async embed(): Promise<void> {\n // Meilisearch handles its own embedding when configured with an embedder\n }\n\n async embedCollection(collection: string): Promise<void> {\n // Meilisearch handles its own embedding when configured with an embedder\n // The collection parameter is accepted for interface compliance but Meilisearch\n // manages embeddings server-side per index (collection).\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 (!this.available) return \"skipped\";\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n const targetCollection = collection ?? this.collection;\n try {\n const client = await this.ensureClient();\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n try {\n await client.getIndex(targetCollection);\n return \"present\";\n } catch (err) {\n if (!isMeilisearchIndexNotFoundError(err)) {\n log.debug(\n `MeilisearchBackend collection check unavailable for \"${targetCollection}\" (will not skip update): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return \"unknown\";\n }\n // Index doesn't exist — create it\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n const createTask = await client.createIndex(targetCollection, { primaryKey: \"id\" });\n if (isSearchAborted(effectiveExecution)) return \"skipped\";\n if (createTask?.taskUid !== undefined && createTask?.taskUid !== null) {\n await client.waitForTask(createTask.taskUid, { timeOutMs: this.timeoutMs });\n }\n return \"present\";\n }\n } catch (err) {\n log.debug(\n `MeilisearchBackend collection check failed for \"${targetCollection}\" (will not disable updates): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return \"unknown\";\n }\n }\n\n private async ensureClient(): Promise<any> {\n if (this.client) return this.client;\n if (!this.meiliModule) {\n this.meiliModule = await import(\"meilisearch\");\n }\n const MeiliSearch = this.meiliModule.MeiliSearch ?? this.meiliModule.default?.MeiliSearch;\n this.client = new MeiliSearch({\n host: this.host,\n apiKey: this.apiKey,\n timeout: this.timeoutMs,\n });\n return this.client;\n }\n\n private async doSearch(\n query: string,\n limit: number,\n extra?: Record<string, unknown>,\n collection?: string,\n rethrow = false,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n if (!this.available) return [];\n if (isSearchAborted(execution)) return [];\n try {\n const client = await this.ensureClient();\n throwIfSearchAborted(execution, \"MeilisearchBackend search aborted\");\n const index = client.index(collection ?? this.collection);\n const result = await index.search(query, { limit, showRankingScore: true, ...extra });\n throwIfSearchAborted(execution, \"MeilisearchBackend search aborted\");\n return this.mapHits(result.hits ?? []);\n } catch (err) {\n log.debug(`MeilisearchBackend search failed: ${err}`);\n if (rethrow) throw err;\n if (!isSearchAborted(execution)) {\n reportSearchDegradation(execution, {\n backend: \"meilisearch\",\n code: \"backend_error\",\n detail: err instanceof Error ? err.name : typeof err,\n });\n }\n return [];\n }\n }\n\n private mapHits(hits: any[]): SearchResult[] {\n return hits.map((hit) => ({\n docid: hit.id ?? \"\",\n path: hit.path ?? \"\",\n snippet: hit._formatted?.content ?? hit.snippet ?? hit.content?.slice(0, 200) ?? \"\",\n score: hit._rankingScore ?? 0.5,\n }));\n }\n}\n\nfunction isMeilisearchIndexNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") {\n return false;\n }\n const record = err as Record<string, unknown>;\n const code = typeof record.code === \"string\" ? record.code.toLowerCase() : \"\";\n const type = typeof record.type === \"string\" ? record.type.toLowerCase() : \"\";\n const status =\n typeof record.status === \"number\"\n ? record.status\n : typeof record.statusCode === \"number\"\n ? record.statusCode\n : undefined;\n const message = err instanceof Error\n ? err.message.toLowerCase()\n : typeof record.message === \"string\"\n ? record.message.toLowerCase()\n : \"\";\n\n return (\n code === \"index_not_found\"\n || type === \"index_not_found\"\n || status === 404\n || message.includes(\"index_not_found\")\n || /index .*not found/.test(message)\n || /index .*does not exist/.test(message)\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA2BO,IAAM,qBAAN,MAAkD;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY;AAAA,EACZ,SAAc;AAAA,EACd,cAAmB;AAAA,EAE3B,YAAY,MAAiC;AAC3C,SAAK,OAAO,KAAK;AACjB,SAAK,SAAS,KAAK;AACnB,SAAK,aAAa,KAAK;AACvB,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,YAAY,KAAK;AAAA,EACxB;AAAA,EAEA,MAAM,QAA0B;AAC9B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,YAAM,OAAO,OAAO;AACpB,WAAK,YAAY;AACjB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,MAAM,oCAAoC,GAAG,EAAE;AACnD,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAsB;AACpB,WAAO,iCAAiC,KAAK,SAAS,SAAS,KAAK,IAAI;AAAA,EAC1E;AAAA,EAEA,MAAM,OACJ,OACA,YACA,YACA,UACA,WACyB;AACzB,QAAI,gBAAgB,SAAS,EAAG,QAAO,CAAC;AAExC,QAAI;AACF,aAAO,MAAM,KAAK,SAAS,OAAO,cAAc,IAAI,EAAE,QAAQ,EAAE,eAAe,KAAK,UAAU,UAAU,EAAE,GAAG,YAAY,MAAM,SAAS;AAAA,IAC1I,QAAQ;AACN,UAAI,gBAAgB,SAAS,EAAG,QAAO,CAAC;AACxC,aAAO,KAAK,WAAW,OAAO,YAAY,YAAY,SAAS;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAe,YAAqB,WAA6D;AAClH,UAAM,QAAQ,cAAc;AAC5B,QAAI,CAAC,KAAK,UAAW,QAAO,CAAC;AAE7B,QAAI;AACF,2BAAqB,WAAW,0CAA0C;AAC1E,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,2BAAqB,WAAW,0CAA0C;AAC1E,YAAM,WAAW,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC,SAAc;AAAA,QACzD,UAAU,IAAI;AAAA,QACd,GAAG;AAAA,QACH;AAAA,QACA,kBAAkB;AAAA,MACpB,EAAE;AACF,UAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,YAAM,cAAc,MAAM,OAAO,YAAY,EAAE,QAAQ,CAAC;AACxD,2BAAqB,WAAW,0CAA0C;AAC1E,YAAM,aAA6B,CAAC;AACpC,iBAAW,UAAU,YAAY,WAAW,CAAC,GAAG;AAC9C,mBAAW,KAAK,GAAG,KAAK,QAAQ,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,MACpD;AACA,iBAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC3C,aAAO,WAAW,MAAM,GAAG,KAAK;AAAA,IAClC,SAAS,KAAK;AACZ,UAAI,MAAM,2CAA2C,GAAG,EAAE;AAC1D,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAe,YAAqB,YAAqB,WAA6D;AACrI,WAAO,KAAK,SAAS,OAAO,cAAc,IAAI,QAAW,YAAY,OAAO,SAAS;AAAA,EACvF;AAAA,EAEA,MAAM,aAAa,OAAe,YAAqB,YAAqB,WAA6D;AACvI,WAAO,KAAK,SAAS,OAAO,cAAc,IAAI,EAAE,QAAQ,EAAE,eAAe,GAAK,UAAU,UAAU,EAAE,GAAG,YAAY,OAAO,SAAS;AAAA,EACrI;AAAA,EAEA,MAAM,aAAa,OAAe,YAAqB,YAAqB,WAA6D;AACvI,WAAO,KAAK,SAAS,OAAO,cAAc,IAAI,EAAE,QAAQ,EAAE,eAAe,KAAK,UAAU,UAAU,EAAE,GAAG,YAAY,OAAO,SAAS;AAAA,EACrI;AAAA,EAEA,MAAM,OAAO,WAAmD;AAC9D,UAAM,KAAK,iBAAiB,KAAK,YAAY,SAAS;AAAA,EACxD;AAAA,EAEA,MAAM,iBAAiB,YAAoB,WAAmD;AAC5F,QAAI,CAAC,KAAK,UAAW;AACrB,UAAM,KAAK,wBAAwB,YAAY,KAAK,WAAW,SAAS;AAAA,EAC1E;AAAA,EAEA,MAAM,wBAAwB,YAAoB,WAAmB,WAAmD;AACtH,UAAM,KAAK,kBAAkB,YAAY,WAAW,SAAS;AAAA,EAC/D;AAAA,EAEA,MAAM,gBAAgB,WAAsD;AAG1E,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,WAAO,KAAK,kBAAkB,KAAK,YAAY,KAAK,WAAW,SAAS;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAc,kBAAkB,YAAoB,WAAmB,WAAsD;AAC3H,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,QAAI,gBAAgB,SAAS,EAAG,QAAO;AAEvC,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,iBAAiB,WAAW,YAAY,SAAS;AAC5E,UAAI,YAAY,aAAa,YAAY,UAAW,QAAO;AAC3D,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,UAAI,gBAAgB,SAAS,EAAG,QAAO;AACvC,YAAM,OAAO,MAAM,cAAc,SAAS;AAC1C,UAAI,gBAAgB,SAAS,EAAG,QAAO;AACvC,YAAM,QAAQ,OAAO,MAAM,UAAU;AAErC,YAAM,WAAW,KAAK,IAAI,CAAC,OAAO;AAAA,QAChC,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,SAAS,EAAE;AAAA,MACb,EAAE;AAGF,UAAI,gBAAgB,SAAS,EAAG,QAAO;AACvC,YAAM,UAAU,MAAM,MAAM,aAAa,UAAU,EAAE,YAAY,KAAK,CAAC;AAEvE,YAAM,QAAQ,MAAM,OAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,KAAK,UAAU,CAAC;AACrF,UAAI,MAAM,WAAW,aAAa;AAChC,YAAI,MAAM,oDAAoD,MAAM,MAAM,EAAE;AAC5E,eAAO;AAAA,MACT;AACA,UAAI,gBAAgB,SAAS,EAAG,QAAO;AAGvC,YAAM,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACnD,UAAI;AACF,cAAM,YAAY;AAClB,YAAI,SAAS;AACb,YAAI,WAAqB,CAAC;AAC1B,YAAI,UAAU;AACd,eAAO,SAAS;AACd,cAAI,gBAAgB,SAAS,EAAG,QAAO;AACvC,gBAAM,OAAO,MAAM,MAAM,aAAa,EAAE,OAAO,WAAW,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;AAClF,gBAAM,UAAU,KAAK,WAAW,CAAC;AACjC,qBAAW,OAAO,SAAS;AACzB,kBAAM,KAAK,IAAI;AACf,gBAAI,CAAC,WAAW,IAAI,EAAE,EAAG,UAAS,KAAK,EAAE;AAAA,UAC3C;AACA,oBAAU,QAAQ;AAClB,oBAAU,QAAQ,WAAW;AAAA,QAC/B;AACA,YAAI,SAAS,SAAS,GAAG;AACvB,cAAI,gBAAgB,SAAS,EAAG,QAAO;AACvC,gBAAM,UAAU,MAAM,MAAM,gBAAgB,QAAQ;AAGpD,gBAAM,UAAU,MAAM,OAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,KAAK,UAAU,CAAC;AACvF,cAAI,QAAQ,WAAW,aAAa;AAClC,gBAAI,MAAM,mEAAmE,QAAQ,MAAM,EAAE;AAC7F,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,MAAM,sDAAsD,GAAG,EAAE;AACrE,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,MAAM,qCAAqC,GAAG,EAAE;AACpD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAAA,EAE7B;AAAA,EAEA,MAAM,gBAAgB,YAAmC;AAAA,EAIzD;AAAA,EAEA,MAAM,iBACJ,YACA,uBACA,WACwD;AACxD,UAAM,EAAE,YAAY,WAAW,mBAAmB,IAAI;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,QAAI,gBAAgB,kBAAkB,EAAG,QAAO;AAChD,UAAM,mBAAmB,cAAc,KAAK;AAC5C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,UAAI,gBAAgB,kBAAkB,EAAG,QAAO;AAChD,UAAI;AACF,cAAM,OAAO,SAAS,gBAAgB;AACtC,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,YAAI,CAAC,gCAAgC,GAAG,GAAG;AACzC,cAAI;AAAA,YACF,wDAAwD,gBAAgB,6BACtE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,gBAAgB,kBAAkB,EAAG,QAAO;AAChD,cAAM,aAAa,MAAM,OAAO,YAAY,kBAAkB,EAAE,YAAY,KAAK,CAAC;AAClF,YAAI,gBAAgB,kBAAkB,EAAG,QAAO;AAChD,YAAI,YAAY,YAAY,UAAa,YAAY,YAAY,MAAM;AACrE,gBAAM,OAAO,YAAY,WAAW,SAAS,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,QAC5E;AACA,eAAO;AAAA,MACT;AAAA,IACF,SAAS,KAAK;AACZ,UAAI;AAAA,QACF,mDAAmD,gBAAgB,iCACjE,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,eAA6B;AACzC,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,cAAc,MAAM,OAAO,aAAa;AAAA,IAC/C;AACA,UAAM,cAAc,KAAK,YAAY,eAAe,KAAK,YAAY,SAAS;AAC9E,SAAK,SAAS,IAAI,YAAY;AAAA,MAC5B,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,SACZ,OACA,OACA,OACA,YACA,UAAU,OACV,WACyB;AACzB,QAAI,CAAC,KAAK,UAAW,QAAO,CAAC;AAC7B,QAAI,gBAAgB,SAAS,EAAG,QAAO,CAAC;AACxC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,2BAAqB,WAAW,mCAAmC;AACnE,YAAM,QAAQ,OAAO,MAAM,cAAc,KAAK,UAAU;AACxD,YAAM,SAAS,MAAM,MAAM,OAAO,OAAO,EAAE,OAAO,kBAAkB,MAAM,GAAG,MAAM,CAAC;AACpF,2BAAqB,WAAW,mCAAmC;AACnE,aAAO,KAAK,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAAA,IACvC,SAAS,KAAK;AACZ,UAAI,MAAM,qCAAqC,GAAG,EAAE;AACpD,UAAI,QAAS,OAAM;AACnB,UAAI,CAAC,gBAAgB,SAAS,GAAG;AAC/B,gCAAwB,WAAW;AAAA,UACjC,SAAS;AAAA,UACT,MAAM;AAAA,UACN,QAAQ,eAAe,QAAQ,IAAI,OAAO,OAAO;AAAA,QACnD,CAAC;AAAA,MACH;AACA,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,QAAQ,MAA6B;AAC3C,WAAO,KAAK,IAAI,CAAC,SAAS;AAAA,MACxB,OAAO,IAAI,MAAM;AAAA,MACjB,MAAM,IAAI,QAAQ;AAAA,MAClB,SAAS,IAAI,YAAY,WAAW,IAAI,WAAW,IAAI,SAAS,MAAM,GAAG,GAAG,KAAK;AAAA,MACjF,OAAO,IAAI,iBAAiB;AAAA,IAC9B,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,gCAAgC,KAAuB;AAC9D,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,YAAY,IAAI;AAC3E,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,YAAY,IAAI;AAC3E,QAAM,SACJ,OAAO,OAAO,WAAW,WACrB,OAAO,SACP,OAAO,OAAO,eAAe,WAC3B,OAAO,aACP;AACR,QAAM,UAAU,eAAe,QAC3B,IAAI,QAAQ,YAAY,IACxB,OAAO,OAAO,YAAY,WACxB,OAAO,QAAQ,YAAY,IAC3B;AAEN,SACE,SAAS,qBACN,SAAS,qBACT,WAAW,OACX,QAAQ,SAAS,iBAAiB,KAClC,oBAAoB,KAAK,OAAO,KAChC,yBAAyB,KAAK,OAAO;AAE5C;","names":[]}
|