@remnic/core 9.65.8 → 9.66.1
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.d.ts +11 -12
- package/dist/access-admin-ops-surface.js +54 -51
- package/dist/access-authorization-probe.d.ts +11 -12
- package/dist/access-authorization-probe.js +55 -52
- package/dist/access-boundary.d.ts +11 -12
- package/dist/access-boundary.js +54 -51
- package/dist/access-citation-namespace.js +3 -3
- package/dist/access-cli.js +132 -125
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -2
- package/dist/access-coding-context-resolution.js +2 -2
- package/dist/access-extraction-force-flush.d.ts +11 -12
- package/dist/access-extraction-force-flush.js +54 -51
- package/dist/access-health-types.d.ts +1 -2
- package/dist/access-http-lcm-compaction.d.ts +11 -12
- package/dist/access-http-lifecycle-flush.d.ts +11 -12
- package/dist/access-http-offline-stream.d.ts +11 -12
- package/dist/access-http-query.d.ts +2 -3
- package/dist/access-http-query.js +56 -53
- package/dist/access-http.d.ts +12 -13
- package/dist/access-http.js +77 -74
- package/dist/access-identity-continuity-surface.d.ts +9 -10
- package/dist/access-identity-continuity-surface.js +54 -51
- package/dist/access-lcm-surface.d.ts +11 -12
- package/dist/access-lcm-surface.js +54 -51
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +11 -12
- package/dist/access-mcp.js +67 -64
- package/dist/access-memory-search-fanout.d.ts +2 -3
- package/dist/{access-namespace-preflight-CpAOrS-9.d.ts → access-namespace-preflight-50VIkPhB.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -4
- package/dist/access-namespace-preflight.js +54 -51
- package/dist/access-observe-write-surface.d.ts +11 -12
- package/dist/access-observe-write-surface.js +54 -51
- package/dist/access-offline-manifest.d.ts +9 -10
- package/dist/access-offline-manifest.js +15 -15
- package/dist/access-operations-batch.js +59 -56
- package/dist/access-operations.d.ts +12 -13
- package/dist/access-operations.js +64 -61
- package/dist/access-recall-concurrency.d.ts +11 -12
- package/dist/access-recall-concurrency.js +54 -51
- package/dist/access-recall-response.d.ts +11 -12
- package/dist/access-recall-response.js +54 -51
- package/dist/access-recall-surface.d.ts +11 -12
- package/dist/access-recall-surface.js +54 -51
- package/dist/access-schema.d.ts +12 -12
- package/dist/access-schema.js +5 -5
- package/dist/{access-service-Diu61Cfv.d.ts → access-service-C2tV2-uL.d.ts} +8 -8
- package/dist/access-service-helpers.d.ts +11 -12
- package/dist/access-service.d.ts +11 -12
- package/dist/access-service.js +54 -51
- package/dist/access-surface-catalog.d.ts +11 -12
- package/dist/access-surface-catalog.js +58 -53
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +3 -4
- package/dist/action-confidence.d.ts +1 -2
- package/dist/active-memory-bridge.d.ts +1 -2
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +1 -2
- package/dist/active-recall.js +11 -11
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +1 -2
- package/dist/artifact-search.d.ts +1 -2
- package/dist/{auto-sync-2YPITIWN.js → auto-sync-Q6Q2FVSC.js} +9 -9
- package/dist/behavior-learner.d.ts +1 -2
- package/dist/behavior-signals.d.ts +1 -2
- package/dist/bootstrap.d.ts +9 -10
- package/dist/briefing-window.d.ts +2 -3
- package/dist/briefing.d.ts +2 -3
- package/dist/briefing.js +28 -28
- package/dist/buffer-surprise-report.d.ts +1 -2
- package/dist/buffer-turn-helpers.d.ts +1 -2
- package/dist/buffer.d.ts +2 -3
- package/dist/buffer.js +20 -4
- package/dist/bulk-import/index.d.ts +3 -4
- package/dist/calibration.d.ts +1 -2
- package/dist/calibration.js +1 -1
- package/dist/capabilities.d.ts +1 -2
- package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
- package/dist/{catalog-9f-vEQLS.d.ts → catalog-C2jA-gLm.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -2
- package/dist/causal-consolidation.d.ts +1 -2
- package/dist/causal-consolidation.js +29 -29
- package/dist/causal-trajectory-graph.d.ts +1 -2
- package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
- package/dist/{chunk-TFR3HG4K.js → chunk-2FA7U5XY.js} +4 -4
- package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
- package/dist/{chunk-W2BAGGEW.js → chunk-2ITZ74A6.js} +40 -31
- package/dist/{chunk-W2BAGGEW.js.map → chunk-2ITZ74A6.js.map} +1 -1
- package/dist/{chunk-MY2BC6UE.js → chunk-2X6BGKQL.js} +11 -11
- package/dist/{chunk-UEBDCMOO.js → chunk-3TSU662L.js} +3 -3
- package/dist/{chunk-XAB6STPO.js → chunk-46XR5FNZ.js} +53 -3
- package/dist/chunk-46XR5FNZ.js.map +1 -0
- package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
- package/dist/chunk-4OFKZAJG.js.map +1 -0
- package/dist/{chunk-S5XOSTYM.js → chunk-4XLTUR6R.js} +3 -3
- package/dist/{chunk-BWGCOLEL.js → chunk-65JOGLIS.js} +2 -2
- package/dist/{chunk-HMZKGHMD.js → chunk-7UOXCCCI.js} +3 -3
- package/dist/{chunk-7WOWGRAU.js → chunk-AF5H7TKI.js} +108 -23
- package/dist/chunk-AF5H7TKI.js.map +1 -0
- package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
- package/dist/chunk-AJTG3CP7.js.map +1 -0
- package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
- package/dist/chunk-AL3UYZ5N.js.map +1 -0
- package/dist/{chunk-4F4AQFWL.js → chunk-B4AOWRYF.js} +10 -10
- package/dist/{chunk-ODU2CNNX.js → chunk-C5IUOBCN.js} +2 -2
- package/dist/{chunk-3A2NJP2U.js → chunk-CHGG74CY.js} +3 -3
- package/dist/{chunk-76DIF5KT.js → chunk-CX4OLNIH.js} +2 -2
- package/dist/{chunk-Z3YEGSR4.js → chunk-D3UXGE5D.js} +10 -10
- package/dist/{chunk-5HK3CJAR.js → chunk-D6Q5EPOV.js} +2 -2
- package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
- package/dist/{chunk-XBGHAAKR.js → chunk-DDX6KIXF.js} +2 -2
- package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
- package/dist/{chunk-7KQB4EBS.js → chunk-DUAJKRR2.js} +2 -2
- package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
- package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
- package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
- package/dist/{chunk-DPCXDG7G.js → chunk-EH65UV2Z.js} +2 -2
- package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
- package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
- package/dist/{chunk-TUHBYJXL.js → chunk-EWKVYCFP.js} +1 -1
- package/dist/{chunk-NPFUNWNX.js → chunk-FFUMTH27.js} +2 -2
- package/dist/{chunk-3PKAS6VL.js → chunk-GAJK3DQ5.js} +2 -2
- package/dist/{chunk-DA7ITC5Z.js → chunk-GBEOUCBB.js} +2 -2
- package/dist/{chunk-UENKPWCS.js → chunk-H2IRSXZN.js} +6 -6
- package/dist/{chunk-CFVTRUR3.js → chunk-H6RSANGQ.js} +2 -2
- package/dist/chunk-HVAEXYPL.js +98 -0
- package/dist/chunk-HVAEXYPL.js.map +1 -0
- package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
- package/dist/{chunk-3SZD4CYO.js → chunk-IGZCAHFL.js} +3 -3
- package/dist/{chunk-UPFNQJC7.js → chunk-INUBU6I5.js} +2 -2
- package/dist/{chunk-PMVPCZJZ.js → chunk-J2R275FN.js} +3 -3
- package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
- package/dist/chunk-JALOAKSZ.js.map +1 -0
- package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
- package/dist/{chunk-3BCULS4U.js → chunk-JKTV3JNX.js} +145 -507
- package/dist/chunk-JKTV3JNX.js.map +1 -0
- package/dist/{chunk-5ACCD4L7.js → chunk-JRRQ747T.js} +7 -7
- package/dist/{chunk-V4IDF3EZ.js → chunk-JTWZKNUH.js} +5 -5
- package/dist/{chunk-AZMLH5UT.js → chunk-KI64TTBL.js} +2 -2
- package/dist/{chunk-DEACDKE3.js → chunk-KJXCD7VR.js} +112 -87
- package/dist/chunk-KJXCD7VR.js.map +1 -0
- package/dist/chunk-LJABGXC4.js +267 -0
- package/dist/chunk-LJABGXC4.js.map +1 -0
- package/dist/{chunk-NPIBN2VL.js → chunk-LK4TOYPU.js} +2 -2
- package/dist/{chunk-UTQUEHC7.js → chunk-LUDBXTBJ.js} +8 -8
- package/dist/{chunk-PU56CXZA.js → chunk-LYUUA6QB.js} +2 -2
- package/dist/{chunk-P36Z4JRA.js → chunk-M5ERTI4I.js} +2 -2
- package/dist/{chunk-LDKPDODJ.js → chunk-ME35HVDJ.js} +2 -2
- package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
- package/dist/{chunk-OXRRJXPR.js → chunk-MUEGIKKY.js} +476 -1796
- package/dist/chunk-MUEGIKKY.js.map +1 -0
- package/dist/{chunk-AHPIFKNG.js → chunk-N4F7ZSSG.js} +2 -2
- package/dist/{chunk-JOZUBF4A.js → chunk-NACLNNFQ.js} +2 -2
- package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
- package/dist/{chunk-T7XP6IZE.js → chunk-NFP4KPTA.js} +2 -2
- package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
- package/dist/{chunk-LPNCR4QK.js → chunk-NSTNGMSS.js} +14 -14
- package/dist/{chunk-5RWZH6PH.js → chunk-NUF7VSEX.js} +2 -2
- package/dist/{chunk-7VZFRUQU.js → chunk-O7ERGZDA.js} +5 -5
- package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
- package/dist/{chunk-5DHKCO52.js → chunk-OJUEUQDJ.js} +2 -2
- package/dist/{chunk-LOXHYCVS.js → chunk-OMX6TKXH.js} +2 -2
- package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
- package/dist/{chunk-SEEJOGQX.js → chunk-QBNE55VA.js} +4 -4
- package/dist/chunk-QJCWK2A7.js +1466 -0
- package/dist/chunk-QJCWK2A7.js.map +1 -0
- package/dist/{chunk-YEUXERJ6.js → chunk-RDGKVH6T.js} +7 -3
- package/dist/{chunk-YEUXERJ6.js.map → chunk-RDGKVH6T.js.map} +1 -1
- package/dist/{chunk-JYSN42VN.js → chunk-RPIS5FQ7.js} +237 -183
- package/dist/chunk-RPIS5FQ7.js.map +1 -0
- package/dist/{chunk-F7XUD3PL.js → chunk-S4CDUXQY.js} +2 -2
- package/dist/{chunk-WNXYT4MK.js → chunk-S4Z2OBTX.js} +4 -4
- package/dist/{chunk-UL4MKZHI.js → chunk-SN4JXNLL.js} +2 -2
- package/dist/{chunk-CAMNRAJF.js → chunk-SZMYGDSM.js} +2 -2
- package/dist/chunk-TB2MJRI6.js +866 -0
- package/dist/chunk-TB2MJRI6.js.map +1 -0
- package/dist/{chunk-XNWXSGHS.js → chunk-TBCDF556.js} +28 -10
- package/dist/chunk-TBCDF556.js.map +1 -0
- package/dist/{chunk-LKYIOCWL.js → chunk-TCF4MU7L.js} +967 -132
- package/dist/chunk-TCF4MU7L.js.map +1 -0
- package/dist/chunk-TCQRIIIN.js +202 -0
- package/dist/chunk-TCQRIIIN.js.map +1 -0
- package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
- package/dist/chunk-TEZ2HTC7.js.map +1 -0
- package/dist/{chunk-CPA5NBHN.js → chunk-TNGH4ZYI.js} +2 -2
- package/dist/{chunk-F3NVYTTA.js → chunk-TNXNECAN.js} +6 -6
- package/dist/{chunk-BEC4YBNA.js → chunk-TVW4C7PV.js} +2 -2
- package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
- package/dist/{chunk-KZIF6XHX.js → chunk-U65VJSCJ.js} +32 -19
- package/dist/chunk-U65VJSCJ.js.map +1 -0
- package/dist/{chunk-4QEYREAV.js → chunk-U6NGKS32.js} +8 -8
- package/dist/{chunk-HRHO3ZNG.js → chunk-UW4RYPWC.js} +2 -2
- package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
- package/dist/chunk-UYA36DQ7.js.map +1 -0
- package/dist/{chunk-T6ILXUAH.js → chunk-VG4SSPAW.js} +2 -2
- package/dist/chunk-VOSWUO3K.js +100 -0
- package/dist/chunk-VOSWUO3K.js.map +1 -0
- package/dist/chunk-WFCWP4XU.js +17 -0
- package/dist/chunk-WFCWP4XU.js.map +1 -0
- package/dist/{chunk-H2YSH3DG.js → chunk-WKAXBXVA.js} +2 -2
- package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
- package/dist/{chunk-UNUMFURP.js → chunk-X5PIDJ3L.js} +3 -3
- package/dist/{chunk-CRML27CO.js → chunk-X5YYSAZX.js} +4 -4
- package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
- package/dist/{chunk-U7EW2W4W.js → chunk-XKNHFDTT.js} +26 -6
- package/dist/chunk-XKNHFDTT.js.map +1 -0
- package/dist/{chunk-OA2O2GJ4.js → chunk-XOHYGIWF.js} +3 -3
- package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
- package/dist/{chunk-MINHJ55X.js → chunk-XXW32OL7.js} +1 -1
- package/dist/{chunk-MINHJ55X.js.map → chunk-XXW32OL7.js.map} +1 -1
- package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
- package/dist/{chunk-MDD2RINF.js → chunk-YWPLOJ7T.js} +3 -3
- package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
- package/dist/{chunk-GTO56JY5.js → chunk-ZPS724LT.js} +2 -2
- package/dist/{chunk-SNOIKAHM.js → chunk-ZZZWEDF4.js} +3 -3
- package/dist/{cli-O3F-ht3i.d.ts → cli-CsfFMe6n.d.ts} +5 -5
- package/dist/cli.d.ts +13 -14
- package/dist/cli.js +101 -96
- package/dist/coding/export-okf-codegraph.d.ts +56 -0
- package/dist/coding/export-okf-codegraph.js +526 -0
- package/dist/coding/export-okf-codegraph.js.map +1 -0
- package/dist/coding/pre-action-gate.d.ts +1 -2
- package/dist/compounding/engine.d.ts +2 -3
- package/dist/compounding/engine.js +29 -29
- package/dist/compounding/preference-consolidator.d.ts +1 -2
- package/dist/compression-optimizer.d.ts +1 -2
- package/dist/config.d.ts +1 -2
- package/dist/config.js +11 -11
- package/dist/connectors/codex-materialize-runner.d.ts +1 -2
- package/dist/connectors/codex-materialize-runner.js +28 -28
- package/dist/connectors/codex-materialize.d.ts +1 -2
- package/dist/connectors/index.d.ts +1 -2
- package/dist/connectors/index.js +28 -28
- package/dist/consolidation-provenance-check.d.ts +2 -3
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +2 -3
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +3 -4
- package/dist/contradiction/index.js +9 -9
- package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
- package/dist/converge-config.d.ts +1 -2
- package/dist/convergence-refresh.d.ts +2 -3
- package/dist/convergence-refresh.js +30 -30
- package/dist/conversation-index/backend.d.ts +1 -2
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +1 -2
- package/dist/conversation-index/faiss-adapter.d.ts +1 -2
- package/dist/conversation-index/indexer.d.ts +1 -2
- package/dist/conversation-index/search.d.ts +1 -2
- package/dist/corpus-watermark.d.ts +1 -2
- package/dist/corpus-watermark.js +30 -30
- package/dist/cross-lingual-recall.d.ts +1 -2
- package/dist/day-summary.d.ts +1 -2
- package/dist/delinearize.d.ts +1 -2
- package/dist/dependency-propagation-config.d.ts +1 -2
- package/dist/{dependency-propagation-delivery-CL6RWXTA.d.ts → dependency-propagation-delivery-D4WMbOwA.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -2
- package/dist/direct-answer.d.ts +1 -2
- package/dist/embedding-fallback.d.ts +1 -2
- package/dist/enrichment/index.d.ts +1 -2
- package/dist/entity-origin-fields.d.ts +1 -2
- package/dist/entity-retrieval.d.ts +2 -3
- package/dist/entity-retrieval.js +28 -28
- package/dist/entity-schema.d.ts +1 -2
- package/dist/episodic-context.d.ts +1 -2
- package/dist/eval-trajectory-contracts.d.ts +1 -2
- package/dist/eval-trajectory-store.d.ts +1 -2
- package/dist/eval-trajectory.d.ts +1 -2
- package/dist/explicit-capture.d.ts +9 -10
- package/dist/explicit-capture.js +11 -11
- package/dist/external-wiki-access.d.ts +11 -12
- package/dist/external-wiki-access.js +55 -52
- package/dist/external-wiki-collection-registration.d.ts +1 -2
- package/dist/external-wiki-collection.d.ts +1 -2
- package/dist/external-wiki-mcp-tools.d.ts +11 -12
- package/dist/extraction-error-classification.d.ts +1 -2
- package/dist/extraction-faithfulness.d.ts +1 -2
- package/dist/extraction-faithfulness.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +1 -2
- package/dist/extraction-judge-training.d.ts +1 -2
- package/dist/extraction-judge.d.ts +1 -2
- package/dist/extraction-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +1 -2
- package/dist/extraction-normalization.d.ts +1 -2
- package/dist/extraction-prompt.d.ts +1 -2
- package/dist/extraction-source-grounding-rules.d.ts +1 -2
- package/dist/extraction-source-grounding.d.ts +1 -2
- package/dist/extraction.d.ts +1 -2
- package/dist/extraction.js +37 -34
- package/dist/fallback-llm.d.ts +7 -2
- package/dist/fallback-llm.js +1 -1
- package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
- package/dist/graph-dashboard-diff.d.ts +1 -2
- package/dist/graph-dashboard-key.d.ts +1 -2
- package/dist/graph-dashboard-parser.d.ts +1 -2
- package/dist/graph-edge-reinforcement.d.ts +1 -2
- package/dist/graph-path-reconstruction.d.ts +1 -2
- package/dist/graph-path-scoring.d.ts +1 -2
- package/dist/graph-snapshot.d.ts +1 -2
- package/dist/graph.d.ts +1 -2
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -2
- package/dist/importers/index.d.ts +1 -2
- package/dist/in-flight-reads.d.ts +1 -2
- package/dist/{index-C7Xep6S9.d.ts → index-DuJnzwHv.d.ts} +2 -2
- package/dist/index.d.ts +364 -26
- package/dist/index.js +232 -169
- package/dist/intent.d.ts +1 -2
- package/dist/lcm/engine.d.ts +1 -2
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.d.ts +1 -2
- package/dist/lcm/index.js +10 -10
- package/dist/lcm/tools.d.ts +1 -2
- package/dist/lifecycle.d.ts +1 -2
- package/dist/live-connectors-runner.d.ts +1 -2
- package/dist/local-llm.d.ts +1 -2
- package/dist/local-model-endpoint.d.ts +1 -2
- package/dist/location/index.d.ts +315 -6
- package/dist/location/index.js +151 -19
- package/dist/maintenance/memory-governance.d.ts +1 -2
- package/dist/maintenance/memory-governance.js +28 -28
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -28
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -3
- package/dist/maintenance/rebuild-memory-projection.js +29 -29
- package/dist/{maintenance-CJ-xqFp0.d.ts → maintenance-BBeaeYRR.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +11 -12
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -2
- package/dist/memory-cache.d.ts +1 -2
- package/dist/memory-controller.d.ts +1 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -2
- package/dist/memory-projection-mutations.js +3 -3
- package/dist/memory-projection-store.d.ts +1 -2
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +1 -2
- package/dist/memory-snapshot.d.ts +1 -2
- package/dist/memory-subject-cli.d.ts +11 -12
- package/dist/memory-subject.d.ts +11 -12
- package/dist/memory-subject.js +4 -4
- package/dist/memory-worth-outcomes.d.ts +2 -3
- package/dist/models-json.d.ts +1 -2
- package/dist/namespaces/migrate.d.ts +3 -4
- package/dist/namespaces/migrate.js +29 -29
- package/dist/namespaces/principal.d.ts +1 -2
- package/dist/namespaces/search.d.ts +1 -2
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +3 -4
- package/dist/namespaces/storage.js +28 -28
- package/dist/native-knowledge.d.ts +1 -2
- package/dist/offline-sync-file-io.js +3 -3
- package/dist/offline-sync-impression-drain.d.ts +1 -2
- package/dist/offline-sync-impression-drain.js +9 -9
- package/dist/offline-sync.js +4 -4
- package/dist/operator-doctor-corpus.d.ts +1 -2
- package/dist/operator-doctor-corpus.js +31 -31
- package/dist/operator-doctor-replica.d.ts +1 -2
- package/dist/operator-toolkit.d.ts +3 -4
- package/dist/operator-toolkit.js +47 -47
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -3
- package/dist/orchestration/maintenance.d.ts +4 -5
- package/dist/orchestration/maintenance.js +42 -41
- package/dist/{orchestrator-BsntWxLy.d.ts → orchestrator-CaqnwNwM.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -10
- package/dist/orchestrator.js +132 -125
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +1 -2
- package/dist/{pipeline-CVoysPm2.d.ts → pipeline-CrxVjlJr.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -2
- package/dist/proactive-contention.d.ts +1 -2
- package/dist/provenance.d.ts +1 -2
- package/dist/{public-http-CuOxlTC2.d.ts → public-http-Cwvl4QZr.d.ts} +1 -1
- package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
- package/dist/{qmd-DWMAGA5l.d.ts → qmd-BZgbJm0g.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -3
- package/dist/qmd-recall-cache.d.ts +1 -2
- package/dist/qmd.d.ts +2 -3
- package/dist/recall-concurrency-config.d.ts +1 -2
- package/dist/recall-deep.d.ts +37 -0
- package/dist/recall-deep.js +81 -0
- package/dist/recall-deep.js.map +1 -0
- package/dist/recall-disclosure-escalation.d.ts +1 -2
- package/dist/recall-explain-renderer.d.ts +1 -2
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -2
- package/dist/recall-navigate.d.ts +70 -0
- package/dist/recall-navigate.js +51 -0
- package/dist/recall-navigate.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +1 -2
- package/dist/recall-planner-llm.js +1 -1
- package/dist/recall-state-view-wire.d.ts +14 -0
- package/dist/recall-state-view-wire.js +11 -0
- package/dist/recall-state-view.d.ts +25 -0
- package/dist/recall-state-view.js +22 -0
- package/dist/recall-state-view.js.map +1 -0
- package/dist/recall-state.d.ts +1 -2
- package/dist/recall-tag-filter.d.ts +1 -2
- package/dist/recall-timings.d.ts +1 -2
- package/dist/recall-xray-cli.d.ts +1 -2
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -2
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -2
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -2
- package/dist/reconcile/manifest.d.ts +1 -2
- package/dist/reconcile/manifest.js +4 -4
- package/dist/reconcile/plan.d.ts +1 -2
- package/dist/replay/normalizers/chatgpt.d.ts +1 -2
- package/dist/replay/normalizers/claude.d.ts +1 -2
- package/dist/replay/normalizers/openclaw.d.ts +1 -2
- package/dist/replay/normalizers/shared.d.ts +1 -2
- package/dist/replay/runner.d.ts +1 -2
- package/dist/replay/types.d.ts +1 -2
- package/dist/replica-divergence.d.ts +1 -2
- package/dist/replica-peers-config.d.ts +1 -2
- package/dist/{resolution-XWBPKYFB.js → resolution-4DLI3IOR.js} +10 -10
- package/dist/resolution-4DLI3IOR.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -2
- package/dist/resume-bundles.js +12 -12
- package/dist/retrieval-agents.d.ts +2 -3
- package/dist/retrieval-tiers.d.ts +1 -2
- package/dist/routing/engine.d.ts +1 -2
- package/dist/routing/store.d.ts +1 -2
- package/dist/salvage-envelope.d.ts +1 -2
- package/dist/salvage-envelope.js +6 -6
- package/dist/schemas.d.ts +570 -105
- package/dist/schemas.js +3 -1
- package/dist/{scope-profiles-CPWkW_dI.d.ts → scope-profiles-DFaojvoP.d.ts} +1 -1
- package/dist/search/document-scanner.js +1 -1
- package/dist/search/embed-helper.d.ts +1 -2
- package/dist/search/factory.d.ts +1 -2
- package/dist/search/factory.js +7 -7
- package/dist/search/index.d.ts +1 -2
- package/dist/search/index.js +13 -13
- package/dist/search/lancedb-backend.d.ts +1 -2
- package/dist/search/lancedb-backend.js +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -2
- package/dist/search/meilisearch-backend.js +1 -1
- package/dist/search/noop-backend.d.ts +1 -2
- package/dist/search/orama-backend.d.ts +1 -2
- package/dist/search/orama-backend.js +1 -1
- package/dist/search/port.d.ts +1 -2
- package/dist/search/remote-backend.d.ts +1 -2
- package/dist/secure-store/index.js +3 -3
- package/dist/{semantic-consolidation-CNFVBXFc.d.ts → semantic-consolidation-BiX68wZA.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -3
- package/dist/semantic-consolidation.js +29 -29
- package/dist/semantic-rule-promotion.js +28 -28
- package/dist/semantic-rule-verifier.d.ts +1 -2
- package/dist/semantic-rule-verifier.js +28 -28
- package/dist/{service-Bb-JIdQ0.d.ts → service-D5h2zZ0M.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -2
- package/dist/session-observer-state.d.ts +1 -2
- package/dist/shared-context/manager.d.ts +1 -2
- package/dist/signal.d.ts +1 -2
- package/dist/source-agent-qualifier.d.ts +1 -2
- package/dist/source-agent-qualifier.js +35 -32
- package/dist/standup/build.d.ts +16 -0
- package/dist/standup/build.js +17 -0
- package/dist/standup/build.js.map +1 -0
- package/dist/{storage-CukrlNKk.d.ts → storage-CtsaojWD.d.ts} +1 -1
- package/dist/storage.d.ts +2 -3
- package/dist/storage.js +27 -27
- package/dist/subject-config.d.ts +1 -2
- package/dist/subject-config.js +5 -5
- package/dist/summarizer.d.ts +1 -2
- package/dist/summarizer.js +2 -2
- package/dist/summary-snapshot.d.ts +1 -2
- package/dist/support-passport/index.d.ts +16 -17
- package/dist/support-passport/index.js +57 -54
- package/dist/temporal-supersession.d.ts +2 -3
- package/dist/temporal-timeline-recall.d.ts +1 -2
- package/dist/temporal-validity.d.ts +1 -2
- package/dist/threading.d.ts +1 -2
- package/dist/tier-migration.d.ts +2 -3
- package/dist/tier-routing.d.ts +1 -2
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
- package/dist/topics.d.ts +1 -2
- package/dist/transcript.d.ts +1 -2
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/export-okf.d.ts +39 -0
- package/dist/transfer/export-okf.js +112 -0
- package/dist/transfer/export-okf.js.map +1 -0
- package/dist/trust-score-stage.d.ts +1 -2
- package/dist/trust-score.d.ts +1 -2
- package/dist/{types-djxQlxJ7.d.ts → types-CIpfYz1I.d.ts} +132 -12
- package/dist/types.d.ts +1 -2
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -2
- package/dist/verified-recall.js +28 -28
- package/dist/who-knows-cli.d.ts +11 -12
- package/dist/who-knows-cli.js +29 -29
- package/dist/who-knows.d.ts +11 -12
- package/dist/who-knows.js +28 -28
- package/dist/write-envelope.d.ts +1 -2
- package/dist/write-envelope.js +5 -5
- package/package.json +34 -3
- package/src/access-admin-ops-surface.ts +6 -1
- package/src/access-boundary.ts +1 -0
- package/src/access-http.ts +3 -1
- package/src/access-mcp-output-schemas.ts +1 -0
- package/src/access-mcp.ts +3 -3
- package/src/access-operations.ts +1 -0
- package/src/access-service-offline-file-content.test.ts +63 -0
- package/src/access-surface-catalog.ts +2 -0
- package/src/activity/config.test.ts +1 -0
- package/src/activity/config.ts +66 -1
- package/src/activity/index.ts +3 -0
- package/src/activity/journal.test.ts +97 -0
- package/src/activity/journal.ts +113 -0
- package/src/activity/privacy.test.ts +53 -0
- package/src/activity/privacy.ts +80 -0
- package/src/activity/timeline/build.ts +279 -0
- package/src/activity/timeline/categories.ts +111 -0
- package/src/activity/timeline/classify.ts +110 -0
- package/src/activity/timeline/corrections.ts +145 -0
- package/src/activity/timeline/index.ts +8 -0
- package/src/activity/timeline/journal-recap.test.ts +113 -0
- package/src/activity/timeline/journal-recap.ts +130 -0
- package/src/activity/timeline/query.test.ts +198 -0
- package/src/activity/timeline/query.ts +313 -0
- package/src/activity/timeline/timeline.test.ts +277 -0
- package/src/activity/timeline/types.ts +106 -0
- package/src/activity/timeline/weekly.test.ts +215 -0
- package/src/activity/timeline/weekly.ts +234 -0
- package/src/activity/types.ts +20 -0
- package/src/activity/vault-publish.test.ts +166 -0
- package/src/activity/vault-publish.ts +101 -0
- package/src/cli/okf-commands.ts +45 -0
- package/src/cli.ts +2 -2
- package/src/coding/export-okf-codegraph.test.ts +381 -0
- package/src/coding/export-okf-codegraph.ts +565 -0
- package/src/config.test.ts +1 -0
- package/src/config.ts +2 -22
- package/src/dedup/merge-on-write.test.ts +91 -0
- package/src/dedup/merge-on-write.ts +75 -0
- package/src/dedup/novelty-gate.test.ts +143 -0
- package/src/dedup/novelty-gate.ts +163 -0
- package/src/extraction-prompt-safety.test.ts +14 -2
- package/src/extraction.ts +21 -1
- package/src/fallback-llm.test.ts +134 -0
- package/src/fallback-llm.ts +77 -5
- package/src/location/access-operations.ts +17 -8
- package/src/location/backfill.ts +137 -0
- package/src/location/config.test.ts +3 -0
- package/src/location/config.ts +46 -2
- package/src/location/http-glue.ts +1 -1
- package/src/location/index.ts +3 -0
- package/src/location/intervals.ts +1 -0
- package/src/location/matching.test.ts +65 -0
- package/src/location/matching.ts +354 -0
- package/src/location/mcp-tools.ts +2 -1
- package/src/location/recall-exclusion.test.ts +1 -0
- package/src/location/surfaces.test.ts +15 -2
- package/src/location/surfaces.ts +95 -18
- package/src/location/tagging.test.ts +119 -0
- package/src/location/tagging.ts +277 -0
- package/src/location/types.ts +23 -1
- package/src/mcp-read-only-tools.ts +1 -0
- package/src/memory-projection-store.ts +3 -1
- package/src/okf/cli.ts +18 -5
- package/src/okf/config.ts +5 -0
- package/src/okf/index-files.test.ts +60 -0
- package/src/okf/index-files.ts +114 -0
- package/src/okf/render.ts +133 -0
- package/src/okf/type-mapping.test.ts +3 -0
- package/src/okf/type-mapping.ts +2 -0
- package/src/orchestration/extraction-persist.ts +22 -23
- package/src/orchestration/extraction-run.ts +2 -1
- package/src/orchestration/generic-recall-paths.ts +15 -3
- package/src/orchestration/recall-entry.ts +8 -3
- package/src/recall-deep.test.ts +72 -0
- package/src/recall-deep.ts +113 -0
- package/src/recall-navigate.test.ts +84 -0
- package/src/recall-navigate.ts +100 -0
- package/src/recall-state-view-wire.test.ts +35 -0
- package/src/recall-state-view-wire.ts +28 -0
- package/src/recall-state-view.test.ts +131 -0
- package/src/recall-state-view.ts +138 -0
- package/src/schemas.ts +17 -1
- package/src/shared-context/governance.test.ts +53 -0
- package/src/shared-context/governance.ts +86 -0
- package/src/standup/access-operations.ts +14 -0
- package/src/standup/build.test.ts +34 -0
- package/src/standup/build.ts +115 -0
- package/src/standup/http-glue.ts +15 -0
- package/src/standup/mcp-tools.ts +16 -0
- package/src/support-passport/card-projection.ts +1 -0
- package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
- package/src/support-passport/card-service.test.ts +75 -1
- package/src/support-passport/card-service.ts +6 -3
- package/src/support-passport/card-state.ts +5 -1
- package/src/support-passport/offline-sync-guard.ts +14 -1
- package/src/transfer/export-okf.test.ts +164 -0
- package/src/transfer/export-okf.ts +286 -0
- package/src/types.ts +3 -10
- package/dist/chunk-2LWQSV6A.js.map +0 -1
- package/dist/chunk-3BCULS4U.js.map +0 -1
- package/dist/chunk-7BDZTALN.js.map +0 -1
- package/dist/chunk-7PHI6GUI.js.map +0 -1
- package/dist/chunk-7WOWGRAU.js.map +0 -1
- package/dist/chunk-AX7UXCHJ.js.map +0 -1
- package/dist/chunk-DEACDKE3.js.map +0 -1
- package/dist/chunk-FP7YTTVO.js.map +0 -1
- package/dist/chunk-JYSN42VN.js.map +0 -1
- package/dist/chunk-KZIF6XHX.js.map +0 -1
- package/dist/chunk-LKYIOCWL.js.map +0 -1
- package/dist/chunk-OXRRJXPR.js.map +0 -1
- package/dist/chunk-U7EW2W4W.js.map +0 -1
- package/dist/chunk-UW5NPZJ2.js.map +0 -1
- package/dist/chunk-XAB6STPO.js.map +0 -1
- package/dist/chunk-XNWXSGHS.js.map +0 -1
- package/dist/types-CM86alG1.d.ts +0 -89
- /package/dist/{auto-sync-2YPITIWN.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
- /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
- /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
- /package/dist/{chunk-TFR3HG4K.js.map → chunk-2FA7U5XY.js.map} +0 -0
- /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
- /package/dist/{chunk-MY2BC6UE.js.map → chunk-2X6BGKQL.js.map} +0 -0
- /package/dist/{chunk-UEBDCMOO.js.map → chunk-3TSU662L.js.map} +0 -0
- /package/dist/{chunk-S5XOSTYM.js.map → chunk-4XLTUR6R.js.map} +0 -0
- /package/dist/{chunk-BWGCOLEL.js.map → chunk-65JOGLIS.js.map} +0 -0
- /package/dist/{chunk-HMZKGHMD.js.map → chunk-7UOXCCCI.js.map} +0 -0
- /package/dist/{chunk-4F4AQFWL.js.map → chunk-B4AOWRYF.js.map} +0 -0
- /package/dist/{chunk-ODU2CNNX.js.map → chunk-C5IUOBCN.js.map} +0 -0
- /package/dist/{chunk-3A2NJP2U.js.map → chunk-CHGG74CY.js.map} +0 -0
- /package/dist/{chunk-76DIF5KT.js.map → chunk-CX4OLNIH.js.map} +0 -0
- /package/dist/{chunk-Z3YEGSR4.js.map → chunk-D3UXGE5D.js.map} +0 -0
- /package/dist/{chunk-5HK3CJAR.js.map → chunk-D6Q5EPOV.js.map} +0 -0
- /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
- /package/dist/{chunk-XBGHAAKR.js.map → chunk-DDX6KIXF.js.map} +0 -0
- /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
- /package/dist/{chunk-7KQB4EBS.js.map → chunk-DUAJKRR2.js.map} +0 -0
- /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
- /package/dist/{chunk-DPCXDG7G.js.map → chunk-EH65UV2Z.js.map} +0 -0
- /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
- /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
- /package/dist/{chunk-TUHBYJXL.js.map → chunk-EWKVYCFP.js.map} +0 -0
- /package/dist/{chunk-NPFUNWNX.js.map → chunk-FFUMTH27.js.map} +0 -0
- /package/dist/{chunk-3PKAS6VL.js.map → chunk-GAJK3DQ5.js.map} +0 -0
- /package/dist/{chunk-DA7ITC5Z.js.map → chunk-GBEOUCBB.js.map} +0 -0
- /package/dist/{chunk-UENKPWCS.js.map → chunk-H2IRSXZN.js.map} +0 -0
- /package/dist/{chunk-CFVTRUR3.js.map → chunk-H6RSANGQ.js.map} +0 -0
- /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
- /package/dist/{chunk-3SZD4CYO.js.map → chunk-IGZCAHFL.js.map} +0 -0
- /package/dist/{chunk-UPFNQJC7.js.map → chunk-INUBU6I5.js.map} +0 -0
- /package/dist/{chunk-PMVPCZJZ.js.map → chunk-J2R275FN.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-5ACCD4L7.js.map → chunk-JRRQ747T.js.map} +0 -0
- /package/dist/{chunk-V4IDF3EZ.js.map → chunk-JTWZKNUH.js.map} +0 -0
- /package/dist/{chunk-AZMLH5UT.js.map → chunk-KI64TTBL.js.map} +0 -0
- /package/dist/{chunk-NPIBN2VL.js.map → chunk-LK4TOYPU.js.map} +0 -0
- /package/dist/{chunk-UTQUEHC7.js.map → chunk-LUDBXTBJ.js.map} +0 -0
- /package/dist/{chunk-PU56CXZA.js.map → chunk-LYUUA6QB.js.map} +0 -0
- /package/dist/{chunk-P36Z4JRA.js.map → chunk-M5ERTI4I.js.map} +0 -0
- /package/dist/{chunk-LDKPDODJ.js.map → chunk-ME35HVDJ.js.map} +0 -0
- /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
- /package/dist/{chunk-AHPIFKNG.js.map → chunk-N4F7ZSSG.js.map} +0 -0
- /package/dist/{chunk-JOZUBF4A.js.map → chunk-NACLNNFQ.js.map} +0 -0
- /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
- /package/dist/{chunk-T7XP6IZE.js.map → chunk-NFP4KPTA.js.map} +0 -0
- /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
- /package/dist/{chunk-LPNCR4QK.js.map → chunk-NSTNGMSS.js.map} +0 -0
- /package/dist/{chunk-5RWZH6PH.js.map → chunk-NUF7VSEX.js.map} +0 -0
- /package/dist/{chunk-7VZFRUQU.js.map → chunk-O7ERGZDA.js.map} +0 -0
- /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
- /package/dist/{chunk-5DHKCO52.js.map → chunk-OJUEUQDJ.js.map} +0 -0
- /package/dist/{chunk-LOXHYCVS.js.map → chunk-OMX6TKXH.js.map} +0 -0
- /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
- /package/dist/{chunk-SEEJOGQX.js.map → chunk-QBNE55VA.js.map} +0 -0
- /package/dist/{chunk-F7XUD3PL.js.map → chunk-S4CDUXQY.js.map} +0 -0
- /package/dist/{chunk-WNXYT4MK.js.map → chunk-S4Z2OBTX.js.map} +0 -0
- /package/dist/{chunk-UL4MKZHI.js.map → chunk-SN4JXNLL.js.map} +0 -0
- /package/dist/{chunk-CAMNRAJF.js.map → chunk-SZMYGDSM.js.map} +0 -0
- /package/dist/{chunk-CPA5NBHN.js.map → chunk-TNGH4ZYI.js.map} +0 -0
- /package/dist/{chunk-F3NVYTTA.js.map → chunk-TNXNECAN.js.map} +0 -0
- /package/dist/{chunk-BEC4YBNA.js.map → chunk-TVW4C7PV.js.map} +0 -0
- /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
- /package/dist/{chunk-4QEYREAV.js.map → chunk-U6NGKS32.js.map} +0 -0
- /package/dist/{chunk-HRHO3ZNG.js.map → chunk-UW4RYPWC.js.map} +0 -0
- /package/dist/{chunk-T6ILXUAH.js.map → chunk-VG4SSPAW.js.map} +0 -0
- /package/dist/{chunk-H2YSH3DG.js.map → chunk-WKAXBXVA.js.map} +0 -0
- /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
- /package/dist/{chunk-UNUMFURP.js.map → chunk-X5PIDJ3L.js.map} +0 -0
- /package/dist/{chunk-CRML27CO.js.map → chunk-X5YYSAZX.js.map} +0 -0
- /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
- /package/dist/{chunk-OA2O2GJ4.js.map → chunk-XOHYGIWF.js.map} +0 -0
- /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
- /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
- /package/dist/{chunk-MDD2RINF.js.map → chunk-YWPLOJ7T.js.map} +0 -0
- /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
- /package/dist/{chunk-GTO56JY5.js.map → chunk-ZPS724LT.js.map} +0 -0
- /package/dist/{chunk-SNOIKAHM.js.map → chunk-ZZZWEDF4.js.map} +0 -0
- /package/dist/{contradiction-scan-AKUWPX5N.js.map → contradiction-scan-NOYMFG66.js.map} +0 -0
- /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
- /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
- /package/dist/{resolution-XWBPKYFB.js.map → recall-state-view-wire.js.map} +0 -0
- /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core location matcher (issue #2046) — the ONE place that decides whether a
|
|
3
|
+
* memory or wearable conversation gets provider location context.
|
|
4
|
+
*
|
|
5
|
+
* Pure and deterministic: no IO, no clocks, no randomness. Inputs are UTC
|
|
6
|
+
* ISO-8601 instants and half-open [start, end) intervals everywhere.
|
|
7
|
+
*
|
|
8
|
+
* Rules (issue #2046 / umbrella #2043 decision D):
|
|
9
|
+
* 1. A valid memory interval is required — derived ONLY from the memory's own
|
|
10
|
+
* bi-temporal frontmatter (`valid_at` / `observedAt` / `invalid_at`), never
|
|
11
|
+
* from wall-clock time or message order. Untimed memories stay untagged.
|
|
12
|
+
* 2. Intervals longer than 24h describe long-lived facts, not events at a
|
|
13
|
+
* place; they stay untagged.
|
|
14
|
+
* 3. A place is tagged only when it is DOMINANT (strictly the longest overlap
|
|
15
|
+
* among candidate places; ties are conflicts and leave the memory untagged)
|
|
16
|
+
* and meets `minimumOverlapSeconds` and `minimumConfidence`.
|
|
17
|
+
* 4. Only resolved named places participate (`kind` home/work/poi): transit
|
|
18
|
+
* legs and unnamed visits never tag a memory.
|
|
19
|
+
* 5. No address is ever inferred from text, coordinates, IP, or proximity —
|
|
20
|
+
* only provider-supplied place metadata is echoed, and coordinates only
|
|
21
|
+
* when `retainCoordinates` is enabled.
|
|
22
|
+
*
|
|
23
|
+
* Provider-owned metadata contract: the tag is `location:<stable-place-slug>`
|
|
24
|
+
* and the opaque provider place id lives in structured attributes. Every
|
|
25
|
+
* field the matcher writes is provider-owned; a memory that carries
|
|
26
|
+
* location-ish metadata WITHOUT the `locationSource` marker is treated as
|
|
27
|
+
* manual/user-authored and is never touched.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { TAG_LIMITS, STRUCTURED_ATTRIBUTE_LIMITS } from "../write-envelope.js";
|
|
31
|
+
import type { LocationPlace, LocationSegment } from "./types.js";
|
|
32
|
+
|
|
33
|
+
/** Maximum memory span eligible for location tagging. */
|
|
34
|
+
export const LOCATION_MATCH_MAX_MEMORY_SPAN_MS = 24 * 60 * 60 * 1000;
|
|
35
|
+
|
|
36
|
+
/** Prefix of provider-owned location tags. */
|
|
37
|
+
export const LOCATION_TAG_PREFIX = "location:";
|
|
38
|
+
|
|
39
|
+
/** Structured-attribute keys owned by the tagging pipeline (never manual). */
|
|
40
|
+
export const LOCATION_ATTRIBUTE_KEYS = [
|
|
41
|
+
"locationSource",
|
|
42
|
+
"locationPlaceId",
|
|
43
|
+
"locationPlace",
|
|
44
|
+
"locationConfidence",
|
|
45
|
+
"locationVisitStart",
|
|
46
|
+
"locationVisitEnd",
|
|
47
|
+
"locationLatitude",
|
|
48
|
+
"locationLongitude",
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
/** Place kinds eligible for tagging: resolved, named places only. */
|
|
52
|
+
const TAGGABLE_PLACE_KINDS: Record<string, true> = { home: true, work: true, poi: true };
|
|
53
|
+
|
|
54
|
+
export interface LocationTagPolicy {
|
|
55
|
+
minimumOverlapSeconds: number;
|
|
56
|
+
minimumConfidence: number;
|
|
57
|
+
retainCoordinates: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** The memory side of a match: a half-open interval, or a single instant. */
|
|
61
|
+
export type MemoryLocationWindow =
|
|
62
|
+
| { kind: "interval"; startUtc: string; endUtc: string }
|
|
63
|
+
| { kind: "instant"; atUtc: string };
|
|
64
|
+
|
|
65
|
+
/** Why a window was rejected before matching. */
|
|
66
|
+
export type WindowRejectReason = "untimed" | "span-too-long";
|
|
67
|
+
|
|
68
|
+
export interface WindowResult {
|
|
69
|
+
window?: MemoryLocationWindow;
|
|
70
|
+
/** Local days (YYYY-MM-DD in the tag policy timezone) the window touches. */
|
|
71
|
+
days?: string[];
|
|
72
|
+
rejected?: WindowRejectReason;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Derive the match window from a memory's own frontmatter. `validAt` (the
|
|
77
|
+
* event start; assumed copies carry the ingestion anchor) opens the window;
|
|
78
|
+
* `invalid_at` closes it. An end-only memory (no start bound) is untimed.
|
|
79
|
+
*/
|
|
80
|
+
export function memoryLocationWindow(
|
|
81
|
+
frontmatter: { valid_at?: string; observedAt?: string; invalid_at?: string },
|
|
82
|
+
localDay: (instantUtc: string) => string,
|
|
83
|
+
): WindowResult {
|
|
84
|
+
const start = frontmatter.valid_at ?? frontmatter.observedAt;
|
|
85
|
+
if (start === undefined || Number.isNaN(Date.parse(start))) {
|
|
86
|
+
return { rejected: "untimed" };
|
|
87
|
+
}
|
|
88
|
+
const end = frontmatter.invalid_at;
|
|
89
|
+
if (end === undefined || Number.isNaN(Date.parse(end)) || Date.parse(end) <= Date.parse(start)) {
|
|
90
|
+
return { window: { kind: "instant", atUtc: start }, days: [localDay(start)] };
|
|
91
|
+
}
|
|
92
|
+
if (Date.parse(end) - Date.parse(start) > LOCATION_MATCH_MAX_MEMORY_SPAN_MS) {
|
|
93
|
+
return { rejected: "span-too-long" };
|
|
94
|
+
}
|
|
95
|
+
// The interval is half-open [start, end): its last instant is end-1ms, so a
|
|
96
|
+
// memory ending exactly at local midnight never touches the next day.
|
|
97
|
+
const lastInstant = new Date(Date.parse(end) - 1).toISOString();
|
|
98
|
+
const days = [localDay(start)];
|
|
99
|
+
const endDay = localDay(lastInstant);
|
|
100
|
+
if (endDay !== days[0]) days.push(endDay);
|
|
101
|
+
return { window: { kind: "interval", startUtc: start, endUtc: end }, days };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** One source's segments for a day, keyed by the configured source id. */
|
|
105
|
+
export interface LocationSourceSegments {
|
|
106
|
+
sourceId: string;
|
|
107
|
+
segments: LocationSegment[];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface LocationMatch {
|
|
111
|
+
sourceId: string;
|
|
112
|
+
place: LocationPlace;
|
|
113
|
+
/** Overlap (ms) with the window — interval mode; see `visitMs` otherwise. */
|
|
114
|
+
overlapMs: number;
|
|
115
|
+
/** Total dwell (ms) of the dominant place inside the window's day(s). */
|
|
116
|
+
visitMs: number;
|
|
117
|
+
/** Minimum contributing segment confidence, when any source reported one. */
|
|
118
|
+
confidence?: number;
|
|
119
|
+
/** Envelope [start, end) of the segments that produced the match. */
|
|
120
|
+
visitStartUtc: string;
|
|
121
|
+
visitEndUtc: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export type MatchOutcome =
|
|
125
|
+
| { status: "matched"; match: LocationMatch }
|
|
126
|
+
| { status: "unmatched"; reason: "no-overlap" | "ambiguous" | "below-minimum-overlap" | "below-minimum-confidence" };
|
|
127
|
+
|
|
128
|
+
interface PlaceAccumulator {
|
|
129
|
+
sourceId: string;
|
|
130
|
+
place: LocationPlace;
|
|
131
|
+
overlapMs: number;
|
|
132
|
+
visitMs: number;
|
|
133
|
+
confidence: number | undefined;
|
|
134
|
+
startUtc: string;
|
|
135
|
+
endUtc: string;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function overlapMsOf(
|
|
139
|
+
window: MemoryLocationWindow,
|
|
140
|
+
segment: { startUtc: string; endUtc: string },
|
|
141
|
+
): number {
|
|
142
|
+
if (window.kind === "instant") {
|
|
143
|
+
const at = Date.parse(window.atUtc);
|
|
144
|
+
return at >= Date.parse(segment.startUtc) && at < Date.parse(segment.endUtc) ? 1 : 0;
|
|
145
|
+
}
|
|
146
|
+
return Math.max(
|
|
147
|
+
0,
|
|
148
|
+
Math.min(Date.parse(window.endUtc), Date.parse(segment.endUtc)) -
|
|
149
|
+
Math.max(Date.parse(window.startUtc), Date.parse(segment.startUtc)),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* The dominant qualifying place for a window, across every source's
|
|
155
|
+
* segments. Deterministic: strict overlap comparison, ties (conflicts) are
|
|
156
|
+
* rejected, and equal-place contributions merge across sources.
|
|
157
|
+
*/
|
|
158
|
+
export function matchDominantPlace(
|
|
159
|
+
window: MemoryLocationWindow,
|
|
160
|
+
sources: readonly LocationSourceSegments[],
|
|
161
|
+
policy: LocationTagPolicy,
|
|
162
|
+
): MatchOutcome {
|
|
163
|
+
const byPlace = new Map<string, PlaceAccumulator>();
|
|
164
|
+
for (const source of sources) {
|
|
165
|
+
for (const segment of source.segments) {
|
|
166
|
+
if (TAGGABLE_PLACE_KINDS[segment.place.kind ?? ""] !== true) continue;
|
|
167
|
+
const overlap = overlapMsOf(window, segment);
|
|
168
|
+
if (overlap <= 0) continue;
|
|
169
|
+
const duration = Date.parse(segment.endUtc) - Date.parse(segment.startUtc);
|
|
170
|
+
const existing = byPlace.get(segment.place.id);
|
|
171
|
+
if (existing === undefined) {
|
|
172
|
+
byPlace.set(segment.place.id, {
|
|
173
|
+
sourceId: source.sourceId,
|
|
174
|
+
place: segment.place,
|
|
175
|
+
overlapMs: overlap,
|
|
176
|
+
visitMs: duration,
|
|
177
|
+
confidence: segment.confidence,
|
|
178
|
+
startUtc: segment.startUtc,
|
|
179
|
+
endUtc: segment.endUtc,
|
|
180
|
+
});
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// Same place from another source (or a revisit): accumulate.
|
|
184
|
+
existing.overlapMs += overlap;
|
|
185
|
+
existing.visitMs += duration;
|
|
186
|
+
existing.confidence =
|
|
187
|
+
existing.confidence === undefined
|
|
188
|
+
? segment.confidence
|
|
189
|
+
: segment.confidence === undefined
|
|
190
|
+
? existing.confidence
|
|
191
|
+
: Math.min(existing.confidence, segment.confidence);
|
|
192
|
+
if (segment.startUtc < existing.startUtc) existing.startUtc = segment.startUtc;
|
|
193
|
+
if (segment.endUtc > existing.endUtc) existing.endUtc = segment.endUtc;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (byPlace.size === 0) return { status: "unmatched", reason: "no-overlap" };
|
|
197
|
+
|
|
198
|
+
let best: PlaceAccumulator | null = null;
|
|
199
|
+
let tie = false;
|
|
200
|
+
for (const candidate of byPlace.values()) {
|
|
201
|
+
if (best === null || candidate.overlapMs > best.overlapMs) {
|
|
202
|
+
best = candidate;
|
|
203
|
+
tie = false;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (candidate.overlapMs === best.overlapMs) tie = true;
|
|
207
|
+
}
|
|
208
|
+
if (best === null || tie) return { status: "unmatched", reason: "ambiguous" };
|
|
209
|
+
|
|
210
|
+
const overlapForThreshold = window.kind === "instant" ? best.visitMs : best.overlapMs;
|
|
211
|
+
if (policy.minimumOverlapSeconds > 0 && overlapForThreshold < policy.minimumOverlapSeconds * 1000) {
|
|
212
|
+
return { status: "unmatched", reason: "below-minimum-overlap" };
|
|
213
|
+
}
|
|
214
|
+
if (best.confidence !== undefined && best.confidence < policy.minimumConfidence) {
|
|
215
|
+
return { status: "unmatched", reason: "below-minimum-confidence" };
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
status: "matched",
|
|
219
|
+
match: {
|
|
220
|
+
sourceId: best.sourceId,
|
|
221
|
+
place: best.place,
|
|
222
|
+
overlapMs: best.overlapMs,
|
|
223
|
+
visitMs: best.visitMs,
|
|
224
|
+
...(best.confidence !== undefined ? { confidence: best.confidence } : {}),
|
|
225
|
+
visitStartUtc: best.startUtc,
|
|
226
|
+
visitEndUtc: best.endUtc,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** Deterministic tag slug for a provider place id (`reitti:place:7` → `reitti-place-7`). */
|
|
232
|
+
export function locationTagSlug(placeId: string): string {
|
|
233
|
+
const slug = placeId
|
|
234
|
+
.toLowerCase()
|
|
235
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
236
|
+
.replace(/^-+|-+$/g, "");
|
|
237
|
+
return slug.slice(0, TAG_LIMITS.maxTagLength - LOCATION_TAG_PREFIX.length);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** The provider-owned tag for a matched place. */
|
|
241
|
+
export function locationTagForPlace(placeId: string): string {
|
|
242
|
+
return `${LOCATION_TAG_PREFIX}${locationTagSlug(placeId)}`;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function boundedAttributeValue(value: string): string {
|
|
246
|
+
return value.slice(0, STRUCTURED_ATTRIBUTE_LIMITS.maxValueLength);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Provider-owned structured attributes describing a match. */
|
|
250
|
+
export function locationAttributesForMatch(
|
|
251
|
+
match: LocationMatch,
|
|
252
|
+
policy: LocationTagPolicy,
|
|
253
|
+
): Record<string, string> {
|
|
254
|
+
const attributes: Record<string, string> = {
|
|
255
|
+
locationSource: match.sourceId,
|
|
256
|
+
locationPlaceId: boundedAttributeValue(match.place.id),
|
|
257
|
+
locationPlace: boundedAttributeValue(match.place.label),
|
|
258
|
+
...(match.confidence !== undefined ? { locationConfidence: match.confidence.toFixed(3) } : {}),
|
|
259
|
+
locationVisitStart: match.visitStartUtc,
|
|
260
|
+
locationVisitEnd: match.visitEndUtc,
|
|
261
|
+
};
|
|
262
|
+
if (policy.retainCoordinates && match.place.latitude !== undefined && match.place.longitude !== undefined) {
|
|
263
|
+
attributes.locationLatitude = String(match.place.latitude);
|
|
264
|
+
attributes.locationLongitude = String(match.place.longitude);
|
|
265
|
+
}
|
|
266
|
+
return attributes;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export interface LocationUpdatePlan {
|
|
270
|
+
/** Patch for `writeMemoryFrontmatter`; absent when nothing changes. */
|
|
271
|
+
patch?: { tags: string[]; structuredAttributes: Record<string, string> };
|
|
272
|
+
/** Outcome for reporting. */
|
|
273
|
+
outcome:
|
|
274
|
+
| "tagged"
|
|
275
|
+
| "updated"
|
|
276
|
+
| "removed"
|
|
277
|
+
| "unchanged"
|
|
278
|
+
| "manual-metadata"
|
|
279
|
+
| "unmatched"
|
|
280
|
+
| "untimed"
|
|
281
|
+
| "span-too-long";
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function frontmatterHasLocationMetadata(
|
|
285
|
+
frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },
|
|
286
|
+
): boolean {
|
|
287
|
+
if ((frontmatter.tags ?? []).some((tag) => tag.startsWith(LOCATION_TAG_PREFIX))) return true;
|
|
288
|
+
return Object.keys(frontmatter.structuredAttributes ?? {}).some((key) =>
|
|
289
|
+
(LOCATION_ATTRIBUTE_KEYS as readonly string[]).includes(key),
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function isProviderOwned(frontmatter: { structuredAttributes?: Record<string, string> }): boolean {
|
|
294
|
+
const source = frontmatter.structuredAttributes?.locationSource;
|
|
295
|
+
return typeof source === "string" && source.length > 0;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Plan the provider-owned update for one memory: a match adds/replaces ONLY
|
|
300
|
+
* provider-owned fields; a lost match removes them (corrected observations);
|
|
301
|
+
* manual location metadata (no `locationSource` marker) always wins and is
|
|
302
|
+
* never touched. Unrelated tags and attributes survive every path.
|
|
303
|
+
*/
|
|
304
|
+
export function planLocationUpdate(
|
|
305
|
+
frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },
|
|
306
|
+
outcome: MatchOutcome,
|
|
307
|
+
policy: LocationTagPolicy,
|
|
308
|
+
): LocationUpdatePlan {
|
|
309
|
+
if (frontmatterHasLocationMetadata(frontmatter) && !isProviderOwned(frontmatter)) {
|
|
310
|
+
return { outcome: "manual-metadata" };
|
|
311
|
+
}
|
|
312
|
+
const tags = [...(frontmatter.tags ?? [])];
|
|
313
|
+
const attributes = { ...(frontmatter.structuredAttributes ?? {}) };
|
|
314
|
+
const providerTagIndex = tags.findIndex((tag) => tag.startsWith(LOCATION_TAG_PREFIX));
|
|
315
|
+
const stripProviderFields = (): void => {
|
|
316
|
+
if (providerTagIndex >= 0) tags.splice(providerTagIndex, 1);
|
|
317
|
+
for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
if (outcome.status !== "matched") {
|
|
321
|
+
if (!isProviderOwned(frontmatter)) return { outcome: "unmatched" };
|
|
322
|
+
if (providerTagIndex < 0 && !("locationPlaceId" in attributes)) {
|
|
323
|
+
return { outcome: "unchanged" };
|
|
324
|
+
}
|
|
325
|
+
stripProviderFields();
|
|
326
|
+
return { patch: { tags, structuredAttributes: attributes }, outcome: "removed" };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const desiredTag = locationTagForPlace(outcome.match.place.id);
|
|
330
|
+
const desiredAttributes = locationAttributesForMatch(outcome.match, policy);
|
|
331
|
+
if (tags.length >= TAG_LIMITS.maxTags && providerTagIndex < 0) {
|
|
332
|
+
// Full tag budget with no provider slot to reuse — leave the memory alone.
|
|
333
|
+
return { outcome: "unchanged" };
|
|
334
|
+
}
|
|
335
|
+
const alreadyCurrent =
|
|
336
|
+
providerTagIndex >= 0 &&
|
|
337
|
+
tags[providerTagIndex] === desiredTag &&
|
|
338
|
+
LOCATION_ATTRIBUTE_KEYS.every((key) => {
|
|
339
|
+
const want = desiredAttributes[key];
|
|
340
|
+
const have = attributes[key];
|
|
341
|
+
return want === undefined ? have === undefined : have === want;
|
|
342
|
+
});
|
|
343
|
+
if (alreadyCurrent) return { outcome: "unchanged" };
|
|
344
|
+
|
|
345
|
+
if (providerTagIndex >= 0) tags[providerTagIndex] = desiredTag;
|
|
346
|
+
else tags.push(desiredTag);
|
|
347
|
+
for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];
|
|
348
|
+
Object.assign(attributes, desiredAttributes);
|
|
349
|
+
const wasProviderOwned = isProviderOwned(frontmatter);
|
|
350
|
+
return {
|
|
351
|
+
patch: { tags, structuredAttributes: attributes },
|
|
352
|
+
outcome: wasProviderOwned ? "updated" : "tagged",
|
|
353
|
+
};
|
|
354
|
+
}
|
|
@@ -55,12 +55,13 @@ export const LOCATION_MCP_TOOLS: McpTool[] = [
|
|
|
55
55
|
{
|
|
56
56
|
name: "engram.location_backfill",
|
|
57
57
|
description:
|
|
58
|
-
"Sync an explicit historical day range (inclusive, capped at 90 days) for every enabled location provider
|
|
58
|
+
"Sync an explicit historical day range (inclusive, capped at 90 days) for every enabled location provider, then re-tag overlapping memories with provider-owned location metadata (issue #2046; requires location.tagging.backfillEnabled). dryRun reports the memory changes without persisting anything — no day files, no memory patches. Never makes an unbounded scan and never calls the LLM.",
|
|
59
59
|
inputSchema: {
|
|
60
60
|
type: "object",
|
|
61
61
|
properties: {
|
|
62
62
|
from: { type: "string", description: "Range start day (YYYY-MM-DD)." },
|
|
63
63
|
to: { type: "string", description: "Range end day (YYYY-MM-DD, inclusive)." },
|
|
64
|
+
dryRun: { type: "boolean", description: "Report only; persist nothing." },
|
|
64
65
|
},
|
|
65
66
|
required: ["from", "to"],
|
|
66
67
|
additionalProperties: false,
|
|
@@ -17,6 +17,7 @@ test("isLocationDayPath matches only the top-level day-file shape", () => {
|
|
|
17
17
|
|
|
18
18
|
test("isSearchExcludedPath keeps location day documents out of generic search and recall", () => {
|
|
19
19
|
assert.equal(isSearchExcludedPath("locations/2026-08-17.md"), true);
|
|
20
|
+
assert.equal(isSearchExcludedPath("journal/2026-08-17.md"), true);
|
|
20
21
|
assert.equal(
|
|
21
22
|
isSearchExcludedPath("qmd://collection/locations/2026-08-17.md", {}, "qmd"),
|
|
22
23
|
true,
|
|
@@ -194,7 +194,11 @@ test("validation is strict and shared: unknown flags, bad dates, bad ranges", as
|
|
|
194
194
|
|
|
195
195
|
// Backfill range cap: 91 days rejects; 90 passes.
|
|
196
196
|
assert.throws(() => parseLocationBackfillRange("2026-05-01", "2026-07-30"), /capped at 90 days/);
|
|
197
|
-
assert.deepEqual(parseLocationBackfillRange("2026-05-02", "2026-07-30"), {
|
|
197
|
+
assert.deepEqual(parseLocationBackfillRange("2026-05-02", "2026-07-30"), {
|
|
198
|
+
from: "2026-05-02",
|
|
199
|
+
endDate: "2026-07-30",
|
|
200
|
+
days: 90,
|
|
201
|
+
});
|
|
198
202
|
} finally {
|
|
199
203
|
await rm(memoryDir, { recursive: true, force: true });
|
|
200
204
|
}
|
|
@@ -206,7 +210,16 @@ test("backfill syncs the explicit range oldest-first; empty days are synced, not
|
|
|
206
210
|
try {
|
|
207
211
|
const out = io();
|
|
208
212
|
const code = await runLocationCliCommand(
|
|
209
|
-
{
|
|
213
|
+
{
|
|
214
|
+
config: parseLocationConfig({
|
|
215
|
+
enabled: true,
|
|
216
|
+
timezone: "UTC",
|
|
217
|
+
syncDays: 1,
|
|
218
|
+
sources: [{ id: "reitti" }],
|
|
219
|
+
tagging: { enabled: true, backfillEnabled: true },
|
|
220
|
+
}),
|
|
221
|
+
memoryDir,
|
|
222
|
+
},
|
|
210
223
|
["backfill", "--from", "2026-08-14", "--to", "2026-08-16", "--json"],
|
|
211
224
|
out.cliIo,
|
|
212
225
|
);
|
package/src/location/surfaces.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Location surface runners (
|
|
3
|
-
* CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the
|
|
2
|
+
* Location surface runners (issues #2047, #2046) — ONE implementation shared
|
|
3
|
+
* by the CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the
|
|
4
4
|
* scheduler, so no surface can fork validation or disabled/empty/failure
|
|
5
5
|
* semantics (same rule as the wearables runner). Parsing here is strict:
|
|
6
6
|
* unknown flags reject with the valid list, invalid values reject loudly.
|
|
@@ -15,23 +15,24 @@ import {
|
|
|
15
15
|
type LocationStatusReport,
|
|
16
16
|
} from "./cli.js";
|
|
17
17
|
import { isValidLocationDate } from "./intervals.js";
|
|
18
|
+
import { backfillLocationTags, type LocationBackfillReport } from "./backfill.js";
|
|
18
19
|
import type { LocationSourceSyncResult } from "./pipeline.js";
|
|
19
20
|
import { ensureConfiguredLocationProviders } from "./provider-setup.js";
|
|
20
21
|
import { parseLocationDaySummary, readLocationDay } from "./store.js";
|
|
21
22
|
import type { LocationConfig } from "./types.js";
|
|
23
|
+
import type { StorageManager } from "../index.js";
|
|
22
24
|
|
|
23
25
|
export interface LocationSurfaceDeps {
|
|
24
26
|
config: LocationConfig;
|
|
25
27
|
memoryDir: string;
|
|
28
|
+
/**
|
|
29
|
+
* Memory storage for tag backfill (default-namespace store). Optional so
|
|
30
|
+
* pure day-sync surfaces (status/check/day) never construct one; hosts
|
|
31
|
+
* that expose backfill provide it (issue #2046).
|
|
32
|
+
*/
|
|
33
|
+
getMemoryStorage?: () => Promise<StorageManager>;
|
|
26
34
|
}
|
|
27
35
|
|
|
28
|
-
export interface LocationSyncRun {
|
|
29
|
-
date: string;
|
|
30
|
-
results: LocationSourceSyncResult[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export type LocationSyncRuns = LocationSyncRun[];
|
|
34
|
-
|
|
35
36
|
export async function runLocationStatus(
|
|
36
37
|
deps: LocationSurfaceDeps,
|
|
37
38
|
): Promise<LocationStatusReport> {
|
|
@@ -39,6 +40,12 @@ export async function runLocationStatus(
|
|
|
39
40
|
return locationStatus(deps.config, deps.memoryDir);
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
export interface LocationSyncRun {
|
|
44
|
+
date: string;
|
|
45
|
+
results: LocationSourceSyncResult[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type LocationSyncRuns = LocationSyncRun[];
|
|
42
49
|
export async function runLocationCheck(
|
|
43
50
|
deps: LocationSurfaceDeps,
|
|
44
51
|
signal?: AbortSignal,
|
|
@@ -113,7 +120,7 @@ function validatedSyncWindow(request: { endDate?: string; days?: number }): {
|
|
|
113
120
|
export function parseLocationBackfillRange(
|
|
114
121
|
rawFrom: unknown,
|
|
115
122
|
rawTo: unknown,
|
|
116
|
-
): { endDate: string; days: number } {
|
|
123
|
+
): { from: string; endDate: string; days: number } {
|
|
117
124
|
const from = requireLocationDate(rawFrom, "from");
|
|
118
125
|
const to = requireLocationDate(rawTo, "to");
|
|
119
126
|
const fromMs = Date.parse(`${from}T00:00:00Z`);
|
|
@@ -125,7 +132,48 @@ export function parseLocationBackfillRange(
|
|
|
125
132
|
if (days > 90) {
|
|
126
133
|
throw new EngramAccessInputError("location: backfill range is capped at 90 days");
|
|
127
134
|
}
|
|
128
|
-
return { endDate: to, days };
|
|
135
|
+
return { from, endDate: to, days };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface LocationBackfillResult {
|
|
139
|
+
/** Per-day provider sync results (empty under `dryRun`). */
|
|
140
|
+
days: LocationSyncRuns;
|
|
141
|
+
/** Memory re-tag report; absent when no memory storage was provided. */
|
|
142
|
+
memory?: LocationBackfillReport;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Backfill an explicit historical range (issue #2046): sync the days (unless
|
|
147
|
+
* `dryRun`, which persists NOTHING — not day files, not memory patches), then
|
|
148
|
+
* re-run the shared tagging core over the stored segments. Requires
|
|
149
|
+
* `location.enabled` + `location.tagging.enabled` +
|
|
150
|
+
* `location.tagging.backfillEnabled`.
|
|
151
|
+
*/
|
|
152
|
+
export async function runLocationBackfill(
|
|
153
|
+
deps: LocationSurfaceDeps,
|
|
154
|
+
request: { from?: unknown; to?: unknown; dryRun?: boolean } = {},
|
|
155
|
+
): Promise<LocationBackfillResult> {
|
|
156
|
+
const range = parseLocationBackfillRange(request.from, request.to);
|
|
157
|
+
if (!deps.config.enabled || !deps.config.tagging.enabled || !deps.config.tagging.backfillEnabled) {
|
|
158
|
+
throw new EngramAccessInputError(
|
|
159
|
+
"location: backfill requires location.enabled, location.tagging.enabled, and location.tagging.backfillEnabled",
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
await ensureConfiguredLocationProviders(deps.config);
|
|
163
|
+
const days =
|
|
164
|
+
request.dryRun === true ? [] : (await syncLocation({ ...deps, endDate: range.endDate, days: range.days })) as LocationSyncRuns;
|
|
165
|
+
let memory: LocationBackfillReport | undefined;
|
|
166
|
+
if (deps.getMemoryStorage !== undefined) {
|
|
167
|
+
memory = await backfillLocationTags({
|
|
168
|
+
storage: await deps.getMemoryStorage(),
|
|
169
|
+
memoryDir: deps.memoryDir,
|
|
170
|
+
config: deps.config,
|
|
171
|
+
from: range.from,
|
|
172
|
+
to: range.endDate,
|
|
173
|
+
dryRun: request.dryRun === true,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return { days, ...(memory !== undefined ? { memory } : {}) };
|
|
129
177
|
}
|
|
130
178
|
|
|
131
179
|
// ---------------------------------------------------------------------------
|
|
@@ -146,8 +194,12 @@ Commands:
|
|
|
146
194
|
ending yesterday)
|
|
147
195
|
--date <YYYY-MM-DD> End the window on this day (inclusive)
|
|
148
196
|
--days <n> Window size, 1..90 (default: location.syncDays)
|
|
149
|
-
backfill --from <date> --to <date>
|
|
197
|
+
backfill --from <date> --to <date> [--dry-run]
|
|
150
198
|
Sync an explicit historical range (≤ 90 days)
|
|
199
|
+
and re-tag overlapping memories (requires
|
|
200
|
+
location.tagging.backfillEnabled). --dry-run
|
|
201
|
+
persists nothing: it only reports the memory
|
|
202
|
+
changes stored segments would produce.
|
|
151
203
|
day <YYYY-MM-DD> Print one stored location day
|
|
152
204
|
|
|
153
205
|
Add --json to status/sync/backfill/day for machine-readable output.
|
|
@@ -156,7 +208,7 @@ Credentials for built-in providers come from the environment:
|
|
|
156
208
|
`;
|
|
157
209
|
|
|
158
210
|
const VALUE_FLAGS = new Set(["--date", "--days", "--from", "--to"]);
|
|
159
|
-
const BOOLEAN_FLAGS = new Set(["--json"]);
|
|
211
|
+
const BOOLEAN_FLAGS = new Set(["--json", "--dry-run"]);
|
|
160
212
|
|
|
161
213
|
interface ParsedCliFlags {
|
|
162
214
|
flags: Map<string, string | true>;
|
|
@@ -192,6 +244,26 @@ function parseCliFlags(args: string[]): ParsedCliFlags {
|
|
|
192
244
|
return { flags, positional };
|
|
193
245
|
}
|
|
194
246
|
|
|
247
|
+
function renderBackfillReport(io: LocationCliIo, report: LocationBackfillReport): void {
|
|
248
|
+
for (const day of report.days) {
|
|
249
|
+
if (day.emptyDay) {
|
|
250
|
+
io.stdout.write(`${day.date}: no stored location observations (empty day)\n`);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (day.failed !== undefined) {
|
|
254
|
+
io.stdout.write(`${day.date}: FAILED — ${day.failed}\n`);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const c = day.counts;
|
|
258
|
+
io.stdout.write(
|
|
259
|
+
`${day.date}: ${c.tagged} tagged, ${c.updated} updated, ${c.removed} removed, ` +
|
|
260
|
+
`${c.unchanged} unchanged, ${c.unmatched} unmatched (incl. ambiguous), ` +
|
|
261
|
+
`${c.manual} manual, ${c.untimed} untimed, ${c.failed} failed, ` +
|
|
262
|
+
`${day.considered} considered${report.dryRun ? " (dry run)" : ""}\n`,
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
195
267
|
function flagString(parsed: ParsedCliFlags, name: string): string | undefined {
|
|
196
268
|
const value = parsed.flags.get(name);
|
|
197
269
|
return typeof value === "string" ? value : undefined;
|
|
@@ -294,14 +366,19 @@ export async function runLocationCliCommand(
|
|
|
294
366
|
}
|
|
295
367
|
case "backfill": {
|
|
296
368
|
const parsed = parseCliFlags(rest);
|
|
297
|
-
const
|
|
298
|
-
|
|
369
|
+
const result = await runLocationBackfill(deps, {
|
|
370
|
+
from: flagString(parsed, "--from"),
|
|
371
|
+
to: flagString(parsed, "--to"),
|
|
372
|
+
dryRun: parsed.flags.has("--dry-run"),
|
|
373
|
+
});
|
|
299
374
|
if (parsed.flags.has("--json")) {
|
|
300
|
-
io.stdout.write(`${JSON.stringify(
|
|
375
|
+
io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
301
376
|
} else {
|
|
302
|
-
renderRuns(io,
|
|
377
|
+
renderRuns(io, result.days);
|
|
378
|
+
if (result.memory !== undefined) renderBackfillReport(io, result.memory);
|
|
303
379
|
}
|
|
304
|
-
|
|
380
|
+
const memoryFailed = result.memory?.days.some((day) => day.failed !== undefined) === true;
|
|
381
|
+
return anySourceFailed(result.days) || memoryFailed ? 1 : 0;
|
|
305
382
|
}
|
|
306
383
|
case "day": {
|
|
307
384
|
const parsed = parseCliFlags(rest);
|