@remnic/core 9.65.7 → 9.66.0
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 -14
- package/dist/access-admin-ops-surface.js +65 -62
- package/dist/access-authorization-probe.d.ts +15 -14
- package/dist/access-authorization-probe.js +66 -63
- package/dist/access-boundary.d.ts +15 -14
- package/dist/access-boundary.js +65 -62
- package/dist/access-citation-namespace.js +3 -3
- package/dist/access-cli.js +182 -174
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -2
- package/dist/access-coding-context-resolution.js +2 -2
- package/dist/access-extraction-force-flush.d.ts +15 -14
- package/dist/access-extraction-force-flush.js +65 -62
- package/dist/access-health-types.d.ts +2 -2
- package/dist/access-http-lcm-compaction.d.ts +15 -14
- package/dist/access-http-lifecycle-flush.d.ts +15 -14
- package/dist/access-http-offline-stream.d.ts +15 -14
- package/dist/access-http-query.d.ts +3 -3
- package/dist/access-http-query.js +67 -64
- package/dist/access-http.d.ts +16 -15
- package/dist/access-http.js +87 -84
- package/dist/access-identity-continuity-surface.d.ts +13 -12
- package/dist/access-identity-continuity-surface.js +65 -62
- package/dist/access-lcm-surface.d.ts +15 -14
- package/dist/access-lcm-surface.js +65 -62
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +15 -14
- package/dist/access-mcp.js +77 -74
- package/dist/access-memory-search-fanout.d.ts +3 -3
- package/dist/{access-namespace-preflight-8VYKmRX0.d.ts → access-namespace-preflight-CLWUoMyW.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -4
- package/dist/access-namespace-preflight.js +65 -62
- package/dist/access-observe-write-surface.d.ts +15 -14
- package/dist/access-observe-write-surface.js +65 -62
- package/dist/access-offline-manifest.d.ts +13 -12
- package/dist/access-offline-manifest.js +16 -16
- package/dist/access-operations-batch.js +69 -66
- package/dist/access-operations.d.ts +16 -15
- package/dist/access-operations.js +74 -71
- package/dist/access-recall-concurrency.d.ts +15 -14
- package/dist/access-recall-concurrency.js +65 -62
- package/dist/access-recall-response.d.ts +15 -14
- package/dist/access-recall-response.js +65 -62
- package/dist/access-recall-surface.d.ts +15 -14
- package/dist/access-recall-surface.js +65 -62
- package/dist/access-schema.js +7 -7
- package/dist/{access-service-Crk__Git.d.ts → access-service-CEUE1Isj.d.ts} +14 -14
- package/dist/access-service-helpers.d.ts +15 -14
- package/dist/access-service.d.ts +15 -14
- package/dist/access-service.js +65 -62
- package/dist/access-surface-catalog.d.ts +15 -14
- package/dist/access-surface-catalog.js +69 -64
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +6 -4
- package/dist/action-confidence.d.ts +2 -2
- 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 -2
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +2 -2
- package/dist/active-recall.js +17 -16
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +2 -2
- package/dist/artifact-search.d.ts +2 -2
- package/dist/{auto-sync-XVMLL2RH.js → auto-sync-Q6Q2FVSC.js} +10 -10
- package/dist/behavior-learner.d.ts +2 -2
- package/dist/behavior-signals.d.ts +2 -2
- package/dist/bootstrap.d.ts +13 -12
- package/dist/briefing-window.d.ts +5 -3
- package/dist/briefing.d.ts +5 -3
- package/dist/briefing.js +33 -33
- package/dist/buffer-surprise-report.d.ts +2 -2
- package/dist/buffer-turn-helpers.d.ts +2 -2
- package/dist/buffer.d.ts +5 -3
- package/dist/buffer.js +24 -8
- package/dist/bulk-import/index.d.ts +4 -4
- package/dist/calibration.d.ts +2 -2
- package/dist/calibration.js +1 -1
- package/dist/capabilities.d.ts +2 -2
- package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
- package/dist/{catalog-DybwVNW3.d.ts → catalog-D1HgugTA.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +4 -4
- package/dist/causal-consolidation.d.ts +2 -2
- package/dist/causal-consolidation.js +34 -34
- package/dist/causal-trajectory-graph.d.ts +2 -2
- package/dist/{chunk-CFGU52XJ.js → chunk-23CVL7HS.js} +2 -2
- package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
- package/dist/{chunk-6CPUQ5D6.js → chunk-2LBAFHOQ.js} +15 -15
- package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
- package/dist/{chunk-IP4ZNT4U.js → chunk-33MFRY25.js} +2 -2
- package/dist/{chunk-VFYRYFLL.js → chunk-3TSU662L.js} +3 -3
- package/dist/chunk-43HUVDTD.js +114 -0
- package/dist/chunk-43HUVDTD.js.map +1 -0
- package/dist/{chunk-VXVZ2GM3.js → chunk-4FHRZD5T.js} +2 -2
- package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
- package/dist/chunk-4OFKZAJG.js.map +1 -0
- package/dist/{chunk-5VPQSRQO.js → chunk-4STAANV7.js} +3 -3
- package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
- package/dist/{chunk-LLQCM2U2.js → chunk-56IV4J5W.js} +617 -167
- package/dist/chunk-56IV4J5W.js.map +1 -0
- package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
- package/dist/{chunk-YKWFK7XA.js → chunk-6CEGSTBD.js} +7 -7
- package/dist/{chunk-I7EX6KSH.js → chunk-6QDXA26G.js} +264 -210
- package/dist/chunk-6QDXA26G.js.map +1 -0
- package/dist/{chunk-GEPACVWN.js → chunk-6RUHELWR.js} +3 -3
- package/dist/{chunk-ZAOHJDKH.js → chunk-72OIT7KS.js} +4 -4
- package/dist/{chunk-KQAFEZQX.js → chunk-7LCGFUMB.js} +4 -4
- package/dist/{chunk-7TCGNUVP.js → chunk-7UTDHQZ5.js} +3 -3
- package/dist/{chunk-5HK3CJAR.js → chunk-7XOG75AU.js} +3 -3
- package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
- package/dist/chunk-AJTG3CP7.js.map +1 -0
- package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
- package/dist/chunk-AL3UYZ5N.js.map +1 -0
- package/dist/chunk-B32WYRXX.js +77 -0
- package/dist/chunk-B32WYRXX.js.map +1 -0
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
- package/dist/{chunk-ACOC27BB.js → chunk-CN4VKV3S.js} +2 -2
- package/dist/{chunk-PMVPCZJZ.js → chunk-CTCGHNWN.js} +6 -6
- package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
- package/dist/{chunk-T42L3S6A.js → chunk-DDX6KIXF.js} +2 -2
- package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
- package/dist/{chunk-WTOZBZNN.js → chunk-DMEHOEC7.js} +6 -6
- package/dist/{chunk-OPPBTPUU.js → chunk-DUAJKRR2.js} +4 -4
- package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
- package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
- package/dist/{chunk-SVVIASVX.js → chunk-EFQCDJZ2.js} +7 -7
- package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
- package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
- package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
- package/dist/{chunk-Z4U3UN56.js → chunk-EZSCW4EM.js} +6 -6
- package/dist/{chunk-F6QHHRWP.js → chunk-FESUGFIL.js} +3 -3
- package/dist/{chunk-S3K2CIK5.js → chunk-FKKGCGYL.js} +3 -3
- package/dist/{chunk-BWGCOLEL.js → chunk-FTTJRVB7.js} +2 -2
- package/dist/{chunk-JAQXUGLN.js → chunk-FYWLSFFS.js} +2 -2
- package/dist/{chunk-BJTHRFFC.js → chunk-GEJKYA7D.js} +77 -36
- package/dist/chunk-GEJKYA7D.js.map +1 -0
- package/dist/chunk-GSKINLAK.js +267 -0
- package/dist/chunk-GSKINLAK.js.map +1 -0
- package/dist/{chunk-OPGL46PX.js → chunk-GX6FTSYH.js} +2 -2
- package/dist/{chunk-A32YEQAM.js → chunk-H7VDIF2V.js} +2 -2
- package/dist/{chunk-PDDSFELN.js → chunk-HJXA6ZM7.js} +2 -2
- package/dist/{chunk-RGCF4XNH.js → chunk-HNPE66LB.js} +8 -8
- package/dist/{chunk-SEA6M7SS.js → chunk-I5VB44ZK.js} +2 -2
- package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
- package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
- package/dist/{chunk-RQE4TITU.js → chunk-IHGMRDEE.js} +431 -1834
- package/dist/chunk-IHGMRDEE.js.map +1 -0
- package/dist/{chunk-3RI5Y7KU.js → chunk-IVIAHQBR.js} +2 -2
- package/dist/{chunk-7WR462EM.js → chunk-J3OND5QT.js} +4 -4
- package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
- package/dist/chunk-JALOAKSZ.js.map +1 -0
- package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
- package/dist/{chunk-DVYRD4HY.js → chunk-JRRQ747T.js} +36 -7
- package/dist/chunk-JRRQ747T.js.map +1 -0
- package/dist/{chunk-I32NKXE2.js → chunk-JTWZKNUH.js} +5 -5
- package/dist/chunk-K66OY4EI.js +202 -0
- package/dist/chunk-K66OY4EI.js.map +1 -0
- package/dist/{chunk-XAB6STPO.js → chunk-KODXCHXJ.js} +17 -3
- package/dist/chunk-KODXCHXJ.js.map +1 -0
- package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
- package/dist/chunk-KOLJJN5G.js.map +1 -0
- package/dist/{chunk-FMQ4MOQO.js → chunk-KXIXO76C.js} +32 -19
- package/dist/chunk-KXIXO76C.js.map +1 -0
- package/dist/{chunk-VKCAHCBI.js → chunk-L4X4PJYK.js} +2 -2
- package/dist/chunk-LB7WCZHY.js +553 -0
- package/dist/chunk-LB7WCZHY.js.map +1 -0
- package/dist/{chunk-W4BMEGQA.js → chunk-LUDBXTBJ.js} +8 -8
- package/dist/{chunk-I4343FIA.js → chunk-MAH64N55.js} +28 -10
- package/dist/chunk-MAH64N55.js.map +1 -0
- package/dist/{chunk-RIAM7DND.js → chunk-ME35HVDJ.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-NG3MBQV4.js → chunk-MJRGVXPQ.js} +2 -2
- package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
- package/dist/{chunk-7F27PCSN.js → chunk-MN5NOOI7.js} +2 -2
- package/dist/{chunk-JCWY73FK.js → chunk-N4F7ZSSG.js} +2 -2
- package/dist/{chunk-TR7DGXGI.js → chunk-NACLNNFQ.js} +5 -5
- package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
- package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
- package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
- package/dist/{chunk-IY7UXD3J.js → chunk-O57GM3FR.js} +2 -2
- package/dist/{chunk-I2HTKOOP.js → chunk-O7ERGZDA.js} +5 -5
- package/dist/{chunk-GTSVEEP3.js → chunk-OAJMQKQR.js} +3 -3
- package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
- package/dist/{chunk-D4QVPP3G.js → chunk-PEBH5DCK.js} +18 -11
- package/dist/chunk-PEBH5DCK.js.map +1 -0
- package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
- package/dist/{chunk-EOHKUWXW.js → chunk-QCRJMU5V.js} +2 -2
- package/dist/chunk-QJCWK2A7.js +1466 -0
- package/dist/chunk-QJCWK2A7.js.map +1 -0
- package/dist/{chunk-THG4GYIE.js → chunk-RDGKVH6T.js} +11 -7
- package/dist/{chunk-THG4GYIE.js.map → chunk-RDGKVH6T.js.map} +1 -1
- package/dist/{chunk-5DH6PG4B.js → chunk-RZ3IZIJG.js} +3 -3
- package/dist/{chunk-AAXJNINV.js → chunk-SN4JXNLL.js} +2 -2
- package/dist/chunk-TB2MJRI6.js +866 -0
- package/dist/chunk-TB2MJRI6.js.map +1 -0
- package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
- package/dist/chunk-TEZ2HTC7.js.map +1 -0
- package/dist/{chunk-SVSRPG6M.js → chunk-TNGH4ZYI.js} +2 -2
- package/dist/{chunk-HZNYJN77.js → chunk-TNXNECAN.js} +6 -6
- package/dist/{chunk-JOEJG4SD.js → chunk-TVW4C7PV.js} +5 -5
- package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
- package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
- package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
- package/dist/chunk-UYA36DQ7.js.map +1 -0
- package/dist/{chunk-AFR6AIM4.js → chunk-VCKWULAK.js} +112 -87
- package/dist/chunk-VCKWULAK.js.map +1 -0
- package/dist/chunk-VOSWUO3K.js +100 -0
- package/dist/chunk-VOSWUO3K.js.map +1 -0
- package/dist/{chunk-YRVAKONL.js → chunk-VQ4AMTGZ.js} +1 -1
- package/dist/{chunk-3BCULS4U.js → chunk-VQNRICAQ.js} +145 -507
- package/dist/chunk-VQNRICAQ.js.map +1 -0
- package/dist/{chunk-RAIUTAZZ.js → chunk-WKAXBXVA.js} +2 -2
- package/dist/{chunk-ZIJDI4CP.js → chunk-WKJFIMVN.js} +2 -2
- package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
- package/dist/{chunk-7BEPVIH3.js → chunk-X5YYSAZX.js} +4 -4
- package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
- package/dist/{chunk-F635GAL7.js → chunk-XKNHFDTT.js} +33 -13
- package/dist/chunk-XKNHFDTT.js.map +1 -0
- package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
- package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-ANJXPFRS.js → chunk-YXFCALVT.js} +14 -14
- package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
- package/dist/{chunk-5HERQ5FX.js → chunk-Z3YEGSR4.js} +10 -10
- package/dist/{chunk-YWSQD2IB.js → chunk-ZJPM7GZ3.js} +2 -2
- package/dist/{chunk-5S4LQOPE.js → chunk-ZW4VXELZ.js} +2 -2
- package/dist/{cli-B322UMvB.d.ts → cli-BEkm2MEf.d.ts} +5 -5
- package/dist/cli.d.ts +17 -16
- package/dist/cli.js +126 -120
- package/dist/coding/export-okf-codegraph.d.ts +56 -0
- package/dist/coding/export-okf-codegraph.js +526 -0
- package/dist/coding/export-okf-codegraph.js.map +1 -0
- package/dist/coding/pre-action-gate.d.ts +2 -2
- package/dist/compounding/engine.d.ts +5 -3
- package/dist/compounding/engine.js +34 -34
- package/dist/compounding/preference-consolidator.d.ts +4 -4
- package/dist/compression-optimizer.d.ts +2 -2
- package/dist/config-security.js +2 -2
- package/dist/config.d.ts +2 -2
- package/dist/config.js +17 -16
- package/dist/connectors/codex-materialize-runner.d.ts +2 -2
- package/dist/connectors/codex-materialize-runner.js +33 -33
- package/dist/connectors/codex-materialize.d.ts +2 -2
- package/dist/connectors/index.d.ts +2 -2
- package/dist/connectors/index.js +33 -33
- package/dist/consolidation-provenance-check.d.ts +5 -3
- package/dist/consolidation-provenance-check.js +5 -5
- package/dist/consolidation-undo.d.ts +5 -3
- package/dist/consolidation-undo.js +3 -3
- 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 -4
- package/dist/contradiction/index.js +10 -10
- package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
- package/dist/contradiction-scan-NOYMFG66.js.map +1 -0
- package/dist/converge-config.d.ts +2 -2
- package/dist/convergence-refresh.d.ts +5 -3
- package/dist/convergence-refresh.js +36 -36
- package/dist/conversation-index/backend.d.ts +2 -2
- package/dist/conversation-index/chunker.d.ts +2 -2
- package/dist/conversation-index/faiss-adapter.d.ts +2 -2
- package/dist/conversation-index/indexer.d.ts +2 -2
- package/dist/conversation-index/search.d.ts +2 -2
- package/dist/corpus-watermark.d.ts +2 -2
- package/dist/corpus-watermark.js +35 -35
- package/dist/cross-lingual-recall.d.ts +2 -2
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +2 -2
- package/dist/delinearize.d.ts +2 -2
- package/dist/dependency-propagation-config.d.ts +2 -2
- package/dist/{dependency-propagation-delivery-BGcNairQ.d.ts → dependency-propagation-delivery-BCpeo14F.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -2
- package/dist/direct-answer.d.ts +2 -2
- package/dist/embedding-fallback.d.ts +2 -2
- package/dist/enrichment/index.d.ts +2 -2
- package/dist/entity-origin-fields.d.ts +2 -2
- package/dist/entity-retrieval.d.ts +5 -3
- package/dist/entity-retrieval.js +34 -34
- package/dist/entity-schema.d.ts +2 -2
- package/dist/episodic-context.d.ts +2 -2
- package/dist/eval-trajectory-contracts.d.ts +2 -2
- package/dist/eval-trajectory-store.d.ts +2 -2
- package/dist/eval-trajectory.d.ts +2 -2
- package/dist/event-order-recall.js +3 -3
- package/dist/explicit-capture.d.ts +13 -12
- package/dist/explicit-capture.js +12 -12
- package/dist/external-wiki-access.d.ts +15 -14
- package/dist/external-wiki-access.js +66 -63
- package/dist/external-wiki-collection-registration.d.ts +2 -2
- package/dist/external-wiki-collection.d.ts +2 -2
- package/dist/external-wiki-mcp-tools.d.ts +15 -14
- package/dist/extraction-error-classification.d.ts +2 -2
- package/dist/extraction-faithfulness.d.ts +2 -2
- package/dist/extraction-faithfulness.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +2 -2
- package/dist/extraction-judge-training.d.ts +2 -2
- package/dist/extraction-judge.d.ts +2 -2
- package/dist/extraction-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +2 -2
- package/dist/extraction-normalization.d.ts +2 -2
- package/dist/extraction-prompt.d.ts +2 -2
- package/dist/extraction-source-grounding-rules.d.ts +2 -2
- package/dist/extraction-source-grounding.d.ts +2 -2
- package/dist/extraction.d.ts +2 -2
- package/dist/extraction.js +47 -44
- package/dist/fallback-llm.d.ts +8 -2
- package/dist/fallback-llm.js +1 -1
- package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
- package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
- package/dist/graph-dashboard-diff.d.ts +2 -2
- package/dist/graph-dashboard-key.d.ts +2 -2
- package/dist/graph-dashboard-parser.d.ts +2 -2
- package/dist/graph-edge-reinforcement.d.ts +2 -2
- package/dist/graph-path-reconstruction.d.ts +2 -2
- package/dist/graph-path-scoring.d.ts +2 -2
- package/dist/graph-snapshot.d.ts +2 -2
- package/dist/graph.d.ts +2 -2
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +2 -2
- package/dist/importers/index.d.ts +2 -2
- package/dist/in-flight-reads.d.ts +2 -2
- package/dist/{index-By2QUAMh.d.ts → index-D_pyMUaP.d.ts} +2 -2
- package/dist/index.d.ts +261 -30
- package/dist/index.js +321 -257
- package/dist/intent.d.ts +2 -2
- package/dist/lcm/engine.d.ts +3 -3
- package/dist/lcm/engine.js +5 -4
- package/dist/lcm/index.d.ts +4 -3
- package/dist/lcm/index.js +12 -11
- package/dist/lcm/summarizer.d.ts +4 -6
- package/dist/lcm/summarizer.js +2 -1
- package/dist/lcm/tools.d.ts +4 -4
- package/dist/lifecycle.d.ts +2 -2
- package/dist/live-connectors-runner.d.ts +2 -2
- package/dist/local-llm.d.ts +2 -2
- package/dist/local-model-endpoint.d.ts +2 -2
- package/dist/location/index.d.ts +315 -6
- package/dist/location/index.js +151 -19
- package/dist/maintenance/memory-governance.d.ts +2 -2
- package/dist/maintenance/memory-governance.js +34 -34
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -33
- package/dist/maintenance/rebuild-memory-projection.d.ts +5 -3
- package/dist/maintenance/rebuild-memory-projection.js +35 -35
- package/dist/{maintenance-Dm2McrIx.d.ts → maintenance-DDUX9d6D.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +15 -14
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +18 -3
- package/dist/memory-action-policy.js +3 -1
- package/dist/memory-cache.d.ts +2 -2
- package/dist/memory-controller.d.ts +2 -2
- package/dist/memory-controller.js +2 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -2
- package/dist/memory-projection-mutations.js +3 -3
- package/dist/memory-projection-store.d.ts +2 -2
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +2 -2
- package/dist/memory-snapshot.d.ts +2 -2
- package/dist/memory-subject-cli.d.ts +15 -14
- package/dist/memory-subject.d.ts +15 -14
- package/dist/memory-subject.js +5 -5
- package/dist/memory-worth-outcomes.d.ts +5 -3
- package/dist/models-json.d.ts +2 -2
- package/dist/namespaces/migrate.d.ts +6 -4
- package/dist/namespaces/migrate.js +34 -34
- package/dist/namespaces/principal.d.ts +2 -2
- package/dist/namespaces/search.d.ts +2 -2
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +6 -4
- package/dist/namespaces/storage.js +33 -33
- package/dist/native-knowledge.d.ts +2 -2
- package/dist/offline-sync-file-io.js +3 -3
- package/dist/offline-sync-impression-drain.d.ts +2 -2
- package/dist/offline-sync-impression-drain.js +9 -9
- package/dist/offline-sync.js +4 -4
- package/dist/operator-doctor-corpus.d.ts +2 -2
- package/dist/operator-doctor-corpus.js +36 -36
- package/dist/operator-doctor-replica.d.ts +2 -2
- package/dist/operator-toolkit.d.ts +6 -4
- package/dist/operator-toolkit.js +56 -55
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -3
- package/dist/orchestration/maintenance.d.ts +7 -5
- package/dist/orchestration/maintenance.js +48 -47
- package/dist/{orchestrator-Co1DyfuP.d.ts → orchestrator-3F4jihCo.d.ts} +8 -8
- package/dist/orchestrator.d.ts +13 -12
- package/dist/orchestrator.js +182 -174
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +2 -2
- package/dist/{pipeline-DotMnb6y.d.ts → pipeline-CB1dj6Uh.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -2
- package/dist/proactive-contention.d.ts +2 -2
- package/dist/provenance.d.ts +2 -2
- package/dist/{public-http-PJRtnSi-.d.ts → public-http-34-JIAGQ.d.ts} +1 -1
- package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
- package/dist/{qmd-BP0n11fR.d.ts → qmd-edLLZXc5.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -3
- package/dist/qmd-recall-cache.d.ts +2 -2
- package/dist/qmd.d.ts +3 -3
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +2 -2
- package/dist/recall-disclosure-escalation.d.ts +2 -2
- package/dist/recall-explain-renderer.d.ts +2 -2
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -2
- package/dist/recall-planner-llm.d.ts +2 -2
- package/dist/recall-planner-llm.js +1 -1
- package/dist/recall-state.d.ts +2 -2
- package/dist/recall-tag-filter.d.ts +2 -2
- package/dist/recall-timings.d.ts +2 -2
- package/dist/recall-xray-cli.d.ts +2 -2
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -2
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +2 -2
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +2 -2
- package/dist/reconcile/manifest.d.ts +2 -2
- package/dist/reconcile/manifest.js +5 -5
- package/dist/reconcile/plan.d.ts +2 -2
- package/dist/replay/normalizers/chatgpt.d.ts +2 -2
- package/dist/replay/normalizers/claude.d.ts +2 -2
- package/dist/replay/normalizers/openclaw.d.ts +2 -2
- package/dist/replay/normalizers/shared.d.ts +2 -2
- package/dist/replay/runner.d.ts +2 -2
- package/dist/replay/types.d.ts +2 -2
- package/dist/replica-divergence.d.ts +2 -2
- package/dist/replica-peers-config.d.ts +2 -2
- package/dist/{resolution-4552BNRV.js → resolution-4DLI3IOR.js} +11 -11
- package/dist/resolution-4DLI3IOR.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -2
- package/dist/resume-bundles.js +18 -17
- package/dist/retrieval-agents.d.ts +3 -3
- package/dist/retrieval-tiers.d.ts +2 -2
- package/dist/routing/engine.d.ts +2 -2
- package/dist/routing/store.d.ts +2 -2
- package/dist/salvage-envelope.d.ts +2 -2
- package/dist/salvage-envelope.js +7 -7
- package/dist/schemas.d.ts +572 -107
- package/dist/schemas.js +3 -1
- package/dist/{scope-profiles-6ChZKTy-.d.ts → scope-profiles-BF2lu81V.d.ts} +1 -1
- package/dist/search/document-scanner.js +1 -1
- package/dist/search/embed-helper.d.ts +2 -2
- package/dist/search/factory.d.ts +2 -2
- package/dist/search/factory.js +7 -7
- package/dist/search/index.d.ts +2 -2
- package/dist/search/index.js +13 -13
- package/dist/search/lancedb-backend.d.ts +2 -2
- package/dist/search/lancedb-backend.js +1 -1
- package/dist/search/meilisearch-backend.d.ts +2 -2
- package/dist/search/meilisearch-backend.js +1 -1
- package/dist/search/noop-backend.d.ts +2 -2
- package/dist/search/orama-backend.d.ts +2 -2
- package/dist/search/orama-backend.js +1 -1
- package/dist/search/port.d.ts +2 -2
- package/dist/search/remote-backend.d.ts +2 -2
- package/dist/secure-store/index.js +3 -3
- package/dist/{semantic-consolidation-DziYcW5J.d.ts → semantic-consolidation-5OuWXBRt.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -3
- package/dist/semantic-consolidation.js +37 -37
- package/dist/semantic-rule-promotion.js +33 -33
- package/dist/semantic-rule-verifier.d.ts +2 -2
- package/dist/semantic-rule-verifier.js +33 -33
- package/dist/{service-C7rIBuK_.d.ts → service-CrqEhLXD.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -2
- package/dist/session-observer-state.d.ts +2 -2
- package/dist/shared-context/manager.d.ts +2 -2
- package/dist/signal.d.ts +2 -2
- package/dist/source-agent-qualifier.d.ts +2 -2
- package/dist/source-agent-qualifier.js +42 -39
- package/dist/standup/build.d.ts +16 -0
- package/dist/standup/build.js +17 -0
- package/dist/standup/build.js.map +1 -0
- package/dist/{storage-B1hEx8Xg.d.ts → storage-BQn-xnxm.d.ts} +4 -1
- package/dist/storage.d.ts +5 -3
- package/dist/storage.js +32 -32
- package/dist/subject-config.d.ts +2 -2
- package/dist/subject-config.js +6 -6
- package/dist/summarizer.d.ts +2 -2
- package/dist/summarizer.js +2 -2
- package/dist/summary-snapshot.d.ts +2 -2
- package/dist/support-passport/index.d.ts +20 -19
- package/dist/support-passport/index.js +68 -65
- package/dist/temporal-supersession.d.ts +3 -3
- package/dist/temporal-timeline-recall.d.ts +2 -2
- package/dist/temporal-validity.d.ts +2 -2
- package/dist/threading.d.ts +2 -2
- package/dist/tier-migration.d.ts +5 -3
- package/dist/tier-routing.d.ts +2 -2
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
- package/dist/topics.d.ts +2 -2
- package/dist/transcript.d.ts +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +5 -5
- package/dist/transfer/export-okf.d.ts +39 -0
- package/dist/transfer/export-okf.js +112 -0
- package/dist/transfer/export-okf.js.map +1 -0
- package/dist/transfer/types.d.ts +12 -12
- package/dist/trust-score-stage.d.ts +2 -2
- package/dist/trust-score.d.ts +2 -2
- package/dist/{types-BHDNxGTT.d.ts → types-BRpcNjHZ.d.ts} +119 -3
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -2
- package/dist/verified-recall.js +33 -33
- package/dist/who-knows-cli.d.ts +15 -14
- package/dist/who-knows-cli.js +34 -34
- package/dist/who-knows.d.ts +15 -14
- package/dist/who-knows.js +33 -33
- package/dist/write-envelope.d.ts +2 -2
- package/dist/write-envelope.js +6 -6
- package/package.json +54 -3
- package/src/access-admin-ops-surface.ts +6 -1
- package/src/access-boundary.ts +1 -0
- package/src/access-http.ts +3 -1
- package/src/access-mcp-output-schemas.ts +1 -0
- package/src/access-mcp.ts +3 -3
- package/src/access-operations.ts +1 -0
- package/src/access-service-offline-file-content.test.ts +63 -0
- package/src/access-surface-catalog.ts +2 -0
- package/src/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/activity/config.test.ts +1 -0
- package/src/activity/config.ts +21 -1
- package/src/activity/index.ts +1 -0
- package/src/activity/timeline/build.ts +279 -0
- package/src/activity/timeline/categories.ts +111 -0
- package/src/activity/timeline/classify.ts +110 -0
- package/src/activity/timeline/corrections.ts +145 -0
- package/src/activity/timeline/index.ts +6 -0
- package/src/activity/timeline/timeline.test.ts +277 -0
- package/src/activity/timeline/types.ts +106 -0
- package/src/activity/types.ts +6 -0
- package/src/cli/okf-commands.ts +45 -0
- package/src/cli.ts +2 -2
- package/src/coding/export-okf-codegraph.test.ts +381 -0
- package/src/coding/export-okf-codegraph.ts +565 -0
- package/src/config.test.ts +1 -0
- package/src/config.ts +3 -5
- package/src/context-summary.ts +182 -0
- package/src/extraction-prompt-safety.test.ts +14 -2
- package/src/extraction.ts +21 -1
- package/src/fallback-llm.test.ts +134 -0
- package/src/fallback-llm.ts +77 -5
- package/src/index.ts +4 -11
- package/src/lcm/summarizer.ts +14 -93
- package/src/location/access-operations.ts +17 -8
- package/src/location/backfill.ts +137 -0
- package/src/location/config.test.ts +3 -0
- package/src/location/config.ts +46 -2
- package/src/location/http-glue.ts +1 -1
- package/src/location/index.ts +3 -0
- package/src/location/intervals.ts +1 -0
- package/src/location/matching.test.ts +65 -0
- package/src/location/matching.ts +354 -0
- package/src/location/mcp-tools.ts +2 -1
- package/src/location/surfaces.test.ts +15 -2
- package/src/location/surfaces.ts +95 -18
- package/src/location/tagging.test.ts +119 -0
- package/src/location/tagging.ts +277 -0
- package/src/location/types.ts +23 -1
- package/src/mcp-read-only-tools.ts +1 -0
- package/src/memory-action-policy.ts +28 -0
- package/src/memory-projection-store.ts +3 -1
- package/src/okf/cli.ts +18 -5
- package/src/okf/config.ts +5 -0
- package/src/okf/index-files.test.ts +60 -0
- package/src/okf/index-files.ts +114 -0
- package/src/okf/render.ts +133 -0
- package/src/okf/type-mapping.test.ts +3 -0
- package/src/okf/type-mapping.ts +2 -0
- package/src/orchestration/extraction-run.ts +2 -1
- package/src/orchestration/generic-recall-paths.ts +4 -3
- package/src/schemas.ts +17 -1
- package/src/standup/access-operations.ts +14 -0
- package/src/standup/build.test.ts +34 -0
- package/src/standup/build.ts +115 -0
- package/src/standup/http-glue.ts +15 -0
- package/src/standup/mcp-tools.ts +16 -0
- package/src/storage/context-transform-ledger.ts +39 -0
- package/src/storage/secure-line-reader.ts +50 -1
- package/src/storage.ts +4 -1
- package/src/support-passport/card-projection.ts +1 -0
- package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
- package/src/support-passport/card-service.test.ts +75 -1
- package/src/support-passport/card-service.ts +6 -3
- package/src/support-passport/card-state.ts +5 -1
- package/src/support-passport/offline-sync-guard.ts +14 -1
- package/src/transfer/export-okf.test.ts +164 -0
- package/src/transfer/export-okf.ts +286 -0
- package/src/types.ts +2 -3
- package/dist/chunk-2LWQSV6A.js.map +0 -1
- package/dist/chunk-3BCULS4U.js.map +0 -1
- package/dist/chunk-7BDZTALN.js.map +0 -1
- package/dist/chunk-7PHI6GUI.js.map +0 -1
- package/dist/chunk-AFR6AIM4.js.map +0 -1
- package/dist/chunk-AX7UXCHJ.js.map +0 -1
- package/dist/chunk-BJTHRFFC.js.map +0 -1
- package/dist/chunk-D4QVPP3G.js.map +0 -1
- package/dist/chunk-DVYRD4HY.js.map +0 -1
- package/dist/chunk-F635GAL7.js.map +0 -1
- package/dist/chunk-FMQ4MOQO.js.map +0 -1
- package/dist/chunk-FP7YTTVO.js.map +0 -1
- package/dist/chunk-I4343FIA.js.map +0 -1
- package/dist/chunk-I7EX6KSH.js.map +0 -1
- package/dist/chunk-LBFFNDFM.js.map +0 -1
- package/dist/chunk-LLQCM2U2.js.map +0 -1
- package/dist/chunk-RQE4TITU.js.map +0 -1
- package/dist/chunk-UW5NPZJ2.js.map +0 -1
- package/dist/chunk-XAB6STPO.js.map +0 -1
- package/dist/chunk-ZPUIRTIZ.js.map +0 -1
- package/dist/types-CM86alG1.d.ts +0 -89
- /package/dist/{contradiction-scan-AKUWPX5N.js.map → active-context-config.js.map} +0 -0
- /package/dist/{resolution-4552BNRV.js.map → active-context-transform.js.map} +0 -0
- /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
- /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
- /package/dist/{chunk-CFGU52XJ.js.map → chunk-23CVL7HS.js.map} +0 -0
- /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
- /package/dist/{chunk-6CPUQ5D6.js.map → chunk-2LBAFHOQ.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-IP4ZNT4U.js.map → chunk-33MFRY25.js.map} +0 -0
- /package/dist/{chunk-VFYRYFLL.js.map → chunk-3TSU662L.js.map} +0 -0
- /package/dist/{chunk-VXVZ2GM3.js.map → chunk-4FHRZD5T.js.map} +0 -0
- /package/dist/{chunk-5VPQSRQO.js.map → chunk-4STAANV7.js.map} +0 -0
- /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
- /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
- /package/dist/{chunk-YKWFK7XA.js.map → chunk-6CEGSTBD.js.map} +0 -0
- /package/dist/{chunk-GEPACVWN.js.map → chunk-6RUHELWR.js.map} +0 -0
- /package/dist/{chunk-ZAOHJDKH.js.map → chunk-72OIT7KS.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-7LCGFUMB.js.map} +0 -0
- /package/dist/{chunk-7TCGNUVP.js.map → chunk-7UTDHQZ5.js.map} +0 -0
- /package/dist/{chunk-5HK3CJAR.js.map → chunk-7XOG75AU.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-ACOC27BB.js.map → chunk-CN4VKV3S.js.map} +0 -0
- /package/dist/{chunk-PMVPCZJZ.js.map → chunk-CTCGHNWN.js.map} +0 -0
- /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
- /package/dist/{chunk-T42L3S6A.js.map → chunk-DDX6KIXF.js.map} +0 -0
- /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
- /package/dist/{chunk-WTOZBZNN.js.map → chunk-DMEHOEC7.js.map} +0 -0
- /package/dist/{chunk-OPPBTPUU.js.map → chunk-DUAJKRR2.js.map} +0 -0
- /package/dist/{chunk-SVVIASVX.js.map → chunk-EFQCDJZ2.js.map} +0 -0
- /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
- /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
- /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
- /package/dist/{chunk-Z4U3UN56.js.map → chunk-EZSCW4EM.js.map} +0 -0
- /package/dist/{chunk-F6QHHRWP.js.map → chunk-FESUGFIL.js.map} +0 -0
- /package/dist/{chunk-S3K2CIK5.js.map → chunk-FKKGCGYL.js.map} +0 -0
- /package/dist/{chunk-BWGCOLEL.js.map → chunk-FTTJRVB7.js.map} +0 -0
- /package/dist/{chunk-JAQXUGLN.js.map → chunk-FYWLSFFS.js.map} +0 -0
- /package/dist/{chunk-OPGL46PX.js.map → chunk-GX6FTSYH.js.map} +0 -0
- /package/dist/{chunk-A32YEQAM.js.map → chunk-H7VDIF2V.js.map} +0 -0
- /package/dist/{chunk-PDDSFELN.js.map → chunk-HJXA6ZM7.js.map} +0 -0
- /package/dist/{chunk-RGCF4XNH.js.map → chunk-HNPE66LB.js.map} +0 -0
- /package/dist/{chunk-SEA6M7SS.js.map → chunk-I5VB44ZK.js.map} +0 -0
- /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
- /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
- /package/dist/{chunk-3RI5Y7KU.js.map → chunk-IVIAHQBR.js.map} +0 -0
- /package/dist/{chunk-7WR462EM.js.map → chunk-J3OND5QT.js.map} +0 -0
- /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
- /package/dist/{chunk-I32NKXE2.js.map → chunk-JTWZKNUH.js.map} +0 -0
- /package/dist/{chunk-VKCAHCBI.js.map → chunk-L4X4PJYK.js.map} +0 -0
- /package/dist/{chunk-W4BMEGQA.js.map → chunk-LUDBXTBJ.js.map} +0 -0
- /package/dist/{chunk-RIAM7DND.js.map → chunk-ME35HVDJ.js.map} +0 -0
- /package/dist/{chunk-NG3MBQV4.js.map → chunk-MJRGVXPQ.js.map} +0 -0
- /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
- /package/dist/{chunk-7F27PCSN.js.map → chunk-MN5NOOI7.js.map} +0 -0
- /package/dist/{chunk-JCWY73FK.js.map → chunk-N4F7ZSSG.js.map} +0 -0
- /package/dist/{chunk-TR7DGXGI.js.map → chunk-NACLNNFQ.js.map} +0 -0
- /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
- /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
- /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
- /package/dist/{chunk-IY7UXD3J.js.map → chunk-O57GM3FR.js.map} +0 -0
- /package/dist/{chunk-I2HTKOOP.js.map → chunk-O7ERGZDA.js.map} +0 -0
- /package/dist/{chunk-GTSVEEP3.js.map → chunk-OAJMQKQR.js.map} +0 -0
- /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
- /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
- /package/dist/{chunk-EOHKUWXW.js.map → chunk-QCRJMU5V.js.map} +0 -0
- /package/dist/{chunk-5DH6PG4B.js.map → chunk-RZ3IZIJG.js.map} +0 -0
- /package/dist/{chunk-AAXJNINV.js.map → chunk-SN4JXNLL.js.map} +0 -0
- /package/dist/{chunk-SVSRPG6M.js.map → chunk-TNGH4ZYI.js.map} +0 -0
- /package/dist/{chunk-HZNYJN77.js.map → chunk-TNXNECAN.js.map} +0 -0
- /package/dist/{chunk-JOEJG4SD.js.map → chunk-TVW4C7PV.js.map} +0 -0
- /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
- /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
- /package/dist/{chunk-YRVAKONL.js.map → chunk-VQ4AMTGZ.js.map} +0 -0
- /package/dist/{chunk-RAIUTAZZ.js.map → chunk-WKAXBXVA.js.map} +0 -0
- /package/dist/{chunk-ZIJDI4CP.js.map → chunk-WKJFIMVN.js.map} +0 -0
- /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
- /package/dist/{chunk-7BEPVIH3.js.map → chunk-X5YYSAZX.js.map} +0 -0
- /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
- /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
- /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-ANJXPFRS.js.map → chunk-YXFCALVT.js.map} +0 -0
- /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
- /package/dist/{chunk-5HERQ5FX.js.map → chunk-Z3YEGSR4.js.map} +0 -0
- /package/dist/{chunk-YWSQD2IB.js.map → chunk-ZJPM7GZ3.js.map} +0 -0
- /package/dist/{chunk-5S4LQOPE.js.map → chunk-ZW4VXELZ.js.map} +0 -0
- /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
- /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
- /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
- /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline correction store (issue #2049): manual card/category edits that
|
|
3
|
+
* survive day rebuilds. Corrections are keyed by the card's stable
|
|
4
|
+
* content-derived id, so rebuilding the same evidence reproduces the same
|
|
5
|
+
* card ids and re-applies the edit; an explicit `reset()` reverts a card to
|
|
6
|
+
* its derived values. Corrections are user edits, not evidence — they live in
|
|
7
|
+
* their own small SQLite file, never in the #1899 snapshot store.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { mkdirSync } from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
|
|
13
|
+
import { openBetterSqlite3, type BetterSqlite3Database } from "../../runtime/better-sqlite.js";
|
|
14
|
+
import { DEFAULT_TIMELINE_CATEGORIES, validateTimelineCategories } from "./categories.js";
|
|
15
|
+
import type { TimelineCard, TimelineCategory, TimelineCorrection } from "./types.js";
|
|
16
|
+
|
|
17
|
+
export function timelineCorrectionDatabasePath(memoryDir: string): string {
|
|
18
|
+
return path.join(memoryDir, "state", "activity-timeline.sqlite");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface CorrectionRow {
|
|
22
|
+
card_id: string;
|
|
23
|
+
category_id: string | null;
|
|
24
|
+
title: string | null;
|
|
25
|
+
edited_at_utc: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function rowToCorrection(row: CorrectionRow): TimelineCorrection {
|
|
29
|
+
return {
|
|
30
|
+
cardId: row.card_id,
|
|
31
|
+
categoryId: row.category_id ?? undefined,
|
|
32
|
+
title: row.title ?? undefined,
|
|
33
|
+
editedAtUtc: row.edited_at_utc,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export class TimelineCorrectionStore {
|
|
38
|
+
private readonly db: BetterSqlite3Database;
|
|
39
|
+
|
|
40
|
+
constructor(db: BetterSqlite3Database) {
|
|
41
|
+
this.db = db;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static open(memoryDir: string): TimelineCorrectionStore {
|
|
45
|
+
mkdirSync(path.join(memoryDir, "state"), { recursive: true });
|
|
46
|
+
const db = openBetterSqlite3(timelineCorrectionDatabasePath(memoryDir));
|
|
47
|
+
db.pragma("journal_mode = WAL");
|
|
48
|
+
db.pragma("busy_timeout = 5000");
|
|
49
|
+
db.exec(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS timeline_corrections (
|
|
51
|
+
card_id TEXT PRIMARY KEY,
|
|
52
|
+
category_id TEXT,
|
|
53
|
+
title TEXT,
|
|
54
|
+
edited_at_utc TEXT NOT NULL
|
|
55
|
+
);
|
|
56
|
+
`);
|
|
57
|
+
return new TimelineCorrectionStore(db);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Persist one correction. `categoryId`, when set, must exist in `categories`
|
|
62
|
+
* (defaults to the built-in registry) — an unknown category is a malformed
|
|
63
|
+
* edit and must fail rather than silently strand the card.
|
|
64
|
+
*/
|
|
65
|
+
upsert(correction: TimelineCorrection, categories: readonly TimelineCategory[] = DEFAULT_TIMELINE_CATEGORIES): void {
|
|
66
|
+
validateTimelineCategories(categories);
|
|
67
|
+
if (typeof correction.cardId !== "string" || correction.cardId.length === 0) {
|
|
68
|
+
throw new RangeError("timeline correction requires a non-empty cardId");
|
|
69
|
+
}
|
|
70
|
+
if (typeof correction.editedAtUtc !== "string" || Number.isNaN(Date.parse(correction.editedAtUtc))) {
|
|
71
|
+
throw new RangeError("timeline correction requires a valid editedAtUtc instant");
|
|
72
|
+
}
|
|
73
|
+
if ((correction.categoryId === undefined && correction.title === undefined) || (correction.title !== undefined && correction.title.length === 0)) {
|
|
74
|
+
throw new RangeError("timeline correction must set a categoryId and/or a non-empty title");
|
|
75
|
+
}
|
|
76
|
+
if (correction.categoryId !== undefined && !categories.some((category) => category.id === correction.categoryId)) {
|
|
77
|
+
throw new RangeError(`timeline correction targets unknown category: ${correction.categoryId}`);
|
|
78
|
+
}
|
|
79
|
+
this.db
|
|
80
|
+
.prepare(
|
|
81
|
+
`INSERT INTO timeline_corrections (card_id, category_id, title, edited_at_utc)
|
|
82
|
+
VALUES (?, ?, ?, ?)
|
|
83
|
+
ON CONFLICT(card_id) DO UPDATE SET category_id = excluded.category_id, title = excluded.title, edited_at_utc = excluded.edited_at_utc`,
|
|
84
|
+
)
|
|
85
|
+
.run(correction.cardId, correction.categoryId ?? null, correction.title ?? null, correction.editedAtUtc);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
get(cardId: string): TimelineCorrection | undefined {
|
|
89
|
+
const row = this.db.prepare("SELECT card_id, category_id, title, edited_at_utc FROM timeline_corrections WHERE card_id = ?").get(cardId);
|
|
90
|
+
return row === undefined ? undefined : rowToCorrection(row as CorrectionRow);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** All corrections ordered by card id (deterministic listing). */
|
|
94
|
+
list(): TimelineCorrection[] {
|
|
95
|
+
return this.db
|
|
96
|
+
.prepare("SELECT card_id, category_id, title, edited_at_utc FROM timeline_corrections ORDER BY card_id ASC")
|
|
97
|
+
.all()
|
|
98
|
+
.map((row) => rowToCorrection(row as CorrectionRow));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Explicitly reset a card to its derived values; true when a correction existed. */
|
|
102
|
+
reset(cardId: string): boolean {
|
|
103
|
+
return this.db.prepare("DELETE FROM timeline_corrections WHERE card_id = ?").run(cardId).changes > 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
close(): void {
|
|
107
|
+
this.db.close();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Apply corrections to built cards. Overrides title/category, sets confidence
|
|
113
|
+
* to 1 (a human confirmed it), and stamps manual-edit provenance. Uncorrected
|
|
114
|
+
* cards pass through untouched, so serialization stays byte-stable for them.
|
|
115
|
+
*/
|
|
116
|
+
export function applyTimelineCorrections(
|
|
117
|
+
cards: readonly TimelineCard[],
|
|
118
|
+
corrections: readonly TimelineCorrection[],
|
|
119
|
+
): TimelineCard[] {
|
|
120
|
+
const byCardId = new Map(corrections.map((correction) => [correction.cardId, correction]));
|
|
121
|
+
return cards.map((card) => {
|
|
122
|
+
const correction = byCardId.get(card.id);
|
|
123
|
+
if (correction === undefined) return card;
|
|
124
|
+
return {
|
|
125
|
+
id: card.id,
|
|
126
|
+
kind: card.kind,
|
|
127
|
+
title: correction.title ?? card.title,
|
|
128
|
+
summary: card.summary,
|
|
129
|
+
categoryId: correction.categoryId ?? card.categoryId,
|
|
130
|
+
confidence: 1,
|
|
131
|
+
startUtc: card.startUtc,
|
|
132
|
+
endUtc: card.endUtc,
|
|
133
|
+
dayKey: card.dayKey,
|
|
134
|
+
timezone: card.timezone,
|
|
135
|
+
machine: card.machine,
|
|
136
|
+
evidenceIds: card.evidenceIds,
|
|
137
|
+
evidenceRange: card.evidenceRange,
|
|
138
|
+
manualEdit: {
|
|
139
|
+
...(correction.categoryId !== undefined ? { categoryId: correction.categoryId } : {}),
|
|
140
|
+
...(correction.title !== undefined ? { title: correction.title } : {}),
|
|
141
|
+
editedAtUtc: correction.editedAtUtc,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { activityDayWindow } from "../digest.js";
|
|
8
|
+
import { parseActivityConfig } from "../config.js";
|
|
9
|
+
import {
|
|
10
|
+
DEFAULT_TIMELINE_CATEGORIES,
|
|
11
|
+
TIMELINE_RESERVED_IDLE,
|
|
12
|
+
TIMELINE_RESERVED_PAUSE,
|
|
13
|
+
TIMELINE_RESERVED_UNKNOWN,
|
|
14
|
+
sortTimelineCategories,
|
|
15
|
+
validateTimelineCategories,
|
|
16
|
+
} from "./categories.js";
|
|
17
|
+
import { classifyTimelineObservation } from "./classify.js";
|
|
18
|
+
import { buildTimelineDay, serializeTimelineDay, TIMELINE_MERGE_GAP_MS } from "./build.js";
|
|
19
|
+
import { applyTimelineCorrections, TimelineCorrectionStore } from "./corrections.js";
|
|
20
|
+
import type { TimelineCategory, TimelineObservation } from "./types.js";
|
|
21
|
+
|
|
22
|
+
function obs(overrides: Partial<TimelineObservation> & { id: number; capturedAtUtc: string }): TimelineObservation {
|
|
23
|
+
return {
|
|
24
|
+
machine: "workstation-a",
|
|
25
|
+
app: "Code",
|
|
26
|
+
windowTitle: "main.ts — editor",
|
|
27
|
+
contentHash: `hash-${overrides.id}`,
|
|
28
|
+
...overrides,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const BASE_INPUT = {
|
|
33
|
+
date: "2026-06-01",
|
|
34
|
+
timezone: "UTC",
|
|
35
|
+
observations: [
|
|
36
|
+
obs({ id: 1, capturedAtUtc: "2026-06-01T09:00:00.000Z" }),
|
|
37
|
+
obs({ id: 2, capturedAtUtc: "2026-06-01T09:01:00.000Z" }),
|
|
38
|
+
obs({ id: 3, capturedAtUtc: "2026-06-01T09:02:00.000Z" }),
|
|
39
|
+
obs({ id: 4, capturedAtUtc: "2026-06-01T09:40:00.000Z" }),
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
test("synthetic observations replay into byte-stable cards regardless of input order", () => {
|
|
44
|
+
const first = buildTimelineDay(BASE_INPUT);
|
|
45
|
+
const second = buildTimelineDay({ ...BASE_INPUT, observations: [...BASE_INPUT.observations].reverse() });
|
|
46
|
+
assert.equal(serializeTimelineDay(second), serializeTimelineDay(first));
|
|
47
|
+
// "Restart" isolation: a completely fresh call over equal content matches.
|
|
48
|
+
const third = buildTimelineDay(JSON.parse(JSON.stringify(BASE_INPUT)));
|
|
49
|
+
assert.equal(serializeTimelineDay(third), serializeTimelineDay(first));
|
|
50
|
+
assert.ok(first.cards.every((card) => card.id.startsWith("tlc_")));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("adjacent compatible observations merge; key changes and long gaps split cards", () => {
|
|
54
|
+
const day = buildTimelineDay(BASE_INPUT);
|
|
55
|
+
const activity = day.cards.filter((card) => card.kind === "activity");
|
|
56
|
+
assert.equal(activity.length, 2, "2-min gaps merge, a 38-min gap splits");
|
|
57
|
+
assert.deepEqual(activity[0].evidenceIds, [1, 2, 3]);
|
|
58
|
+
// Dwell caps at 15 min past the LAST observation: [09:00, 09:17), [09:40, 09:55).
|
|
59
|
+
assert.equal(activity[0].startUtc, "2026-06-01T09:00:00.000Z");
|
|
60
|
+
assert.equal(activity[0].endUtc, "2026-06-01T09:17:00.000Z");
|
|
61
|
+
assert.equal(activity[1].startUtc, "2026-06-01T09:40:00.000Z");
|
|
62
|
+
assert.equal(activity[1].endUtc, "2026-06-01T09:55:00.000Z");
|
|
63
|
+
// The >15-min remainder is a derived idle card with no evidence.
|
|
64
|
+
const idle = day.cards.filter((card) => card.kind === "idle");
|
|
65
|
+
assert.equal(idle.length, 1);
|
|
66
|
+
assert.equal(idle[0].categoryId, TIMELINE_RESERVED_IDLE);
|
|
67
|
+
assert.deepEqual(idle[0].evidenceIds, []);
|
|
68
|
+
assert.equal(idle[0].startUtc, "2026-06-01T09:17:00.000Z");
|
|
69
|
+
assert.equal(idle[0].endUtc, "2026-06-01T09:40:00.000Z");
|
|
70
|
+
|
|
71
|
+
// Same cadence but a different window title: two cards, contiguous, no idle.
|
|
72
|
+
const keyed = buildTimelineDay({
|
|
73
|
+
...BASE_INPUT,
|
|
74
|
+
observations: [
|
|
75
|
+
obs({ id: 1, capturedAtUtc: "2026-06-01T09:00:00.000Z" }),
|
|
76
|
+
obs({ id: 2, capturedAtUtc: "2026-06-01T09:01:00.000Z", windowTitle: "other.ts — editor" }),
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
const cards = keyed.cards.filter((card) => card.kind === "activity");
|
|
80
|
+
assert.equal(cards.length, 2);
|
|
81
|
+
assert.equal(cards[0].endUtc, cards[1].startUtc, "dwell stops at the next observation");
|
|
82
|
+
assert.equal(keyed.cards.filter((card) => card.kind === "idle").length, 0);
|
|
83
|
+
assert.equal(TIMELINE_MERGE_GAP_MS, 120_000, "merge gap contract");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("card dwell is clipped at the local day end (midnight)", () => {
|
|
87
|
+
const day = buildTimelineDay({
|
|
88
|
+
date: "2026-06-01",
|
|
89
|
+
timezone: "UTC",
|
|
90
|
+
observations: [obs({ id: 7, capturedAtUtc: "2026-06-01T23:59:00.000Z" })],
|
|
91
|
+
});
|
|
92
|
+
const card = day.cards[0];
|
|
93
|
+
assert.equal(card.startUtc, "2026-06-01T23:59:00.000Z");
|
|
94
|
+
assert.equal(card.endUtc, "2026-06-02T00:00:00.000Z", "15-min dwell must not cross midnight");
|
|
95
|
+
assert.equal(card.dayKey, "2026-06-01");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("DST transition days bucket observations through the shifted window", () => {
|
|
99
|
+
// America/New_York springs forward 2026-03-08: the local day is 23 hours.
|
|
100
|
+
const window = activityDayWindow("2026-03-08", "America/New_York");
|
|
101
|
+
assert.equal(Date.parse(window.endUtc) - Date.parse(window.startUtc), 23 * 3_600_000);
|
|
102
|
+
const day = buildTimelineDay({
|
|
103
|
+
date: "2026-03-08",
|
|
104
|
+
timezone: "America/New_York",
|
|
105
|
+
observations: [
|
|
106
|
+
obs({ id: 11, capturedAtUtc: "2026-03-08T06:30:00.000Z" }),
|
|
107
|
+
obs({ id: 12, capturedAtUtc: "2026-03-08T06:31:00.000Z" }),
|
|
108
|
+
],
|
|
109
|
+
});
|
|
110
|
+
assert.equal(day.cards.length, 1);
|
|
111
|
+
assert.equal(day.cards[0].dayKey, "2026-03-08");
|
|
112
|
+
assert.equal(day.startUtc, window.startUtc);
|
|
113
|
+
// Fall-back day is 25 hours.
|
|
114
|
+
const fallWindow = activityDayWindow("2026-11-01", "America/New_York");
|
|
115
|
+
assert.equal(Date.parse(fallWindow.endUtc) - Date.parse(fallWindow.startUtc), 25 * 3_600_000);
|
|
116
|
+
});
|
|
117
|
+
test("user pause closes cards, is emitted as its own kind, and wins over idle", () => {
|
|
118
|
+
const day = buildTimelineDay({
|
|
119
|
+
...BASE_INPUT,
|
|
120
|
+
observations: [
|
|
121
|
+
obs({ id: 1, capturedAtUtc: "2026-06-01T10:00:00.000Z" }),
|
|
122
|
+
obs({ id: 2, capturedAtUtc: "2026-06-01T10:01:30.000Z" }),
|
|
123
|
+
obs({ id: 3, capturedAtUtc: "2026-06-01T11:00:00.000Z" }),
|
|
124
|
+
],
|
|
125
|
+
pauses: [{ startUtc: "2026-06-01T10:30:00.000Z", endUtc: "2026-06-01T11:00:00.000Z", reason: "lunch" }],
|
|
126
|
+
});
|
|
127
|
+
const pause = day.cards.filter((card) => card.kind === "pause");
|
|
128
|
+
assert.equal(pause.length, 1);
|
|
129
|
+
assert.equal(pause[0].categoryId, TIMELINE_RESERVED_PAUSE);
|
|
130
|
+
assert.deepEqual(pause[0].evidenceIds, []);
|
|
131
|
+
assert.ok(pause[0].summary.includes("lunch"));
|
|
132
|
+
const before = day.cards.find((card) => card.kind === "activity" && card.evidenceIds.includes(1));
|
|
133
|
+
assert.equal(before?.endUtc, "2026-06-01T10:16:30.000Z", "dwell (15m from last obs) ends before the pause");
|
|
134
|
+
// Dwell stops short of the pause, so the 13.5-min remainder is one idle
|
|
135
|
+
// card; the pause wins over idle covering the same minutes.
|
|
136
|
+
const idle = day.cards.filter((card) => card.kind === "idle");
|
|
137
|
+
assert.equal(idle.length, 1);
|
|
138
|
+
assert.equal(idle[0].startUtc, "2026-06-01T10:16:30.000Z");
|
|
139
|
+
assert.equal(idle[0].endUtc, "2026-06-01T10:30:00.000Z");
|
|
140
|
+
// No idle overlaps the pause interval itself.
|
|
141
|
+
assert.ok(idle.every((card) => card.endUtc <= pause[0].startUtc || card.startUtc >= pause[0].endUtc));
|
|
142
|
+
// Overlapping pauses union into one interval.
|
|
143
|
+
const unioned = buildTimelineDay({
|
|
144
|
+
date: "2026-06-01",
|
|
145
|
+
timezone: "UTC",
|
|
146
|
+
pauses: [
|
|
147
|
+
{ startUtc: "2026-06-01T10:00:00.000Z", endUtc: "2026-06-01T10:30:00.000Z" },
|
|
148
|
+
{ startUtc: "2026-06-01T10:20:00.000Z", endUtc: "2026-06-01T11:00:00.000Z" },
|
|
149
|
+
],
|
|
150
|
+
observations: [],
|
|
151
|
+
});
|
|
152
|
+
assert.equal(unioned.cards.length, 1);
|
|
153
|
+
assert.equal(unioned.cards[0].endUtc, "2026-06-01T11:00:00.000Z");
|
|
154
|
+
// A pause between two compatible observations still closes the card.
|
|
155
|
+
const split = buildTimelineDay({
|
|
156
|
+
date: "2026-06-01",
|
|
157
|
+
timezone: "UTC",
|
|
158
|
+
observations: [
|
|
159
|
+
obs({ id: 1, capturedAtUtc: "2026-06-01T09:00:00.000Z" }),
|
|
160
|
+
obs({ id: 2, capturedAtUtc: "2026-06-01T09:00:30.000Z" }),
|
|
161
|
+
],
|
|
162
|
+
pauses: [{ startUtc: "2026-06-01T09:00:10.000Z", endUtc: "2026-06-01T09:00:20.000Z" }],
|
|
163
|
+
});
|
|
164
|
+
assert.equal(split.cards.filter((card) => card.kind === "activity").length, 2);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("overlapping multi-machine tracks never merge across machines", () => {
|
|
168
|
+
const day = buildTimelineDay({
|
|
169
|
+
...BASE_INPUT,
|
|
170
|
+
observations: [
|
|
171
|
+
obs({ id: 1, machine: "ws-a", capturedAtUtc: "2026-06-01T09:00:00.000Z", app: "Chrome", windowTitle: "Docs" }),
|
|
172
|
+
obs({ id: 2, machine: "ws-b", capturedAtUtc: "2026-06-01T09:00:30.000Z", app: "Chrome", windowTitle: "Docs" }),
|
|
173
|
+
obs({ id: 3, machine: "ws-a", capturedAtUtc: "2026-06-01T09:01:00.000Z", app: "Chrome", windowTitle: "Docs" }),
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
const activity = day.cards.filter((card) => card.kind === "activity");
|
|
177
|
+
assert.equal(activity.length, 2);
|
|
178
|
+
assert.deepEqual(new Set(activity.map((card) => card.machine)), new Set(["ws-a", "ws-b"]));
|
|
179
|
+
// Global order is start-time first with a stable machine tie-break.
|
|
180
|
+
assert.ok(activity[0].startUtc <= activity[1].startUtc);
|
|
181
|
+
assert.equal(activity.find((card) => card.machine === "ws-a")?.evidenceIds.length, 2);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("unclassified activity stays visible in system.unknown; domains outrank app names", () => {
|
|
185
|
+
const unknown = classifyTimelineObservation({ app: "MysteryTool", windowTitle: "untitled" }, DEFAULT_TIMELINE_CATEGORIES);
|
|
186
|
+
assert.deepEqual(unknown, { categoryId: TIMELINE_RESERVED_UNKNOWN, confidence: 0 });
|
|
187
|
+
const day = buildTimelineDay({
|
|
188
|
+
date: "2026-06-01",
|
|
189
|
+
timezone: "UTC",
|
|
190
|
+
observations: [obs({ id: 1, capturedAtUtc: "2026-06-01T09:00:00.000Z", app: "MysteryTool", windowTitle: "untitled" })],
|
|
191
|
+
});
|
|
192
|
+
assert.equal(day.cards[0].categoryId, TIMELINE_RESERVED_UNKNOWN);
|
|
193
|
+
assert.equal(day.cards[0].confidence, 0);
|
|
194
|
+
// A browser on github.com is development (domain signal) even though the
|
|
195
|
+
// app rule alone would say browsing.
|
|
196
|
+
const classified = classifyTimelineObservation(
|
|
197
|
+
{ app: "Chrome", windowTitle: "feat: timeline", browserUrl: "https://github.com/org/repo" },
|
|
198
|
+
DEFAULT_TIMELINE_CATEGORIES,
|
|
199
|
+
);
|
|
200
|
+
assert.equal(classified.categoryId, "development");
|
|
201
|
+
assert.equal(classified.confidence, 0.85);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("categories validate reserved/system rules and sort with equal-order tie-breaks", () => {
|
|
205
|
+
assert.throws(
|
|
206
|
+
() => validateTimelineCategories([{ id: "development", name: "x", color: "#3b82f6", description: "d", order: 1 }]),
|
|
207
|
+
/system\.unknown/,
|
|
208
|
+
);
|
|
209
|
+
assert.throws(
|
|
210
|
+
() =>
|
|
211
|
+
validateTimelineCategories([
|
|
212
|
+
...DEFAULT_TIMELINE_CATEGORIES,
|
|
213
|
+
{ id: "development", name: "dup", color: "#000000", description: "d", order: 5 },
|
|
214
|
+
]),
|
|
215
|
+
/unique/,
|
|
216
|
+
);
|
|
217
|
+
assert.throws(
|
|
218
|
+
() => validateTimelineCategories(DEFAULT_TIMELINE_CATEGORIES.map((c) => (c.id === "development" ? { ...c, color: "blue" } : c))),
|
|
219
|
+
/#RRGGBB/,
|
|
220
|
+
);
|
|
221
|
+
assert.throws(
|
|
222
|
+
() => validateTimelineCategories(DEFAULT_TIMELINE_CATEGORIES.map((c) => (c.id === "development" ? { ...c, system: true } : c))),
|
|
223
|
+
/only reserved categories/,
|
|
224
|
+
);
|
|
225
|
+
const equalOrder: TimelineCategory[] = [
|
|
226
|
+
{ id: "beta", name: "B", color: "#000001", description: "d", order: 50 },
|
|
227
|
+
{ id: "alpha", name: "A", color: "#000002", description: "d", order: 50 },
|
|
228
|
+
...DEFAULT_TIMELINE_CATEGORIES,
|
|
229
|
+
];
|
|
230
|
+
validateTimelineCategories(equalOrder);
|
|
231
|
+
const sorted = sortTimelineCategories(equalOrder);
|
|
232
|
+
assert.ok(sorted.findIndex((c) => c.id === "alpha") < sorted.findIndex((c) => c.id === "beta"), "equal order tie-breaks by id");
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test("manual corrections survive a rebuild and reset reverts the card", () => {
|
|
236
|
+
const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-timeline-test-"));
|
|
237
|
+
try {
|
|
238
|
+
const store = TimelineCorrectionStore.open(memoryDir);
|
|
239
|
+
const day = buildTimelineDay(BASE_INPUT);
|
|
240
|
+
const target = day.cards[0];
|
|
241
|
+
store.upsert({ cardId: target.id, categoryId: "communication", title: "Morning standup", editedAtUtc: "2026-06-01T12:00:00.000Z" });
|
|
242
|
+
assert.throws(() => store.upsert({ cardId: target.id, categoryId: "nope", editedAtUtc: "2026-06-01T12:00:00.000Z" }), /unknown category/);
|
|
243
|
+
|
|
244
|
+
// "Rebuild" — same evidence, fresh build call, corrections reapplied.
|
|
245
|
+
const rebuiltDay = buildTimelineDay(BASE_INPUT);
|
|
246
|
+
const rebuilt = applyTimelineCorrections(rebuiltDay.cards, store.list());
|
|
247
|
+
const corrected = rebuilt.find((card) => card.id === target.id);
|
|
248
|
+
assert.equal(corrected?.title, "Morning standup");
|
|
249
|
+
assert.equal(corrected?.categoryId, "communication");
|
|
250
|
+
assert.equal(corrected?.confidence, 1);
|
|
251
|
+
assert.equal(corrected?.manualEdit?.editedAtUtc, "2026-06-01T12:00:00.000Z");
|
|
252
|
+
const untouched = rebuilt.find((card) => card.id !== target.id);
|
|
253
|
+
assert.deepEqual(untouched, rebuiltDay.cards.find((card) => card.id === untouched?.id));
|
|
254
|
+
|
|
255
|
+
// Explicit reset restores the derived card byte-for-byte.
|
|
256
|
+
assert.equal(store.reset(target.id), true);
|
|
257
|
+
assert.equal(store.reset(target.id), false);
|
|
258
|
+
const afterReset = applyTimelineCorrections(buildTimelineDay(BASE_INPUT).cards, store.list());
|
|
259
|
+
assert.deepEqual(afterReset.find((card) => card.id === target.id), target);
|
|
260
|
+
|
|
261
|
+
// Corrections persist across close/reopen (process restart).
|
|
262
|
+
store.close();
|
|
263
|
+
const reopened = TimelineCorrectionStore.open(memoryDir);
|
|
264
|
+
assert.equal(reopened.list().length, 0);
|
|
265
|
+
reopened.close();
|
|
266
|
+
} finally {
|
|
267
|
+
rmSync(memoryDir, { recursive: true, force: true });
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("activity.timeline config gate defaults off and parses explicitly", () => {
|
|
272
|
+
assert.equal(parseActivityConfig(undefined).timeline.enabled, false);
|
|
273
|
+
assert.equal(parseActivityConfig({ timeline: { enabled: true } }).timeline.enabled, true);
|
|
274
|
+
assert.equal(parseActivityConfig({ timeline: { enabled: "false" } }).timeline.enabled, false);
|
|
275
|
+
assert.throws(() => parseActivityConfig({ timeline: "on" }), /activity\.timeline must be an object/);
|
|
276
|
+
assert.throws(() => parseActivityConfig({ timeline: { enabled: "maybe" } }), /activity\.timeline\.enabled must be a boolean/);
|
|
277
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline-card layer over the #1899 activity store (issue #2049).
|
|
3
|
+
*
|
|
4
|
+
* A card is a deterministic, replayable *derived view*: it references snapshot
|
|
5
|
+
* evidence by store row id and content identity, never copying or re-storing
|
|
6
|
+
* it. All intervals are half-open [start, end) UTC; day bucketing reuses the
|
|
7
|
+
* DST-aware `activityDayWindow` from the digest layer, so timeline days and
|
|
8
|
+
* digests always agree on day bounds.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Reference to one stored observation (subset of ActivitySnapshot; no text). */
|
|
12
|
+
export interface TimelineObservation {
|
|
13
|
+
/** Store row id of the referenced snapshot. */
|
|
14
|
+
id: number;
|
|
15
|
+
machine: string;
|
|
16
|
+
/** UTC ISO-8601 capture instant. */
|
|
17
|
+
capturedAtUtc: string;
|
|
18
|
+
app: string;
|
|
19
|
+
windowTitle: string;
|
|
20
|
+
/** Browser tab URL, when the frontmost window is a known browser. */
|
|
21
|
+
browserUrl?: string;
|
|
22
|
+
/** Content hash of the referenced snapshot (identity, not re-stored text). */
|
|
23
|
+
contentHash: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** User-declared pause, half-open [startUtc, endUtc) in UTC. Not idle. */
|
|
27
|
+
export interface TimelinePause {
|
|
28
|
+
startUtc: string;
|
|
29
|
+
endUtc: string;
|
|
30
|
+
/** Free-form reason, kept verbatim on the derived pause card. */
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** One category definition in the registry. */
|
|
35
|
+
export interface TimelineCategory {
|
|
36
|
+
/** Stable ID (`system.*` is the reserved namespace). */
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
/** Hex color, `#RRGGBB`. */
|
|
40
|
+
color: string;
|
|
41
|
+
description: string;
|
|
42
|
+
/** Presentation order; equal orders tie-break by id. */
|
|
43
|
+
order: number;
|
|
44
|
+
/** Reserved system category (idle / pause / unknown). */
|
|
45
|
+
system?: boolean;
|
|
46
|
+
/** Marks the reserved idle category. */
|
|
47
|
+
idle?: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type TimelineCardKind = "activity" | "idle" | "pause";
|
|
51
|
+
|
|
52
|
+
/** Provenance stamped on a card when a manual correction was applied. */
|
|
53
|
+
export interface TimelineManualEdit {
|
|
54
|
+
categoryId?: string;
|
|
55
|
+
title?: string;
|
|
56
|
+
editedAtUtc: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** A persisted manual correction; keyed by stable card id, survives rebuilds. */
|
|
60
|
+
export interface TimelineCorrection {
|
|
61
|
+
cardId: string;
|
|
62
|
+
categoryId?: string;
|
|
63
|
+
title?: string;
|
|
64
|
+
editedAtUtc: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Stable first/last evidence identity keys bracketing a card's sources. */
|
|
68
|
+
export interface TimelineEvidenceRange {
|
|
69
|
+
firstKey: string;
|
|
70
|
+
lastKey: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface TimelineCard {
|
|
74
|
+
/** Stable content-derived id (never array position or wall-clock). */
|
|
75
|
+
id: string;
|
|
76
|
+
kind: TimelineCardKind;
|
|
77
|
+
title: string;
|
|
78
|
+
summary: string;
|
|
79
|
+
categoryId: string;
|
|
80
|
+
/** Classification confidence; manual corrections set it to 1. */
|
|
81
|
+
confidence: number;
|
|
82
|
+
/** Half-open [startUtc, endUtc) UTC bounds. */
|
|
83
|
+
startUtc: string;
|
|
84
|
+
endUtc: string;
|
|
85
|
+
/** Local day key (YYYY-MM-DD) this card belongs to. */
|
|
86
|
+
dayKey: string;
|
|
87
|
+
timezone: string;
|
|
88
|
+
/** Track the card was built on; null for machine-less pause cards. */
|
|
89
|
+
machine: string | null;
|
|
90
|
+
/** Store row ids of the source snapshots (empty for idle/pause). */
|
|
91
|
+
evidenceIds: number[];
|
|
92
|
+
/** First/last evidence identity keys (null for idle/pause). */
|
|
93
|
+
evidenceRange: TimelineEvidenceRange | null;
|
|
94
|
+
/** Present only when a manual correction was applied. */
|
|
95
|
+
manualEdit?: TimelineManualEdit;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** One replayable local day of cards. */
|
|
99
|
+
export interface TimelineDay {
|
|
100
|
+
formatVersion: number;
|
|
101
|
+
date: string;
|
|
102
|
+
timezone: string;
|
|
103
|
+
startUtc: string;
|
|
104
|
+
endUtc: string;
|
|
105
|
+
cards: TimelineCard[];
|
|
106
|
+
}
|
package/src/activity/types.ts
CHANGED
|
@@ -96,6 +96,11 @@ export interface ActivitySourceConfig {
|
|
|
96
96
|
token?: string;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
/** Opt-in timeline-card derivation settings (issue #2049). Default off. */
|
|
100
|
+
export interface ActivityTimelineConfig {
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
99
104
|
/** Opt-in activity synchronization + trust-gated extraction settings. */
|
|
100
105
|
export interface ActivityConfig {
|
|
101
106
|
enabled: boolean;
|
|
@@ -114,4 +119,5 @@ export interface ActivityConfig {
|
|
|
114
119
|
minImportance: ImportanceLevel;
|
|
115
120
|
/** `0` means no count cap. */
|
|
116
121
|
maxMemoriesPerDay: number;
|
|
122
|
+
timeline: ActivityTimelineConfig;
|
|
117
123
|
}
|
package/src/cli/okf-commands.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import type { Orchestrator } from "../orchestrator.js";
|
|
2
3
|
import type { CliCommand } from "../cli.js";
|
|
3
4
|
import { runOkfCliCommand } from "../okf/cli.js";
|
|
5
|
+
import { exportOkfBundle, parseIncludeStatus } from "../transfer/export-okf.js";
|
|
4
6
|
|
|
5
7
|
export function registerOkfCommands(cmd: CliCommand, orchestrator: Orchestrator): void {
|
|
6
8
|
const okfCmd = cmd.command("okf").description("OKF v0.1 conformance (lint, sweep)");
|
|
@@ -9,6 +11,7 @@ export function registerOkfCommands(cmd: CliCommand, orchestrator: Orchestrator)
|
|
|
9
11
|
memoryDir: orchestrator.config.memoryDir,
|
|
10
12
|
conformanceEnabled: orchestrator.config.okf.conformanceEnabled,
|
|
11
13
|
sweepEnabled: orchestrator.config.okf.sweepEnabled,
|
|
14
|
+
indexFilesEnabled: orchestrator.config.okf.indexFilesEnabled,
|
|
12
15
|
});
|
|
13
16
|
if (code !== 0) process.exitCode = code;
|
|
14
17
|
};
|
|
@@ -21,3 +24,45 @@ export function registerOkfCommands(cmd: CliCommand, orchestrator: Orchestrator)
|
|
|
21
24
|
await forward(["sweep", ...(options.json === true ? ["--json"] : [])]);
|
|
22
25
|
});
|
|
23
26
|
}
|
|
27
|
+
|
|
28
|
+
export function registerExportOkfCommand(exportCmd: CliCommand, orchestrator: Orchestrator): void {
|
|
29
|
+
exportCmd
|
|
30
|
+
.command("okf")
|
|
31
|
+
.description("Export a portable OKF v0.1 knowledge bundle")
|
|
32
|
+
.requiredOption("--out <path>", "Output directory")
|
|
33
|
+
.option("--namespace <ns>", "Namespace to export")
|
|
34
|
+
.option("--include-status <status>", "Repeatable status allow-list (default: active)")
|
|
35
|
+
.option("--include-categories <categories>", "Comma-separated category allow-list")
|
|
36
|
+
.option("--exclude-tags <tags>", "Comma-separated tags to drop")
|
|
37
|
+
.option("--include-profile", "Include profile.md (default off)")
|
|
38
|
+
.option("--include-wearables", "Include wearable day transcripts (default off)")
|
|
39
|
+
.option("--log", "Write log.md from the lifecycle ledger")
|
|
40
|
+
.option("--force", "Replace a non-empty output directory")
|
|
41
|
+
.action(async (...args: unknown[]) => {
|
|
42
|
+
const options = (args[0] ?? {}) as Record<string, unknown>;
|
|
43
|
+
const out = options.out ? String(options.out) : "";
|
|
44
|
+
if (!out) throw new Error("Missing --out");
|
|
45
|
+
const includeStatus = parseIncludeStatus(options.includeStatus);
|
|
46
|
+
const namespace = options.namespace ? String(options.namespace) : "";
|
|
47
|
+
const memoryDir = namespace
|
|
48
|
+
? path.join(orchestrator.config.memoryDir, "namespaces", namespace)
|
|
49
|
+
: orchestrator.config.memoryDir;
|
|
50
|
+
const result = await exportOkfBundle({
|
|
51
|
+
memoryDir,
|
|
52
|
+
outDir: out,
|
|
53
|
+
includeStatus,
|
|
54
|
+
includeCategories: options.includeCategories ? String(options.includeCategories).split(",") : undefined,
|
|
55
|
+
excludeTags: options.excludeTags ? String(options.excludeTags).split(",") : undefined,
|
|
56
|
+
includeProfile: options.includeProfile === true,
|
|
57
|
+
includeWearables: options.includeWearables === true,
|
|
58
|
+
includeLog: options.log === true,
|
|
59
|
+
force: options.force === true,
|
|
60
|
+
});
|
|
61
|
+
if (result.plaintextWarning) {
|
|
62
|
+
console.log("PLAINTEXT EXPORT: the OKF bundle is unencrypted.");
|
|
63
|
+
}
|
|
64
|
+
console.log(
|
|
65
|
+
`OKF export: ${result.exported} concepts, ${result.excluded} excluded`,
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { utcDayRange } from "./transcript.js";
|
|
|
15
15
|
import { padEndDisplay, truncateGraphemeSafe } from "./whitespace.js";
|
|
16
16
|
import { runWearablesCliCommand } from "./wearables/cli.js";
|
|
17
17
|
import { registerMeetingsCommands } from "./cli/meetings-commands.js";
|
|
18
|
-
import { registerOkfCommands } from "./cli/okf-commands.js";
|
|
18
|
+
import { registerExportOkfCommand, registerOkfCommands } from "./cli/okf-commands.js";
|
|
19
19
|
import { registerSkillsCommands } from "./cli/skills-commands.js";
|
|
20
20
|
import { registerResearchStatusCommands } from "./cli/research-status-commands.js";
|
|
21
21
|
import { registerCreationLedgerCommands } from "./cli/creation-ledger-commands.js";
|
|
@@ -4367,7 +4367,7 @@ export function registerCli(
|
|
|
4367
4367
|
return;
|
|
4368
4368
|
}
|
|
4369
4369
|
console.log("OK");
|
|
4370
|
-
});
|
|
4370
|
+
}); registerExportOkfCommand(exportCmd, orchestrator);
|
|
4371
4371
|
|
|
4372
4372
|
const importCmd = cmd
|
|
4373
4373
|
.command("import")
|