@remnic/core 9.65.6 → 9.65.8
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 +15 -13
- package/dist/access-admin-ops-surface.js +54 -54
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +15 -13
- package/dist/access-authorization-probe.js +55 -55
- package/dist/access-boundary.d.ts +15 -13
- package/dist/access-boundary.js +54 -54
- package/dist/access-cli.js +156 -148
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-extraction-force-flush.d.ts +15 -13
- package/dist/access-extraction-force-flush.js +54 -54
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-lcm-compaction.d.ts +15 -13
- package/dist/access-http-lifecycle-flush.d.ts +15 -13
- package/dist/access-http-offline-stream.d.ts +15 -13
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +56 -56
- package/dist/access-http.d.ts +17 -20
- package/dist/access-http.js +75 -73
- package/dist/access-identity-continuity-surface.d.ts +13 -11
- package/dist/access-identity-continuity-surface.js +54 -54
- package/dist/access-lcm-surface.d.ts +15 -13
- package/dist/access-lcm-surface.js +54 -54
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +15 -13
- package/dist/access-mcp.js +66 -64
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-D_6mo8ms.d.ts → access-namespace-preflight-CpAOrS-9.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +54 -54
- package/dist/access-observe-write-surface.d.ts +15 -13
- package/dist/access-observe-write-surface.js +54 -54
- package/dist/access-offline-manifest.d.ts +13 -11
- package/dist/access-offline-manifest.js +6 -6
- package/dist/access-operations-batch.js +58 -58
- package/dist/access-operations.d.ts +21 -19
- package/dist/access-operations.js +63 -61
- package/dist/access-recall-concurrency.d.ts +15 -13
- package/dist/access-recall-concurrency.js +54 -54
- package/dist/access-recall-response.d.ts +15 -13
- package/dist/access-recall-response.js +54 -54
- package/dist/access-recall-surface.d.ts +15 -13
- package/dist/access-recall-surface.js +54 -54
- package/dist/access-schema.d.ts +83 -83
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-sbiNS5UB.d.ts → access-service-Diu61Cfv.d.ts} +72 -72
- package/dist/access-service-helpers.d.ts +15 -13
- package/dist/access-service.d.ts +15 -13
- package/dist/access-service.js +54 -54
- package/dist/access-surface-catalog.d.ts +15 -13
- package/dist/access-surface-catalog.js +66 -56
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +6 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-context-config.d.ts +27 -0
- package/dist/active-context-config.js +14 -0
- package/dist/active-context-transform.d.ts +267 -0
- package/dist/active-context-transform.js +31 -0
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +13 -12
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-XVMLL2RH.js → auto-sync-2YPITIWN.js} +6 -6
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +13 -11
- package/dist/briefing-window.d.ts +5 -2
- package/dist/briefing.d.ts +5 -2
- package/dist/briefing.js +25 -25
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +5 -2
- package/dist/buffer.js +6 -6
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/{catalog-DO_7zfkv.d.ts → catalog-9f-vEQLS.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +4 -3
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +28 -28
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +2 -1
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-NZPFCP5A.js → chunk-2PSX5BJU.js} +2 -2
- package/dist/{chunk-RKNJBZ55.js → chunk-2QSZNTDO.js} +4 -4
- package/dist/{chunk-X2DWBWOX.js → chunk-3A2NJP2U.js} +2 -2
- package/dist/chunk-3BCULS4U.js +1093 -0
- package/dist/chunk-3BCULS4U.js.map +1 -0
- package/dist/{chunk-JGG5HVI2.js → chunk-3PKAS6VL.js} +2 -2
- package/dist/{chunk-LSYD7GHZ.js → chunk-3SZD4CYO.js} +3 -3
- package/dist/chunk-43HUVDTD.js +114 -0
- package/dist/chunk-43HUVDTD.js.map +1 -0
- package/dist/{chunk-5TG4MU2U.js → chunk-4F4AQFWL.js} +8 -8
- package/dist/{chunk-D35XLYQ7.js → chunk-4QEYREAV.js} +12 -12
- package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
- package/dist/{chunk-DVYRD4HY.js → chunk-5ACCD4L7.js} +30 -1
- package/dist/chunk-5ACCD4L7.js.map +1 -0
- package/dist/{chunk-W6J4POB6.js → chunk-5DHKCO52.js} +2 -2
- package/dist/{chunk-IRXMJLTW.js → chunk-5HK3CJAR.js} +2 -2
- package/dist/{chunk-NLUCDKLT.js → chunk-5RWZH6PH.js} +2 -2
- package/dist/{chunk-H7BZBSP6.js → chunk-645WOU5I.js} +4 -4
- package/dist/{chunk-AYAZWXJI.js → chunk-76DIF5KT.js} +2 -2
- package/dist/{chunk-OPPBTPUU.js → chunk-7KQB4EBS.js} +4 -4
- package/dist/{chunk-I2HTKOOP.js → chunk-7VZFRUQU.js} +3 -3
- package/dist/{chunk-DPNXADEI.js → chunk-7WOWGRAU.js} +11 -7
- package/dist/chunk-7WOWGRAU.js.map +1 -0
- package/dist/{chunk-JCWY73FK.js → chunk-AHPIFKNG.js} +2 -2
- package/dist/{chunk-FC7TIRFS.js → chunk-AX7UXCHJ.js} +6 -1
- package/dist/chunk-AX7UXCHJ.js.map +1 -0
- package/dist/{chunk-3I22VWB3.js → chunk-AZMLH5UT.js} +2 -2
- package/dist/chunk-B32WYRXX.js +77 -0
- package/dist/chunk-B32WYRXX.js.map +1 -0
- package/dist/{chunk-JOEJG4SD.js → chunk-BEC4YBNA.js} +4 -4
- package/dist/chunk-BWGCOLEL.js +61 -0
- package/dist/chunk-BWGCOLEL.js.map +1 -0
- package/dist/{chunk-BXXOPKT5.js → chunk-CAMNRAJF.js} +2 -2
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
- package/dist/{chunk-SVSRPG6M.js → chunk-CPA5NBHN.js} +2 -2
- package/dist/{chunk-7BEPVIH3.js → chunk-CRML27CO.js} +3 -3
- package/dist/{chunk-AXGFOFNY.js → chunk-DA7ITC5Z.js} +2 -2
- package/dist/{chunk-5W7MKXMU.js → chunk-DEACDKE3.js} +144 -78
- package/dist/chunk-DEACDKE3.js.map +1 -0
- package/dist/{chunk-FEO2CDXR.js → chunk-DPCXDG7G.js} +2 -2
- package/dist/{chunk-HZNYJN77.js → chunk-F3NVYTTA.js} +2 -2
- package/dist/{chunk-7SSRXEZJ.js → chunk-F7XUD3PL.js} +2 -2
- package/dist/{chunk-LDBFXD4F.js → chunk-FP7YTTVO.js} +3 -1
- package/dist/chunk-FP7YTTVO.js.map +1 -0
- package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
- package/dist/{chunk-PP7R754B.js → chunk-GPFZFCRN.js} +1 -1
- package/dist/{chunk-53MZQEBD.js → chunk-GTO56JY5.js} +2 -2
- package/dist/{chunk-RAIUTAZZ.js → chunk-H2YSH3DG.js} +2 -2
- package/dist/{chunk-HWVNYNIV.js → chunk-HMZKGHMD.js} +2 -2
- package/dist/{chunk-ZXUZ54Z5.js → chunk-HRHO3ZNG.js} +2 -2
- package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
- package/dist/chunk-JCCWJHOP.js +240 -0
- package/dist/chunk-JCCWJHOP.js.map +1 -0
- package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
- package/dist/{chunk-TR7DGXGI.js → chunk-JOZUBF4A.js} +5 -5
- package/dist/{chunk-YWBOOBDP.js → chunk-JYSN42VN.js} +71 -71
- package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
- package/dist/chunk-KOLJJN5G.js.map +1 -0
- package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
- package/dist/{chunk-D2YNNDML.js → chunk-KWIGDKM2.js} +2 -2
- package/dist/{chunk-YUTTMSC7.js → chunk-KZIF6XHX.js} +93 -30
- package/dist/chunk-KZIF6XHX.js.map +1 -0
- package/dist/chunk-LB7WCZHY.js +553 -0
- package/dist/chunk-LB7WCZHY.js.map +1 -0
- package/dist/{chunk-RIAM7DND.js → chunk-LDKPDODJ.js} +2 -2
- package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
- package/dist/{chunk-2JHRCWHT.js → chunk-LKYIOCWL.js} +107 -107
- package/dist/{chunk-XAWIL7TC.js → chunk-LOXHYCVS.js} +2 -2
- package/dist/{chunk-OMZLBT4B.js → chunk-LPNCR4QK.js} +48 -27
- package/dist/chunk-LPNCR4QK.js.map +1 -0
- package/dist/{chunk-OLBZ2WGG.js → chunk-LTBKKSCX.js} +2 -2
- package/dist/{chunk-O4BAGJDN.js → chunk-MDD2RINF.js} +2 -2
- package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
- package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
- package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
- package/dist/chunk-MINHJ55X.js.map +1 -0
- package/dist/{chunk-ROEAEANL.js → chunk-MY2BC6UE.js} +15 -15
- package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
- package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
- package/dist/{chunk-PGW64IFQ.js → chunk-NPFUNWNX.js} +2 -2
- package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
- package/dist/{chunk-IF4EY26E.js → chunk-OA2O2GJ4.js} +3 -3
- package/dist/{chunk-6FUMA6AA.js → chunk-ODU2CNNX.js} +2 -2
- package/dist/{chunk-PNAGNVGK.js → chunk-OXRRJXPR.js} +42 -37
- package/dist/chunk-OXRRJXPR.js.map +1 -0
- package/dist/{chunk-TWBQQ3FT.js → chunk-P36Z4JRA.js} +2 -2
- package/dist/{chunk-OUKBMQ2O.js → chunk-PD66CVSD.js} +2 -2
- package/dist/{chunk-MVIYRRVJ.js → chunk-PMVPCZJZ.js} +5 -5
- package/dist/{chunk-US4IRASK.js → chunk-PU56CXZA.js} +6 -6
- package/dist/{chunk-IDQ6DKXC.js → chunk-S5XOSTYM.js} +3 -3
- package/dist/{chunk-DYO24BNB.js → chunk-SEEJOGQX.js} +5 -5
- package/dist/{chunk-7OZSHBWK.js → chunk-SNOIKAHM.js} +2 -2
- package/dist/{chunk-SR7JIRAR.js → chunk-T6ILXUAH.js} +2 -2
- package/dist/{chunk-2RXUZVPU.js → chunk-T7XP6IZE.js} +2 -2
- package/dist/{chunk-KBOG7FJV.js → chunk-TFR3HG4K.js} +3 -3
- package/dist/{chunk-XUZ5CIEE.js → chunk-TUHBYJXL.js} +1 -1
- package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
- package/dist/{chunk-ZK4BFABK.js → chunk-U7EW2W4W.js} +13 -13
- package/dist/{chunk-4K7IW3F7.js → chunk-UD7UNYRD.js} +34 -3
- package/dist/chunk-UD7UNYRD.js.map +1 -0
- package/dist/{chunk-VFYRYFLL.js → chunk-UEBDCMOO.js} +2 -2
- package/dist/{chunk-JFWZRUKP.js → chunk-UENKPWCS.js} +4 -4
- package/dist/{chunk-AAXJNINV.js → chunk-UL4MKZHI.js} +2 -2
- package/dist/chunk-ULM7JCDH.js +154 -0
- package/dist/chunk-ULM7JCDH.js.map +1 -0
- package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
- package/dist/{chunk-5GIZM4RX.js → chunk-UPFNQJC7.js} +2 -2
- package/dist/{chunk-W4BMEGQA.js → chunk-UTQUEHC7.js} +2 -2
- package/dist/{chunk-I32NKXE2.js → chunk-V4IDF3EZ.js} +2 -2
- package/dist/{chunk-6LS5OX3U.js → chunk-W2BAGGEW.js} +50 -18
- package/dist/chunk-W2BAGGEW.js.map +1 -0
- package/dist/chunk-W2UOAATB.js +521 -0
- package/dist/chunk-W2UOAATB.js.map +1 -0
- package/dist/{chunk-QMZY3GG6.js → chunk-WNXYT4MK.js} +3 -3
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-T42L3S6A.js → chunk-XBGHAAKR.js} +2 -2
- package/dist/{chunk-RQ2EQRRR.js → chunk-XNWXSGHS.js} +80 -7
- package/dist/chunk-XNWXSGHS.js.map +1 -0
- package/dist/{chunk-THG4GYIE.js → chunk-YEUXERJ6.js} +5 -5
- package/dist/{chunk-BIJAWZYW.js → chunk-YMOPYG3K.js} +6 -6
- package/dist/{chunk-M4AHBM72.js → chunk-Z3YEGSR4.js} +2 -2
- package/dist/{cli-Bfgo0n1L.d.ts → cli-O3F-ht3i.d.ts} +5 -5
- package/dist/cli.d.ts +17 -15
- package/dist/cli.js +106 -104
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +26 -26
- package/dist/compounding/preference-consolidator.d.ts +4 -3
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config-security.js +2 -2
- package/dist/config.d.ts +2 -1
- package/dist/config.js +13 -12
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +25 -25
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +25 -25
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-provenance-check.js +2 -2
- package/dist/consolidation-undo.d.ts +5 -2
- package/dist/context-summary.d.ts +43 -0
- package/dist/context-summary.js +14 -0
- package/dist/context-summary.js.map +1 -0
- package/dist/contradiction/index.d.ts +6 -3
- package/dist/contradiction/index.js +5 -5
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +5 -2
- package/dist/convergence-refresh.js +28 -28
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +27 -27
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/day-summary.d.ts +2 -1
- package/dist/delinearize.d.ts +2 -1
- package/dist/dependency-propagation-config.d.ts +2 -1
- package/dist/{dependency-propagation-delivery-D23_x-s5.d.ts → dependency-propagation-delivery-CL6RWXTA.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-origin-fields.d.ts +2 -1
- package/dist/entity-retrieval.d.ts +5 -2
- package/dist/entity-retrieval.js +26 -26
- package/dist/entity-schema.d.ts +2 -1
- package/dist/episodic-context.d.ts +2 -1
- package/dist/eval-trajectory-contracts.d.ts +257 -0
- package/dist/eval-trajectory-contracts.js +56 -0
- package/dist/eval-trajectory-contracts.js.map +1 -0
- package/dist/eval-trajectory-store.d.ts +40 -0
- package/dist/eval-trajectory-store.js +19 -0
- package/dist/eval-trajectory-store.js.map +1 -0
- package/dist/eval-trajectory.d.ts +68 -0
- package/dist/eval-trajectory.js +46 -0
- package/dist/eval-trajectory.js.map +1 -0
- package/dist/event-order-recall.js +2 -2
- package/dist/explicit-capture.d.ts +13 -11
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.d.ts +15 -13
- package/dist/external-wiki-access.js +55 -55
- package/dist/external-wiki-collection-registration.d.ts +2 -1
- package/dist/external-wiki-collection.d.ts +2 -1
- package/dist/external-wiki-mcp-tools.d.ts +15 -13
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-normalization.d.ts +2 -1
- package/dist/extraction-prompt.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +33 -33
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
- package/dist/graph-dashboard-diff.d.ts +2 -1
- package/dist/graph-dashboard-key.d.ts +2 -1
- package/dist/graph-dashboard-parser.d.ts +2 -1
- package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-A4SDFMMS.js} +4 -4
- package/dist/graph-edge-decay-A4SDFMMS.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +2 -1
- package/dist/graph-path-reconstruction.d.ts +2 -1
- package/dist/graph-path-scoring.d.ts +2 -1
- package/dist/graph-snapshot.d.ts +2 -1
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.d.ts +2 -1
- package/dist/graph.js +3 -3
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index--QhGIXF2.d.ts → index-C7Xep6S9.d.ts} +2 -2
- package/dist/index.d.ts +706 -701
- package/dist/index.js +271 -200
- package/dist/intent.d.ts +2 -1
- package/dist/lcm/engine.d.ts +3 -2
- package/dist/lcm/engine.js +3 -2
- package/dist/lcm/index.d.ts +4 -2
- package/dist/lcm/index.js +6 -5
- package/dist/lcm/summarizer.d.ts +4 -6
- package/dist/lcm/summarizer.js +2 -1
- package/dist/lcm/tools.d.ts +4 -3
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/local-llm.d.ts +2 -1
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/location/index.d.ts +128 -1
- package/dist/location/index.js +60 -750
- package/dist/location/index.js.map +1 -1
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +26 -26
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -25
- package/dist/maintenance/rebuild-memory-projection.d.ts +5 -2
- package/dist/maintenance/rebuild-memory-projection.js +27 -27
- package/dist/{maintenance-PFvY1Pw_.d.ts → maintenance-CJ-xqFp0.d.ts} +4 -3
- package/dist/mcp-memory-inspector-app.d.ts +15 -13
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +18 -2
- package/dist/memory-action-policy.js +3 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-controller.js +2 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-snapshot.d.ts +2 -1
- package/dist/memory-subject-cli.d.ts +15 -13
- package/dist/memory-subject.d.ts +15 -13
- package/dist/memory-subject.js +3 -3
- package/dist/memory-worth-outcomes.d.ts +50 -3
- package/dist/memory-worth-outcomes.js +5 -3
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +6 -3
- package/dist/namespaces/migrate.js +26 -26
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +11 -11
- package/dist/namespaces/storage.d.ts +6 -3
- package/dist/namespaces/storage.js +25 -25
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +2 -2
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +28 -28
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +6 -3
- package/dist/operator-toolkit.js +45 -44
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
- package/dist/orchestration/maintenance.d.ts +7 -4
- package/dist/orchestration/maintenance.js +34 -32
- package/dist/{orchestrator-4wzJrPVm.d.ts → orchestrator-BsntWxLy.d.ts} +8 -8
- package/dist/orchestrator.d.ts +13 -11
- package/dist/orchestrator.js +156 -148
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-CgXgdIrF.d.ts → pipeline-CVoysPm2.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/{public-http-BP3VQDl5.d.ts → public-http-CuOxlTC2.d.ts} +1 -1
- package/dist/{qmd-BppGGxsi.d.ts → qmd-DWMAGA5l.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +3 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +2 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +2 -1
- package/dist/reconcile/manifest.d.ts +2 -1
- package/dist/reconcile/manifest.js +3 -3
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/{resolution-4552BNRV.js → resolution-XWBPKYFB.js} +6 -6
- package/dist/resolution-XWBPKYFB.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +14 -13
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +5 -5
- package/dist/schemas.d.ts +124 -124
- package/dist/{scope-profiles-ChZUtxDU.d.ts → scope-profiles-CPWkW_dI.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +10 -10
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +15 -15
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/{semantic-consolidation-mSPwQSmF.d.ts → semantic-consolidation-CNFVBXFc.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +31 -31
- package/dist/semantic-rule-promotion.js +25 -25
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +25 -25
- package/dist/{service-BICWLwSP.d.ts → service-Bb-JIdQ0.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +8 -7
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +29 -29
- package/dist/{storage-B7urx1K3.d.ts → storage-CukrlNKk.d.ts} +4 -1
- package/dist/storage.d.ts +5 -2
- package/dist/storage.js +24 -24
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +4 -4
- package/dist/summarizer.d.ts +2 -1
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +18 -16
- package/dist/support-passport/index.js +57 -57
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +5 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/types.d.ts +78 -78
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-ETU5N6nB.d.ts → types-djxQlxJ7.d.ts} +3 -2
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/verified-recall.js +25 -25
- package/dist/who-knows-cli.d.ts +15 -13
- package/dist/who-knows-cli.js +26 -26
- package/dist/who-knows.d.ts +15 -13
- package/dist/who-knows.js +25 -25
- package/dist/write-envelope.d.ts +2 -1
- package/dist/write-envelope.js +4 -4
- package/package.json +22 -2
- package/src/access-boundary.ts +5 -0
- package/src/access-http.ts +15 -16
- package/src/access-mcp-output-schemas.ts +5 -0
- package/src/access-mcp.ts +6 -6
- package/src/access-operations.ts +2 -0
- package/src/access-surface-catalog.ts +10 -0
- package/src/active-context-config.ts +98 -0
- package/src/active-context-transform.test.ts +533 -0
- package/src/active-context-transform.ts +981 -0
- package/src/config.ts +3 -5
- package/src/context-summary.ts +182 -0
- package/src/eval-trajectory-contracts.ts +411 -0
- package/src/eval-trajectory-store.ts +306 -0
- package/src/eval-trajectory.test.ts +534 -0
- package/src/eval-trajectory.ts +773 -0
- package/src/index.ts +6 -11
- package/src/lcm/summarizer.ts +14 -93
- package/src/location/access-operations.ts +84 -0
- package/src/location/http-glue.test.ts +100 -0
- package/src/location/http-glue.ts +85 -0
- package/src/location/index.ts +3 -0
- package/src/location/mcp-tools.ts +82 -0
- package/src/location/provider-setup.test.ts +106 -0
- package/src/location/provider-setup.ts +103 -0
- package/src/location/scheduler.test.ts +113 -0
- package/src/location/scheduler.ts +98 -0
- package/src/location/surfaces.test.ts +241 -0
- package/src/location/surfaces.ts +329 -0
- package/src/maintenance/day-summary-cron.ts +45 -0
- package/src/mcp-read-only-tools.ts +2 -0
- package/src/memory-action-policy.ts +28 -0
- package/src/memory-worth-outcomes.test.ts +53 -18
- package/src/memory-worth-outcomes.ts +91 -9
- package/src/orchestration/maintenance.ts +22 -30
- package/src/storage/context-transform-ledger.ts +39 -0
- package/src/storage/secure-line-reader.ts +50 -1
- package/src/storage.ts +4 -1
- package/src/types.ts +2 -3
- package/src/wearables/http-glue.ts +28 -0
- package/dist/chunk-4K7IW3F7.js.map +0 -1
- package/dist/chunk-5W7MKXMU.js.map +0 -1
- package/dist/chunk-6LS5OX3U.js.map +0 -1
- package/dist/chunk-DPNXADEI.js.map +0 -1
- package/dist/chunk-DVYRD4HY.js.map +0 -1
- package/dist/chunk-FC7TIRFS.js.map +0 -1
- package/dist/chunk-LBFFNDFM.js.map +0 -1
- package/dist/chunk-LDBFXD4F.js.map +0 -1
- package/dist/chunk-OMZLBT4B.js.map +0 -1
- package/dist/chunk-PNAGNVGK.js.map +0 -1
- package/dist/chunk-RQ2EQRRR.js.map +0 -1
- package/dist/chunk-YUTTMSC7.js.map +0 -1
- package/dist/chunk-ZPUIRTIZ.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → active-context-config.js.map} +0 -0
- /package/dist/{graph-edge-decay-FXGELBFA.js.map → active-context-transform.js.map} +0 -0
- /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-2YPITIWN.js.map} +0 -0
- /package/dist/{resolution-4552BNRV.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-NZPFCP5A.js.map → chunk-2PSX5BJU.js.map} +0 -0
- /package/dist/{chunk-RKNJBZ55.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-X2DWBWOX.js.map → chunk-3A2NJP2U.js.map} +0 -0
- /package/dist/{chunk-JGG5HVI2.js.map → chunk-3PKAS6VL.js.map} +0 -0
- /package/dist/{chunk-LSYD7GHZ.js.map → chunk-3SZD4CYO.js.map} +0 -0
- /package/dist/{chunk-5TG4MU2U.js.map → chunk-4F4AQFWL.js.map} +0 -0
- /package/dist/{chunk-D35XLYQ7.js.map → chunk-4QEYREAV.js.map} +0 -0
- /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
- /package/dist/{chunk-W6J4POB6.js.map → chunk-5DHKCO52.js.map} +0 -0
- /package/dist/{chunk-IRXMJLTW.js.map → chunk-5HK3CJAR.js.map} +0 -0
- /package/dist/{chunk-NLUCDKLT.js.map → chunk-5RWZH6PH.js.map} +0 -0
- /package/dist/{chunk-H7BZBSP6.js.map → chunk-645WOU5I.js.map} +0 -0
- /package/dist/{chunk-AYAZWXJI.js.map → chunk-76DIF5KT.js.map} +0 -0
- /package/dist/{chunk-OPPBTPUU.js.map → chunk-7KQB4EBS.js.map} +0 -0
- /package/dist/{chunk-I2HTKOOP.js.map → chunk-7VZFRUQU.js.map} +0 -0
- /package/dist/{chunk-JCWY73FK.js.map → chunk-AHPIFKNG.js.map} +0 -0
- /package/dist/{chunk-3I22VWB3.js.map → chunk-AZMLH5UT.js.map} +0 -0
- /package/dist/{chunk-JOEJG4SD.js.map → chunk-BEC4YBNA.js.map} +0 -0
- /package/dist/{chunk-BXXOPKT5.js.map → chunk-CAMNRAJF.js.map} +0 -0
- /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
- /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
- /package/dist/{chunk-SVSRPG6M.js.map → chunk-CPA5NBHN.js.map} +0 -0
- /package/dist/{chunk-7BEPVIH3.js.map → chunk-CRML27CO.js.map} +0 -0
- /package/dist/{chunk-AXGFOFNY.js.map → chunk-DA7ITC5Z.js.map} +0 -0
- /package/dist/{chunk-FEO2CDXR.js.map → chunk-DPCXDG7G.js.map} +0 -0
- /package/dist/{chunk-HZNYJN77.js.map → chunk-F3NVYTTA.js.map} +0 -0
- /package/dist/{chunk-7SSRXEZJ.js.map → chunk-F7XUD3PL.js.map} +0 -0
- /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
- /package/dist/{chunk-PP7R754B.js.map → chunk-GPFZFCRN.js.map} +0 -0
- /package/dist/{chunk-53MZQEBD.js.map → chunk-GTO56JY5.js.map} +0 -0
- /package/dist/{chunk-RAIUTAZZ.js.map → chunk-H2YSH3DG.js.map} +0 -0
- /package/dist/{chunk-HWVNYNIV.js.map → chunk-HMZKGHMD.js.map} +0 -0
- /package/dist/{chunk-ZXUZ54Z5.js.map → chunk-HRHO3ZNG.js.map} +0 -0
- /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
- /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
- /package/dist/{chunk-TR7DGXGI.js.map → chunk-JOZUBF4A.js.map} +0 -0
- /package/dist/{chunk-YWBOOBDP.js.map → chunk-JYSN42VN.js.map} +0 -0
- /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-D2YNNDML.js.map → chunk-KWIGDKM2.js.map} +0 -0
- /package/dist/{chunk-RIAM7DND.js.map → chunk-LDKPDODJ.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-2JHRCWHT.js.map → chunk-LKYIOCWL.js.map} +0 -0
- /package/dist/{chunk-XAWIL7TC.js.map → chunk-LOXHYCVS.js.map} +0 -0
- /package/dist/{chunk-OLBZ2WGG.js.map → chunk-LTBKKSCX.js.map} +0 -0
- /package/dist/{chunk-O4BAGJDN.js.map → chunk-MDD2RINF.js.map} +0 -0
- /package/dist/{chunk-ROEAEANL.js.map → chunk-MY2BC6UE.js.map} +0 -0
- /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
- /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
- /package/dist/{chunk-PGW64IFQ.js.map → chunk-NPFUNWNX.js.map} +0 -0
- /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
- /package/dist/{chunk-IF4EY26E.js.map → chunk-OA2O2GJ4.js.map} +0 -0
- /package/dist/{chunk-6FUMA6AA.js.map → chunk-ODU2CNNX.js.map} +0 -0
- /package/dist/{chunk-TWBQQ3FT.js.map → chunk-P36Z4JRA.js.map} +0 -0
- /package/dist/{chunk-OUKBMQ2O.js.map → chunk-PD66CVSD.js.map} +0 -0
- /package/dist/{chunk-MVIYRRVJ.js.map → chunk-PMVPCZJZ.js.map} +0 -0
- /package/dist/{chunk-US4IRASK.js.map → chunk-PU56CXZA.js.map} +0 -0
- /package/dist/{chunk-IDQ6DKXC.js.map → chunk-S5XOSTYM.js.map} +0 -0
- /package/dist/{chunk-DYO24BNB.js.map → chunk-SEEJOGQX.js.map} +0 -0
- /package/dist/{chunk-7OZSHBWK.js.map → chunk-SNOIKAHM.js.map} +0 -0
- /package/dist/{chunk-SR7JIRAR.js.map → chunk-T6ILXUAH.js.map} +0 -0
- /package/dist/{chunk-2RXUZVPU.js.map → chunk-T7XP6IZE.js.map} +0 -0
- /package/dist/{chunk-KBOG7FJV.js.map → chunk-TFR3HG4K.js.map} +0 -0
- /package/dist/{chunk-XUZ5CIEE.js.map → chunk-TUHBYJXL.js.map} +0 -0
- /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
- /package/dist/{chunk-ZK4BFABK.js.map → chunk-U7EW2W4W.js.map} +0 -0
- /package/dist/{chunk-VFYRYFLL.js.map → chunk-UEBDCMOO.js.map} +0 -0
- /package/dist/{chunk-JFWZRUKP.js.map → chunk-UENKPWCS.js.map} +0 -0
- /package/dist/{chunk-AAXJNINV.js.map → chunk-UL4MKZHI.js.map} +0 -0
- /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
- /package/dist/{chunk-5GIZM4RX.js.map → chunk-UPFNQJC7.js.map} +0 -0
- /package/dist/{chunk-W4BMEGQA.js.map → chunk-UTQUEHC7.js.map} +0 -0
- /package/dist/{chunk-I32NKXE2.js.map → chunk-V4IDF3EZ.js.map} +0 -0
- /package/dist/{chunk-QMZY3GG6.js.map → chunk-WNXYT4MK.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-T42L3S6A.js.map → chunk-XBGHAAKR.js.map} +0 -0
- /package/dist/{chunk-THG4GYIE.js.map → chunk-YEUXERJ6.js.map} +0 -0
- /package/dist/{chunk-BIJAWZYW.js.map → chunk-YMOPYG3K.js.map} +0 -0
- /package/dist/{chunk-M4AHBM72.js.map → chunk-Z3YEGSR4.js.map} +0 -0
- /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/location/registry.ts","../src/location/intervals.ts","../src/location/store.ts","../src/location/pipeline.ts","../src/location/cli.ts","../src/location/provider-setup.ts","../src/location/surfaces.ts"],"sourcesContent":["/**\n * Location provider registry (issue #2044).\n *\n * In-memory only: host adapters register provider implementations at startup.\n * Core never statically imports an optional provider package — the registry\n * holds whatever the host wired in, and a configured source whose provider is\n * not registered is skipped (not an error), so partial installs keep working.\n */\n\nimport type { LocationProvider } from \"./types.js\";\n\nconst PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;\n\nconst providers = new Map<string, LocationProvider>();\n\nfunction assertValidProvider(provider: LocationProvider): void {\n if (typeof provider !== \"object\" || provider === null) {\n throw new TypeError(\"location provider must be an object\");\n }\n if (typeof provider.id !== \"string\" || !PROVIDER_ID_PATTERN.test(provider.id)) {\n throw new RangeError(\n \"location provider id must be a non-empty lowercase kebab string (a-z, 0-9, hyphens)\",\n );\n }\n if (typeof provider.displayName !== \"string\" || provider.displayName.trim().length === 0) {\n throw new TypeError(`location provider '${provider.id}' must declare a non-empty displayName`);\n }\n if (typeof provider.verify !== \"function\" || typeof provider.fetchObservations !== \"function\") {\n throw new TypeError(\n `location provider '${provider.id}' must implement verify() and fetchObservations()`,\n );\n }\n}\n\nexport function registerLocationProvider(provider: LocationProvider): void {\n assertValidProvider(provider);\n if (providers.has(provider.id)) {\n throw new Error(`location provider '${provider.id}' is already registered`);\n }\n providers.set(provider.id, provider);\n}\n\nexport function getLocationProvider(id: string): LocationProvider | undefined {\n return typeof id === \"string\" ? providers.get(id) : undefined;\n}\n\nexport function listLocationProviders(): string[] {\n return [...providers.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\n/** Test-only: reset the registry between cases. */\nexport function clearLocationProviders(): void {\n providers.clear();\n}\n","/**\n * Location interval math (issue #2044).\n *\n * Pure, deterministic helpers over UTC ISO-8601 instants: half-open\n * [start, end) day windows (reusing the DST-correct activity day-window), IANA\n * local-day bucketing, overlap, observation→segment dwell, and dominant-place\n * selection with stable tie-breaking. No IO, no clocks, no randomness.\n */\n\nimport { activityDayWindow, isValidActivityDate } from \"../activity/digest.js\";\nimport type { LocationObservation, LocationPlace, LocationSegment } from \"./types.js\";\n\nexport function isValidLocationDate(date: string): boolean {\n return isValidActivityDate(date);\n}\n\n/** Half-open [start, end) UTC ISO bounds of a local day. */\nexport function locationDayWindow(date: string, timezone: string): { startUtc: string; endUtc: string } {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return activityDayWindow(date, timezone);\n}\n\nfunction assertFiniteInstant(iso: string, what: string): number {\n const ms = Date.parse(iso);\n if (typeof iso !== \"string\" || !Number.isFinite(ms)) {\n throw new RangeError(`${what} must be a UTC ISO-8601 instant; got \"${String(iso)}\"`);\n }\n return ms;\n}\n\n/** The IANA local calendar day (YYYY-MM-DD) an instant falls in. */\nexport function localDayKey(instantUtc: string, timezone: string): string {\n assertFiniteInstant(instantUtc, \"instantUtc\");\n return new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(new Date(instantUtc));\n}\n\nfunction compareObservations(a: LocationObservation, b: LocationObservation): number {\n if (a.observedAtUtc !== b.observedAtUtc) {\n return a.observedAtUtc < b.observedAtUtc ? -1 : 1;\n }\n // Total comparator (§12): equal-key observations fall back to place id so\n // ordering — and therefore dwell attribution — is deterministic.\n if (a.place.id !== b.place.id) {\n return a.place.id < b.place.id ? -1 : 1;\n }\n return 0;\n}\n\n/** Bucket observations into their IANA local days, sorted within each day. */\nexport function bucketObservationsByDay(\n observations: readonly LocationObservation[],\n timezone: string,\n): Map<string, LocationObservation[]> {\n const buckets = new Map<string, LocationObservation[]>();\n for (const observation of observations) {\n assertFiniteInstant(observation.observedAtUtc, \"observation observedAtUtc\");\n const key = localDayKey(observation.observedAtUtc, timezone);\n const bucket = buckets.get(key);\n if (bucket === undefined) buckets.set(key, [observation]);\n else bucket.push(observation);\n }\n for (const bucket of buckets.values()) bucket.sort(compareObservations);\n return buckets;\n}\n\n/** Overlap in ms of two half-open intervals; 0 when disjoint. */\nexport function intervalOverlapMs(\n a: { startUtc: string; endUtc: string },\n b: { startUtc: string; endUtc: string },\n): number {\n const overlap =\n Math.min(Date.parse(a.endUtc), Date.parse(b.endUtc)) - Math.max(Date.parse(a.startUtc), Date.parse(b.startUtc));\n return Math.max(0, overlap);\n}\n\nfunction placeForSegment(place: LocationPlace, retainCoordinates: boolean): LocationPlace {\n if (retainCoordinates || place.latitude === undefined || place.longitude === undefined) {\n return place;\n }\n return {\n id: place.id,\n label: place.label,\n ...(place.kind === undefined ? {} : { kind: place.kind }),\n };\n}\n\n/**\n * Derive place-visit segments from a day's observations: each observation\n * covers [its instant, the next observation's instant ∩ window end). The last\n * observation is capped by the window end, so dwell never crosses the day\n * boundary. Out-of-window observations are a provider contract violation and\n * are rejected loudly rather than silently reshaping the day. Coordinates are\n * stripped unless `retainCoordinates` is set.\n */\nexport function observationSegments(\n observations: readonly LocationObservation[],\n window: { startUtc: string; endUtc: string },\n options: { retainCoordinates: boolean },\n): LocationSegment[] {\n const startMs = assertFiniteInstant(window.startUtc, \"window startUtc\");\n const endMs = assertFiniteInstant(window.endUtc, \"window endUtc\");\n if (startMs >= endMs) {\n throw new RangeError(\"location window must satisfy startUtc < endUtc\");\n }\n const ordered = [...observations].sort(compareObservations);\n const segments: LocationSegment[] = [];\n for (let index = 0; index < ordered.length; index += 1) {\n const current = ordered[index]!;\n const currentMs = Date.parse(current.observedAtUtc);\n if (currentMs < startMs || currentMs >= endMs) {\n throw new RangeError(\n `location observation at \"${current.observedAtUtc}\" falls outside the requested [${window.startUtc}, ${window.endUtc}) window`,\n );\n }\n const nextMs =\n index + 1 < ordered.length ? Date.parse(ordered[index + 1]!.observedAtUtc) : endMs;\n const segmentEndMs = Math.min(nextMs, endMs);\n if (currentMs >= segmentEndMs) continue;\n segments.push({\n startUtc: new Date(currentMs).toISOString(),\n endUtc: new Date(segmentEndMs).toISOString(),\n place: placeForSegment(current.place, options.retainCoordinates),\n });\n }\n return segments;\n}\n\n/** Total time a place was occupied (union of its segment intervals, ms). */\nexport interface PlaceDuration {\n place: LocationPlace;\n totalMs: number;\n /** Earliest segment start contributing to this place's total. */\n firstStartUtc: string;\n}\n\nfunction unionIntervalMs(segments: readonly LocationSegment[]): number {\n // Merge overlapping [start, end) intervals per place so two providers\n // observing the same visit do not double-count its duration.\n const bounds = segments\n .map((segment) => ({ start: Date.parse(segment.startUtc), end: Date.parse(segment.endUtc) }))\n .sort((a, b) => (a.start !== b.start ? a.start - b.start : a.end - b.end));\n let total = 0;\n let sweepStart: number | null = null;\n let sweepEnd = 0;\n for (const bound of bounds) {\n if (sweepStart === null || bound.start > sweepEnd) {\n if (sweepStart !== null) total += sweepEnd - sweepStart;\n sweepStart = bound.start;\n sweepEnd = bound.end;\n } else if (bound.end > sweepEnd) {\n sweepEnd = bound.end;\n }\n }\n if (sweepStart !== null) total += sweepEnd - sweepStart;\n return total;\n}\n\n/** Per-place totals across every segment given (multi-source safe). */\nexport function placeDurations(segments: readonly LocationSegment[]): PlaceDuration[] {\n const byPlace = new Map<string, { place: LocationPlace; segments: LocationSegment[]; firstStartUtc: string }>();\n for (const segment of segments) {\n const existing = byPlace.get(segment.place.id);\n if (existing === undefined) {\n byPlace.set(segment.place.id, { place: segment.place, segments: [segment], firstStartUtc: segment.startUtc });\n continue;\n }\n existing.segments.push(segment);\n if (segment.startUtc < existing.firstStartUtc) existing.firstStartUtc = segment.startUtc;\n // Two providers may label the same place id differently; keep the\n // lexicographically smallest label so rendering stays deterministic.\n if (segment.place.label < existing.place.label) existing.place = segment.place;\n }\n const durations: PlaceDuration[] = [...byPlace.values()].map((entry) => ({\n place: entry.place,\n totalMs: unionIntervalMs(entry.segments),\n firstStartUtc: entry.firstStartUtc,\n }));\n durations.sort((a, b) => {\n if (a.place.id !== b.place.id) return a.place.id < b.place.id ? -1 : 1;\n return 0;\n });\n return durations;\n}\n\nexport interface DominantPlaceResult {\n place: LocationPlace;\n totalMs: number;\n}\n\n/**\n * The place with the longest total occupancy. Ties are stable and\n * deterministic: earlier first start wins, then the lexicographically smaller\n * place id — never insertion order.\n */\nexport function dominantPlace(segments: readonly LocationSegment[]): DominantPlaceResult | null {\n const durations = placeDurations(segments);\n let best: PlaceDuration | null = null;\n for (const duration of durations) {\n if (best === null) {\n best = duration;\n continue;\n }\n if (duration.totalMs !== best.totalMs) {\n if (duration.totalMs > best.totalMs) best = duration;\n continue;\n }\n if (duration.firstStartUtc !== best.firstStartUtc) {\n if (duration.firstStartUtc < best.firstStartUtc) best = duration;\n continue;\n }\n if (duration.place.id < best.place.id) best = duration;\n }\n return best === null ? null : { place: best.place, totalMs: best.totalMs };\n}\n","/**\n * Location day-file + sync-state store (issue #2044).\n *\n * Day documents live at `<memoryDir>/locations/<YYYY-MM-DD>.md` — OUTSIDE the\n * memory scan roots (facts/, entities/, …) so raw location history never\n * surfaces as a memory in recall or governance passes, and INSIDE the QMD\n * collection root so the markdown stays full-text searchable once an index\n * update runs. Per-source sync state lives at\n * `<memoryDir>/state/locations/sync.json` and is written only after the day\n * document is durable (see pipeline.ts).\n *\n * Both writes are atomic (temp file + rename) and containment-checked: a\n * symlinked `locations/` root or day file is rejected even when it resolves\n * inside the memory dir (AGENTS.md pattern #3), and a path that escapes the\n * memory dir is refused outright.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { lstat, mkdir, readFile, readdir, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { writeFileAtomically } from \"../maintenance/atomic-file.js\";\nimport { pathIsInside } from \"../utils/path-containment.js\";\nimport { isValidLocationDate, placeDurations } from \"./intervals.js\";\nimport type { LocationSegment } from \"./types.js\";\n\nexport const LOCATIONS_DIR_NAME = \"locations\";\nexport const LOCATION_DAY_KIND = \"location-day\";\nexport const LOCATION_DAY_FORMAT_VERSION = 1;\n\n/** Cap on remembered day payloads per source (~3 months of days). */\nconst MAX_TRACKED_LOCATION_DAYS = 90;\n\nconst DAY_FILE_NAME_PATTERN = /^\\d{4}-\\d{2}-\\d{2}\\.md$/;\n\n// Serializes state load→mutate→save sections per state file so two sources\n// syncing concurrently cannot lose-update each other's entries.\nconst stateLocks = new Map<string, Promise<unknown>>();\n\nfunction withStateLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const prior = stateLocks.get(key) ?? Promise.resolve();\n const next = prior.then(fn, fn);\n const tail = next.then(\n () => undefined,\n () => undefined,\n );\n stateLocks.set(key, tail);\n void tail.then(() => {\n if (stateLocks.get(key) === tail) stateLocks.delete(key);\n });\n return next;\n}\n\nexport function locationDayFilePath(memoryDir: string, date: string): string {\n if (!isValidLocationDate(date)) {\n // Never interpolate an unvalidated date into a filesystem path (a `../`\n // would escape <memoryDir>/locations/). Reject loudly.\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return path.join(memoryDir, LOCATIONS_DIR_NAME, `${date}.md`);\n}\n\nexport function locationSyncStateFilePath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"locations\", \"sync.json\");\n}\n\n/** A source's derived day payload, kept in sync state for multi-source merges. */\nexport interface LocationSourceDayPayload {\n observationCount: number;\n segments: LocationSegment[];\n providerDisplayName?: string;\n}\n\nexport interface LocationSourceSyncState {\n lastSyncedAtUtc?: string;\n days?: Record<string, LocationSourceDayPayload>;\n}\n\nexport interface LocationSyncStateFile {\n version: 1;\n sources: Record<string, LocationSourceSyncState>;\n}\n\nexport function emptyLocationSyncState(): LocationSyncStateFile {\n return { version: 1, sources: {} };\n}\n\nexport async function loadLocationSyncState(memoryDir: string): Promise<LocationSyncStateFile> {\n let raw: string;\n try {\n raw = await readFile(locationSyncStateFilePath(memoryDir), \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return emptyLocationSyncState();\n throw err;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n // A corrupt state file must not brick syncing forever; treat it as a cold\n // start. The worst case is re-syncing days already on disk, and the day\n // file's contentHash makes that rewrite idempotent.\n return emptyLocationSyncState();\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as LocationSyncStateFile).sources !== \"object\" ||\n (parsed as LocationSyncStateFile).sources === null\n ) {\n return emptyLocationSyncState();\n }\n return { version: 1, sources: (parsed as LocationSyncStateFile).sources };\n}\n\nexport async function saveLocationSyncState(\n memoryDir: string,\n state: LocationSyncStateFile,\n): Promise<void> {\n await mkdir(path.dirname(locationSyncStateFilePath(memoryDir)), { recursive: true, mode: 0o700 });\n await writeFileAtomically(\n locationSyncStateFilePath(memoryDir),\n `${JSON.stringify(state, null, 2)}\\n`,\n );\n}\n\nfunction pruneSourceDays(source: LocationSourceSyncState): void {\n const days = source.days;\n if (days === undefined) return;\n const keys = Object.keys(days).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n for (const key of keys.slice(0, Math.max(0, keys.length - MAX_TRACKED_LOCATION_DAYS))) {\n delete days[key];\n }\n}\n\n/**\n * Record one source's completed day sync. Runs the whole read-modify-write\n * under the per-directory state lock so concurrent sources cannot clobber\n * each other, and prunes day payloads beyond the retention cap.\n */\nexport async function updateLocationSourceDay(\n memoryDir: string,\n sourceId: string,\n date: string,\n payload: LocationSourceDayPayload,\n completedAtUtc: string,\n): Promise<LocationSyncStateFile> {\n if (!isValidLocationDate(date)) {\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return withStateLock(locationSyncStateFilePath(memoryDir), async () => {\n const state = await loadLocationSyncState(memoryDir);\n const source = state.sources[sourceId] ?? {};\n const days = source.days ?? {};\n days[date] = payload;\n source.days = days;\n source.lastSyncedAtUtc = completedAtUtc;\n state.sources[sourceId] = source;\n for (const candidate of Object.values(state.sources)) pruneSourceDays(candidate);\n await saveLocationSyncState(memoryDir, state);\n return state;\n });\n}\n/** Frontmatter persisted on a rendered day document. */\nexport interface LocationDayMeta {\n kind: typeof LOCATION_DAY_KIND;\n date: string;\n timezone: string;\n formatVersion: number;\n sources: string[];\n observationCount: number;\n /** SHA-256 of the rendered body (rebuild idempotency). */\n contentHash: string;\n}\n\n/** A parsed day document (frontmatter + rendered body). */\nexport interface LocationDayDocument {\n meta: LocationDayMeta;\n body: string;\n}\n\n/** The per-source view a day document is composed from. */\nexport interface LocationDaySourceEntry extends LocationSourceDayPayload {\n /** Provider display name for the timeline heading; falls back to the id. */\n providerDisplayName?: string;\n}\n\nexport function hashLocationBody(body: string): string {\n return createHash(\"sha256\").update(body, \"utf8\").digest(\"hex\");\n}\n\nfunction clockHhMm(iso: string, timezone: string): string {\n return new Intl.DateTimeFormat(\"en-GB\", {\n timeZone: timezone,\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).format(new Date(iso));\n}\n\nfunction formatDuration(ms: number): string {\n const totalMinutes = Math.round(ms / 60_000);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours <= 0) return `${minutes}m`;\n return `${hours}h ${String(minutes).padStart(2, \"0\")}m`;\n}\n\n/** Collapse whitespace and strip markdown emphasis/backticks from a label. */\nfunction safeLabel(label: string): string {\n return label.replace(/\\s+/g, \" \").replace(/[`*_]/g, \"\").trim();\n}\n\nfunction formatPlaceLabel(segment: LocationSegment): string {\n const label = safeLabel(segment.place.label);\n return segment.place.kind === undefined ? label : `${label} (${segment.place.kind})`;\n}\n\nfunction formatCoordinates(segment: LocationSegment): string {\n if (segment.place.latitude === undefined || segment.place.longitude === undefined) return \"\";\n return ` @ ${segment.place.latitude.toFixed(4)},${segment.place.longitude.toFixed(4)}`;\n}\n\nexport function composeLocationDayBody(\n date: string,\n timezone: string,\n sources: Record<string, LocationDaySourceEntry>,\n): string {\n const lines: string[] = [`# Location day — ${date} (${timezone})`, \"\"];\n const allSegments: LocationSegment[] = [];\n let observationCount = 0;\n for (const entry of Object.values(sources)) {\n allSegments.push(...entry.segments);\n observationCount += entry.observationCount;\n }\n\n lines.push(\"## Summary\", \"\");\n if (observationCount === 0) {\n lines.push(\"No location observations recorded.\", \"\");\n } else {\n const durations = placeDurations(allSegments).sort((a, b) => b.totalMs - a.totalMs);\n lines.push(\n `- Places visited: ${durations.length}`,\n ...durations.map(\n (duration) => `- ${safeLabel(duration.place.label)}: ${formatDuration(duration.totalMs)}`,\n ),\n \"\",\n );\n }\n\n const sourceIds = Object.keys(sources).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n for (const sourceId of sourceIds) {\n const entry = sources[sourceId]!;\n lines.push(`## Timeline — ${safeLabel(entry.providerDisplayName ?? sourceId)}`, \"\");\n if (entry.segments.length === 0) {\n lines.push(\"No observations.\", \"\");\n continue;\n }\n for (const segment of entry.segments) {\n lines.push(\n `- ${clockHhMm(segment.startUtc, timezone)}–${clockHhMm(segment.endUtc, timezone)} — ${formatPlaceLabel(segment)}${formatCoordinates(segment)}`,\n );\n }\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function composeLocationDayMeta(\n date: string,\n timezone: string,\n sources: Record<string, LocationDaySourceEntry>,\n body: string,\n): LocationDayMeta {\n let observationCount = 0;\n for (const entry of Object.values(sources)) observationCount += entry.observationCount;\n return {\n kind: LOCATION_DAY_KIND,\n date,\n timezone,\n formatVersion: LOCATION_DAY_FORMAT_VERSION,\n sources: Object.keys(sources).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)),\n observationCount,\n contentHash: hashLocationBody(body),\n };\n}\n\nfunction frontmatterScalar(key: string, value: string | number): string {\n return `${key}: ${typeof value === \"number\" ? value : JSON.stringify(value)}`;\n}\n\nfunction frontmatterList(key: string, values: readonly string[]): string[] {\n if (values.length === 0) return [`${key}: []`];\n const lines = [`${key}:`];\n for (const value of values) lines.push(` - ${JSON.stringify(value)}`);\n return lines;\n}\n\nexport function serializeLocationDay(meta: LocationDayMeta, body: string): string {\n const lines: string[] = [\"---\"];\n lines.push(frontmatterScalar(\"kind\", meta.kind));\n lines.push(frontmatterScalar(\"date\", meta.date));\n lines.push(frontmatterScalar(\"timezone\", meta.timezone));\n lines.push(frontmatterScalar(\"formatVersion\", meta.formatVersion));\n lines.push(...frontmatterList(\"sources\", meta.sources));\n lines.push(frontmatterScalar(\"observationCount\", meta.observationCount));\n lines.push(frontmatterScalar(\"contentHash\", meta.contentHash));\n lines.push(\"---\", \"\", body);\n return lines.join(\"\\n\");\n}\n\nfunction parseScalar(raw: string): string {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"string\" ? parsed : raw;\n } catch {\n return raw;\n }\n}\n\n/** A day document's frontmatter, parsed for idempotency checks and status. */\nexport interface LocationDaySummary {\n date: string;\n timezone: string;\n sources: string[];\n observationCount: number;\n contentHash: string;\n}\n\n/**\n * Parse a day document's frontmatter. Returns null when the content is not a\n * location day document (wrong kind, missing frontmatter) so callers can\n * distinguish a foreign file from a corrupt one.\n */\nexport function parseLocationDaySummary(raw: string): LocationDaySummary | null {\n if (!raw.startsWith(\"---\\n\")) return null;\n const closeIndex = raw.indexOf(\"\\n---\\n\", 4);\n if (closeIndex === -1) return null;\n const scalars: Record<string, string> = {};\n const lists: Record<string, string[]> = {};\n let currentList: string | null = null;\n for (const line of raw.slice(4, closeIndex).split(\"\\n\")) {\n const listItem = /^ {2}- (.*)$/.exec(line);\n if (listItem !== null && currentList !== null) {\n lists[currentList]!.push(parseScalar(listItem[1]!));\n continue;\n }\n currentList = null;\n const separator = line.indexOf(\":\");\n if (separator === -1) continue;\n const key = line.slice(0, separator);\n const value = line.slice(separator + 1).trim();\n if (value === \"\" || value === \"[]\") {\n lists[key] = [];\n currentList = key;\n continue;\n }\n if (value.startsWith(\"[\")) {\n lists[key] = [parseScalar(value)];\n currentList = key;\n continue;\n }\n scalars[key] = value;\n }\n if (scalars.kind === undefined || parseScalar(scalars.kind) !== LOCATION_DAY_KIND) return null;\n if (scalars.date === undefined || scalars.contentHash === undefined) return null;\n return {\n date: parseScalar(scalars.date),\n timezone: scalars.timezone === undefined ? \"UTC\" : parseScalar(scalars.timezone),\n sources: lists.sources ?? [],\n observationCount: scalars.observationCount === undefined ? 0 : Number(scalars.observationCount) || 0,\n contentHash: parseScalar(scalars.contentHash),\n };\n}\n\n// ── Containment-checked day-file IO ─────────────────────────────────────────\n\nfunction isErrnoCode(err: unknown, code: string): boolean {\n return err instanceof Error && (err as NodeJS.ErrnoException).code === code;\n}\n\nasync function assertNotSymlink(target: string, kind: \"directory\" | \"day file\"): Promise<void> {\n let stat: { isSymbolicLink(): boolean };\n try {\n stat = await lstat(target);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return;\n throw err;\n }\n if (stat.isSymbolicLink()) {\n throw new Error(\n `locations ${kind} '${path.basename(target)}' is a symbolic link — refusing to follow it even when it resolves inside the memory dir (AGENTS.md pattern #3)`,\n );\n }\n}\n\nasync function assertNoEscape(rootReal: string, candidate: string): Promise<void> {\n let candidateReal: string;\n try {\n candidateReal = await realpath(candidate);\n } catch {\n return;\n }\n if (!pathIsInside(rootReal, candidateReal)) {\n throw new Error(\n \"location day path resolves outside the memory dir — refusing to follow a symlink/traversal (AGENTS.md pattern #3)\",\n );\n }\n}\n\nasync function assertDayPathContained(memoryDir: string, targetPath: string): Promise<void> {\n let rootReal: string;\n try {\n rootReal = await realpath(memoryDir);\n } catch {\n rootReal = path.resolve(memoryDir);\n }\n const locationsDir = path.join(memoryDir, LOCATIONS_DIR_NAME);\n await assertNoEscape(rootReal, locationsDir);\n await assertNoEscape(rootReal, targetPath);\n // Reject a symlinked locations root or day file outright — even when the\n // link resolves inside the memory dir (aliasing / tampering) — before IO.\n await assertNotSymlink(locationsDir, \"directory\");\n await assertNotSymlink(targetPath, \"day file\");\n}\n\n/**\n * Idempotently persist a day document: skip the write when the on-disk\n * contentHash already matches. The write is atomic and containment-checked;\n * the caller (pipeline) advances sync state only after this resolves.\n */\nexport async function writeLocationDay(\n memoryDir: string,\n date: string,\n serialized: string,\n): Promise<boolean> {\n const target = locationDayFilePath(memoryDir, date);\n await assertDayPathContained(memoryDir, target);\n try {\n if ((await readFile(target, \"utf-8\")) === serialized) return false;\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });\n await writeFileAtomically(target, serialized);\n return true;\n}\n\n/** Read a stored day document's raw markdown; null when absent. */\nexport async function readLocationDay(memoryDir: string, date: string): Promise<string | null> {\n const target = locationDayFilePath(memoryDir, date);\n await assertDayPathContained(memoryDir, target);\n try {\n return await readFile(target, \"utf-8\");\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n}\n\n/** List dates that have a stored day document, newest first. */\nexport async function listLocationDayDates(memoryDir: string): Promise<string[]> {\n const locationsDir = path.join(memoryDir, LOCATIONS_DIR_NAME);\n await assertDayPathContained(memoryDir, locationsDir);\n let entries: string[];\n try {\n entries = await readdir(locationsDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return [];\n throw err;\n }\n const dates = entries\n .filter((entry) => DAY_FILE_NAME_PATTERN.test(entry))\n .map((entry) => entry.slice(0, -3));\n dates.sort((a, b) => (a > b ? -1 : a < b ? 1 : 0));\n return dates;\n}\n","/**\n * Location day-sync pipeline (issue #2044).\n *\n * For one local day, each configured (enabled, registered) provider's\n * observations are fetched over the day's half-open UTC window, folded into\n * place-visit segments, merged with the other sources' last-known day\n * payloads from sync state, and rendered to the day document. Sync state\n * advances only AFTER the day document (when any) is durable, so a failed\n * write never moves the watermark past data that did not land. An empty\n * fetch is a successful sync — never conflated with a provider failure\n * (AGENTS.md rule 22).\n */\n\nimport { getLocationProvider } from \"./registry.js\";\nimport { locationDayWindow, observationSegments } from \"./intervals.js\";\nimport {\n composeLocationDayBody,\n composeLocationDayMeta,\n loadLocationSyncState,\n serializeLocationDay,\n updateLocationSourceDay,\n writeLocationDay,\n type LocationDaySourceEntry,\n} from \"./store.js\";\nimport type { LocationConfig, LocationObservation, LocationProvider, LocationSegment } from \"./types.js\";\n\nconst MAX_SYNC_PAGES = 10_000;\n\nexport interface LocationDaySyncOptions {\n config: LocationConfig;\n memoryDir: string;\n date: string;\n signal?: AbortSignal;\n /** Runaway-pagination guard; defaults to MAX_SYNC_PAGES. */\n maxPages?: number;\n now?: () => Date;\n /** Provider lookup seam (defaults to the registry); tests inject doubles. */\n getProvider?: (id: string) => LocationProvider | undefined;\n}\n\nexport interface LocationSourceSyncResult {\n sourceId: string;\n status: \"synced\" | \"skipped\" | \"failed\";\n skipReason?: \"source-disabled\" | \"provider-not-registered\";\n fetched: number;\n dayWritten: boolean;\n stateSaved: boolean;\n /** Sanitized provider error (no tokens, URLs, or coordinates). */\n error?: string;\n}\n\n/** Redact credential, URL query, and coordinate shapes from a provider error. */\nexport function sanitizeProviderError(error: unknown): string {\n const raw = error instanceof Error ? error.message : String(error);\n return raw\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer [redacted]\")\n .replace(/[?#][^ \\t\"']*/g, \"[redacted]\")\n .replace(/[+-]?\\d+\\.\\d{3,},\\s?[+-]?\\d+\\.\\d{3,}/g, \"[coordinates]\")\n .slice(0, 300);\n}\n\nfunction assertValidObservation(observation: LocationObservation): void {\n if (typeof observation !== \"object\" || observation === null) {\n throw new TypeError(\"location provider returned a non-object observation\");\n }\n if (typeof observation.observedAtUtc !== \"string\" || !Number.isFinite(Date.parse(observation.observedAtUtc))) {\n throw new TypeError(\"location provider returned an observation with an invalid observedAtUtc\");\n }\n const place = observation.place;\n if (typeof place !== \"object\" || place === null || typeof place.id !== \"string\" || place.id.length === 0) {\n throw new TypeError(\"location provider returned an observation without a valid place\");\n }\n if (typeof place.label !== \"string\" || place.label.trim().length === 0) {\n throw new TypeError(`location provider returned place '${place.id}' without a label`);\n }\n}\n\n/** Fetch every observation one provider holds for the window, all pages. */\nasync function fetchWindow(\n provider: LocationProvider,\n window: { startUtc: string; endUtc: string },\n options: LocationDaySyncOptions,\n): Promise<LocationObservation[]> {\n const maxPages = options.maxPages ?? MAX_SYNC_PAGES;\n if (!Number.isInteger(maxPages) || maxPages < 1) {\n throw new RangeError(\"location sync maxPages must be a positive integer\");\n }\n const observations: LocationObservation[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | null = null;\n let pages = 0;\n let completed = false;\n while (pages < maxPages) {\n options.signal?.throwIfAborted();\n const page = await provider.fetchObservations({\n startUtc: window.startUtc,\n endUtc: window.endUtc,\n cursor,\n signal: options.signal,\n });\n pages += 1;\n for (const observation of page.observations) assertValidObservation(observation);\n observations.push(...page.observations);\n if (page.nextCursor === null) {\n completed = true;\n break;\n }\n if (typeof page.nextCursor !== \"string\" || page.nextCursor.length === 0) {\n throw new TypeError(\"location provider returned an invalid cursor\");\n }\n if (seenCursors.has(page.nextCursor)) {\n throw new Error(\"location provider returned a repeated cursor\");\n }\n seenCursors.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n // Only a loop that ran out of its page budget without a terminal null\n // cursor is a runaway; completing on the final allowed page is normal.\n if (!completed) {\n throw new Error(`location provider exceeded ${maxPages} pages`);\n }\n return observations;\n}\n\n/**\n * Sync every configured source for one local day. The master gate\n * (`config.enabled === false`) short-circuits every path: no providers are\n * contacted and nothing touches the filesystem. A provider failure fails\n * that source only (state not advanced) and never blocks the others.\n */\nexport async function syncLocationDay(options: LocationDaySyncOptions): Promise<LocationSourceSyncResult[]> {\n if (!options.config.enabled) return [];\n const window = locationDayWindow(options.date, options.config.timezone);\n const now = options.now ?? (() => new Date());\n const resolveProvider = options.getProvider ?? getLocationProvider;\n\n const results: LocationSourceSyncResult[] = [];\n for (const source of options.config.sources) {\n if (!source.enabled) {\n results.push({\n sourceId: source.id,\n status: \"skipped\",\n skipReason: \"source-disabled\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n });\n continue;\n }\n const provider = resolveProvider(source.id);\n if (provider === undefined) {\n results.push({\n sourceId: source.id,\n status: \"skipped\",\n skipReason: \"provider-not-registered\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n });\n continue;\n }\n\n let observations: LocationObservation[];\n try {\n observations = await fetchWindow(provider, window, options);\n } catch (error) {\n results.push({\n sourceId: source.id,\n status: \"failed\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n ...(error instanceof Error && error.name === \"AbortError\"\n ? { error: \"aborted\" }\n : { error: sanitizeProviderError(error) }),\n });\n continue;\n }\n\n try {\n options.signal?.throwIfAborted();\n const segments = observationSegments(observations, window, {\n retainCoordinates: options.config.retainCoordinates,\n });\n const payload = { observationCount: observations.length, segments, providerDisplayName: provider.displayName };\n const merged = await mergeDaySources(options.memoryDir, source.id, options.date, payload);\n let dayWritten = false;\n if (Object.values(merged).some((entry) => entry.observationCount > 0)) {\n const body = composeLocationDayBody(options.date, options.config.timezone, merged);\n const meta = composeLocationDayMeta(options.date, options.config.timezone, merged, body);\n dayWritten = await writeLocationDay(options.memoryDir, options.date, serializeLocationDay(meta, body));\n }\n // State advances only after the durable day write above succeeded.\n await updateLocationSourceDay(\n options.memoryDir,\n source.id,\n options.date,\n payload,\n now().toISOString(),\n );\n results.push({\n sourceId: source.id,\n status: \"synced\",\n fetched: observations.length,\n dayWritten,\n stateSaved: true,\n });\n } catch (error) {\n results.push({\n sourceId: source.id,\n status: \"failed\",\n fetched: observations.length,\n dayWritten: false,\n stateSaved: false,\n ...(error instanceof Error && error.name === \"AbortError\"\n ? { error: \"aborted\" }\n : { error: sanitizeProviderError(error) }),\n });\n }\n }\n return results;\n}\n\n/**\n * The day-document source map: this source's fresh payload plus every OTHER\n * source's last-known payload from sync state. Rendered documents therefore\n * survive a re-sync of one source without re-fetching the others.\n */\nasync function mergeDaySources(\n memoryDir: string,\n sourceId: string,\n date: string,\n payload: { observationCount: number; segments: LocationSegment[] },\n): Promise<Record<string, LocationDaySourceEntry>> {\n const state = await loadLocationSyncState(memoryDir);\n const merged: Record<string, LocationDaySourceEntry> = {};\n for (const [otherId, otherState] of Object.entries(state.sources)) {\n if (otherId === sourceId) continue;\n const day = otherState.days?.[date];\n if (day === undefined) continue;\n merged[otherId] = { ...day, segments: [...day.segments] };\n }\n merged[sourceId] = payload;\n return merged;\n}\n","/**\n * Location surface helpers (issue #2044): status, provider health checks, and\n * multi-day sync. Pure `@remnic/core` — no optional packages, no host CLI\n * wiring; a host adapter (or the core CLI, in a later slice) renders these\n * structured results into its own command surface.\n */\n\nimport { getLocationProvider } from \"./registry.js\";\nimport { isValidLocationDate, localDayKey } from \"./intervals.js\";\nimport { listLocationDayDates, loadLocationSyncState, parseLocationDaySummary, readLocationDay } from \"./store.js\";\nimport { syncLocationDay, type LocationDaySyncOptions, type LocationSourceSyncResult } from \"./pipeline.js\";\nimport type { LocationConfig, LocationProvider } from \"./types.js\";\n\nexport interface LocationSourceStatus {\n id: string;\n enabled: boolean;\n providerRegistered: boolean;\n lastSyncedAtUtc?: string;\n trackedDays: number;\n}\n\nexport interface LocationDayStatus {\n date: string;\n sources: string[];\n observationCount: number;\n}\n\nexport interface LocationStatusReport {\n enabled: boolean;\n timezone: string;\n sources: LocationSourceStatus[];\n /** Stored day documents, newest first (at most `maxDays`). */\n recentDays: LocationDayStatus[];\n}\n\nexport interface LocationStatusOptions {\n /** Provider lookup seam (defaults to the registry); tests inject doubles. */\n getProvider?: (id: string) => LocationProvider | undefined;\n /** Cap on day documents listed; defaults to 7. */\n maxDays?: number;\n now?: () => Date;\n}\n\nexport async function locationStatus(\n config: LocationConfig,\n memoryDir: string,\n options: LocationStatusOptions = {},\n): Promise<LocationStatusReport> {\n const resolveProvider = options.getProvider ?? getLocationProvider;\n const state = await loadLocationSyncState(memoryDir);\n const sources: LocationSourceStatus[] = config.sources.map((source) => {\n const sourceState = state.sources[source.id];\n return {\n id: source.id,\n enabled: source.enabled,\n providerRegistered: resolveProvider(source.id) !== undefined,\n ...(sourceState?.lastSyncedAtUtc === undefined ? {} : { lastSyncedAtUtc: sourceState.lastSyncedAtUtc }),\n trackedDays: Object.keys(sourceState?.days ?? {}).length,\n };\n });\n\n const maxDays = options.maxDays ?? 7;\n const recentDays: LocationDayStatus[] = [];\n for (const date of (await listLocationDayDates(memoryDir)).slice(0, Math.max(0, maxDays))) {\n const raw = await readLocationDay(memoryDir, date);\n const summary = raw === null ? null : parseLocationDaySummary(raw);\n recentDays.push({\n date,\n sources: summary?.sources ?? [],\n observationCount: summary?.observationCount ?? 0,\n });\n }\n return { enabled: config.enabled, timezone: config.timezone, sources, recentDays };\n}\n\nexport interface LocationSourceCheckResult {\n id: string;\n ok: boolean;\n detail?: string;\n skipped?: \"location-disabled\" | \"source-disabled\" | \"provider-not-registered\";\n}\n\nexport interface LocationCheckOptions {\n signal?: AbortSignal;\n getProvider?: (id: string) => LocationProvider | undefined;\n}\n\n/** Probe every configured provider's health. The master gate short-circuits. */\nexport async function checkLocationSources(\n config: LocationConfig,\n options: LocationCheckOptions = {},\n): Promise<LocationSourceCheckResult[]> {\n if (!config.enabled) {\n return config.sources.map((source) => ({ id: source.id, ok: false, skipped: \"location-disabled\" as const }));\n }\n const resolveProvider = options.getProvider ?? getLocationProvider;\n const results: LocationSourceCheckResult[] = [];\n for (const source of config.sources) {\n if (!source.enabled) {\n results.push({ id: source.id, ok: false, skipped: \"source-disabled\" });\n continue;\n }\n const provider = resolveProvider(source.id);\n if (provider === undefined) {\n results.push({ id: source.id, ok: false, skipped: \"provider-not-registered\" });\n continue;\n }\n try {\n const check = await provider.verify(options.signal);\n results.push({\n id: source.id,\n ok: check.ok,\n ...(check.detail === undefined || check.detail.length === 0 ? {} : { detail: check.detail }),\n });\n } catch (error) {\n results.push({ id: source.id, ok: false, detail: error instanceof Error ? error.name : \"provider error\" });\n }\n }\n return results;\n}\n\nfunction shiftIsoDate(date: string, days: number): string {\n const parsed = new Date(`${date}T00:00:00Z`);\n parsed.setUTCDate(parsed.getUTCDate() + days);\n return parsed.toISOString().slice(0, 10);\n}\n\nexport interface LocationSyncRunOptions\n extends Omit<LocationDaySyncOptions, \"config\" | \"date\" | \"memoryDir\"> {\n config: LocationConfig;\n memoryDir: string;\n /** Exclusive end date (local YYYY-MM-DD); defaults to today in config.timezone. */\n endDate?: string;\n /** Number of days to sync ending at endDate; defaults to config.syncDays. */\n days?: number;\n now?: () => Date;\n}\n/**\n * Sync the trailing `days` local days ending AT `endDate` (inclusive).\n * `endDate` defaults to yesterday in config.timezone (today is incomplete);\n * days run oldest-first so a failure stops before newer days, matching the\n * incremental-sync intent of `syncDays`.\n */\nexport async function syncLocation(\n options: LocationSyncRunOptions,\n): Promise<Array<{ date: string; results: LocationSourceSyncResult[] }>> {\n const { config, memoryDir, endDate, days, ...rest } = options;\n if (endDate !== undefined && !isValidLocationDate(endDate)) {\n throw new RangeError(`Invalid location endDate \"${endDate}\"; expected a real YYYY-MM-DD day.`);\n }\n const now = rest.now ?? (() => new Date());\n const end = endDate ?? shiftIsoDate(localDayKey(now().toISOString(), config.timezone), -1);\n const count = days ?? config.syncDays;\n if (!Number.isInteger(count) || count < 1 || count > 90) {\n throw new RangeError(\"location sync days must be an integer from 1 to 90\");\n }\n const runs: Array<{ date: string; results: LocationSourceSyncResult[] }> = [];\n for (let offset = count; offset >= 1; offset -= 1) {\n const date = shiftIsoDate(end, -(offset - 1));\n runs.push({ date, results: await syncLocationDay({ ...rest, config, memoryDir, date, now }) });\n }\n return runs;\n}\n","/**\n * Location provider bootstrapping (issue #2047).\n *\n * Core never statically imports a provider package (adapter-isolation test),\n * so every surface calls this before status/check/sync: it registers\n * configured providers from optional packages via computed-specifier dynamic\n * imports, with credentials read from environment variables — tokens never\n * enter config files, errors, or logs. A source whose package or credentials\n * are absent stays unregistered and the pipeline reports\n * `provider-not-registered`; that is a skip reason, never an error (the\n * connector-reitti package's README contract).\n */\n\nimport { readEnvVar } from \"../runtime/env.js\";\nimport { log } from \"../logger.js\";\nimport { getLocationProvider } from \"./registry.js\";\nimport type { LocationConfig } from \"./types.js\";\n\n/** Environment shape the setup reads for the `reitti` source. */\nexport interface LocationProviderEnv {\n baseUrl?: string;\n token?: string;\n authMode?: string;\n}\n\nexport interface LocationProviderSetupDeps {\n /** Injectable env (tests); defaults to REITTI_* process variables. */\n env?: LocationProviderEnv;\n /** Injectable module loader (tests); defaults to a dynamic import. */\n importModule?: (specifier: string) => Promise<unknown>;\n}\n\ninterface ReittiProviderModule {\n ensureReittiProviderRegistered(options: {\n baseUrl: string;\n token: string;\n timezone: string;\n authMode?: \"x-api-token\" | \"bearer\";\n }): boolean;\n}\n\nconst loadFailuresWarned = new Set<string>();\n\nfunction readReittiEnv(): LocationProviderEnv {\n return {\n baseUrl: readEnvVar(\"REITTI_BASE_URL\"),\n token: readEnvVar(\"REITTI_TOKEN\"),\n authMode: readEnvVar(\"REITTI_AUTH_MODE\"),\n };\n}\n\n/**\n * Register every configured+enabled source's provider when its optional\n * package and credentials are available. Idempotent; returns the ids this\n * call registered. Never throws — a missing package or credential set is\n * reported downstream as `provider-not-registered`.\n */\nexport async function ensureConfiguredLocationProviders(\n config: LocationConfig,\n deps: LocationProviderSetupDeps = {},\n): Promise<string[]> {\n const registered: string[] = [];\n if (!config.enabled) return registered;\n for (const source of config.sources) {\n if (!source.enabled) continue;\n if (getLocationProvider(source.id) !== undefined) continue;\n // ponytail: only the `reitti` built-in exists today; add cases here as\n // provider packages land — a registry table when there is more than one.\n if (source.id !== \"reitti\") continue;\n const env = deps.env ?? readReittiEnv();\n const baseUrl = env.baseUrl?.trim();\n const token = env.token?.trim();\n if (!baseUrl || !token) continue;\n const authMode =\n env.authMode === \"x-api-token\" || env.authMode === \"bearer\" ? env.authMode : undefined;\n const specifier = \"@remnic/\" + \"connector-reitti\";\n const load = deps.importModule ?? ((s: string) => import(s));\n try {\n const mod = (await load(specifier)) as ReittiProviderModule;\n if (\n mod.ensureReittiProviderRegistered({\n baseUrl,\n token,\n timezone: config.timezone,\n ...(authMode !== undefined ? { authMode } : {}),\n })\n ) {\n registered.push(\"reitti\");\n }\n } catch (err) {\n // Absent optional package is the common case (skip silently); a real\n // load failure is worth one warn line, never credentials.\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(specifier)) {\n if (!loadFailuresWarned.has(specifier)) {\n loadFailuresWarned.add(specifier);\n log.warn(`location: failed to load optional provider package ${specifier}: ${message}`);\n }\n }\n }\n }\n return registered;\n}\n","/**\n * Location surface runners (issue #2047) — ONE implementation shared by the\n * CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the\n * scheduler, so no surface can fork validation or disabled/empty/failure\n * semantics (same rule as the wearables runner). Parsing here is strict:\n * unknown flags reject with the valid list, invalid values reject loudly.\n */\n\nimport { EngramAccessInputError } from \"../access-errors.js\";\nimport {\n checkLocationSources,\n locationStatus,\n syncLocation,\n type LocationSourceCheckResult,\n type LocationStatusReport,\n} from \"./cli.js\";\nimport { isValidLocationDate } from \"./intervals.js\";\nimport type { LocationSourceSyncResult } from \"./pipeline.js\";\nimport { ensureConfiguredLocationProviders } from \"./provider-setup.js\";\nimport { parseLocationDaySummary, readLocationDay } from \"./store.js\";\nimport type { LocationConfig } from \"./types.js\";\n\nexport interface LocationSurfaceDeps {\n config: LocationConfig;\n memoryDir: string;\n}\n\nexport interface LocationSyncRun {\n date: string;\n results: LocationSourceSyncResult[];\n}\n\nexport type LocationSyncRuns = LocationSyncRun[];\n\nexport async function runLocationStatus(\n deps: LocationSurfaceDeps,\n): Promise<LocationStatusReport> {\n await ensureConfiguredLocationProviders(deps.config);\n return locationStatus(deps.config, deps.memoryDir);\n}\n\nexport async function runLocationCheck(\n deps: LocationSurfaceDeps,\n signal?: AbortSignal,\n): Promise<LocationSourceCheckResult[]> {\n await ensureConfiguredLocationProviders(deps.config);\n return checkLocationSources(deps.config, signal !== undefined ? { signal } : {});\n}\n\nexport async function runLocationSync(\n deps: LocationSurfaceDeps,\n request: { endDate?: string; days?: number } = {},\n): Promise<LocationSyncRuns> {\n await ensureConfiguredLocationProviders(deps.config);\n const runs = await syncLocation({ ...deps, ...validatedSyncWindow(request) });\n return runs as LocationSyncRuns;\n}\n\nexport interface LocationDayView {\n date: string;\n found: boolean;\n sources: string[];\n observationCount: number;\n body: string | null;\n}\n\nexport async function runLocationDay(memoryDir: string, rawDate: unknown): Promise<LocationDayView> {\n const date = requireLocationDate(rawDate, \"date\");\n const body = await readLocationDay(memoryDir, date);\n const summary = body === null ? null : parseLocationDaySummary(body);\n return {\n date,\n found: body !== null,\n sources: summary?.sources ?? [],\n observationCount: summary?.observationCount ?? 0,\n body,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared validation (CLI, MCP, HTTP all reject identically)\n// ---------------------------------------------------------------------------\n\nfunction requireLocationDate(raw: unknown, label: string): string {\n if (typeof raw !== \"string\" || !isValidLocationDate(raw)) {\n throw new EngramAccessInputError(`location: ${label} is required (YYYY-MM-DD)`);\n }\n return raw;\n}\n\nfunction optionalLocationDays(raw: unknown): number | undefined {\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 90) {\n throw new EngramAccessInputError(\"location: days expects an integer from 1 to 90\");\n }\n return parsed;\n}\n\nfunction validatedSyncWindow(request: { endDate?: string; days?: number }): {\n endDate?: string;\n days?: number;\n} {\n const days = optionalLocationDays(request.days);\n const endDate =\n request.endDate === undefined || request.endDate === null || request.endDate === \"\"\n ? undefined\n : requireLocationDate(request.endDate, \"date\");\n return { ...(endDate !== undefined ? { endDate } : {}), ...(days !== undefined ? { days } : {}) };\n}\n\n/** Day span between two inclusive local dates (from ≤ to, ≤ 90 days). */\nexport function parseLocationBackfillRange(\n rawFrom: unknown,\n rawTo: unknown,\n): { endDate: string; days: number } {\n const from = requireLocationDate(rawFrom, \"from\");\n const to = requireLocationDate(rawTo, \"to\");\n const fromMs = Date.parse(`${from}T00:00:00Z`);\n const toMs = Date.parse(`${to}T00:00:00Z`);\n if (toMs < fromMs) {\n throw new EngramAccessInputError(\"location: backfill --from must not be after --to\");\n }\n const days = Math.round((toMs - fromMs) / 86_400_000) + 1;\n if (days > 90) {\n throw new EngramAccessInputError(\"location: backfill range is capped at 90 days\");\n }\n return { endDate: to, days };\n}\n\n// ---------------------------------------------------------------------------\n// CLI command (shared by every CLI host)\n// ---------------------------------------------------------------------------\n\nexport interface LocationCliIo {\n stdout: { write(chunk: string): unknown };\n stderr: { write(chunk: string): unknown };\n}\n\nconst USAGE = `Usage: location <command> [options]\n\nCommands:\n status Configured sources, registration, last sync\n check Probe every enabled provider (auth/connectivity)\n sync [options] Sync recent local days (default: config.syncDays\n ending yesterday)\n --date <YYYY-MM-DD> End the window on this day (inclusive)\n --days <n> Window size, 1..90 (default: location.syncDays)\n backfill --from <date> --to <date>\n Sync an explicit historical range (≤ 90 days)\n day <YYYY-MM-DD> Print one stored location day\n\nAdd --json to status/sync/backfill/day for machine-readable output.\nCredentials for built-in providers come from the environment:\n reitti: REITTI_BASE_URL, REITTI_TOKEN[, REITTI_AUTH_MODE=x-api-token|bearer]\n`;\n\nconst VALUE_FLAGS = new Set([\"--date\", \"--days\", \"--from\", \"--to\"]);\nconst BOOLEAN_FLAGS = new Set([\"--json\"]);\n\ninterface ParsedCliFlags {\n flags: Map<string, string | true>;\n positional: string[];\n}\n\nfunction parseCliFlags(args: string[]): ParsedCliFlags {\n const flags = new Map<string, string | true>();\n const positional: string[] = [];\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positional.push(arg);\n continue;\n }\n if (BOOLEAN_FLAGS.has(arg)) {\n flags.set(arg, true);\n continue;\n }\n if (VALUE_FLAGS.has(arg)) {\n const value = args[index + 1];\n if (value === undefined || value.startsWith(\"--\")) {\n throw new EngramAccessInputError(`location: ${arg} requires a value`);\n }\n flags.set(arg, value);\n index++;\n continue;\n }\n throw new EngramAccessInputError(\n `location: unknown flag '${arg}' — valid flags: ${[...VALUE_FLAGS, ...BOOLEAN_FLAGS].join(\", \")}`,\n );\n }\n return { flags, positional };\n}\n\nfunction flagString(parsed: ParsedCliFlags, name: string): string | undefined {\n const value = parsed.flags.get(name);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction renderStatus(report: LocationStatusReport): string {\n const lines = [\n `Location: ${report.enabled ? \"enabled\" : \"disabled\"} (timezone ${report.timezone})`,\n ];\n if (report.sources.length === 0) {\n lines.push(\"No sources configured. Add location.sources to the plugin config.\");\n return `${lines.join(\"\\n\")}\\n`;\n }\n for (const source of report.sources) {\n lines.push(\n ` ${source.id}: ${source.enabled ? \"enabled\" : \"disabled\"}, ` +\n `provider ${source.providerRegistered ? \"registered\" : \"not registered\"}, ` +\n `${source.trackedDays} tracked day${source.trackedDays === 1 ? \"\" : \"s\"}, ` +\n `last sync ${source.lastSyncedAtUtc ?? \"never\"}`,\n );\n }\n if (report.recentDays.length > 0) {\n lines.push(\" recent days:\");\n for (const day of report.recentDays) {\n lines.push(\n ` ${day.date} ${day.observationCount} observation${day.observationCount === 1 ? \"\" : \"s\"} [${day.sources.join(\", \")}]`,\n );\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction anySourceFailed(runs: LocationSyncRuns): boolean {\n return runs.some((run) => run.results.some((result) => result.status === \"failed\"));\n}\n\nfunction renderRuns(io: LocationCliIo, runs: LocationSyncRuns): void {\n for (const run of runs) {\n for (const result of run.results) {\n io.stdout.write(\n `${run.date} ${result.sourceId}: ${result.status}${result.error ? ` — ${result.error}` : \"\"} (${result.fetched} fetched)\\n`,\n );\n }\n }\n}\n\n/** Run a `remnic location ...` command; returns a process exit code. */\nexport async function runLocationCliCommand(\n deps: LocationSurfaceDeps,\n args: string[],\n io: LocationCliIo,\n): Promise<number> {\n const [command, ...rest] = args;\n try {\n switch (command) {\n case undefined:\n case \"help\":\n case \"--help\": {\n io.stdout.write(USAGE);\n return command === undefined ? 1 : 0;\n }\n case \"status\": {\n const parsed = parseCliFlags(rest);\n const report = await runLocationStatus(deps);\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n return 0;\n }\n io.stdout.write(renderStatus(report));\n return 0;\n }\n case \"check\": {\n const results = await runLocationCheck(deps);\n for (const result of results) {\n const skipped = result.skipped === undefined ? \"\" : ` (skipped: ${result.skipped})`;\n io.stdout.write(\n `${result.id}: ${result.ok ? \"OK\" : \"FAILED\"}${skipped}${result.detail ? ` — ${result.detail}` : \"\"}\\n`,\n );\n }\n return results.every((result) => result.ok) ? 0 : 1;\n }\n case \"sync\": {\n const parsed = parseCliFlags(rest);\n if (parsed.positional.length > 0) {\n throw new EngramAccessInputError(\n `location: unexpected argument '${parsed.positional[0]}' — sync takes flags only`,\n );\n }\n const daysValue = flagString(parsed, \"--days\");\n const runs = await runLocationSync(deps, {\n endDate: flagString(parsed, \"--date\"),\n ...(daysValue !== undefined ? { days: Number(daysValue) } : {}),\n });\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify({ days: runs }, null, 2)}\\n`);\n } else {\n renderRuns(io, runs);\n }\n return anySourceFailed(runs) ? 1 : 0;\n }\n case \"backfill\": {\n const parsed = parseCliFlags(rest);\n const range = parseLocationBackfillRange(flagString(parsed, \"--from\"), flagString(parsed, \"--to\"));\n const runs = await runLocationSync(deps, range);\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify({ days: runs }, null, 2)}\\n`);\n } else {\n renderRuns(io, runs);\n }\n return anySourceFailed(runs) ? 1 : 0;\n }\n case \"day\": {\n const parsed = parseCliFlags(rest);\n const date = parsed.positional[0] ?? flagString(parsed, \"--date\");\n const view = await runLocationDay(deps.memoryDir, date);\n if (!view.found) {\n io.stderr.write(`No stored location day for ${view.date}.\\n`);\n return 1;\n }\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify(view, null, 2)}\\n`);\n return 0;\n }\n io.stdout.write(`${view.body}\\n`);\n return 0;\n }\n default:\n io.stderr.write(`location: unknown command '${command}'\\n${USAGE}`);\n return 1;\n }\n } catch (err) {\n io.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveDefaultNamespaceRoot,
|
|
3
3
|
resolveNamespaceStorageRoot
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-F7XUD3PL.js";
|
|
5
5
|
import {
|
|
6
6
|
MutationSerializer,
|
|
7
7
|
withHeldFileLock
|
|
@@ -1473,4 +1473,4 @@ export {
|
|
|
1473
1473
|
isNamespaceKind,
|
|
1474
1474
|
NamespaceCatalog
|
|
1475
1475
|
};
|
|
1476
|
-
//# sourceMappingURL=chunk-
|
|
1476
|
+
//# sourceMappingURL=chunk-3PKAS6VL.js.map
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
} from "./chunk-VI637ILW.js";
|
|
5
5
|
import {
|
|
6
6
|
composeSalvagedEnvelope
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AHPIFKNG.js";
|
|
8
8
|
import {
|
|
9
9
|
StorageManager
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-W2BAGGEW.js";
|
|
11
11
|
import {
|
|
12
12
|
parseContinuityImprovementLoops
|
|
13
13
|
} from "./chunk-LDXUBPMO.js";
|
|
@@ -1283,4 +1283,4 @@ export {
|
|
|
1283
1283
|
defaultTierMigrationCycleBudget,
|
|
1284
1284
|
CompoundingEngine
|
|
1285
1285
|
};
|
|
1286
|
-
//# sourceMappingURL=chunk-
|
|
1286
|
+
//# sourceMappingURL=chunk-3SZD4CYO.js.map
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import {
|
|
2
|
+
looksLikeMechanicalTelemetryTranscript
|
|
3
|
+
} from "./chunk-4RA3C3EV.js";
|
|
4
|
+
import {
|
|
5
|
+
estimateTokenCount
|
|
6
|
+
} from "./chunk-TOTT6S2V.js";
|
|
7
|
+
|
|
8
|
+
// src/context-summary.ts
|
|
9
|
+
var ContextSummaryUnavailableError = class extends Error {
|
|
10
|
+
constructor(reason) {
|
|
11
|
+
super(`context summary unavailable: ${reason}`);
|
|
12
|
+
this.name = "ContextSummaryUnavailableError";
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
var DEFAULT_DETERMINISTIC_MAX_TOKENS = 256;
|
|
16
|
+
var OUTPUT_TOKEN_TOLERANCE = 1.5;
|
|
17
|
+
var MIN_DETERMINISTIC_TOKENS = 1;
|
|
18
|
+
async function summarizeContextPure(text, targetTokens, method, options = {}) {
|
|
19
|
+
const deterministicMaxTokens = Math.max(
|
|
20
|
+
MIN_DETERMINISTIC_TOKENS,
|
|
21
|
+
options.deterministicMaxTokens ?? DEFAULT_DETERMINISTIC_MAX_TOKENS
|
|
22
|
+
);
|
|
23
|
+
if (method === "deterministic") {
|
|
24
|
+
return {
|
|
25
|
+
text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),
|
|
26
|
+
method: "deterministic",
|
|
27
|
+
fallback: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const usableLlm = options.llm ?? null;
|
|
31
|
+
if (method === "llm") {
|
|
32
|
+
if (!usableLlm) {
|
|
33
|
+
throw new ContextSummaryUnavailableError("no llm seam configured");
|
|
34
|
+
}
|
|
35
|
+
const result = await attemptLlm(usableLlm, text, targetTokens, false);
|
|
36
|
+
if (result === null) {
|
|
37
|
+
throw new ContextSummaryUnavailableError("llm path failed");
|
|
38
|
+
}
|
|
39
|
+
return { text: result, method: "llm", fallback: false, modelUsed: options.modelUsed };
|
|
40
|
+
}
|
|
41
|
+
if (options.telemetryPrefilterEnabled && looksLikeMechanicalTelemetryTranscript(text)) {
|
|
42
|
+
return {
|
|
43
|
+
text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),
|
|
44
|
+
method: "deterministic",
|
|
45
|
+
fallback: true,
|
|
46
|
+
escalation: 2
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (usableLlm) {
|
|
50
|
+
const normal = await attemptLlm(usableLlm, text, targetTokens, false);
|
|
51
|
+
if (normal !== null) {
|
|
52
|
+
return { text: normal, method: "llm", fallback: false, escalation: 0, modelUsed: options.modelUsed };
|
|
53
|
+
}
|
|
54
|
+
const aggressiveTarget = Math.max(32, Math.ceil(targetTokens * 0.5));
|
|
55
|
+
const aggressive = await attemptLlm(usableLlm, text, aggressiveTarget, true);
|
|
56
|
+
if (aggressive !== null) {
|
|
57
|
+
return { text: aggressive, method: "llm", fallback: true, escalation: 1, modelUsed: options.modelUsed };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
text: deterministicTruncate(text, deterministicMaxTokens),
|
|
62
|
+
method: "deterministic",
|
|
63
|
+
fallback: true,
|
|
64
|
+
escalation: 2
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function attemptLlm(llm, text, targetTokens, aggressive) {
|
|
68
|
+
try {
|
|
69
|
+
const result = await llm(text, targetTokens, aggressive);
|
|
70
|
+
if (!result || result.trim().length === 0) return null;
|
|
71
|
+
if (estimateTokenCount(result) > targetTokens * OUTPUT_TOKEN_TOLERANCE) return null;
|
|
72
|
+
return result;
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function deterministicTruncate(text, maxTokens) {
|
|
78
|
+
if (maxTokens <= 0 || estimateTokenCount(text) <= maxTokens) return text;
|
|
79
|
+
const sentences = text.split(/(?<=[.!?])\s+/).filter((s) => s.length > 0);
|
|
80
|
+
if (sentences.length <= 2) return clampToTokenBudget(text, maxTokens);
|
|
81
|
+
const first = sentences[0];
|
|
82
|
+
const last = sentences[sentences.length - 1];
|
|
83
|
+
const render = (middle2, truncated2) => `${first} ${middle2.join(" ")}${truncated2 ? " [...] " : " "}${last}`;
|
|
84
|
+
const base = render([], false);
|
|
85
|
+
if (estimateTokenCount(base) > maxTokens) return clampToTokenBudget(text, maxTokens);
|
|
86
|
+
if (estimateTokenCount(render([], true)) > maxTokens) return base;
|
|
87
|
+
const middle = [];
|
|
88
|
+
for (let i = 1; i < sentences.length - 1; i++) {
|
|
89
|
+
const candidate = [...middle, sentences[i]];
|
|
90
|
+
const truncated2 = i < sentences.length - 2;
|
|
91
|
+
if (estimateTokenCount(render(candidate, truncated2)) > maxTokens) break;
|
|
92
|
+
middle.push(sentences[i]);
|
|
93
|
+
}
|
|
94
|
+
const truncated = middle.length < sentences.length - 2;
|
|
95
|
+
return clampToTokenBudget(render(middle, truncated), maxTokens);
|
|
96
|
+
}
|
|
97
|
+
function clampToTokenBudget(text, maxTokens) {
|
|
98
|
+
const codePoints = [...text];
|
|
99
|
+
let low = 0;
|
|
100
|
+
let high = codePoints.length;
|
|
101
|
+
while (low < high) {
|
|
102
|
+
const mid = Math.ceil((low + high) / 2);
|
|
103
|
+
if (estimateTokenCount(codePoints.slice(0, mid).join("")) <= maxTokens) low = mid;
|
|
104
|
+
else high = mid - 1;
|
|
105
|
+
}
|
|
106
|
+
return codePoints.slice(0, low).join("");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export {
|
|
110
|
+
ContextSummaryUnavailableError,
|
|
111
|
+
summarizeContextPure,
|
|
112
|
+
deterministicTruncate
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=chunk-43HUVDTD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context-summary.ts"],"sourcesContent":["/**\n * Pure context summary seam (issue #2347).\n *\n * The only shared summary path: `LcmSummarizer` and active-context\n * transforms both call `summarizeContextPure`. No DAG writes, no model\n * client construction — callers inject the model seam (`SummarizeFn`).\n */\nimport { looksLikeMechanicalTelemetryTranscript } from \"./telemetry-transcript.js\";\nimport { estimateTokenCount } from \"./token-estimate.js\";\n\n/** Model seam injected by the caller (orchestrator LLM path or a test stub). */\nexport type SummarizeFn = (\n text: string,\n targetTokens: number,\n aggressive: boolean,\n) => Promise<string | null>;\n\nexport type ContextSummaryMethod = \"deterministic\" | \"llm\" | \"auto\";\n\nexport interface PureContextSummaryResult {\n text: string;\n method: \"llm\" | \"deterministic\";\n /** True when the requested path degraded (auto mode only). */\n fallback: boolean;\n modelUsed?: string;\n /**\n * Escalation level preserved for LCM callers: 0 normal LLM, 1 aggressive\n * LLM, 2 deterministic truncation. Undefined when never escalated.\n */\n escalation?: number;\n}\n\nexport interface SummarizeContextPureOptions {\n /** LLM seam. Required for `llm`; without it `auto` degrades to deterministic. */\n llm?: SummarizeFn;\n /** Hard ceiling for deterministic truncation output. */\n deterministicMaxTokens?: number;\n /** Route obvious mechanical telemetry straight to truncation. */\n telemetryPrefilterEnabled?: boolean;\n /** Recorded verbatim in the result for telemetry. */\n modelUsed?: string;\n}\n\n/** Thrown when `llm` mode cannot produce usable text (no silent fallback). */\nexport class ContextSummaryUnavailableError extends Error {\n constructor(reason: string) {\n super(`context summary unavailable: ${reason}`);\n this.name = \"ContextSummaryUnavailableError\";\n }\n}\n\nconst DEFAULT_DETERMINISTIC_MAX_TOKENS = 256;\n/** LLM output tolerance before an attempt is rejected as too long (LCM parity). */\nconst OUTPUT_TOKEN_TOLERANCE = 1.5;\nconst MIN_DETERMINISTIC_TOKENS = 1;\n\n/**\n * Summarize text through the shared seam.\n *\n * - `deterministic`: safe truncation only, never throws, never calls the LLM.\n * - `llm`: exactly one non-aggressive LLM call; failure or unusable output\n * throws {@link ContextSummaryUnavailableError} (fallback is not allowed).\n * - `auto`: escalation ladder (LLM → aggressive LLM → deterministic), with\n * `fallback: true` and an `escalation` level on degradation.\n */\nexport async function summarizeContextPure(\n text: string,\n targetTokens: number,\n method: ContextSummaryMethod,\n options: SummarizeContextPureOptions = {},\n): Promise<PureContextSummaryResult> {\n const deterministicMaxTokens = Math.max(\n MIN_DETERMINISTIC_TOKENS,\n options.deterministicMaxTokens ?? DEFAULT_DETERMINISTIC_MAX_TOKENS,\n );\n\n if (method === \"deterministic\") {\n return {\n text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),\n method: \"deterministic\",\n fallback: false,\n };\n }\n\n const usableLlm = options.llm ?? null;\n if (method === \"llm\") {\n if (!usableLlm) {\n throw new ContextSummaryUnavailableError(\"no llm seam configured\");\n }\n const result = await attemptLlm(usableLlm, text, targetTokens, false);\n if (result === null) {\n throw new ContextSummaryUnavailableError(\"llm path failed\");\n }\n return { text: result, method: \"llm\", fallback: false, modelUsed: options.modelUsed };\n }\n\n // auto\n if (options.telemetryPrefilterEnabled && looksLikeMechanicalTelemetryTranscript(text)) {\n return {\n text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),\n method: \"deterministic\",\n fallback: true,\n escalation: 2,\n };\n }\n\n if (usableLlm) {\n const normal = await attemptLlm(usableLlm, text, targetTokens, false);\n if (normal !== null) {\n return { text: normal, method: \"llm\", fallback: false, escalation: 0, modelUsed: options.modelUsed };\n }\n const aggressiveTarget = Math.max(32, Math.ceil(targetTokens * 0.5));\n const aggressive = await attemptLlm(usableLlm, text, aggressiveTarget, true);\n if (aggressive !== null) {\n return { text: aggressive, method: \"llm\", fallback: true, escalation: 1, modelUsed: options.modelUsed };\n }\n }\n\n return {\n text: deterministicTruncate(text, deterministicMaxTokens),\n method: \"deterministic\",\n fallback: true,\n escalation: 2,\n };\n}\n\n/** One LLM attempt; null on error, empty, or over-tolerance output. */\nasync function attemptLlm(\n llm: SummarizeFn,\n text: string,\n targetTokens: number,\n aggressive: boolean,\n): Promise<string | null> {\n try {\n const result = await llm(text, targetTokens, aggressive);\n if (!result || result.trim().length === 0) return null;\n if (estimateTokenCount(result) > targetTokens * OUTPUT_TOKEN_TOLERANCE) return null;\n return result;\n } catch {\n return null;\n }\n}\n\n/** Deterministic truncation: first and last sentence, plus middle truncation. */\nexport function deterministicTruncate(text: string, maxTokens: number): string {\n if (maxTokens <= 0 || estimateTokenCount(text) <= maxTokens) return text;\n\n const sentences = text.split(/(?<=[.!?])\\s+/).filter((s) => s.length > 0);\n if (sentences.length <= 2) return clampToTokenBudget(text, maxTokens);\n\n const first = sentences[0];\n const last = sentences[sentences.length - 1];\n const render = (middle: string[], truncated: boolean): string =>\n `${first} ${middle.join(\" \")}${truncated ? \" [...] \" : \" \"}${last}`;\n\n const base = render([], false);\n if (estimateTokenCount(base) > maxTokens) return clampToTokenBudget(text, maxTokens);\n if (estimateTokenCount(render([], true)) > maxTokens) return base;\n\n const middle: string[] = [];\n for (let i = 1; i < sentences.length - 1; i++) {\n const candidate = [...middle, sentences[i]];\n const truncated = i < sentences.length - 2;\n if (estimateTokenCount(render(candidate, truncated)) > maxTokens) break;\n middle.push(sentences[i]);\n }\n\n const truncated = middle.length < sentences.length - 2;\n return clampToTokenBudget(render(middle, truncated), maxTokens);\n}\n\nfunction clampToTokenBudget(text: string, maxTokens: number): string {\n const codePoints = [...text];\n let low = 0;\n let high = codePoints.length;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (estimateTokenCount(codePoints.slice(0, mid).join(\"\")) <= maxTokens) low = mid;\n else high = mid - 1;\n }\n return codePoints.slice(0, low).join(\"\");\n}\n"],"mappings":";;;;;;;;AA4CO,IAAM,iCAAN,cAA6C,MAAM;AAAA,EACxD,YAAY,QAAgB;AAC1B,UAAM,gCAAgC,MAAM,EAAE;AAC9C,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,mCAAmC;AAEzC,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AAWjC,eAAsB,qBACpB,MACA,cACA,QACA,UAAuC,CAAC,GACL;AACnC,QAAM,yBAAyB,KAAK;AAAA,IAClC;AAAA,IACA,QAAQ,0BAA0B;AAAA,EACpC;AAEA,MAAI,WAAW,iBAAiB;AAC9B,WAAO;AAAA,MACL,MAAM,sBAAsB,MAAM,KAAK,IAAI,cAAc,sBAAsB,CAAC;AAAA,MAChF,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,OAAO;AACjC,MAAI,WAAW,OAAO;AACpB,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,+BAA+B,wBAAwB;AAAA,IACnE;AACA,UAAM,SAAS,MAAM,WAAW,WAAW,MAAM,cAAc,KAAK;AACpE,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI,+BAA+B,iBAAiB;AAAA,IAC5D;AACA,WAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,UAAU,OAAO,WAAW,QAAQ,UAAU;AAAA,EACtF;AAGA,MAAI,QAAQ,6BAA6B,uCAAuC,IAAI,GAAG;AACrF,WAAO;AAAA,MACL,MAAM,sBAAsB,MAAM,KAAK,IAAI,cAAc,sBAAsB,CAAC;AAAA,MAChF,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,WAAW;AACb,UAAM,SAAS,MAAM,WAAW,WAAW,MAAM,cAAc,KAAK;AACpE,QAAI,WAAW,MAAM;AACnB,aAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,UAAU,OAAO,YAAY,GAAG,WAAW,QAAQ,UAAU;AAAA,IACrG;AACA,UAAM,mBAAmB,KAAK,IAAI,IAAI,KAAK,KAAK,eAAe,GAAG,CAAC;AACnE,UAAM,aAAa,MAAM,WAAW,WAAW,MAAM,kBAAkB,IAAI;AAC3E,QAAI,eAAe,MAAM;AACvB,aAAO,EAAE,MAAM,YAAY,QAAQ,OAAO,UAAU,MAAM,YAAY,GAAG,WAAW,QAAQ,UAAU;AAAA,IACxG;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,sBAAsB,MAAM,sBAAsB;AAAA,IACxD,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;AAGA,eAAe,WACb,KACA,MACA,cACA,YACwB;AACxB,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,MAAM,cAAc,UAAU;AACvD,QAAI,CAAC,UAAU,OAAO,KAAK,EAAE,WAAW,EAAG,QAAO;AAClD,QAAI,mBAAmB,MAAM,IAAI,eAAe,uBAAwB,QAAO;AAC/E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,sBAAsB,MAAc,WAA2B;AAC7E,MAAI,aAAa,KAAK,mBAAmB,IAAI,KAAK,UAAW,QAAO;AAEpE,QAAM,YAAY,KAAK,MAAM,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AACxE,MAAI,UAAU,UAAU,EAAG,QAAO,mBAAmB,MAAM,SAAS;AAEpE,QAAM,QAAQ,UAAU,CAAC;AACzB,QAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,QAAM,SAAS,CAACA,SAAkBC,eAChC,GAAG,KAAK,IAAID,QAAO,KAAK,GAAG,CAAC,GAAGC,aAAY,YAAY,GAAG,GAAG,IAAI;AAEnE,QAAM,OAAO,OAAO,CAAC,GAAG,KAAK;AAC7B,MAAI,mBAAmB,IAAI,IAAI,UAAW,QAAO,mBAAmB,MAAM,SAAS;AACnF,MAAI,mBAAmB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,UAAW,QAAO;AAE7D,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,UAAU,SAAS,GAAG,KAAK;AAC7C,UAAM,YAAY,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC;AAC1C,UAAMA,aAAY,IAAI,UAAU,SAAS;AACzC,QAAI,mBAAmB,OAAO,WAAWA,UAAS,CAAC,IAAI,UAAW;AAClE,WAAO,KAAK,UAAU,CAAC,CAAC;AAAA,EAC1B;AAEA,QAAM,YAAY,OAAO,SAAS,UAAU,SAAS;AACrD,SAAO,mBAAmB,OAAO,QAAQ,SAAS,GAAG,SAAS;AAChE;AAEA,SAAS,mBAAmB,MAAc,WAA2B;AACnE,QAAM,aAAa,CAAC,GAAG,IAAI;AAC3B,MAAI,MAAM;AACV,MAAI,OAAO,WAAW;AACtB,SAAO,MAAM,MAAM;AACjB,UAAM,MAAM,KAAK,MAAM,MAAM,QAAQ,CAAC;AACtC,QAAI,mBAAmB,WAAW,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,UAAW,OAAM;AAAA,QACzE,QAAO,MAAM;AAAA,EACpB;AACA,SAAO,WAAW,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE;AACzC;","names":["middle","truncated"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runGraphEdgeDecayMaintenanceAcrossNamespaces
|
|
3
|
-
} from "./chunk-OLBZ2WGG.js";
|
|
4
1
|
import {
|
|
5
2
|
normalizeDreamsStatusWindowHours
|
|
6
3
|
} from "./chunk-EQWEIIKQ.js";
|
|
4
|
+
import {
|
|
5
|
+
runGraphEdgeDecayMaintenanceAcrossNamespaces
|
|
6
|
+
} from "./chunk-LTBKKSCX.js";
|
|
7
7
|
import {
|
|
8
8
|
executeResolution,
|
|
9
9
|
isValidResolutionVerb,
|
|
10
10
|
runPreferenceDriftScan
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-V4IDF3EZ.js";
|
|
12
12
|
import {
|
|
13
13
|
runContradictionScan
|
|
14
14
|
} from "./chunk-Q4WONDMJ.js";
|
|
@@ -28,15 +28,15 @@ import {
|
|
|
28
28
|
import {
|
|
29
29
|
observeRequestSchema,
|
|
30
30
|
recallRequestSchema
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-5HK3CJAR.js";
|
|
32
32
|
import {
|
|
33
33
|
defineOperation,
|
|
34
34
|
parseNamespacePreflightWriteOp,
|
|
35
35
|
resolveAuthorizedNamespaceWritablePreflight
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-OXRRJXPR.js";
|
|
37
37
|
import {
|
|
38
38
|
validateBriefingFormat
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-HMZKGHMD.js";
|
|
40
40
|
import {
|
|
41
41
|
enforceNamespaceAllowList,
|
|
42
42
|
tokenCapabilityStore
|
|
@@ -538,4 +538,4 @@ defineOperation({ name: "graph_events", description: "SSE graph events.", schema
|
|
|
538
538
|
defineOperation({ name: "chat_message", description: "Chat message.", schema: strictSchema({ message: S.str, chatSessionId: S.str }), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
|
|
539
539
|
defineOperation({ name: "chat_events", description: "SSE chat events.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { stream: "sse" } }) });
|
|
540
540
|
defineOperation({ name: "adapters_status", description: "Adapter registry metadata (issue #1850 round 5). Marker op: the HTTP transport builds the response from its own adapterRegistry, but the op still must be registered so it appears in listRegisteredOperations and enforceTokenOp can gate it for scoped tokens.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
|
|
541
|
-
//# sourceMappingURL=chunk-
|
|
541
|
+
//# sourceMappingURL=chunk-4F4AQFWL.js.map
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
RemoteSearchBackend
|
|
3
|
-
} from "./chunk-YQNNHLCG.js";
|
|
4
|
-
import {
|
|
5
|
-
EmbedHelper
|
|
6
|
-
} from "./chunk-6KTXE6A3.js";
|
|
7
1
|
import {
|
|
8
2
|
LanceDbBackend
|
|
9
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-N37X5RU7.js";
|
|
10
4
|
import {
|
|
11
5
|
MeilisearchBackend
|
|
12
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NNBZS3DY.js";
|
|
13
7
|
import {
|
|
14
8
|
NoopSearchBackend
|
|
15
9
|
} from "./chunk-CYEPCZN5.js";
|
|
16
10
|
import {
|
|
17
11
|
OramaBackend
|
|
18
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GIC6BASP.js";
|
|
13
|
+
import {
|
|
14
|
+
RemoteSearchBackend
|
|
15
|
+
} from "./chunk-YQNNHLCG.js";
|
|
16
|
+
import {
|
|
17
|
+
EmbedHelper
|
|
18
|
+
} from "./chunk-6KTXE6A3.js";
|
|
19
19
|
import {
|
|
20
20
|
createConversationIndexBackend
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-LEPOP46W.js";
|
|
22
22
|
import {
|
|
23
23
|
FaissConversationIndexAdapter
|
|
24
24
|
} from "./chunk-ET356KSB.js";
|
|
25
25
|
import {
|
|
26
26
|
QmdClient
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-CEH2AFXG.js";
|
|
28
28
|
import {
|
|
29
29
|
resolveIndexingCapabilities,
|
|
30
30
|
resolvePipelineProcessingCapabilities,
|
|
@@ -179,4 +179,4 @@ export {
|
|
|
179
179
|
createConversationSearchBackend,
|
|
180
180
|
createConversationIndexRuntime
|
|
181
181
|
};
|
|
182
|
-
//# sourceMappingURL=chunk-
|
|
182
|
+
//# sourceMappingURL=chunk-4QEYREAV.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
serializeMutations,
|
|
3
|
+
withHeldFileLock
|
|
4
|
+
} from "./chunk-FFAZ2XFU.js";
|
|
1
5
|
import {
|
|
2
6
|
computeLegacyContentHash,
|
|
3
7
|
isUnambiguousLegacyContentHash,
|
|
4
8
|
normalizeLegacyContent
|
|
5
9
|
} from "./chunk-5FVVY2EB.js";
|
|
6
|
-
import {
|
|
7
|
-
serializeMutations,
|
|
8
|
-
withHeldFileLock
|
|
9
|
-
} from "./chunk-FFAZ2XFU.js";
|
|
10
10
|
|
|
11
11
|
// src/lifecycle/tombstones.ts
|
|
12
12
|
var TOMBSTONE_NORMALIZER_VERSION = 2;
|
|
@@ -663,4 +663,4 @@ export {
|
|
|
663
663
|
applyTombstoneResurrectionGate,
|
|
664
664
|
buildRetiredFactTombstoneInputs
|
|
665
665
|
};
|
|
666
|
-
//# sourceMappingURL=chunk-
|
|
666
|
+
//# sourceMappingURL=chunk-4ZWCQJNM.js.map
|
|
@@ -219,6 +219,7 @@ async function readMemoryActionEventRowsFromLines(lines, limit) {
|
|
|
219
219
|
if (!line) continue;
|
|
220
220
|
try {
|
|
221
221
|
const parsed = JSON.parse(line);
|
|
222
|
+
if (parsed.recordKind !== void 0) continue;
|
|
222
223
|
const outcome = parsed.outcome === "applied" || parsed.outcome === "skipped" || parsed.outcome === "failed" ? parsed.outcome : null;
|
|
223
224
|
if (typeof parsed.timestamp === "string" && typeof parsed.action === "string" && outcome !== null) {
|
|
224
225
|
const entry = {
|
|
@@ -237,6 +238,33 @@ async function readMemoryActionEventRowsFromLines(lines, limit) {
|
|
|
237
238
|
}
|
|
238
239
|
return writeIndex === 0 ? out : [...out.slice(writeIndex), ...out.slice(0, writeIndex)];
|
|
239
240
|
}
|
|
241
|
+
async function readContextTransformRecordRowsFromLines(lines, limit) {
|
|
242
|
+
const out = [];
|
|
243
|
+
let writeIndex = 0;
|
|
244
|
+
let lineNumber = 0;
|
|
245
|
+
for await (const row of lines) {
|
|
246
|
+
lineNumber += 1;
|
|
247
|
+
const line = row.trim();
|
|
248
|
+
if (!line) continue;
|
|
249
|
+
try {
|
|
250
|
+
const parsed = JSON.parse(line);
|
|
251
|
+
if (parsed.recordKind === "context_transform" && typeof parsed.timestamp === "string" && typeof parsed.actionId === "string" && typeof parsed.planHash === "string") {
|
|
252
|
+
const entry = {
|
|
253
|
+
line: lineNumber,
|
|
254
|
+
record: parsed
|
|
255
|
+
};
|
|
256
|
+
if (out.length < limit) {
|
|
257
|
+
out.push(entry);
|
|
258
|
+
} else {
|
|
259
|
+
out[writeIndex] = entry;
|
|
260
|
+
writeIndex = (writeIndex + 1) % limit;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
} catch {
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return writeIndex === 0 ? out : [...out.slice(writeIndex), ...out.slice(0, writeIndex)];
|
|
267
|
+
}
|
|
240
268
|
function isValidLifecycleEventRow(parsed) {
|
|
241
269
|
return typeof parsed.eventId === "string" && typeof parsed.memoryId === "string" && typeof parsed.eventType === "string" && typeof parsed.timestamp === "string" && typeof parsed.actor === "string" && typeof parsed.ruleVersion === "string";
|
|
242
270
|
}
|
|
@@ -713,6 +741,7 @@ export {
|
|
|
713
741
|
STATE_FILE_MAX_DECRYPT_BYTES,
|
|
714
742
|
readMaybeEncryptedLines,
|
|
715
743
|
readMemoryActionEventRowsFromLines,
|
|
744
|
+
readContextTransformRecordRowsFromLines,
|
|
716
745
|
readAllLifecycleEventsFromLedger,
|
|
717
746
|
readAllLifecycleEventsFromLedgerBuffer,
|
|
718
747
|
readBoundedLifecycleEventsFromLedger,
|
|
@@ -724,4 +753,4 @@ export {
|
|
|
724
753
|
drainPendingLifecycleLedgerForSync,
|
|
725
754
|
drainPendingLifecycleForSyncOrThrow
|
|
726
755
|
};
|
|
727
|
-
//# sourceMappingURL=chunk-
|
|
756
|
+
//# sourceMappingURL=chunk-5ACCD4L7.js.map
|