@remnic/core 9.69.86 → 9.69.88
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 +74 -67
- package/dist/access-authorization-probe.js +75 -68
- package/dist/access-boundary.js +74 -67
- package/dist/access-citation-namespace.js +2 -2
- package/dist/access-cli.js +158 -151
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.d.ts.map +1 -1
- package/dist/access-extraction-force-flush.js +74 -67
- package/dist/access-http-briefing.js +75 -68
- package/dist/access-http-offline-stream.d.ts.map +1 -1
- package/dist/access-http-offline-stream.js +1 -1
- package/dist/access-http-query.js +76 -69
- package/dist/access-http.js +100 -93
- package/dist/access-identity-continuity-surface.js +74 -67
- package/dist/access-lcm-surface.js +74 -67
- package/dist/access-mcp-output-schemas.d.ts.map +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts.map +1 -1
- package/dist/access-mcp.js +89 -82
- package/dist/access-namespace-preflight.js +74 -67
- package/dist/access-observe-write-category.js +19 -13
- package/dist/access-observe-write-surface.js +74 -67
- package/dist/access-offline-manifest.js +15 -10
- package/dist/access-operations-batch.js +78 -71
- package/dist/access-operations.js +85 -78
- package/dist/access-recall-concurrency.js +74 -67
- package/dist/access-recall-diagnostics.js +4 -4
- package/dist/access-recall-response.js +74 -67
- package/dist/access-recall-surface.js +74 -67
- package/dist/access-schema.js +15 -7
- package/dist/access-service-helpers.d.ts +1 -0
- package/dist/access-service-helpers.d.ts.map +1 -1
- package/dist/access-service-helpers.js +1 -1
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +74 -67
- package/dist/access-surface-catalog.js +76 -69
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +34 -28
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-WEUDMXUW.js → auto-sync-U5N3CB5Y.js} +10 -10
- package/dist/background-generation.js +2 -2
- package/dist/briefing.js +18 -18
- package/dist/buffer.js +9 -8
- package/dist/calibration.js +2 -2
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{capsule-merge-3MNURAQ3.js → capsule-merge-ZCXUPLNJ.js} +2 -2
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +21 -21
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.js +3 -3
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-JE334SIA.js → chunk-22DYJLFN.js} +2 -2
- package/dist/{chunk-DGAWEJVI.js → chunk-2DLWLNO4.js} +3 -3
- package/dist/{chunk-J3IWHCMF.js → chunk-2DT7PIDZ.js} +3 -3
- package/dist/{chunk-NKFLHW7J.js → chunk-2NAD4YCI.js} +2 -2
- package/dist/{chunk-SV72F4DS.js → chunk-2WLMWP2T.js} +2 -2
- package/dist/{chunk-IVH7INFM.js → chunk-3O5BB45T.js} +7 -7
- package/dist/{chunk-RDEUG2M2.js → chunk-3SGTV7RD.js} +6 -6
- package/dist/{chunk-QOPB6KE3.js → chunk-3TB2XQ3C.js} +2 -2
- package/dist/{chunk-C7JAUNFC.js → chunk-4KN2JLQV.js} +2 -2
- package/dist/{chunk-TIQZNDZ5.js → chunk-4MP7XR5J.js} +2 -2
- package/dist/chunk-4NSLQ7EU.js +137 -0
- package/dist/chunk-4NSLQ7EU.js.map +1 -0
- package/dist/{chunk-7DE2NOON.js → chunk-4O4XCBOS.js} +3 -3
- package/dist/{chunk-SLEAJ67D.js → chunk-4OQET73E.js} +4 -4
- package/dist/{chunk-Q3THVX75.js → chunk-4RL3JOB3.js} +2 -2
- package/dist/{chunk-GDYU6VF4.js → chunk-5AYUHSAU.js} +2 -2
- package/dist/{chunk-B47OHVFT.js → chunk-5E6RYRYW.js} +7 -7
- package/dist/{chunk-2U3R3DDH.js → chunk-5FAGCOZD.js} +9 -9
- package/dist/{chunk-CRKWSSS4.js → chunk-5MNUBT7T.js} +2 -2
- package/dist/{chunk-CK5KOVHW.js → chunk-5R627MYY.js} +3 -2
- package/dist/{chunk-CK5KOVHW.js.map → chunk-5R627MYY.js.map} +1 -1
- package/dist/chunk-5X4MXNEU.js +64 -0
- package/dist/chunk-5X4MXNEU.js.map +1 -0
- package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
- package/dist/{chunk-7G6WUOLB.js → chunk-66DKTOBY.js} +2 -2
- package/dist/{chunk-AZ2X5LNA.js → chunk-6LYAEM54.js} +2 -2
- package/dist/{chunk-DUJYRVUD.js → chunk-6O2VUWV6.js} +3 -3
- package/dist/{chunk-IMAP236M.js → chunk-6UQFJULG.js} +2 -2
- package/dist/chunk-75PT4N7Q.js +75 -0
- package/dist/chunk-75PT4N7Q.js.map +1 -0
- package/dist/{chunk-2I6VHX6Q.js → chunk-76M5OK7V.js} +2 -2
- package/dist/{chunk-OEBLZZKK.js → chunk-7XG7KMIW.js} +2 -2
- package/dist/{chunk-FYAU4S6E.js → chunk-A4VSOUCB.js} +3 -3
- package/dist/{chunk-GEX5NI36.js → chunk-AE5U5NMS.js} +2 -2
- package/dist/{chunk-UNJOB4DY.js → chunk-AEHVZY3X.js} +2 -2
- package/dist/{chunk-ML2MVAEZ.js → chunk-AEU4EQGV.js} +1 -1
- package/dist/{chunk-3SG4FGDV.js → chunk-AWD36R4D.js} +5 -2
- package/dist/chunk-AWD36R4D.js.map +1 -0
- package/dist/{chunk-JVY556FW.js → chunk-AWG3TIAY.js} +2 -2
- package/dist/{chunk-JX6USXZR.js → chunk-AXC4WSF3.js} +4 -4
- package/dist/{chunk-BOUFVFV2.js → chunk-AZSGSRIM.js} +2 -2
- package/dist/{chunk-VZBW6CDG.js → chunk-B3O3IRZN.js} +1 -1
- package/dist/{chunk-4V44AA7O.js → chunk-BGI4NUAO.js} +2 -2
- package/dist/{chunk-BNPLDVM6.js → chunk-BJVO4H5C.js} +2 -2
- package/dist/{chunk-S42HZILI.js → chunk-BLVR4WYU.js} +3 -3
- package/dist/{chunk-JXMECXMF.js → chunk-BOZJD5PK.js} +2 -2
- package/dist/{chunk-6DTJBTHL.js → chunk-BUQKSQXL.js} +15 -3
- package/dist/chunk-BUQKSQXL.js.map +1 -0
- package/dist/{chunk-OWHERGF2.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-EVBI7S4J.js → chunk-C6U57KG4.js} +4 -4
- package/dist/{chunk-RB776UH3.js → chunk-C7V3KPKJ.js} +235 -93
- package/dist/chunk-C7V3KPKJ.js.map +1 -0
- package/dist/{chunk-T4BE5KJM.js → chunk-C7ZDKWPS.js} +4 -4
- package/dist/{chunk-HKFJ3PF3.js → chunk-CRXRZA3G.js} +2 -2
- package/dist/{chunk-NMBX4D7P.js → chunk-CZJA2EQE.js} +2 -2
- package/dist/{chunk-BJX3VQWZ.js → chunk-D5BSQR63.js} +2 -2
- package/dist/{chunk-MFZACYZ6.js → chunk-DGS34QSY.js} +2 -2
- package/dist/{chunk-UVYI6VIX.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-DQISIT63.js → chunk-DZ42MDZE.js} +3 -3
- package/dist/{chunk-5ELENZTA.js → chunk-EDIH6X2P.js} +2 -2
- package/dist/{chunk-3BTFBQLO.js → chunk-EFHNFTWB.js} +49 -3
- package/dist/chunk-EFHNFTWB.js.map +1 -0
- package/dist/{chunk-C3QXITIP.js → chunk-EQUD7FP4.js} +2 -2
- package/dist/chunk-ETUZFFPU.js +218 -0
- package/dist/chunk-ETUZFFPU.js.map +1 -0
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-IA3X2Y4K.js → chunk-FJLQXMTU.js} +3 -3
- package/dist/{chunk-TY446V34.js → chunk-FKD656D2.js} +2 -2
- package/dist/{chunk-CLXTDOKV.js → chunk-FUNBJQYR.js} +2 -2
- package/dist/{chunk-CLSYE5OZ.js → chunk-G2STTRYB.js} +2 -2
- package/dist/{chunk-SQDKX4RW.js → chunk-GWM6T5EQ.js} +2 -2
- package/dist/{chunk-AXDOF4VI.js → chunk-GZDTVYK2.js} +2 -2
- package/dist/{chunk-55FCXCXJ.js → chunk-H56VY4BY.js} +7 -7
- package/dist/{chunk-OM5BIPBR.js → chunk-H5BJWPUI.js} +4 -4
- package/dist/{chunk-7QK5TUTW.js → chunk-HLB7GKGG.js} +2 -2
- package/dist/{chunk-CHDGJJV6.js → chunk-HWLIMQE2.js} +2 -2
- package/dist/{chunk-QB75LKQQ.js → chunk-IOSZHHJC.js} +34 -15
- package/dist/chunk-IOSZHHJC.js.map +1 -0
- package/dist/{chunk-NAFPHFDM.js → chunk-JNLEJE4A.js} +2 -2
- package/dist/{chunk-7UUKRS3J.js → chunk-JVPWRNHA.js} +3 -3
- package/dist/{chunk-6ET2VII7.js → chunk-JYG2334B.js} +2 -2
- package/dist/chunk-K6T33R4Q.js +535 -0
- package/dist/chunk-K6T33R4Q.js.map +1 -0
- package/dist/{chunk-2QG4SLZI.js → chunk-KF7PQ7G2.js} +2 -2
- package/dist/{chunk-WIKO4SCR.js → chunk-LHRQBMJN.js} +2 -2
- package/dist/{chunk-IFCKHPY4.js → chunk-LO4UKPKX.js} +2 -2
- package/dist/{chunk-TEV2JGU5.js → chunk-LU7E2MXE.js} +19 -19
- package/dist/{chunk-RJLV4BKR.js → chunk-LV5H6FTN.js} +2 -2
- package/dist/{chunk-IBGEHKQ6.js → chunk-LW3HKRL7.js} +3 -3
- package/dist/{chunk-3XQYM4RE.js → chunk-M6C7SOR6.js} +2 -2
- package/dist/{chunk-JN72EPOE.js → chunk-MAAL6OZV.js} +7 -7
- package/dist/chunk-MAAL6OZV.js.map +1 -0
- package/dist/{chunk-MY2PLXSM.js → chunk-MCTM4YPL.js} +2 -1
- package/dist/{chunk-MY2PLXSM.js.map → chunk-MCTM4YPL.js.map} +1 -1
- package/dist/{chunk-T4QGUXCV.js → chunk-MXCAJKMA.js} +9 -9
- package/dist/{chunk-BMYZTZ5D.js → chunk-MY7B3HYC.js} +2 -2
- package/dist/{chunk-NB3LRY4T.js → chunk-N4PYB235.js} +2 -2
- package/dist/{chunk-S3YM4SZQ.js → chunk-N7QV3CMX.js} +2 -2
- package/dist/{chunk-3GN2PEOT.js → chunk-NYKIUQL6.js} +2 -2
- package/dist/{chunk-WQZZDN5M.js → chunk-OCFXVDBZ.js} +322 -376
- package/dist/chunk-OCFXVDBZ.js.map +1 -0
- package/dist/{chunk-L2LBMKSI.js → chunk-OK52IY3W.js} +10 -10
- package/dist/{chunk-WB2I2EQK.js → chunk-P2ODTYOF.js} +2 -2
- package/dist/{chunk-RIEX7NOZ.js → chunk-PEBHPCX2.js} +2 -2
- package/dist/{chunk-VYCOJKSX.js → chunk-PO7NXNGC.js} +2 -2
- package/dist/{chunk-G6SVZWPB.js → chunk-PZX3AQLF.js} +44 -1
- package/dist/chunk-PZX3AQLF.js.map +1 -0
- package/dist/{chunk-XAITGGX5.js → chunk-Q4AUIFUA.js} +4 -4
- package/dist/{chunk-EU3N5MK3.js → chunk-QAW55ZHJ.js} +4 -4
- package/dist/{chunk-SVZWVZ7E.js → chunk-QB57WIS6.js} +101 -93
- package/dist/chunk-QB57WIS6.js.map +1 -0
- package/dist/{chunk-I4G4UWQA.js → chunk-QI2E6ISQ.js} +1 -1
- package/dist/{chunk-CK5U7JGH.js → chunk-QI7K7BZ5.js} +2 -2
- package/dist/{chunk-VTPASHTO.js → chunk-R3X2T2LP.js} +3 -3
- package/dist/{chunk-I53NAHZ4.js → chunk-RBITPCMK.js} +10 -9
- package/dist/chunk-RBITPCMK.js.map +1 -0
- package/dist/{chunk-EJPF6XDQ.js → chunk-RDJ6C7NZ.js} +3 -3
- package/dist/{chunk-C2WWQ4OR.js → chunk-RMMA44HE.js} +1 -1
- package/dist/chunk-RMMA44HE.js.map +1 -0
- package/dist/{chunk-QC56VZXC.js → chunk-S2GE2K36.js} +85 -82
- package/dist/{chunk-QC56VZXC.js.map → chunk-S2GE2K36.js.map} +1 -1
- package/dist/{chunk-2UPTRDGM.js → chunk-SCXURCVT.js} +3 -3
- package/dist/{chunk-S55WTPFJ.js → chunk-STEOT4DI.js} +20 -20
- package/dist/chunk-STEOT4DI.js.map +1 -0
- package/dist/{chunk-N3MNDVJO.js → chunk-SWBC3UER.js} +2 -2
- package/dist/{chunk-ZTHGFTMW.js → chunk-TKC5LZ43.js} +2 -2
- package/dist/chunk-TYT4TEQV.js +45 -0
- package/dist/chunk-TYT4TEQV.js.map +1 -0
- package/dist/{chunk-YRLHEEQT.js → chunk-U6VC6RP3.js} +2 -2
- package/dist/chunk-UCPGOUDZ.js +726 -0
- package/dist/chunk-UCPGOUDZ.js.map +1 -0
- package/dist/{chunk-MOQPEFLN.js → chunk-UP75KL3L.js} +2 -2
- package/dist/{chunk-D5F7TKMH.js → chunk-V4JZCTMK.js} +2 -2
- package/dist/{chunk-NAYBHNGN.js → chunk-VALKBYBN.js} +2 -2
- package/dist/{chunk-BUKK5SWA.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-H36X4NRH.js → chunk-VVX5PZFS.js} +2 -2
- package/dist/{chunk-RCQKAOOB.js → chunk-W3XXFPRI.js} +52 -52
- package/dist/{chunk-W75BBBSY.js → chunk-WKY7N3L7.js} +11 -11
- package/dist/{chunk-GZAGLCQH.js → chunk-X5SHE2O3.js} +3 -3
- package/dist/{chunk-OAOBL6OY.js → chunk-XOV7NRY5.js} +5 -5
- package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
- package/dist/{chunk-RGMVMVMF.js → chunk-YBA52OKG.js} +2 -1
- package/dist/chunk-YBA52OKG.js.map +1 -0
- package/dist/{chunk-IP5VLSLO.js → chunk-YJ7MW627.js} +2 -2
- package/dist/{chunk-HS75MCQF.js → chunk-YRULQW5J.js} +2 -2
- package/dist/{chunk-DINRT75P.js → chunk-YSBL7VPO.js} +2 -2
- package/dist/{chunk-QWUJWBZ5.js → chunk-Z3O53WZR.js} +2 -2
- package/dist/{chunk-KERNN6BC.js → chunk-Z5LP6ILP.js} +2 -2
- package/dist/{chunk-5FNZ3G6X.js → chunk-Z6EZCN6Z.js} +5 -5
- package/dist/chunk-ZJP66Q4I.js +48 -0
- package/dist/chunk-ZJP66Q4I.js.map +1 -0
- package/dist/{chunk-JS3S2HVG.js → chunk-ZZZ4I455.js} +2 -2
- package/dist/cli.js +122 -115
- package/dist/coding/export-okf-codegraph.js +19 -19
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +19 -19
- package/dist/config.js +34 -28
- package/dist/connectors/codex-materialize-runner.js +18 -18
- package/dist/connectors/index.js +18 -18
- package/dist/console/state.d.ts +30 -0
- package/dist/console/state.d.ts.map +1 -1
- package/dist/contradiction/index.js +7 -7
- package/dist/{contradiction-scan-5EJYRKD3.js → contradiction-scan-TAGMOUQ2.js} +3 -3
- package/dist/convergence-refresh.js +20 -20
- package/dist/corpus-watermark.js +20 -20
- package/dist/correction/correction-access-wiring.d.ts.map +1 -1
- package/dist/dashboard-runtime.js +2 -2
- package/dist/deep-recall-http-glue.js +15 -8
- package/dist/deep-recall-policy-llm.js +3 -3
- package/dist/deep-recall.js +2 -2
- package/dist/embedding-fallback.d.ts +41 -31
- package/dist/embedding-fallback.d.ts.map +1 -1
- package/dist/embedding-fallback.js +9 -1
- package/dist/embedding-generation-lock.d.ts +49 -0
- package/dist/embedding-generation-lock.d.ts.map +1 -0
- package/dist/embedding-generation-lock.js +19 -0
- package/dist/embedding-index-storage.d.ts +276 -0
- package/dist/embedding-index-storage.d.ts.map +1 -0
- package/dist/embedding-index-storage.js +28 -0
- package/dist/entity-retrieval.js +19 -19
- package/dist/event-order-recall.js +3 -3
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.js +75 -68
- package/dist/extraction-faithfulness.js +3 -3
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction-liveness.d.ts +9 -0
- package/dist/extraction-liveness.d.ts.map +1 -1
- package/dist/extraction-liveness.js +2 -1
- package/dist/extraction-llm-health.d.ts +32 -0
- package/dist/extraction-llm-health.d.ts.map +1 -0
- package/dist/extraction-llm-health.js +17 -0
- package/dist/extraction-span-config.js +3 -2
- package/dist/extraction-span-materialize.js +2 -2
- package/dist/extraction.js +29 -28
- package/dist/fallback-llm.js +2 -2
- package/dist/{first-start-migration-GAT7G733.js → first-start-migration-7OATHJKB.js} +4 -4
- package/dist/{graph-edge-decay-PVKDKLQK.js → graph-edge-decay-MKIRZ762.js} +6 -6
- package/dist/graph-jsonl.js +4 -4
- package/dist/graph-snapshot.js +4 -4
- package/dist/graph.js +5 -5
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +237 -206
- package/dist/json-extract.d.ts.map +1 -1
- package/dist/json-extract.js +1 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.js +5 -5
- package/dist/local-llm.d.ts.map +1 -1
- package/dist/local-llm.js +2 -2
- package/dist/location/index.js +21 -21
- package/dist/maintenance/memory-governance.js +18 -18
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
- package/dist/maintenance/rebuild-memory-projection.js +19 -19
- package/dist/memory-browse-operations.js +75 -68
- package/dist/memory-browse.js +3 -3
- package/dist/memory-subject.js +3 -3
- package/dist/namespaces/migrate.js +19 -19
- package/dist/namespaces/search.js +4 -4
- package/dist/namespaces/storage.js +18 -18
- package/dist/offline-sync-embedding-generation.d.ts +207 -0
- package/dist/offline-sync-embedding-generation.d.ts.map +1 -0
- package/dist/offline-sync-embedding-generation.js +42 -0
- package/dist/offline-sync-embedding-generation.js.map +1 -0
- package/dist/offline-sync-exclude-globs.d.ts +15 -0
- package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
- package/dist/offline-sync-exclude-globs.js +11 -3
- package/dist/offline-sync-file-io.d.ts +7 -0
- package/dist/offline-sync-file-io.d.ts.map +1 -1
- package/dist/offline-sync-file-io.js +14 -2
- package/dist/offline-sync-impression-drain.js +3 -3
- package/dist/offline-sync-runtime-state.d.ts +5 -0
- package/dist/offline-sync-runtime-state.d.ts.map +1 -0
- package/dist/offline-sync-runtime-state.js +14 -0
- package/dist/offline-sync-runtime-state.js.map +1 -0
- package/dist/offline-sync-snapshot-stream.d.ts +26 -0
- package/dist/offline-sync-snapshot-stream.d.ts.map +1 -0
- package/dist/offline-sync-snapshot-stream.js +28 -0
- package/dist/offline-sync-snapshot-stream.js.map +1 -0
- package/dist/offline-sync-upload-staging.d.ts +34 -0
- package/dist/offline-sync-upload-staging.d.ts.map +1 -0
- package/dist/offline-sync-upload-staging.js +26 -0
- package/dist/offline-sync-upload-staging.js.map +1 -0
- package/dist/offline-sync.d.ts +46 -27
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +21 -8
- package/dist/operator-doctor-corpus.js +21 -21
- package/dist/operator-toolkit.js +46 -40
- package/dist/orchestration/extraction-run.d.ts.map +1 -1
- package/dist/orchestration/maintenance.js +30 -30
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +159 -152
- package/dist/recall-navigation-operations.js +75 -68
- package/dist/recall-navigation.js +74 -67
- package/dist/recall-planner-llm.js +2 -2
- package/dist/recall-state-view-admission.js +3 -3
- package/dist/recall-why-service.js +6 -6
- package/dist/recall-why.js +3 -3
- package/dist/reconcile/manifest.js +4 -4
- package/dist/{resolution-UYJU5JUA.js → resolution-K4A3VPKZ.js} +8 -8
- package/dist/resolution-K4A3VPKZ.js.map +1 -0
- package/dist/resume-bundles.js +35 -29
- package/dist/salvage-envelope.js +5 -5
- package/dist/search/factory.js +3 -3
- package/dist/search/index.js +7 -7
- package/dist/secure-store/index.js +2 -2
- package/dist/secure-store/secure-fs.d.ts +14 -1
- package/dist/secure-store/secure-fs.d.ts.map +1 -1
- package/dist/semantic-consolidation.js +19 -19
- package/dist/semantic-rule-promotion.js +18 -18
- package/dist/semantic-rule-verifier.js +18 -18
- package/dist/source-agent-qualifier.js +23 -22
- package/dist/standup/build.js +18 -18
- package/dist/{state-ITXJKXRE.js → state-JB47KHYV.js} +2 -2
- package/dist/state-JB47KHYV.js.map +1 -0
- package/dist/storage.d.ts +9 -3
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +17 -17
- package/dist/subject-config.js +4 -4
- package/dist/summarizer.js +6 -6
- package/dist/support-passport/index.js +77 -70
- package/dist/{trace-ZFVRH4GO.js → trace-LXXCMZJA.js} +3 -3
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +3 -3
- package/dist/transfer/export-okf.js +19 -19
- package/dist/{tui-55UJMJX7.js → tui-2Z5WOV7L.js} +3 -3
- package/dist/tui-2Z5WOV7L.js.map +1 -0
- package/dist/verified-recall.js +18 -18
- package/dist/who-knows-cli.js +19 -19
- package/dist/who-knows.js +18 -18
- package/dist/write-envelope.js +4 -4
- package/package.json +2 -2
- package/src/access-extraction-force-flush.ts +15 -7
- package/src/access-http-offline-stream.ts +3 -0
- package/src/access-mcp-output-schemas.ts +1 -0
- package/src/access-mcp.ts +90 -28
- package/src/access-service-health.test.ts +41 -5
- package/src/access-service-helpers.ts +1 -0
- package/src/access-service-observe-lcm-parity.test.ts +56 -24
- package/src/access-service.ts +7 -18
- package/src/console/state.test.ts +56 -0
- package/src/console/state.ts +83 -0
- package/src/correction/correction-access-wiring.ts +36 -8
- package/src/correction/correction-classify-parse.test.ts +178 -0
- package/src/embedding-fallback.ts +325 -141
- package/src/embedding-generation-lock.ts +141 -0
- package/src/embedding-index-storage.test.ts +245 -0
- package/src/embedding-index-storage.ts +1068 -0
- package/src/extraction-liveness.ts +13 -1
- package/src/extraction-llm-health.test.ts +103 -0
- package/src/extraction-llm-health.ts +71 -0
- package/src/index.ts +3 -3
- package/src/json-extract.ts +6 -0
- package/src/local-llm-thinking.test.ts +12 -0
- package/src/local-llm.ts +1 -0
- package/src/offline-sync-embedding-generation.test.ts +2173 -0
- package/src/offline-sync-embedding-generation.ts +885 -0
- package/src/offline-sync-exclude-globs.ts +112 -0
- package/src/offline-sync-file-io.ts +48 -0
- package/src/offline-sync-runtime-state.ts +48 -0
- package/src/offline-sync-snapshot-stream.ts +99 -0
- package/src/offline-sync-upload-staging.ts +291 -0
- package/src/offline-sync.test.ts +164 -1
- package/src/offline-sync.ts +458 -453
- package/src/orchestration/extraction-run.test.ts +55 -1
- package/src/orchestration/extraction-run.ts +13 -0
- package/src/orchestrator.ts +2 -1
- package/src/secure-store/secure-fs.ts +26 -6
- package/src/storage.ts +11 -6
- package/dist/chunk-3BTFBQLO.js.map +0 -1
- package/dist/chunk-3SG4FGDV.js.map +0 -1
- package/dist/chunk-6DTJBTHL.js.map +0 -1
- package/dist/chunk-AREGMX2J.js +0 -50
- package/dist/chunk-AREGMX2J.js.map +0 -1
- package/dist/chunk-C2WWQ4OR.js.map +0 -1
- package/dist/chunk-G6SVZWPB.js.map +0 -1
- package/dist/chunk-I53NAHZ4.js.map +0 -1
- package/dist/chunk-JN72EPOE.js.map +0 -1
- package/dist/chunk-QB75LKQQ.js.map +0 -1
- package/dist/chunk-RB776UH3.js.map +0 -1
- package/dist/chunk-RGMVMVMF.js.map +0 -1
- package/dist/chunk-S55WTPFJ.js.map +0 -1
- package/dist/chunk-SVZWVZ7E.js.map +0 -1
- package/dist/chunk-WQZZDN5M.js.map +0 -1
- /package/dist/{auto-sync-WEUDMXUW.js.map → auto-sync-U5N3CB5Y.js.map} +0 -0
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{capsule-merge-3MNURAQ3.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
- /package/dist/{chunk-JE334SIA.js.map → chunk-22DYJLFN.js.map} +0 -0
- /package/dist/{chunk-DGAWEJVI.js.map → chunk-2DLWLNO4.js.map} +0 -0
- /package/dist/{chunk-J3IWHCMF.js.map → chunk-2DT7PIDZ.js.map} +0 -0
- /package/dist/{chunk-NKFLHW7J.js.map → chunk-2NAD4YCI.js.map} +0 -0
- /package/dist/{chunk-SV72F4DS.js.map → chunk-2WLMWP2T.js.map} +0 -0
- /package/dist/{chunk-IVH7INFM.js.map → chunk-3O5BB45T.js.map} +0 -0
- /package/dist/{chunk-RDEUG2M2.js.map → chunk-3SGTV7RD.js.map} +0 -0
- /package/dist/{chunk-QOPB6KE3.js.map → chunk-3TB2XQ3C.js.map} +0 -0
- /package/dist/{chunk-C7JAUNFC.js.map → chunk-4KN2JLQV.js.map} +0 -0
- /package/dist/{chunk-TIQZNDZ5.js.map → chunk-4MP7XR5J.js.map} +0 -0
- /package/dist/{chunk-7DE2NOON.js.map → chunk-4O4XCBOS.js.map} +0 -0
- /package/dist/{chunk-SLEAJ67D.js.map → chunk-4OQET73E.js.map} +0 -0
- /package/dist/{chunk-Q3THVX75.js.map → chunk-4RL3JOB3.js.map} +0 -0
- /package/dist/{chunk-GDYU6VF4.js.map → chunk-5AYUHSAU.js.map} +0 -0
- /package/dist/{chunk-B47OHVFT.js.map → chunk-5E6RYRYW.js.map} +0 -0
- /package/dist/{chunk-2U3R3DDH.js.map → chunk-5FAGCOZD.js.map} +0 -0
- /package/dist/{chunk-CRKWSSS4.js.map → chunk-5MNUBT7T.js.map} +0 -0
- /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
- /package/dist/{chunk-7G6WUOLB.js.map → chunk-66DKTOBY.js.map} +0 -0
- /package/dist/{chunk-AZ2X5LNA.js.map → chunk-6LYAEM54.js.map} +0 -0
- /package/dist/{chunk-DUJYRVUD.js.map → chunk-6O2VUWV6.js.map} +0 -0
- /package/dist/{chunk-IMAP236M.js.map → chunk-6UQFJULG.js.map} +0 -0
- /package/dist/{chunk-2I6VHX6Q.js.map → chunk-76M5OK7V.js.map} +0 -0
- /package/dist/{chunk-OEBLZZKK.js.map → chunk-7XG7KMIW.js.map} +0 -0
- /package/dist/{chunk-FYAU4S6E.js.map → chunk-A4VSOUCB.js.map} +0 -0
- /package/dist/{chunk-GEX5NI36.js.map → chunk-AE5U5NMS.js.map} +0 -0
- /package/dist/{chunk-UNJOB4DY.js.map → chunk-AEHVZY3X.js.map} +0 -0
- /package/dist/{chunk-ML2MVAEZ.js.map → chunk-AEU4EQGV.js.map} +0 -0
- /package/dist/{chunk-JVY556FW.js.map → chunk-AWG3TIAY.js.map} +0 -0
- /package/dist/{chunk-JX6USXZR.js.map → chunk-AXC4WSF3.js.map} +0 -0
- /package/dist/{chunk-BOUFVFV2.js.map → chunk-AZSGSRIM.js.map} +0 -0
- /package/dist/{chunk-VZBW6CDG.js.map → chunk-B3O3IRZN.js.map} +0 -0
- /package/dist/{chunk-4V44AA7O.js.map → chunk-BGI4NUAO.js.map} +0 -0
- /package/dist/{chunk-BNPLDVM6.js.map → chunk-BJVO4H5C.js.map} +0 -0
- /package/dist/{chunk-S42HZILI.js.map → chunk-BLVR4WYU.js.map} +0 -0
- /package/dist/{chunk-JXMECXMF.js.map → chunk-BOZJD5PK.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-EVBI7S4J.js.map → chunk-C6U57KG4.js.map} +0 -0
- /package/dist/{chunk-T4BE5KJM.js.map → chunk-C7ZDKWPS.js.map} +0 -0
- /package/dist/{chunk-HKFJ3PF3.js.map → chunk-CRXRZA3G.js.map} +0 -0
- /package/dist/{chunk-NMBX4D7P.js.map → chunk-CZJA2EQE.js.map} +0 -0
- /package/dist/{chunk-BJX3VQWZ.js.map → chunk-D5BSQR63.js.map} +0 -0
- /package/dist/{chunk-MFZACYZ6.js.map → chunk-DGS34QSY.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-DQISIT63.js.map → chunk-DZ42MDZE.js.map} +0 -0
- /package/dist/{chunk-5ELENZTA.js.map → chunk-EDIH6X2P.js.map} +0 -0
- /package/dist/{chunk-C3QXITIP.js.map → chunk-EQUD7FP4.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-IA3X2Y4K.js.map → chunk-FJLQXMTU.js.map} +0 -0
- /package/dist/{chunk-TY446V34.js.map → chunk-FKD656D2.js.map} +0 -0
- /package/dist/{chunk-CLXTDOKV.js.map → chunk-FUNBJQYR.js.map} +0 -0
- /package/dist/{chunk-CLSYE5OZ.js.map → chunk-G2STTRYB.js.map} +0 -0
- /package/dist/{chunk-SQDKX4RW.js.map → chunk-GWM6T5EQ.js.map} +0 -0
- /package/dist/{chunk-AXDOF4VI.js.map → chunk-GZDTVYK2.js.map} +0 -0
- /package/dist/{chunk-55FCXCXJ.js.map → chunk-H56VY4BY.js.map} +0 -0
- /package/dist/{chunk-OM5BIPBR.js.map → chunk-H5BJWPUI.js.map} +0 -0
- /package/dist/{chunk-7QK5TUTW.js.map → chunk-HLB7GKGG.js.map} +0 -0
- /package/dist/{chunk-CHDGJJV6.js.map → chunk-HWLIMQE2.js.map} +0 -0
- /package/dist/{chunk-NAFPHFDM.js.map → chunk-JNLEJE4A.js.map} +0 -0
- /package/dist/{chunk-7UUKRS3J.js.map → chunk-JVPWRNHA.js.map} +0 -0
- /package/dist/{chunk-6ET2VII7.js.map → chunk-JYG2334B.js.map} +0 -0
- /package/dist/{chunk-2QG4SLZI.js.map → chunk-KF7PQ7G2.js.map} +0 -0
- /package/dist/{chunk-WIKO4SCR.js.map → chunk-LHRQBMJN.js.map} +0 -0
- /package/dist/{chunk-IFCKHPY4.js.map → chunk-LO4UKPKX.js.map} +0 -0
- /package/dist/{chunk-TEV2JGU5.js.map → chunk-LU7E2MXE.js.map} +0 -0
- /package/dist/{chunk-RJLV4BKR.js.map → chunk-LV5H6FTN.js.map} +0 -0
- /package/dist/{chunk-IBGEHKQ6.js.map → chunk-LW3HKRL7.js.map} +0 -0
- /package/dist/{chunk-3XQYM4RE.js.map → chunk-M6C7SOR6.js.map} +0 -0
- /package/dist/{chunk-T4QGUXCV.js.map → chunk-MXCAJKMA.js.map} +0 -0
- /package/dist/{chunk-BMYZTZ5D.js.map → chunk-MY7B3HYC.js.map} +0 -0
- /package/dist/{chunk-NB3LRY4T.js.map → chunk-N4PYB235.js.map} +0 -0
- /package/dist/{chunk-S3YM4SZQ.js.map → chunk-N7QV3CMX.js.map} +0 -0
- /package/dist/{chunk-3GN2PEOT.js.map → chunk-NYKIUQL6.js.map} +0 -0
- /package/dist/{chunk-L2LBMKSI.js.map → chunk-OK52IY3W.js.map} +0 -0
- /package/dist/{chunk-WB2I2EQK.js.map → chunk-P2ODTYOF.js.map} +0 -0
- /package/dist/{chunk-RIEX7NOZ.js.map → chunk-PEBHPCX2.js.map} +0 -0
- /package/dist/{chunk-VYCOJKSX.js.map → chunk-PO7NXNGC.js.map} +0 -0
- /package/dist/{chunk-XAITGGX5.js.map → chunk-Q4AUIFUA.js.map} +0 -0
- /package/dist/{chunk-EU3N5MK3.js.map → chunk-QAW55ZHJ.js.map} +0 -0
- /package/dist/{chunk-I4G4UWQA.js.map → chunk-QI2E6ISQ.js.map} +0 -0
- /package/dist/{chunk-CK5U7JGH.js.map → chunk-QI7K7BZ5.js.map} +0 -0
- /package/dist/{chunk-VTPASHTO.js.map → chunk-R3X2T2LP.js.map} +0 -0
- /package/dist/{chunk-EJPF6XDQ.js.map → chunk-RDJ6C7NZ.js.map} +0 -0
- /package/dist/{chunk-2UPTRDGM.js.map → chunk-SCXURCVT.js.map} +0 -0
- /package/dist/{chunk-N3MNDVJO.js.map → chunk-SWBC3UER.js.map} +0 -0
- /package/dist/{chunk-ZTHGFTMW.js.map → chunk-TKC5LZ43.js.map} +0 -0
- /package/dist/{chunk-YRLHEEQT.js.map → chunk-U6VC6RP3.js.map} +0 -0
- /package/dist/{chunk-MOQPEFLN.js.map → chunk-UP75KL3L.js.map} +0 -0
- /package/dist/{chunk-D5F7TKMH.js.map → chunk-V4JZCTMK.js.map} +0 -0
- /package/dist/{chunk-NAYBHNGN.js.map → chunk-VALKBYBN.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-H36X4NRH.js.map → chunk-VVX5PZFS.js.map} +0 -0
- /package/dist/{chunk-RCQKAOOB.js.map → chunk-W3XXFPRI.js.map} +0 -0
- /package/dist/{chunk-W75BBBSY.js.map → chunk-WKY7N3L7.js.map} +0 -0
- /package/dist/{chunk-GZAGLCQH.js.map → chunk-X5SHE2O3.js.map} +0 -0
- /package/dist/{chunk-OAOBL6OY.js.map → chunk-XOV7NRY5.js.map} +0 -0
- /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
- /package/dist/{chunk-IP5VLSLO.js.map → chunk-YJ7MW627.js.map} +0 -0
- /package/dist/{chunk-HS75MCQF.js.map → chunk-YRULQW5J.js.map} +0 -0
- /package/dist/{chunk-DINRT75P.js.map → chunk-YSBL7VPO.js.map} +0 -0
- /package/dist/{chunk-QWUJWBZ5.js.map → chunk-Z3O53WZR.js.map} +0 -0
- /package/dist/{chunk-KERNN6BC.js.map → chunk-Z5LP6ILP.js.map} +0 -0
- /package/dist/{chunk-5FNZ3G6X.js.map → chunk-Z6EZCN6Z.js.map} +0 -0
- /package/dist/{chunk-JS3S2HVG.js.map → chunk-ZZZ4I455.js.map} +0 -0
- /package/dist/{contradiction-scan-5EJYRKD3.js.map → contradiction-scan-TAGMOUQ2.js.map} +0 -0
- /package/dist/{graph-edge-decay-PVKDKLQK.js.map → embedding-generation-lock.js.map} +0 -0
- /package/dist/{resolution-UYJU5JUA.js.map → embedding-index-storage.js.map} +0 -0
- /package/dist/{state-ITXJKXRE.js.map → extraction-llm-health.js.map} +0 -0
- /package/dist/{first-start-migration-GAT7G733.js.map → first-start-migration-7OATHJKB.js.map} +0 -0
- /package/dist/{tui-55UJMJX7.js.map → graph-edge-decay-MKIRZ762.js.map} +0 -0
- /package/dist/{trace-ZFVRH4GO.js.map → trace-LXXCMZJA.js.map} +0 -0
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* the verdict never diverges across code paths.
|
|
20
20
|
*/
|
|
21
21
|
import { coerceBool, coerceNumber } from "./connectors/coerce.js";
|
|
22
|
+
import { getExtractionLlmHealth } from "./extraction-llm-health.js";
|
|
22
23
|
import { log } from "./logger.js";
|
|
23
24
|
import type { OperatorDoctorCheck } from "./operator-doctor-types.js";
|
|
24
25
|
import type { PluginConfig } from "./types.js";
|
|
@@ -121,6 +122,15 @@ export interface ExtractionLivenessStatus {
|
|
|
121
122
|
degradedReason: string | null;
|
|
122
123
|
watermarkPending?: boolean;
|
|
123
124
|
watermarkScope: "aggregate";
|
|
125
|
+
/**
|
|
126
|
+
* Extraction-LLM availability (issue #3140): outcome of the last extraction
|
|
127
|
+
* attempt. `lastFailureReason` is non-null exactly while `llmReachable` is
|
|
128
|
+
* false. Populated by the daemon-wide status readers (`/health`, doctor,
|
|
129
|
+
* stats), not by the pure evaluators below.
|
|
130
|
+
*/
|
|
131
|
+
llmReachable?: boolean;
|
|
132
|
+
lastFailureReason?: string | null;
|
|
133
|
+
lastFailureAt?: string | null;
|
|
124
134
|
}
|
|
125
135
|
|
|
126
136
|
interface ExtractionLivenessOrchestratorLike {
|
|
@@ -380,7 +390,9 @@ export async function computeExtractionLivenessStatus(
|
|
|
380
390
|
nowMs,
|
|
381
391
|
});
|
|
382
392
|
throttle?.maybeWarn(status, config.staleWindowMs, nowMs);
|
|
383
|
-
|
|
393
|
+
// Extraction-LLM availability (#3140): a silent no_models / LLM-unreachable
|
|
394
|
+
// outage must be visible on /health (and doctor/stats) without debug logs.
|
|
395
|
+
return { ...status, ...getExtractionLlmHealth() };
|
|
384
396
|
}
|
|
385
397
|
|
|
386
398
|
/**
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction-LLM health surfacing (issue #3140).
|
|
3
|
+
*
|
|
4
|
+
* Covers the three #3140 surfaces:
|
|
5
|
+
* 1. the singleton tracker that `/health.extraction` reads for LLM
|
|
6
|
+
* availability + last failure reason,
|
|
7
|
+
* 2. the ERROR-level, per-reason-deduplicated failure event emitted by the
|
|
8
|
+
* extraction run instead of debug-only lines,
|
|
9
|
+
* 3. the runExtraction integration recording failures/successes.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import assert from "node:assert/strict";
|
|
13
|
+
import test from "node:test";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
emitExtractionLlmFailureError,
|
|
17
|
+
getExtractionLlmHealth,
|
|
18
|
+
recordExtractionLlmFailure,
|
|
19
|
+
recordExtractionLlmSuccess,
|
|
20
|
+
resetExtractionLlmHealthForTests,
|
|
21
|
+
} from "./extraction-llm-health.js";
|
|
22
|
+
import { log } from "./logger.js";
|
|
23
|
+
|
|
24
|
+
test("tracker: starts reachable with no failure recorded", () => {
|
|
25
|
+
resetExtractionLlmHealthForTests();
|
|
26
|
+
try {
|
|
27
|
+
assert.deepEqual(getExtractionLlmHealth(), {
|
|
28
|
+
llmReachable: true,
|
|
29
|
+
lastFailureReason: null,
|
|
30
|
+
lastFailureAt: null,
|
|
31
|
+
});
|
|
32
|
+
} finally {
|
|
33
|
+
resetExtractionLlmHealthForTests();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("tracker: a failure marks the extractor unavailable with the last reason (health payload, non-debug)", () => {
|
|
38
|
+
resetExtractionLlmHealthForTests();
|
|
39
|
+
try {
|
|
40
|
+
recordExtractionLlmFailure("no_models", 1_000);
|
|
41
|
+
const health = getExtractionLlmHealth();
|
|
42
|
+
assert.equal(health.llmReachable, false);
|
|
43
|
+
assert.equal(health.lastFailureReason, "no_models");
|
|
44
|
+
assert.equal(health.lastFailureAt, new Date(1_000).toISOString());
|
|
45
|
+
|
|
46
|
+
recordExtractionLlmFailure("local_llm_unavailable", 2_000);
|
|
47
|
+
assert.equal(getExtractionLlmHealth().lastFailureReason, "local_llm_unavailable");
|
|
48
|
+
} finally {
|
|
49
|
+
resetExtractionLlmHealthForTests();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("tracker: a later success clears the failure so llmReachable and the reason agree", () => {
|
|
54
|
+
resetExtractionLlmHealthForTests();
|
|
55
|
+
try {
|
|
56
|
+
recordExtractionLlmFailure("no_models");
|
|
57
|
+
recordExtractionLlmSuccess();
|
|
58
|
+
assert.deepEqual(getExtractionLlmHealth(), {
|
|
59
|
+
llmReachable: true,
|
|
60
|
+
lastFailureReason: null,
|
|
61
|
+
lastFailureAt: null,
|
|
62
|
+
});
|
|
63
|
+
} finally {
|
|
64
|
+
resetExtractionLlmHealthForTests();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("dedup: the first failure of a reason logs at ERROR level, repeats are suppressed", () => {
|
|
69
|
+
resetExtractionLlmHealthForTests();
|
|
70
|
+
const errors: string[] = [];
|
|
71
|
+
const debugs: string[] = [];
|
|
72
|
+
const originalError = log.error;
|
|
73
|
+
const originalDebug = log.debug;
|
|
74
|
+
log.error = (message: unknown) => {
|
|
75
|
+
errors.push(String(message));
|
|
76
|
+
};
|
|
77
|
+
log.debug = (message: unknown) => {
|
|
78
|
+
debugs.push(String(message));
|
|
79
|
+
};
|
|
80
|
+
try {
|
|
81
|
+
assert.equal(emitExtractionLlmFailureError("no_models", "auth_config", 0), true);
|
|
82
|
+
assert.equal(errors.length, 1);
|
|
83
|
+
assert.match(errors[0] ?? "", /no_models/);
|
|
84
|
+
|
|
85
|
+
// Same reason inside the window: suppressed to debug, no second ERROR.
|
|
86
|
+
assert.equal(emitExtractionLlmFailureError("no_models", "auth_config", 60_000), false);
|
|
87
|
+
assert.equal(errors.length, 1);
|
|
88
|
+
assert.equal(debugs.length, 1);
|
|
89
|
+
|
|
90
|
+
// A different reason emits its own first ERROR.
|
|
91
|
+
assert.equal(emitExtractionLlmFailureError("local_llm_unavailable", undefined, 60_000), true);
|
|
92
|
+
assert.equal(errors.length, 2);
|
|
93
|
+
assert.match(errors[1] ?? "", /local_llm_unavailable/);
|
|
94
|
+
|
|
95
|
+
// Outside the window the same reason emits again.
|
|
96
|
+
assert.equal(emitExtractionLlmFailureError("no_models", undefined, 3_600_000), true);
|
|
97
|
+
assert.equal(errors.length, 3);
|
|
98
|
+
} finally {
|
|
99
|
+
log.error = originalError;
|
|
100
|
+
log.debug = originalDebug;
|
|
101
|
+
resetExtractionLlmHealthForTests();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction-LLM availability tracking surfaced on `/health` (issue #3140).
|
|
3
|
+
*
|
|
4
|
+
* A failing extraction LLM (unreachable endpoint, gateway with no models)
|
|
5
|
+
* used to surface only as debug-level lines while extraction silently skipped
|
|
6
|
+
* persistence and the buffer grew for days. The extraction run records every
|
|
7
|
+
* attempt outcome here; the access `/health` payload reads the last outcome so
|
|
8
|
+
* an unavailable extractor is visible without debug logs, and each distinct
|
|
9
|
+
* failure reason logs at ERROR level at most once per window instead of once
|
|
10
|
+
* per failed flush.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { log } from "./logger.js";
|
|
14
|
+
|
|
15
|
+
export interface ExtractionLlmHealth {
|
|
16
|
+
/** Whether the LAST extraction attempt completed without a failure marker. */
|
|
17
|
+
llmReachable: boolean;
|
|
18
|
+
/** `failureReason` of the last failed attempt; null while reachable. */
|
|
19
|
+
lastFailureReason: string | null;
|
|
20
|
+
/** ISO timestamp of the last failed attempt; null while reachable. */
|
|
21
|
+
lastFailureAt: string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** One ERROR line per distinct reason per window; repeats stay at debug. */
|
|
25
|
+
const DEDUP_WINDOW_MS = 3_600_000;
|
|
26
|
+
|
|
27
|
+
let lastFailureReason: string | null = null;
|
|
28
|
+
let lastFailureAtMs: number | null = null;
|
|
29
|
+
const lastErrorEmitByReason = new Map<string, number>();
|
|
30
|
+
|
|
31
|
+
export function recordExtractionLlmSuccess(): void {
|
|
32
|
+
lastFailureReason = null;
|
|
33
|
+
lastFailureAtMs = null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function recordExtractionLlmFailure(reason: string, atMs: number = Date.now()): void {
|
|
37
|
+
lastFailureReason = reason;
|
|
38
|
+
lastFailureAtMs = atMs;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getExtractionLlmHealth(): ExtractionLlmHealth {
|
|
42
|
+
return {
|
|
43
|
+
llmReachable: lastFailureReason === null,
|
|
44
|
+
lastFailureReason,
|
|
45
|
+
lastFailureAt: lastFailureAtMs === null ? null : new Date(lastFailureAtMs).toISOString(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* ERROR-level, deduplicated failure event (issue #3140): the first failure of
|
|
51
|
+
* a given reason inside the window logs at error level; repeats inside the
|
|
52
|
+
* window log at debug so the backoff retry loop cannot flood the transcript
|
|
53
|
+
* while the outage stays visible. Returns whether the error line was emitted.
|
|
54
|
+
*/
|
|
55
|
+
export function emitExtractionLlmFailureError(reason: string, detail?: string, nowMs: number = Date.now()): boolean {
|
|
56
|
+
const suffix = detail ? `: ${detail}` : "";
|
|
57
|
+
const last = lastErrorEmitByReason.get(reason);
|
|
58
|
+
if (last !== undefined && nowMs - last < DEDUP_WINDOW_MS) {
|
|
59
|
+
log.debug(`extraction failure repeat suppressed for ${DEDUP_WINDOW_MS / 60_000}m: ${reason}${suffix}`);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
lastErrorEmitByReason.set(reason, nowMs);
|
|
63
|
+
log.error(`extraction failed with no durable outputs (buffer retained for retry): ${reason}${suffix}`);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Test seam: restore pristine singleton state. */
|
|
68
|
+
export function resetExtractionLlmHealthForTests(): void {
|
|
69
|
+
recordExtractionLlmSuccess();
|
|
70
|
+
lastErrorEmitByReason.clear();
|
|
71
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -876,12 +876,12 @@ export {
|
|
|
876
876
|
type OfflineSyncFileRecord,
|
|
877
877
|
type OfflineSyncFileContentChunk,
|
|
878
878
|
type OfflineSyncRecordDeletionRevision,
|
|
879
|
-
type OfflineSyncFileState,
|
|
880
|
-
type OfflineSyncFileTarget,
|
|
881
|
-
type OfflineSyncFileWriteTarget,
|
|
879
|
+
type OfflineSyncFileState, type OfflineSyncFileTarget, type OfflineSyncFileWriteTarget,
|
|
882
880
|
type OfflineSyncSnapshot,
|
|
883
881
|
type OfflineSyncState,
|
|
884
882
|
} from "./offline-sync.js";
|
|
883
|
+
export { embeddingGenerationMembership, divergedEmbeddingGenerationDeferrals } from "./offline-sync-embedding-generation.js";
|
|
884
|
+
export { EmbeddingIndexCapacityError, EmbeddingIndexFileStore, EmbeddingIndexStorageError, parseEmbeddingIndexDocument, serializeEmbeddingShard, shardEntriesForIndex, shardIndexOf, validateShardMembership } from "./embedding-index-storage.js";
|
|
885
885
|
|
|
886
886
|
// ---------------------------------------------------------------------------
|
|
887
887
|
// Memory Extension Host (#382)
|
package/src/json-extract.ts
CHANGED
|
@@ -21,6 +21,12 @@ export function extractJsonCandidates(text: string): string[] {
|
|
|
21
21
|
const cleaned = stripCodeFences(trimmed);
|
|
22
22
|
const candidates: string[] = [];
|
|
23
23
|
|
|
24
|
+
// Verbatim balanced blocks FIRST: stripCodeFences rewrites every ``` pair, so
|
|
25
|
+
// a stripped candidate can parse while carrying altered content (e.g. a
|
|
26
|
+
// patch value that embeds an inner code block). A string-aware balanced scan
|
|
27
|
+
// of the unstripped text yields the payload unmodified; stripped candidates
|
|
28
|
+
// remain as later fallbacks for shapes the raw scan cannot cut.
|
|
29
|
+
candidates.push(...scanBalancedJsonBlocks(trimmed));
|
|
24
30
|
if (cleaned.length > 0) candidates.push(cleaned);
|
|
25
31
|
candidates.push(...scanBalancedJsonBlocks(cleaned));
|
|
26
32
|
|
|
@@ -356,3 +356,15 @@ test("request-level thinking override leaves short extraction thinking enabled (
|
|
|
356
356
|
}
|
|
357
357
|
assert.equal("reasoning_effort" in (bodies[0] ?? {}), false);
|
|
358
358
|
});
|
|
359
|
+
|
|
360
|
+
test("disableThinking injects chat_template_kwargs for correction classify (#3134)", async () => {
|
|
361
|
+
const client = new LocalLlmClient(createConfig());
|
|
362
|
+
primeClient(client, { thinking: true, detected: "lmstudio" });
|
|
363
|
+
const { restore, bodies } = captureFetchBodies();
|
|
364
|
+
try {
|
|
365
|
+
await runOneChatCompletion(client, "correction-classify");
|
|
366
|
+
} finally {
|
|
367
|
+
restore();
|
|
368
|
+
}
|
|
369
|
+
assert.deepEqual(bodies[0]?.chat_template_kwargs, { enable_thinking: false });
|
|
370
|
+
});
|