@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,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write-time location tagging regression (issue #2046): the post-write
|
|
3
|
+
* enrichment path the extraction coordinator calls after a batch is durable.
|
|
4
|
+
* Pins the gates, the provider-owned patch contract (StorageManager
|
|
5
|
+
* chokepoint, actor "location-tagging"), and per-memory failure isolation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import test from "node:test";
|
|
10
|
+
|
|
11
|
+
import type { MemoryFile } from "../types.js";
|
|
12
|
+
import type { StorageManager } from "../index.js";
|
|
13
|
+
import { parseLocationConfig } from "./config.js";
|
|
14
|
+
import type { LocationSourceSegments } from "./matching.js";
|
|
15
|
+
import { enrichMemoriesWithLocation } from "./tagging.js";
|
|
16
|
+
|
|
17
|
+
function memory(id: string, frontmatter: Record<string, unknown> = {}): MemoryFile {
|
|
18
|
+
return { path: `facts/${id}.md`, content: "body", frontmatter: { id, ...frontmatter } } as MemoryFile;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function taggedConfig() {
|
|
22
|
+
return parseLocationConfig({
|
|
23
|
+
enabled: true,
|
|
24
|
+
timezone: "UTC",
|
|
25
|
+
sources: [{ id: "reitti" }],
|
|
26
|
+
tagging: { enabled: true },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const HOME: LocationSourceSegments = {
|
|
31
|
+
sourceId: "reitti",
|
|
32
|
+
segments: [
|
|
33
|
+
{
|
|
34
|
+
startUtc: "2026-08-01T12:00:00.000Z",
|
|
35
|
+
endUtc: "2026-08-01T14:00:00.000Z",
|
|
36
|
+
place: { id: "reitti:place:home-1", label: "Home", kind: "home" },
|
|
37
|
+
confidence: 0.9,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const index = new Map([["2026-08-01", [HOME]]]);
|
|
43
|
+
|
|
44
|
+
function storageFor(memories: MemoryFile[], failWriteFor?: string) {
|
|
45
|
+
const byId = new Map(memories.map((m) => [m.frontmatter.id, m]));
|
|
46
|
+
const writes: Array<{ id: string; patch: Record<string, unknown>; actor: string }> = [];
|
|
47
|
+
const storage: Pick<StorageManager, "getMemoryById" | "writeMemoryFrontmatter"> = {
|
|
48
|
+
getMemoryById: (id) => Promise.resolve(byId.get(id) ?? null),
|
|
49
|
+
writeMemoryFrontmatter: (file, patch, lifecycle) => {
|
|
50
|
+
if (file.frontmatter.id === failWriteFor) return Promise.reject(new Error("disk full"));
|
|
51
|
+
writes.push({ id: file.frontmatter.id, patch: patch as Record<string, unknown>, actor: lifecycle?.actor ?? "" });
|
|
52
|
+
return Promise.resolve(true);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
return { storage, writes };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
test("write-time enrichment tags matched memories through the storage chokepoint", async () => {
|
|
59
|
+
const { storage, writes } = storageFor([
|
|
60
|
+
memory("matched", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
|
|
61
|
+
memory("untimed", { tags: [] }),
|
|
62
|
+
memory("elsewhere", { valid_at: "2026-08-02T12:30:00.000Z", invalid_at: "2026-08-02T13:30:00.000Z", tags: [] }),
|
|
63
|
+
]);
|
|
64
|
+
const counts = await enrichMemoriesWithLocation({
|
|
65
|
+
storage,
|
|
66
|
+
memoryIds: ["matched", "untimed", "elsewhere"],
|
|
67
|
+
memoryDir: "/unused-when-index-passed",
|
|
68
|
+
config: taggedConfig(),
|
|
69
|
+
index,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
assert.equal(counts.tagged, 1);
|
|
73
|
+
assert.equal(counts.untimed, 1);
|
|
74
|
+
assert.equal(counts.unmatched, 1);
|
|
75
|
+
assert.equal(counts.failed, 0);
|
|
76
|
+
assert.equal(writes.length, 1, "only the matched memory is patched");
|
|
77
|
+
assert.equal(writes[0]?.id, "matched");
|
|
78
|
+
assert.equal(writes[0]?.actor, "location-tagging");
|
|
79
|
+
const tags = (writes[0]?.patch.tags as string[] | undefined) ?? [];
|
|
80
|
+
assert.ok(tags.some((tag) => tag.startsWith("location:")), `provider tag written: ${JSON.stringify(tags)}`);
|
|
81
|
+
const attributes = (writes[0]?.patch.structuredAttributes as Record<string, string> | undefined) ?? {};
|
|
82
|
+
assert.equal(attributes.locationSource, "reitti");
|
|
83
|
+
assert.equal(attributes.locationPlaceId, "reitti:place:home-1");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("tagging gates off inside the shared core: no reads, no writes", async () => {
|
|
87
|
+
const { storage, writes } = storageFor([
|
|
88
|
+
memory("matched", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
|
|
89
|
+
]);
|
|
90
|
+
const counts = await enrichMemoriesWithLocation({
|
|
91
|
+
storage,
|
|
92
|
+
memoryIds: ["matched"],
|
|
93
|
+
memoryDir: "/unused-when-index-passed",
|
|
94
|
+
config: parseLocationConfig({ enabled: true, timezone: "UTC", sources: [{ id: "reitti" }] }),
|
|
95
|
+
index,
|
|
96
|
+
});
|
|
97
|
+
assert.equal(counts.tagged, 0);
|
|
98
|
+
assert.equal(writes.length, 0);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("a failing memory write is counted and never blocks the others", async () => {
|
|
102
|
+
const { storage, writes } = storageFor(
|
|
103
|
+
[
|
|
104
|
+
memory("boom", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
|
|
105
|
+
memory("fine", { valid_at: "2026-08-01T12:30:00.000Z", invalid_at: "2026-08-01T13:30:00.000Z", tags: [] }),
|
|
106
|
+
],
|
|
107
|
+
"boom",
|
|
108
|
+
);
|
|
109
|
+
const counts = await enrichMemoriesWithLocation({
|
|
110
|
+
storage,
|
|
111
|
+
memoryIds: ["boom", "fine"],
|
|
112
|
+
memoryDir: "/unused-when-index-passed",
|
|
113
|
+
config: taggedConfig(),
|
|
114
|
+
index,
|
|
115
|
+
});
|
|
116
|
+
assert.equal(counts.failed, 1);
|
|
117
|
+
assert.equal(counts.tagged, 1);
|
|
118
|
+
assert.deepEqual(writes.map((w) => w.id), ["fine"]);
|
|
119
|
+
});
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Location tagging service (issue #2046) — the IO half around the pure
|
|
3
|
+
* matcher in `matching.ts`. Three consumers share it so the policy can never
|
|
4
|
+
* fork:
|
|
5
|
+
*
|
|
6
|
+
* 1. Write-time enrichment: after an extraction batch has cleared the
|
|
7
|
+
* trust/importance/content-hash gates and persisted, the caller tags the
|
|
8
|
+
* new memories (post-write, best-effort, never fails the extraction).
|
|
9
|
+
* 2. Historical backfill (`location/backfill.ts`): the same plan/apply core
|
|
10
|
+
* over a bounded date range, idempotent by construction.
|
|
11
|
+
* 3. Wearable conversation fill: `WearableConversation.location` is filled
|
|
12
|
+
* ONLY when the source did not provide one and the match passes policy.
|
|
13
|
+
*
|
|
14
|
+
* Segment data comes from the machine-global location sync state
|
|
15
|
+
* (`state/locations/sync.json`, ≤ 90 tracked days — matching the bounded
|
|
16
|
+
* backfill range). Reads are plain file loads; every memory mutation goes
|
|
17
|
+
* through `StorageManager.writeMemoryFrontmatter`, the atomic frontmatter
|
|
18
|
+
* chokepoint that preserves content (and therefore the content hash),
|
|
19
|
+
* lifecycle, and versioning invariants.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { StorageManager } from "../index.js";
|
|
23
|
+
import { log } from "../logger.js";
|
|
24
|
+
import type { MemoryFile } from "../types.js";
|
|
25
|
+
import type { WearableConversation } from "../wearables/types.js";
|
|
26
|
+
import { localDayKey, placeDurations } from "./intervals.js";
|
|
27
|
+
import {
|
|
28
|
+
matchDominantPlace,
|
|
29
|
+
memoryLocationWindow,
|
|
30
|
+
planLocationUpdate,
|
|
31
|
+
type LocationSourceSegments,
|
|
32
|
+
type LocationTagPolicy,
|
|
33
|
+
type LocationUpdatePlan,
|
|
34
|
+
} from "./matching.js";
|
|
35
|
+
import { loadLocationSyncState } from "./store.js";
|
|
36
|
+
import type { LocationConfig } from "./types.js";
|
|
37
|
+
|
|
38
|
+
/** Segments for one local day, per source id, from the sync state. */
|
|
39
|
+
export type DaySegmentIndex = Map<string, LocationSourceSegments[]>;
|
|
40
|
+
|
|
41
|
+
/** Load every tracked day's per-source segments (one file read). */
|
|
42
|
+
export async function loadDaySegmentIndex(memoryDir: string): Promise<DaySegmentIndex> {
|
|
43
|
+
const state = await loadLocationSyncState(memoryDir);
|
|
44
|
+
const index: DaySegmentIndex = new Map();
|
|
45
|
+
for (const [sourceId, source] of Object.entries(state.sources)) {
|
|
46
|
+
for (const [date, payload] of Object.entries(source.days ?? {})) {
|
|
47
|
+
const entry: LocationSourceSegments = { sourceId, segments: payload.segments ?? [] };
|
|
48
|
+
const existing = index.get(date);
|
|
49
|
+
if (existing === undefined) index.set(date, [entry]);
|
|
50
|
+
else existing.push(entry);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function locationTagPolicy(config: LocationConfig): LocationTagPolicy {
|
|
57
|
+
return {
|
|
58
|
+
minimumOverlapSeconds: config.minimumOverlapSeconds,
|
|
59
|
+
minimumConfidence: config.minimumConfidence,
|
|
60
|
+
retainCoordinates: config.retainCoordinates,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Every tagging path is off unless BOTH gates are on. */
|
|
65
|
+
export function locationTaggingEnabled(config: LocationConfig): boolean {
|
|
66
|
+
return config.enabled && config.tagging.enabled;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Write-time post-persist hook (issue #2046): tag the memories an extraction
|
|
71
|
+
* batch just made durable. Best-effort by contract — gated on both location
|
|
72
|
+
* gates, and a location failure must never fail the extraction that already
|
|
73
|
+
* persisted.
|
|
74
|
+
*/
|
|
75
|
+
export async function tagPersistedMemories(
|
|
76
|
+
storage: StorageManager,
|
|
77
|
+
memoryIds: string[],
|
|
78
|
+
config: { memoryDir: string; location?: LocationConfig },
|
|
79
|
+
): Promise<void> {
|
|
80
|
+
if (memoryIds.length === 0 || !config.location || !locationTaggingEnabled(config.location)) return;
|
|
81
|
+
try {
|
|
82
|
+
await enrichMemoriesWithLocation({
|
|
83
|
+
storage,
|
|
84
|
+
memoryIds,
|
|
85
|
+
memoryDir: config.memoryDir,
|
|
86
|
+
config: config.location,
|
|
87
|
+
});
|
|
88
|
+
} catch (locationError) {
|
|
89
|
+
log.warn("[location] post-write tagging failed (non-fatal)", locationError);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function segmentsForDays(index: DaySegmentIndex, days: readonly string[]): LocationSourceSegments[] {
|
|
94
|
+
const merged = new Map<string, LocationSourceSegments>();
|
|
95
|
+
for (const day of days) {
|
|
96
|
+
for (const entry of index.get(day) ?? []) {
|
|
97
|
+
const existing = merged.get(entry.sourceId);
|
|
98
|
+
if (existing === undefined) {
|
|
99
|
+
merged.set(entry.sourceId, { sourceId: entry.sourceId, segments: [...entry.segments] });
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
existing.segments.push(...entry.segments);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return [...merged.values()];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** The full plan for one memory: window → segments → match → provider-owned diff. */
|
|
109
|
+
function planForMemory(
|
|
110
|
+
frontmatter: Pick<MemoryFile["frontmatter"], "valid_at" | "observedAt" | "invalid_at" | "tags" | "structuredAttributes">,
|
|
111
|
+
index: DaySegmentIndex,
|
|
112
|
+
config: LocationConfig,
|
|
113
|
+
): LocationUpdatePlan {
|
|
114
|
+
const policy = locationTagPolicy(config);
|
|
115
|
+
const result = memoryLocationWindow(frontmatter, (instant) => localDayKey(instant, config.timezone));
|
|
116
|
+
if (result.rejected === "span-too-long") return { outcome: "span-too-long" };
|
|
117
|
+
if (result.rejected === "untimed" || result.window === undefined || result.days === undefined) {
|
|
118
|
+
return { outcome: "untimed" };
|
|
119
|
+
}
|
|
120
|
+
const sources = segmentsForDays(index, result.days);
|
|
121
|
+
return planLocationUpdate(frontmatter, matchDominantPlace(result.window, sources, policy), policy);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface LocationEnrichmentCounts {
|
|
125
|
+
tagged: number;
|
|
126
|
+
updated: number;
|
|
127
|
+
removed: number;
|
|
128
|
+
unchanged: number;
|
|
129
|
+
unmatched: number;
|
|
130
|
+
manual: number;
|
|
131
|
+
untimed: number;
|
|
132
|
+
spanTooLong: number;
|
|
133
|
+
failed: number;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function emptyEnrichmentCounts(): LocationEnrichmentCounts {
|
|
137
|
+
return {
|
|
138
|
+
tagged: 0,
|
|
139
|
+
updated: 0,
|
|
140
|
+
removed: 0,
|
|
141
|
+
unchanged: 0,
|
|
142
|
+
unmatched: 0,
|
|
143
|
+
manual: 0,
|
|
144
|
+
untimed: 0,
|
|
145
|
+
spanTooLong: 0,
|
|
146
|
+
failed: 0,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function countOutcome(counts: LocationEnrichmentCounts, outcome: LocationUpdatePlan["outcome"]): void {
|
|
151
|
+
if (outcome === "tagged") counts.tagged += 1;
|
|
152
|
+
else if (outcome === "updated") counts.updated += 1;
|
|
153
|
+
else if (outcome === "removed") counts.removed += 1;
|
|
154
|
+
else if (outcome === "unchanged") counts.unchanged += 1;
|
|
155
|
+
else if (outcome === "manual-metadata") counts.manual += 1;
|
|
156
|
+
else if (outcome === "unmatched") counts.unmatched += 1;
|
|
157
|
+
else if (outcome === "untimed") counts.untimed += 1;
|
|
158
|
+
else if (outcome === "span-too-long") counts.spanTooLong += 1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface EnrichMemoriesOptions {
|
|
162
|
+
storage: Pick<StorageManager, "getMemoryById" | "writeMemoryFrontmatter">;
|
|
163
|
+
memoryDir: string;
|
|
164
|
+
config: LocationConfig;
|
|
165
|
+
/** Enrich exactly these memory ids (write-time path). */
|
|
166
|
+
memoryIds?: string[];
|
|
167
|
+
/** Pre-loaded memories (backfill path — one readAllMemories per run). */
|
|
168
|
+
memories?: MemoryFile[];
|
|
169
|
+
/** Reuse a caller-loaded segment index (backfill). */
|
|
170
|
+
index?: DaySegmentIndex;
|
|
171
|
+
/** Skip every mutation and only report (dry-run). */
|
|
172
|
+
dryRun?: boolean;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Apply the matcher to a set of memories and patch provider-owned location
|
|
177
|
+
* metadata. A failure on ONE memory is counted and skipped — it never blocks
|
|
178
|
+
* the others (failure isolation, issue #2046).
|
|
179
|
+
*/
|
|
180
|
+
export async function enrichMemoriesWithLocation(
|
|
181
|
+
options: EnrichMemoriesOptions,
|
|
182
|
+
): Promise<LocationEnrichmentCounts> {
|
|
183
|
+
if (!locationTaggingEnabled(options.config)) return emptyEnrichmentCounts();
|
|
184
|
+
const counts = emptyEnrichmentCounts();
|
|
185
|
+
const index = options.index ?? (await loadDaySegmentIndex(options.memoryDir));
|
|
186
|
+
|
|
187
|
+
let memories = options.memories;
|
|
188
|
+
if (memories === undefined && options.memoryIds !== undefined) {
|
|
189
|
+
memories = [];
|
|
190
|
+
for (const id of options.memoryIds) {
|
|
191
|
+
const memory = await options.storage.getMemoryById(id);
|
|
192
|
+
if (memory !== null) memories.push(memory);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (memories === undefined) return counts;
|
|
196
|
+
|
|
197
|
+
for (const memory of memories) {
|
|
198
|
+
try {
|
|
199
|
+
const plan = planForMemory(memory.frontmatter, index, options.config);
|
|
200
|
+
// Count patch outcomes (tagged/updated/removed) only after the write
|
|
201
|
+
// lands — a rejected write is `failed`, never also `tagged`.
|
|
202
|
+
if (plan.patch === undefined || options.dryRun === true) {
|
|
203
|
+
countOutcome(counts, plan.outcome);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
await options.storage.writeMemoryFrontmatter(memory, plan.patch, { actor: "location-tagging" });
|
|
207
|
+
countOutcome(counts, plan.outcome);
|
|
208
|
+
} catch {
|
|
209
|
+
counts.failed += 1;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return counts;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Fill `WearableConversation.location` for conversations whose source did not
|
|
217
|
+
* provide one. Missing-only and source-aware: a provider-supplied value is
|
|
218
|
+
* never overwritten, and a failing conversation never blocks the others.
|
|
219
|
+
*/
|
|
220
|
+
export async function fillWearableConversationLocations(
|
|
221
|
+
conversations: WearableConversation[],
|
|
222
|
+
deps: { memoryDir: string; config: LocationConfig },
|
|
223
|
+
): Promise<void> {
|
|
224
|
+
if (!locationTaggingEnabled(deps.config) || conversations.length === 0) return;
|
|
225
|
+
let index: DaySegmentIndex;
|
|
226
|
+
try {
|
|
227
|
+
index = await loadDaySegmentIndex(deps.memoryDir);
|
|
228
|
+
} catch {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const policy = locationTagPolicy(deps.config);
|
|
232
|
+
for (const conversation of conversations) {
|
|
233
|
+
if (conversation.location !== undefined && conversation.location.length > 0) continue;
|
|
234
|
+
try {
|
|
235
|
+
const startMs = Date.parse(conversation.startIso);
|
|
236
|
+
const endMs = conversation.endIso !== undefined ? Date.parse(conversation.endIso) : Number.NaN;
|
|
237
|
+
const window =
|
|
238
|
+
Number.isFinite(startMs) && Number.isFinite(endMs) && endMs > startMs
|
|
239
|
+
? { kind: "interval" as const, startUtc: conversation.startIso, endUtc: conversation.endIso as string }
|
|
240
|
+
: { kind: "instant" as const, atUtc: conversation.startIso };
|
|
241
|
+
const anchor = window.kind === "interval" ? new Date(Date.parse(window.endUtc) - 1).toISOString() : window.atUtc;
|
|
242
|
+
const days = [...new Set([localDayKey(anchor, deps.config.timezone), localDayKey(conversation.startIso, deps.config.timezone)])];
|
|
243
|
+
const outcome = matchDominantPlace(window, segmentsForDays(index, days), policy);
|
|
244
|
+
if (outcome.status === "matched") {
|
|
245
|
+
conversation.location = outcome.match.place.label;
|
|
246
|
+
}
|
|
247
|
+
} catch {
|
|
248
|
+
// One bad conversation never blocks the rest of the day's fill.
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Render an opt-in, labels-only location context section for a day summary. */
|
|
254
|
+
export async function renderDayLocationContext(
|
|
255
|
+
memoryDir: string,
|
|
256
|
+
date: string,
|
|
257
|
+
config: LocationConfig,
|
|
258
|
+
): Promise<string | null> {
|
|
259
|
+
if (!locationTaggingEnabled(config)) return null;
|
|
260
|
+
const state = await loadLocationSyncState(memoryDir);
|
|
261
|
+
const segments = [];
|
|
262
|
+
for (const source of Object.values(state.sources)) {
|
|
263
|
+
for (const segment of source.days?.[date]?.segments ?? []) segments.push(segment);
|
|
264
|
+
}
|
|
265
|
+
if (segments.length === 0) return null;
|
|
266
|
+
const durations = placeDurations(segments)
|
|
267
|
+
.filter((duration) => ["home", "work", "poi"].includes(duration.place.kind ?? "poi"))
|
|
268
|
+
.sort((a, b) => (a.totalMs !== b.totalMs ? b.totalMs - a.totalMs : a.place.id < b.place.id ? -1 : 1));
|
|
269
|
+
if (durations.length === 0) return null;
|
|
270
|
+
const lines = durations.map((duration) => {
|
|
271
|
+
const minutes = Math.round(duration.totalMs / 60_000);
|
|
272
|
+
const hours = Math.floor(minutes / 60);
|
|
273
|
+
const rendered = hours <= 0 ? `${minutes}m` : `${hours}h ${String(minutes % 60).padStart(2, "0")}m`;
|
|
274
|
+
return `- ${duration.place.label.replace(/\s+/g, " ").replace(/[`*_]/g, "").trim()}: ${rendered}`;
|
|
275
|
+
});
|
|
276
|
+
return `## Location context\n\n${lines.join("\n")}`;
|
|
277
|
+
}
|
package/src/location/types.ts
CHANGED
|
@@ -21,7 +21,6 @@ export interface LocationPlace {
|
|
|
21
21
|
longitude?: number;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/** One place observation at a single instant, from a single provider. */
|
|
25
24
|
export interface LocationObservation {
|
|
26
25
|
/** UTC ISO-8601 observation instant. */
|
|
27
26
|
observedAtUtc: string;
|
|
@@ -85,6 +84,27 @@ export interface LocationConfig {
|
|
|
85
84
|
*/
|
|
86
85
|
retainCoordinates: boolean;
|
|
87
86
|
sources: LocationSourceConfig[];
|
|
87
|
+
/**
|
|
88
|
+
* Minimum dominant-place overlap (seconds) required to tag a memory.
|
|
89
|
+
* `0` disables the overlap floor. Integer ≥ 0; default 300.
|
|
90
|
+
*/
|
|
91
|
+
minimumOverlapSeconds: number;
|
|
92
|
+
/**
|
|
93
|
+
* Minimum provider-reported place confidence in [0,1] for a tagging
|
|
94
|
+
* match. Providers that report no confidence pass this gate (there is
|
|
95
|
+
* nothing to doubt), reported values below it fail. Default 0.7.
|
|
96
|
+
*/
|
|
97
|
+
minimumConfidence: number;
|
|
98
|
+
/** Provider-owned location tagging gates (issue #2046). */
|
|
99
|
+
tagging: LocationTaggingConfig;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Opt-in gates for attaching provider location context to memories. */
|
|
103
|
+
export interface LocationTaggingConfig {
|
|
104
|
+
/** `false` (default) disables every memory-tagging path. */
|
|
105
|
+
enabled: boolean;
|
|
106
|
+
/** Extra gate for the historical backfill command; default `false`. */
|
|
107
|
+
backfillEnabled: boolean;
|
|
88
108
|
}
|
|
89
109
|
|
|
90
110
|
/** A time-resolved place visit derived from consecutive observations. */
|
|
@@ -92,4 +112,6 @@ export interface LocationSegment {
|
|
|
92
112
|
startUtc: string;
|
|
93
113
|
endUtc: string;
|
|
94
114
|
place: LocationPlace;
|
|
115
|
+
/** Minimum contributing observation confidence, when any was reported. */
|
|
116
|
+
confidence?: number;
|
|
95
117
|
}
|
|
@@ -130,11 +130,13 @@ function migrateMemoryCurrentTable(db: BetterSqlite3Database): void {
|
|
|
130
130
|
if (!columns.has("preview_text")) {
|
|
131
131
|
db.exec(`ALTER TABLE memory_current ADD COLUMN preview_text TEXT NOT NULL DEFAULT ''`);
|
|
132
132
|
}
|
|
133
|
+
if (!columns.has("private_record")) db.exec(`ALTER TABLE memory_current ADD COLUMN private_record INTEGER NOT NULL DEFAULT 0; UPDATE memory_current SET private_record = 1 WHERE tags_json LIKE '%support-passport-%'`);
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
function memoryCurrentRequiresMigration(db: BetterSqlite3Database): boolean {
|
|
136
137
|
const columns = listTableColumns(db, "memory_current");
|
|
137
|
-
return columns.size > 0 &&
|
|
138
|
+
return columns.size > 0 &&
|
|
139
|
+
(!columns.has("tags_json") || !columns.has("preview_text") || !columns.has("private_record"));
|
|
138
140
|
}
|
|
139
141
|
|
|
140
142
|
function migrateProjectionSchemaIfNeeded(memoryDir: string): void {
|
package/src/okf/cli.ts
CHANGED
|
@@ -1,29 +1,42 @@
|
|
|
1
1
|
import { lintOkfDir } from "./lint.js";
|
|
2
2
|
import { runOkfConformanceSweep } from "./sweep.js";
|
|
3
|
+
import { runOkfIndexMaintenance } from "./index-files.js";
|
|
3
4
|
|
|
4
5
|
export async function runOkfCliCommand(
|
|
5
6
|
argv: string[],
|
|
6
7
|
io: { stdout: NodeJS.WritableStream; stderr: NodeJS.WritableStream },
|
|
7
|
-
ctx: {
|
|
8
|
+
ctx: {
|
|
9
|
+
memoryDir: string;
|
|
10
|
+
conformanceEnabled: boolean;
|
|
11
|
+
sweepEnabled: boolean;
|
|
12
|
+
indexFilesEnabled: boolean;
|
|
13
|
+
},
|
|
8
14
|
): Promise<number> {
|
|
9
15
|
const [subcommand, ...rest] = argv;
|
|
10
16
|
if (subcommand === "help" || subcommand === "--help" || subcommand === "-h") {
|
|
11
|
-
io.stdout.write(`usage: remnic okf <lint|sweep> [--json]
|
|
17
|
+
io.stdout.write(`usage: remnic okf <lint|sweep|index> [--json]
|
|
12
18
|
lint report OKF conformance findings (exit 1 when findings remain)
|
|
13
19
|
sweep backfill missing type values (requires okf.sweepEnabled)
|
|
20
|
+
index generate or remove index.md files (okf.indexFilesEnabled)
|
|
14
21
|
`);
|
|
15
22
|
return 0;
|
|
16
23
|
}
|
|
17
|
-
if (subcommand !== "lint" && subcommand !== "sweep") {
|
|
18
|
-
io.stderr.write("okf: expected lint or
|
|
24
|
+
if (subcommand !== "lint" && subcommand !== "sweep" && subcommand !== "index") {
|
|
25
|
+
io.stderr.write("okf: expected lint, sweep, or index\n");
|
|
19
26
|
return 1;
|
|
20
27
|
}
|
|
21
28
|
for (const token of rest) {
|
|
22
29
|
if (token === "--json") continue;
|
|
23
|
-
io.stderr.write(`okf: unexpected argument '${token}' — usage: remnic okf <lint|sweep> [--json]\n`);
|
|
30
|
+
io.stderr.write(`okf: unexpected argument '${token}' — usage: remnic okf <lint|sweep|index> [--json]\n`);
|
|
24
31
|
return 1;
|
|
25
32
|
}
|
|
26
33
|
const json = rest.includes("--json");
|
|
34
|
+
if (subcommand === "index") {
|
|
35
|
+
const result = await runOkfIndexMaintenance(ctx.memoryDir, ctx.indexFilesEnabled);
|
|
36
|
+
if (json) io.stdout.write(`${JSON.stringify(result)}\n`);
|
|
37
|
+
else io.stdout.write(`okf index: wrote ${result.written.length}, removed ${result.removed.length}\n`);
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
27
40
|
if (subcommand === "sweep") {
|
|
28
41
|
const result = runOkfConformanceSweep(ctx.memoryDir, ctx);
|
|
29
42
|
if (json) io.stdout.write(`${JSON.stringify(result)}\n`);
|
package/src/okf/config.ts
CHANGED
|
@@ -10,11 +10,14 @@ export interface OkfConfig {
|
|
|
10
10
|
conformanceEnabled: boolean;
|
|
11
11
|
/** Opt-in governance sweep that backfills `type` on legacy files (default false). */
|
|
12
12
|
sweepEnabled: boolean;
|
|
13
|
+
/** Generate OKF index.md files in the live store (default false). */
|
|
14
|
+
indexFilesEnabled: boolean;
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
export const DEFAULT_OKF_CONFIG: OkfConfig = Object.freeze({
|
|
16
18
|
conformanceEnabled: true,
|
|
17
19
|
sweepEnabled: false,
|
|
20
|
+
indexFilesEnabled: false,
|
|
18
21
|
});
|
|
19
22
|
|
|
20
23
|
export function parseOkfConfig(raw: unknown): OkfConfig {
|
|
@@ -27,8 +30,10 @@ export function parseOkfConfig(raw: unknown): OkfConfig {
|
|
|
27
30
|
const record = raw as Record<string, unknown>;
|
|
28
31
|
const conformance = coerceBooleanLike(record.conformanceEnabled, "okf.conformanceEnabled");
|
|
29
32
|
const sweep = coerceBooleanLike(record.sweepEnabled, "okf.sweepEnabled");
|
|
33
|
+
const indexFiles = coerceBooleanLike(record.indexFilesEnabled, "okf.indexFilesEnabled");
|
|
30
34
|
return {
|
|
31
35
|
conformanceEnabled: conformance ?? DEFAULT_OKF_CONFIG.conformanceEnabled,
|
|
32
36
|
sweepEnabled: sweep ?? DEFAULT_OKF_CONFIG.sweepEnabled,
|
|
37
|
+
indexFilesEnabled: indexFiles ?? DEFAULT_OKF_CONFIG.indexFilesEnabled,
|
|
33
38
|
};
|
|
34
39
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtempSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { isGenericRecallExcludedPath } from "../orchestration/generic-recall-paths.js";
|
|
8
|
+
import { parseOkfConfig } from "./config.js";
|
|
9
|
+
import { OKF_INDEX_MARKER, runOkfIndexMaintenance } from "./index-files.js";
|
|
10
|
+
|
|
11
|
+
function store(): string {
|
|
12
|
+
const root = mkdtempSync(path.join(tmpdir(), "okf-index-"));
|
|
13
|
+
mkdirSync(path.join(root, "facts", "2026-01-02"), { recursive: true });
|
|
14
|
+
writeFileSync(
|
|
15
|
+
path.join(root, "facts", "2026-01-02", "fact-1.md"),
|
|
16
|
+
"---\nid: fact-1\ncategory: fact\n---\nPostgres is the store.\n",
|
|
17
|
+
);
|
|
18
|
+
return root;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("parseOkfConfig defaults indexFilesEnabled off", () => {
|
|
22
|
+
assert.equal(parseOkfConfig(undefined).indexFilesEnabled, false);
|
|
23
|
+
assert.equal(parseOkfConfig({ indexFilesEnabled: "false" }).indexFilesEnabled, false);
|
|
24
|
+
assert.equal(parseOkfConfig({ indexFilesEnabled: true }).indexFilesEnabled, true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("flag off writes nothing", async () => {
|
|
28
|
+
const root = store();
|
|
29
|
+
const report = await runOkfIndexMaintenance(root, false);
|
|
30
|
+
assert.deepEqual(report.written, []);
|
|
31
|
+
assert.throws(() => readFileSync(path.join(root, "facts", "2026-01-02", "index.md")));
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("flag on writes a deterministic generated index", async () => {
|
|
35
|
+
const root = store();
|
|
36
|
+
const first = await runOkfIndexMaintenance(root, true);
|
|
37
|
+
const second = await runOkfIndexMaintenance(root, true);
|
|
38
|
+
const file = path.join(root, "facts", "2026-01-02", "index.md");
|
|
39
|
+
assert.equal(first.written.length, 1);
|
|
40
|
+
assert.equal(second.written.length, 0);
|
|
41
|
+
const body = readFileSync(file, "utf8");
|
|
42
|
+
assert.match(body, new RegExp(OKF_INDEX_MARKER));
|
|
43
|
+
assert.match(body, /fact-1\.md/);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("disable removes generated indexes and keeps user files", async () => {
|
|
47
|
+
const root = store();
|
|
48
|
+
await runOkfIndexMaintenance(root, true);
|
|
49
|
+
const user = path.join(root, "facts", "index.md");
|
|
50
|
+
writeFileSync(user, "# mine\n");
|
|
51
|
+
const report = await runOkfIndexMaintenance(root, false);
|
|
52
|
+
assert.ok(report.removed.some((item) => item.endsWith(`${path.sep}2026-01-02${path.sep}index.md`)));
|
|
53
|
+
assert.equal(readFileSync(user, "utf8"), "# mine\n");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("reserved OKF basenames are excluded from generic recall", () => {
|
|
57
|
+
assert.equal(isGenericRecallExcludedPath("facts/2026-01-02/index.md"), true);
|
|
58
|
+
assert.equal(isGenericRecallExcludedPath("log.md"), true);
|
|
59
|
+
assert.equal(isGenericRecallExcludedPath("facts/2026-01-02/fact-1.md"), false);
|
|
60
|
+
});
|