@remnic/core 9.65.8 → 9.66.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.d.ts +11 -12
- package/dist/access-admin-ops-surface.js +54 -51
- package/dist/access-authorization-probe.d.ts +11 -12
- package/dist/access-authorization-probe.js +55 -52
- package/dist/access-boundary.d.ts +11 -12
- package/dist/access-boundary.js +54 -51
- package/dist/access-citation-namespace.js +3 -3
- package/dist/access-cli.js +132 -125
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -2
- package/dist/access-coding-context-resolution.js +2 -2
- package/dist/access-extraction-force-flush.d.ts +11 -12
- package/dist/access-extraction-force-flush.js +54 -51
- package/dist/access-health-types.d.ts +1 -2
- package/dist/access-http-lcm-compaction.d.ts +11 -12
- package/dist/access-http-lifecycle-flush.d.ts +11 -12
- package/dist/access-http-offline-stream.d.ts +11 -12
- package/dist/access-http-query.d.ts +2 -3
- package/dist/access-http-query.js +56 -53
- package/dist/access-http.d.ts +12 -13
- package/dist/access-http.js +77 -74
- package/dist/access-identity-continuity-surface.d.ts +9 -10
- package/dist/access-identity-continuity-surface.js +54 -51
- package/dist/access-lcm-surface.d.ts +11 -12
- package/dist/access-lcm-surface.js +54 -51
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +11 -12
- package/dist/access-mcp.js +67 -64
- package/dist/access-memory-search-fanout.d.ts +2 -3
- package/dist/{access-namespace-preflight-CpAOrS-9.d.ts → access-namespace-preflight-50VIkPhB.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -4
- package/dist/access-namespace-preflight.js +54 -51
- package/dist/access-observe-write-surface.d.ts +11 -12
- package/dist/access-observe-write-surface.js +54 -51
- package/dist/access-offline-manifest.d.ts +9 -10
- package/dist/access-offline-manifest.js +15 -15
- package/dist/access-operations-batch.js +59 -56
- package/dist/access-operations.d.ts +12 -13
- package/dist/access-operations.js +64 -61
- package/dist/access-recall-concurrency.d.ts +11 -12
- package/dist/access-recall-concurrency.js +54 -51
- package/dist/access-recall-response.d.ts +11 -12
- package/dist/access-recall-response.js +54 -51
- package/dist/access-recall-surface.d.ts +11 -12
- package/dist/access-recall-surface.js +54 -51
- package/dist/access-schema.d.ts +12 -12
- package/dist/access-schema.js +5 -5
- package/dist/{access-service-Diu61Cfv.d.ts → access-service-C2tV2-uL.d.ts} +8 -8
- package/dist/access-service-helpers.d.ts +11 -12
- package/dist/access-service.d.ts +11 -12
- package/dist/access-service.js +54 -51
- package/dist/access-surface-catalog.d.ts +11 -12
- package/dist/access-surface-catalog.js +58 -53
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +3 -4
- package/dist/action-confidence.d.ts +1 -2
- package/dist/active-memory-bridge.d.ts +1 -2
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +1 -2
- package/dist/active-recall.js +11 -11
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +1 -2
- package/dist/artifact-search.d.ts +1 -2
- package/dist/{auto-sync-2YPITIWN.js → auto-sync-Q6Q2FVSC.js} +9 -9
- package/dist/behavior-learner.d.ts +1 -2
- package/dist/behavior-signals.d.ts +1 -2
- package/dist/bootstrap.d.ts +9 -10
- package/dist/briefing-window.d.ts +2 -3
- package/dist/briefing.d.ts +2 -3
- package/dist/briefing.js +28 -28
- package/dist/buffer-surprise-report.d.ts +1 -2
- package/dist/buffer-turn-helpers.d.ts +1 -2
- package/dist/buffer.d.ts +2 -3
- package/dist/buffer.js +20 -4
- package/dist/bulk-import/index.d.ts +3 -4
- package/dist/calibration.d.ts +1 -2
- package/dist/calibration.js +1 -1
- package/dist/capabilities.d.ts +1 -2
- package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
- package/dist/{catalog-9f-vEQLS.d.ts → catalog-C2jA-gLm.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -2
- package/dist/causal-consolidation.d.ts +1 -2
- package/dist/causal-consolidation.js +29 -29
- package/dist/causal-trajectory-graph.d.ts +1 -2
- package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
- package/dist/{chunk-TFR3HG4K.js → chunk-2FA7U5XY.js} +4 -4
- package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
- package/dist/{chunk-W2BAGGEW.js → chunk-2ITZ74A6.js} +40 -31
- package/dist/{chunk-W2BAGGEW.js.map → chunk-2ITZ74A6.js.map} +1 -1
- package/dist/{chunk-MY2BC6UE.js → chunk-2X6BGKQL.js} +11 -11
- package/dist/{chunk-UEBDCMOO.js → chunk-3TSU662L.js} +3 -3
- package/dist/{chunk-XAB6STPO.js → chunk-46XR5FNZ.js} +53 -3
- package/dist/chunk-46XR5FNZ.js.map +1 -0
- package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
- package/dist/chunk-4OFKZAJG.js.map +1 -0
- package/dist/{chunk-S5XOSTYM.js → chunk-4XLTUR6R.js} +3 -3
- package/dist/{chunk-BWGCOLEL.js → chunk-65JOGLIS.js} +2 -2
- package/dist/{chunk-HMZKGHMD.js → chunk-7UOXCCCI.js} +3 -3
- package/dist/{chunk-7WOWGRAU.js → chunk-AF5H7TKI.js} +108 -23
- package/dist/chunk-AF5H7TKI.js.map +1 -0
- package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
- package/dist/chunk-AJTG3CP7.js.map +1 -0
- package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
- package/dist/chunk-AL3UYZ5N.js.map +1 -0
- package/dist/{chunk-4F4AQFWL.js → chunk-B4AOWRYF.js} +10 -10
- package/dist/{chunk-ODU2CNNX.js → chunk-C5IUOBCN.js} +2 -2
- package/dist/{chunk-3A2NJP2U.js → chunk-CHGG74CY.js} +3 -3
- package/dist/{chunk-76DIF5KT.js → chunk-CX4OLNIH.js} +2 -2
- package/dist/{chunk-Z3YEGSR4.js → chunk-D3UXGE5D.js} +10 -10
- package/dist/{chunk-5HK3CJAR.js → chunk-D6Q5EPOV.js} +2 -2
- package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
- package/dist/{chunk-XBGHAAKR.js → chunk-DDX6KIXF.js} +2 -2
- package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
- package/dist/{chunk-7KQB4EBS.js → chunk-DUAJKRR2.js} +2 -2
- package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
- package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
- package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
- package/dist/{chunk-DPCXDG7G.js → chunk-EH65UV2Z.js} +2 -2
- package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
- package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
- package/dist/{chunk-TUHBYJXL.js → chunk-EWKVYCFP.js} +1 -1
- package/dist/{chunk-NPFUNWNX.js → chunk-FFUMTH27.js} +2 -2
- package/dist/{chunk-3PKAS6VL.js → chunk-GAJK3DQ5.js} +2 -2
- package/dist/{chunk-DA7ITC5Z.js → chunk-GBEOUCBB.js} +2 -2
- package/dist/{chunk-UENKPWCS.js → chunk-H2IRSXZN.js} +6 -6
- package/dist/{chunk-CFVTRUR3.js → chunk-H6RSANGQ.js} +2 -2
- package/dist/chunk-HVAEXYPL.js +98 -0
- package/dist/chunk-HVAEXYPL.js.map +1 -0
- package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
- package/dist/{chunk-3SZD4CYO.js → chunk-IGZCAHFL.js} +3 -3
- package/dist/{chunk-UPFNQJC7.js → chunk-INUBU6I5.js} +2 -2
- package/dist/{chunk-PMVPCZJZ.js → chunk-J2R275FN.js} +3 -3
- package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
- package/dist/chunk-JALOAKSZ.js.map +1 -0
- package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
- package/dist/{chunk-3BCULS4U.js → chunk-JKTV3JNX.js} +145 -507
- package/dist/chunk-JKTV3JNX.js.map +1 -0
- package/dist/{chunk-5ACCD4L7.js → chunk-JRRQ747T.js} +7 -7
- package/dist/{chunk-V4IDF3EZ.js → chunk-JTWZKNUH.js} +5 -5
- package/dist/{chunk-AZMLH5UT.js → chunk-KI64TTBL.js} +2 -2
- package/dist/{chunk-DEACDKE3.js → chunk-KJXCD7VR.js} +112 -87
- package/dist/chunk-KJXCD7VR.js.map +1 -0
- package/dist/chunk-LJABGXC4.js +267 -0
- package/dist/chunk-LJABGXC4.js.map +1 -0
- package/dist/{chunk-NPIBN2VL.js → chunk-LK4TOYPU.js} +2 -2
- package/dist/{chunk-UTQUEHC7.js → chunk-LUDBXTBJ.js} +8 -8
- package/dist/{chunk-PU56CXZA.js → chunk-LYUUA6QB.js} +2 -2
- package/dist/{chunk-P36Z4JRA.js → chunk-M5ERTI4I.js} +2 -2
- package/dist/{chunk-LDKPDODJ.js → chunk-ME35HVDJ.js} +2 -2
- package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
- package/dist/{chunk-OXRRJXPR.js → chunk-MUEGIKKY.js} +476 -1796
- package/dist/chunk-MUEGIKKY.js.map +1 -0
- package/dist/{chunk-AHPIFKNG.js → chunk-N4F7ZSSG.js} +2 -2
- package/dist/{chunk-JOZUBF4A.js → chunk-NACLNNFQ.js} +2 -2
- package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
- package/dist/{chunk-T7XP6IZE.js → chunk-NFP4KPTA.js} +2 -2
- package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
- package/dist/{chunk-LPNCR4QK.js → chunk-NSTNGMSS.js} +14 -14
- package/dist/{chunk-5RWZH6PH.js → chunk-NUF7VSEX.js} +2 -2
- package/dist/{chunk-7VZFRUQU.js → chunk-O7ERGZDA.js} +5 -5
- package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
- package/dist/{chunk-5DHKCO52.js → chunk-OJUEUQDJ.js} +2 -2
- package/dist/{chunk-LOXHYCVS.js → chunk-OMX6TKXH.js} +2 -2
- package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
- package/dist/{chunk-SEEJOGQX.js → chunk-QBNE55VA.js} +4 -4
- package/dist/chunk-QJCWK2A7.js +1466 -0
- package/dist/chunk-QJCWK2A7.js.map +1 -0
- package/dist/{chunk-YEUXERJ6.js → chunk-RDGKVH6T.js} +7 -3
- package/dist/{chunk-YEUXERJ6.js.map → chunk-RDGKVH6T.js.map} +1 -1
- package/dist/{chunk-JYSN42VN.js → chunk-RPIS5FQ7.js} +237 -183
- package/dist/chunk-RPIS5FQ7.js.map +1 -0
- package/dist/{chunk-F7XUD3PL.js → chunk-S4CDUXQY.js} +2 -2
- package/dist/{chunk-WNXYT4MK.js → chunk-S4Z2OBTX.js} +4 -4
- package/dist/{chunk-UL4MKZHI.js → chunk-SN4JXNLL.js} +2 -2
- package/dist/{chunk-CAMNRAJF.js → chunk-SZMYGDSM.js} +2 -2
- package/dist/chunk-TB2MJRI6.js +866 -0
- package/dist/chunk-TB2MJRI6.js.map +1 -0
- package/dist/{chunk-XNWXSGHS.js → chunk-TBCDF556.js} +28 -10
- package/dist/chunk-TBCDF556.js.map +1 -0
- package/dist/{chunk-LKYIOCWL.js → chunk-TCF4MU7L.js} +967 -132
- package/dist/chunk-TCF4MU7L.js.map +1 -0
- package/dist/chunk-TCQRIIIN.js +202 -0
- package/dist/chunk-TCQRIIIN.js.map +1 -0
- package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
- package/dist/chunk-TEZ2HTC7.js.map +1 -0
- package/dist/{chunk-CPA5NBHN.js → chunk-TNGH4ZYI.js} +2 -2
- package/dist/{chunk-F3NVYTTA.js → chunk-TNXNECAN.js} +6 -6
- package/dist/{chunk-BEC4YBNA.js → chunk-TVW4C7PV.js} +2 -2
- package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
- package/dist/{chunk-KZIF6XHX.js → chunk-U65VJSCJ.js} +32 -19
- package/dist/chunk-U65VJSCJ.js.map +1 -0
- package/dist/{chunk-4QEYREAV.js → chunk-U6NGKS32.js} +8 -8
- package/dist/{chunk-HRHO3ZNG.js → chunk-UW4RYPWC.js} +2 -2
- package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
- package/dist/chunk-UYA36DQ7.js.map +1 -0
- package/dist/{chunk-T6ILXUAH.js → chunk-VG4SSPAW.js} +2 -2
- package/dist/chunk-VOSWUO3K.js +100 -0
- package/dist/chunk-VOSWUO3K.js.map +1 -0
- package/dist/chunk-WFCWP4XU.js +17 -0
- package/dist/chunk-WFCWP4XU.js.map +1 -0
- package/dist/{chunk-H2YSH3DG.js → chunk-WKAXBXVA.js} +2 -2
- package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
- package/dist/{chunk-UNUMFURP.js → chunk-X5PIDJ3L.js} +3 -3
- package/dist/{chunk-CRML27CO.js → chunk-X5YYSAZX.js} +4 -4
- package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
- package/dist/{chunk-U7EW2W4W.js → chunk-XKNHFDTT.js} +26 -6
- package/dist/chunk-XKNHFDTT.js.map +1 -0
- package/dist/{chunk-OA2O2GJ4.js → chunk-XOHYGIWF.js} +3 -3
- package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
- package/dist/{chunk-MINHJ55X.js → chunk-XXW32OL7.js} +1 -1
- package/dist/{chunk-MINHJ55X.js.map → chunk-XXW32OL7.js.map} +1 -1
- package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
- package/dist/{chunk-MDD2RINF.js → chunk-YWPLOJ7T.js} +3 -3
- package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
- package/dist/{chunk-GTO56JY5.js → chunk-ZPS724LT.js} +2 -2
- package/dist/{chunk-SNOIKAHM.js → chunk-ZZZWEDF4.js} +3 -3
- package/dist/{cli-O3F-ht3i.d.ts → cli-CsfFMe6n.d.ts} +5 -5
- package/dist/cli.d.ts +13 -14
- package/dist/cli.js +101 -96
- package/dist/coding/export-okf-codegraph.d.ts +56 -0
- package/dist/coding/export-okf-codegraph.js +526 -0
- package/dist/coding/export-okf-codegraph.js.map +1 -0
- package/dist/coding/pre-action-gate.d.ts +1 -2
- package/dist/compounding/engine.d.ts +2 -3
- package/dist/compounding/engine.js +29 -29
- package/dist/compounding/preference-consolidator.d.ts +1 -2
- package/dist/compression-optimizer.d.ts +1 -2
- package/dist/config.d.ts +1 -2
- package/dist/config.js +11 -11
- package/dist/connectors/codex-materialize-runner.d.ts +1 -2
- package/dist/connectors/codex-materialize-runner.js +28 -28
- package/dist/connectors/codex-materialize.d.ts +1 -2
- package/dist/connectors/index.d.ts +1 -2
- package/dist/connectors/index.js +28 -28
- package/dist/consolidation-provenance-check.d.ts +2 -3
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +2 -3
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +3 -4
- package/dist/contradiction/index.js +9 -9
- package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
- package/dist/converge-config.d.ts +1 -2
- package/dist/convergence-refresh.d.ts +2 -3
- package/dist/convergence-refresh.js +30 -30
- package/dist/conversation-index/backend.d.ts +1 -2
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +1 -2
- package/dist/conversation-index/faiss-adapter.d.ts +1 -2
- package/dist/conversation-index/indexer.d.ts +1 -2
- package/dist/conversation-index/search.d.ts +1 -2
- package/dist/corpus-watermark.d.ts +1 -2
- package/dist/corpus-watermark.js +30 -30
- package/dist/cross-lingual-recall.d.ts +1 -2
- package/dist/day-summary.d.ts +1 -2
- package/dist/delinearize.d.ts +1 -2
- package/dist/dependency-propagation-config.d.ts +1 -2
- package/dist/{dependency-propagation-delivery-CL6RWXTA.d.ts → dependency-propagation-delivery-D4WMbOwA.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -2
- package/dist/direct-answer.d.ts +1 -2
- package/dist/embedding-fallback.d.ts +1 -2
- package/dist/enrichment/index.d.ts +1 -2
- package/dist/entity-origin-fields.d.ts +1 -2
- package/dist/entity-retrieval.d.ts +2 -3
- package/dist/entity-retrieval.js +28 -28
- package/dist/entity-schema.d.ts +1 -2
- package/dist/episodic-context.d.ts +1 -2
- package/dist/eval-trajectory-contracts.d.ts +1 -2
- package/dist/eval-trajectory-store.d.ts +1 -2
- package/dist/eval-trajectory.d.ts +1 -2
- package/dist/explicit-capture.d.ts +9 -10
- package/dist/explicit-capture.js +11 -11
- package/dist/external-wiki-access.d.ts +11 -12
- package/dist/external-wiki-access.js +55 -52
- package/dist/external-wiki-collection-registration.d.ts +1 -2
- package/dist/external-wiki-collection.d.ts +1 -2
- package/dist/external-wiki-mcp-tools.d.ts +11 -12
- package/dist/extraction-error-classification.d.ts +1 -2
- package/dist/extraction-faithfulness.d.ts +1 -2
- package/dist/extraction-faithfulness.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +1 -2
- package/dist/extraction-judge-training.d.ts +1 -2
- package/dist/extraction-judge.d.ts +1 -2
- package/dist/extraction-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +1 -2
- package/dist/extraction-normalization.d.ts +1 -2
- package/dist/extraction-prompt.d.ts +1 -2
- package/dist/extraction-source-grounding-rules.d.ts +1 -2
- package/dist/extraction-source-grounding.d.ts +1 -2
- package/dist/extraction.d.ts +1 -2
- package/dist/extraction.js +37 -34
- package/dist/fallback-llm.d.ts +7 -2
- package/dist/fallback-llm.js +1 -1
- package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
- package/dist/graph-dashboard-diff.d.ts +1 -2
- package/dist/graph-dashboard-key.d.ts +1 -2
- package/dist/graph-dashboard-parser.d.ts +1 -2
- package/dist/graph-edge-reinforcement.d.ts +1 -2
- package/dist/graph-path-reconstruction.d.ts +1 -2
- package/dist/graph-path-scoring.d.ts +1 -2
- package/dist/graph-snapshot.d.ts +1 -2
- package/dist/graph.d.ts +1 -2
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -2
- package/dist/importers/index.d.ts +1 -2
- package/dist/in-flight-reads.d.ts +1 -2
- package/dist/{index-C7Xep6S9.d.ts → index-DuJnzwHv.d.ts} +2 -2
- package/dist/index.d.ts +364 -26
- package/dist/index.js +232 -169
- package/dist/intent.d.ts +1 -2
- package/dist/lcm/engine.d.ts +1 -2
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.d.ts +1 -2
- package/dist/lcm/index.js +10 -10
- package/dist/lcm/tools.d.ts +1 -2
- package/dist/lifecycle.d.ts +1 -2
- package/dist/live-connectors-runner.d.ts +1 -2
- package/dist/local-llm.d.ts +1 -2
- package/dist/local-model-endpoint.d.ts +1 -2
- package/dist/location/index.d.ts +315 -6
- package/dist/location/index.js +151 -19
- package/dist/maintenance/memory-governance.d.ts +1 -2
- package/dist/maintenance/memory-governance.js +28 -28
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -28
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -3
- package/dist/maintenance/rebuild-memory-projection.js +29 -29
- package/dist/{maintenance-CJ-xqFp0.d.ts → maintenance-BBeaeYRR.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +11 -12
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -2
- package/dist/memory-cache.d.ts +1 -2
- package/dist/memory-controller.d.ts +1 -2
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -2
- package/dist/memory-projection-mutations.js +3 -3
- package/dist/memory-projection-store.d.ts +1 -2
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +1 -2
- package/dist/memory-snapshot.d.ts +1 -2
- package/dist/memory-subject-cli.d.ts +11 -12
- package/dist/memory-subject.d.ts +11 -12
- package/dist/memory-subject.js +4 -4
- package/dist/memory-worth-outcomes.d.ts +2 -3
- package/dist/models-json.d.ts +1 -2
- package/dist/namespaces/migrate.d.ts +3 -4
- package/dist/namespaces/migrate.js +29 -29
- package/dist/namespaces/principal.d.ts +1 -2
- package/dist/namespaces/search.d.ts +1 -2
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +3 -4
- package/dist/namespaces/storage.js +28 -28
- package/dist/native-knowledge.d.ts +1 -2
- package/dist/offline-sync-file-io.js +3 -3
- package/dist/offline-sync-impression-drain.d.ts +1 -2
- package/dist/offline-sync-impression-drain.js +9 -9
- package/dist/offline-sync.js +4 -4
- package/dist/operator-doctor-corpus.d.ts +1 -2
- package/dist/operator-doctor-corpus.js +31 -31
- package/dist/operator-doctor-replica.d.ts +1 -2
- package/dist/operator-toolkit.d.ts +3 -4
- package/dist/operator-toolkit.js +47 -47
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -3
- package/dist/orchestration/maintenance.d.ts +4 -5
- package/dist/orchestration/maintenance.js +42 -41
- package/dist/{orchestrator-BsntWxLy.d.ts → orchestrator-CaqnwNwM.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -10
- package/dist/orchestrator.js +132 -125
- package/dist/page-versioning.js +3 -3
- package/dist/patterns-cli.d.ts +1 -2
- package/dist/{pipeline-CVoysPm2.d.ts → pipeline-CrxVjlJr.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -2
- package/dist/proactive-contention.d.ts +1 -2
- package/dist/provenance.d.ts +1 -2
- package/dist/{public-http-CuOxlTC2.d.ts → public-http-Cwvl4QZr.d.ts} +1 -1
- package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
- package/dist/{qmd-DWMAGA5l.d.ts → qmd-BZgbJm0g.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -3
- package/dist/qmd-recall-cache.d.ts +1 -2
- package/dist/qmd.d.ts +2 -3
- package/dist/recall-concurrency-config.d.ts +1 -2
- package/dist/recall-deep.d.ts +37 -0
- package/dist/recall-deep.js +81 -0
- package/dist/recall-deep.js.map +1 -0
- package/dist/recall-disclosure-escalation.d.ts +1 -2
- package/dist/recall-explain-renderer.d.ts +1 -2
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -2
- package/dist/recall-navigate.d.ts +70 -0
- package/dist/recall-navigate.js +51 -0
- package/dist/recall-navigate.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +1 -2
- package/dist/recall-planner-llm.js +1 -1
- package/dist/recall-state-view-wire.d.ts +14 -0
- package/dist/recall-state-view-wire.js +11 -0
- package/dist/recall-state-view.d.ts +25 -0
- package/dist/recall-state-view.js +22 -0
- package/dist/recall-state-view.js.map +1 -0
- package/dist/recall-state.d.ts +1 -2
- package/dist/recall-tag-filter.d.ts +1 -2
- package/dist/recall-timings.d.ts +1 -2
- package/dist/recall-xray-cli.d.ts +1 -2
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -2
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -2
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -2
- package/dist/reconcile/manifest.d.ts +1 -2
- package/dist/reconcile/manifest.js +4 -4
- package/dist/reconcile/plan.d.ts +1 -2
- package/dist/replay/normalizers/chatgpt.d.ts +1 -2
- package/dist/replay/normalizers/claude.d.ts +1 -2
- package/dist/replay/normalizers/openclaw.d.ts +1 -2
- package/dist/replay/normalizers/shared.d.ts +1 -2
- package/dist/replay/runner.d.ts +1 -2
- package/dist/replay/types.d.ts +1 -2
- package/dist/replica-divergence.d.ts +1 -2
- package/dist/replica-peers-config.d.ts +1 -2
- package/dist/{resolution-XWBPKYFB.js → resolution-4DLI3IOR.js} +10 -10
- package/dist/resolution-4DLI3IOR.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -2
- package/dist/resume-bundles.js +12 -12
- package/dist/retrieval-agents.d.ts +2 -3
- package/dist/retrieval-tiers.d.ts +1 -2
- package/dist/routing/engine.d.ts +1 -2
- package/dist/routing/store.d.ts +1 -2
- package/dist/salvage-envelope.d.ts +1 -2
- package/dist/salvage-envelope.js +6 -6
- package/dist/schemas.d.ts +570 -105
- package/dist/schemas.js +3 -1
- package/dist/{scope-profiles-CPWkW_dI.d.ts → scope-profiles-DFaojvoP.d.ts} +1 -1
- package/dist/search/document-scanner.js +1 -1
- package/dist/search/embed-helper.d.ts +1 -2
- package/dist/search/factory.d.ts +1 -2
- package/dist/search/factory.js +7 -7
- package/dist/search/index.d.ts +1 -2
- package/dist/search/index.js +13 -13
- package/dist/search/lancedb-backend.d.ts +1 -2
- package/dist/search/lancedb-backend.js +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -2
- package/dist/search/meilisearch-backend.js +1 -1
- package/dist/search/noop-backend.d.ts +1 -2
- package/dist/search/orama-backend.d.ts +1 -2
- package/dist/search/orama-backend.js +1 -1
- package/dist/search/port.d.ts +1 -2
- package/dist/search/remote-backend.d.ts +1 -2
- package/dist/secure-store/index.js +3 -3
- package/dist/{semantic-consolidation-CNFVBXFc.d.ts → semantic-consolidation-BiX68wZA.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -3
- package/dist/semantic-consolidation.js +29 -29
- package/dist/semantic-rule-promotion.js +28 -28
- package/dist/semantic-rule-verifier.d.ts +1 -2
- package/dist/semantic-rule-verifier.js +28 -28
- package/dist/{service-Bb-JIdQ0.d.ts → service-D5h2zZ0M.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -2
- package/dist/session-observer-state.d.ts +1 -2
- package/dist/shared-context/manager.d.ts +1 -2
- package/dist/signal.d.ts +1 -2
- package/dist/source-agent-qualifier.d.ts +1 -2
- package/dist/source-agent-qualifier.js +35 -32
- package/dist/standup/build.d.ts +16 -0
- package/dist/standup/build.js +17 -0
- package/dist/standup/build.js.map +1 -0
- package/dist/{storage-CukrlNKk.d.ts → storage-CtsaojWD.d.ts} +1 -1
- package/dist/storage.d.ts +2 -3
- package/dist/storage.js +27 -27
- package/dist/subject-config.d.ts +1 -2
- package/dist/subject-config.js +5 -5
- package/dist/summarizer.d.ts +1 -2
- package/dist/summarizer.js +2 -2
- package/dist/summary-snapshot.d.ts +1 -2
- package/dist/support-passport/index.d.ts +16 -17
- package/dist/support-passport/index.js +57 -54
- package/dist/temporal-supersession.d.ts +2 -3
- package/dist/temporal-timeline-recall.d.ts +1 -2
- package/dist/temporal-validity.d.ts +1 -2
- package/dist/threading.d.ts +1 -2
- package/dist/tier-migration.d.ts +2 -3
- package/dist/tier-routing.d.ts +1 -2
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
- package/dist/topics.d.ts +1 -2
- package/dist/transcript.d.ts +1 -2
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/export-okf.d.ts +39 -0
- package/dist/transfer/export-okf.js +112 -0
- package/dist/transfer/export-okf.js.map +1 -0
- package/dist/trust-score-stage.d.ts +1 -2
- package/dist/trust-score.d.ts +1 -2
- package/dist/{types-djxQlxJ7.d.ts → types-CIpfYz1I.d.ts} +132 -12
- package/dist/types.d.ts +1 -2
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -2
- package/dist/verified-recall.js +28 -28
- package/dist/who-knows-cli.d.ts +11 -12
- package/dist/who-knows-cli.js +29 -29
- package/dist/who-knows.d.ts +11 -12
- package/dist/who-knows.js +28 -28
- package/dist/write-envelope.d.ts +1 -2
- package/dist/write-envelope.js +5 -5
- package/package.json +34 -3
- package/src/access-admin-ops-surface.ts +6 -1
- package/src/access-boundary.ts +1 -0
- package/src/access-http.ts +3 -1
- package/src/access-mcp-output-schemas.ts +1 -0
- package/src/access-mcp.ts +3 -3
- package/src/access-operations.ts +1 -0
- package/src/access-service-offline-file-content.test.ts +63 -0
- package/src/access-surface-catalog.ts +2 -0
- package/src/activity/config.test.ts +1 -0
- package/src/activity/config.ts +66 -1
- package/src/activity/index.ts +3 -0
- package/src/activity/journal.test.ts +97 -0
- package/src/activity/journal.ts +113 -0
- package/src/activity/privacy.test.ts +53 -0
- package/src/activity/privacy.ts +80 -0
- package/src/activity/timeline/build.ts +279 -0
- package/src/activity/timeline/categories.ts +111 -0
- package/src/activity/timeline/classify.ts +110 -0
- package/src/activity/timeline/corrections.ts +145 -0
- package/src/activity/timeline/index.ts +8 -0
- package/src/activity/timeline/journal-recap.test.ts +113 -0
- package/src/activity/timeline/journal-recap.ts +130 -0
- package/src/activity/timeline/query.test.ts +198 -0
- package/src/activity/timeline/query.ts +313 -0
- package/src/activity/timeline/timeline.test.ts +277 -0
- package/src/activity/timeline/types.ts +106 -0
- package/src/activity/timeline/weekly.test.ts +215 -0
- package/src/activity/timeline/weekly.ts +234 -0
- package/src/activity/types.ts +20 -0
- package/src/activity/vault-publish.test.ts +166 -0
- package/src/activity/vault-publish.ts +101 -0
- package/src/cli/okf-commands.ts +45 -0
- package/src/cli.ts +2 -2
- package/src/coding/export-okf-codegraph.test.ts +381 -0
- package/src/coding/export-okf-codegraph.ts +565 -0
- package/src/config.test.ts +1 -0
- package/src/config.ts +2 -22
- package/src/dedup/merge-on-write.test.ts +91 -0
- package/src/dedup/merge-on-write.ts +75 -0
- package/src/dedup/novelty-gate.test.ts +143 -0
- package/src/dedup/novelty-gate.ts +163 -0
- package/src/extraction-prompt-safety.test.ts +14 -2
- package/src/extraction.ts +21 -1
- package/src/fallback-llm.test.ts +134 -0
- package/src/fallback-llm.ts +77 -5
- package/src/location/access-operations.ts +17 -8
- package/src/location/backfill.ts +137 -0
- package/src/location/config.test.ts +3 -0
- package/src/location/config.ts +46 -2
- package/src/location/http-glue.ts +1 -1
- package/src/location/index.ts +3 -0
- package/src/location/intervals.ts +1 -0
- package/src/location/matching.test.ts +65 -0
- package/src/location/matching.ts +354 -0
- package/src/location/mcp-tools.ts +2 -1
- package/src/location/recall-exclusion.test.ts +1 -0
- package/src/location/surfaces.test.ts +15 -2
- package/src/location/surfaces.ts +95 -18
- package/src/location/tagging.test.ts +119 -0
- package/src/location/tagging.ts +277 -0
- package/src/location/types.ts +23 -1
- package/src/mcp-read-only-tools.ts +1 -0
- package/src/memory-projection-store.ts +3 -1
- package/src/okf/cli.ts +18 -5
- package/src/okf/config.ts +5 -0
- package/src/okf/index-files.test.ts +60 -0
- package/src/okf/index-files.ts +114 -0
- package/src/okf/render.ts +133 -0
- package/src/okf/type-mapping.test.ts +3 -0
- package/src/okf/type-mapping.ts +2 -0
- package/src/orchestration/extraction-persist.ts +22 -23
- package/src/orchestration/extraction-run.ts +2 -1
- package/src/orchestration/generic-recall-paths.ts +15 -3
- package/src/orchestration/recall-entry.ts +8 -3
- package/src/recall-deep.test.ts +72 -0
- package/src/recall-deep.ts +113 -0
- package/src/recall-navigate.test.ts +84 -0
- package/src/recall-navigate.ts +100 -0
- package/src/recall-state-view-wire.test.ts +35 -0
- package/src/recall-state-view-wire.ts +28 -0
- package/src/recall-state-view.test.ts +131 -0
- package/src/recall-state-view.ts +138 -0
- package/src/schemas.ts +17 -1
- package/src/shared-context/governance.test.ts +53 -0
- package/src/shared-context/governance.ts +86 -0
- package/src/standup/access-operations.ts +14 -0
- package/src/standup/build.test.ts +34 -0
- package/src/standup/build.ts +115 -0
- package/src/standup/http-glue.ts +15 -0
- package/src/standup/mcp-tools.ts +16 -0
- package/src/support-passport/card-projection.ts +1 -0
- package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
- package/src/support-passport/card-service.test.ts +75 -1
- package/src/support-passport/card-service.ts +6 -3
- package/src/support-passport/card-state.ts +5 -1
- package/src/support-passport/offline-sync-guard.ts +14 -1
- package/src/transfer/export-okf.test.ts +164 -0
- package/src/transfer/export-okf.ts +286 -0
- package/src/types.ts +3 -10
- package/dist/chunk-2LWQSV6A.js.map +0 -1
- package/dist/chunk-3BCULS4U.js.map +0 -1
- package/dist/chunk-7BDZTALN.js.map +0 -1
- package/dist/chunk-7PHI6GUI.js.map +0 -1
- package/dist/chunk-7WOWGRAU.js.map +0 -1
- package/dist/chunk-AX7UXCHJ.js.map +0 -1
- package/dist/chunk-DEACDKE3.js.map +0 -1
- package/dist/chunk-FP7YTTVO.js.map +0 -1
- package/dist/chunk-JYSN42VN.js.map +0 -1
- package/dist/chunk-KZIF6XHX.js.map +0 -1
- package/dist/chunk-LKYIOCWL.js.map +0 -1
- package/dist/chunk-OXRRJXPR.js.map +0 -1
- package/dist/chunk-U7EW2W4W.js.map +0 -1
- package/dist/chunk-UW5NPZJ2.js.map +0 -1
- package/dist/chunk-XAB6STPO.js.map +0 -1
- package/dist/chunk-XNWXSGHS.js.map +0 -1
- package/dist/types-CM86alG1.d.ts +0 -89
- /package/dist/{auto-sync-2YPITIWN.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
- /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
- /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
- /package/dist/{chunk-TFR3HG4K.js.map → chunk-2FA7U5XY.js.map} +0 -0
- /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
- /package/dist/{chunk-MY2BC6UE.js.map → chunk-2X6BGKQL.js.map} +0 -0
- /package/dist/{chunk-UEBDCMOO.js.map → chunk-3TSU662L.js.map} +0 -0
- /package/dist/{chunk-S5XOSTYM.js.map → chunk-4XLTUR6R.js.map} +0 -0
- /package/dist/{chunk-BWGCOLEL.js.map → chunk-65JOGLIS.js.map} +0 -0
- /package/dist/{chunk-HMZKGHMD.js.map → chunk-7UOXCCCI.js.map} +0 -0
- /package/dist/{chunk-4F4AQFWL.js.map → chunk-B4AOWRYF.js.map} +0 -0
- /package/dist/{chunk-ODU2CNNX.js.map → chunk-C5IUOBCN.js.map} +0 -0
- /package/dist/{chunk-3A2NJP2U.js.map → chunk-CHGG74CY.js.map} +0 -0
- /package/dist/{chunk-76DIF5KT.js.map → chunk-CX4OLNIH.js.map} +0 -0
- /package/dist/{chunk-Z3YEGSR4.js.map → chunk-D3UXGE5D.js.map} +0 -0
- /package/dist/{chunk-5HK3CJAR.js.map → chunk-D6Q5EPOV.js.map} +0 -0
- /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
- /package/dist/{chunk-XBGHAAKR.js.map → chunk-DDX6KIXF.js.map} +0 -0
- /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
- /package/dist/{chunk-7KQB4EBS.js.map → chunk-DUAJKRR2.js.map} +0 -0
- /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
- /package/dist/{chunk-DPCXDG7G.js.map → chunk-EH65UV2Z.js.map} +0 -0
- /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
- /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
- /package/dist/{chunk-TUHBYJXL.js.map → chunk-EWKVYCFP.js.map} +0 -0
- /package/dist/{chunk-NPFUNWNX.js.map → chunk-FFUMTH27.js.map} +0 -0
- /package/dist/{chunk-3PKAS6VL.js.map → chunk-GAJK3DQ5.js.map} +0 -0
- /package/dist/{chunk-DA7ITC5Z.js.map → chunk-GBEOUCBB.js.map} +0 -0
- /package/dist/{chunk-UENKPWCS.js.map → chunk-H2IRSXZN.js.map} +0 -0
- /package/dist/{chunk-CFVTRUR3.js.map → chunk-H6RSANGQ.js.map} +0 -0
- /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
- /package/dist/{chunk-3SZD4CYO.js.map → chunk-IGZCAHFL.js.map} +0 -0
- /package/dist/{chunk-UPFNQJC7.js.map → chunk-INUBU6I5.js.map} +0 -0
- /package/dist/{chunk-PMVPCZJZ.js.map → chunk-J2R275FN.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-5ACCD4L7.js.map → chunk-JRRQ747T.js.map} +0 -0
- /package/dist/{chunk-V4IDF3EZ.js.map → chunk-JTWZKNUH.js.map} +0 -0
- /package/dist/{chunk-AZMLH5UT.js.map → chunk-KI64TTBL.js.map} +0 -0
- /package/dist/{chunk-NPIBN2VL.js.map → chunk-LK4TOYPU.js.map} +0 -0
- /package/dist/{chunk-UTQUEHC7.js.map → chunk-LUDBXTBJ.js.map} +0 -0
- /package/dist/{chunk-PU56CXZA.js.map → chunk-LYUUA6QB.js.map} +0 -0
- /package/dist/{chunk-P36Z4JRA.js.map → chunk-M5ERTI4I.js.map} +0 -0
- /package/dist/{chunk-LDKPDODJ.js.map → chunk-ME35HVDJ.js.map} +0 -0
- /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
- /package/dist/{chunk-AHPIFKNG.js.map → chunk-N4F7ZSSG.js.map} +0 -0
- /package/dist/{chunk-JOZUBF4A.js.map → chunk-NACLNNFQ.js.map} +0 -0
- /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
- /package/dist/{chunk-T7XP6IZE.js.map → chunk-NFP4KPTA.js.map} +0 -0
- /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
- /package/dist/{chunk-LPNCR4QK.js.map → chunk-NSTNGMSS.js.map} +0 -0
- /package/dist/{chunk-5RWZH6PH.js.map → chunk-NUF7VSEX.js.map} +0 -0
- /package/dist/{chunk-7VZFRUQU.js.map → chunk-O7ERGZDA.js.map} +0 -0
- /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
- /package/dist/{chunk-5DHKCO52.js.map → chunk-OJUEUQDJ.js.map} +0 -0
- /package/dist/{chunk-LOXHYCVS.js.map → chunk-OMX6TKXH.js.map} +0 -0
- /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
- /package/dist/{chunk-SEEJOGQX.js.map → chunk-QBNE55VA.js.map} +0 -0
- /package/dist/{chunk-F7XUD3PL.js.map → chunk-S4CDUXQY.js.map} +0 -0
- /package/dist/{chunk-WNXYT4MK.js.map → chunk-S4Z2OBTX.js.map} +0 -0
- /package/dist/{chunk-UL4MKZHI.js.map → chunk-SN4JXNLL.js.map} +0 -0
- /package/dist/{chunk-CAMNRAJF.js.map → chunk-SZMYGDSM.js.map} +0 -0
- /package/dist/{chunk-CPA5NBHN.js.map → chunk-TNGH4ZYI.js.map} +0 -0
- /package/dist/{chunk-F3NVYTTA.js.map → chunk-TNXNECAN.js.map} +0 -0
- /package/dist/{chunk-BEC4YBNA.js.map → chunk-TVW4C7PV.js.map} +0 -0
- /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
- /package/dist/{chunk-4QEYREAV.js.map → chunk-U6NGKS32.js.map} +0 -0
- /package/dist/{chunk-HRHO3ZNG.js.map → chunk-UW4RYPWC.js.map} +0 -0
- /package/dist/{chunk-T6ILXUAH.js.map → chunk-VG4SSPAW.js.map} +0 -0
- /package/dist/{chunk-H2YSH3DG.js.map → chunk-WKAXBXVA.js.map} +0 -0
- /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
- /package/dist/{chunk-UNUMFURP.js.map → chunk-X5PIDJ3L.js.map} +0 -0
- /package/dist/{chunk-CRML27CO.js.map → chunk-X5YYSAZX.js.map} +0 -0
- /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
- /package/dist/{chunk-OA2O2GJ4.js.map → chunk-XOHYGIWF.js.map} +0 -0
- /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
- /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
- /package/dist/{chunk-MDD2RINF.js.map → chunk-YWPLOJ7T.js.map} +0 -0
- /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
- /package/dist/{chunk-GTO56JY5.js.map → chunk-ZPS724LT.js.map} +0 -0
- /package/dist/{chunk-SNOIKAHM.js.map → chunk-ZZZWEDF4.js.map} +0 -0
- /package/dist/{contradiction-scan-AKUWPX5N.js.map → contradiction-scan-NOYMFG66.js.map} +0 -0
- /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
- /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
- /package/dist/{resolution-XWBPKYFB.js.map → recall-state-view-wire.js.map} +0 -0
- /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { defineOperation } from "../access-boundary.js";
|
|
4
|
+
import { buildStandup, parseStandupDate } from "./build.js";
|
|
5
|
+
|
|
6
|
+
defineOperation({
|
|
7
|
+
name: "standup",
|
|
8
|
+
description: "Deterministic yesterday/today/blockers standup brief.",
|
|
9
|
+
fleetWide: true,
|
|
10
|
+
schema: z.object({ date: z.string().optional() }).strict(),
|
|
11
|
+
handler: async (input, ctx) => ({
|
|
12
|
+
result: buildStandup(ctx.service.memoryDir, parseStandupDate(input.date)),
|
|
13
|
+
}),
|
|
14
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { buildStandup, parseStandupDate, previousDate } from "./build.js";
|
|
8
|
+
|
|
9
|
+
test("parseStandupDate rejects garbage and defaults to UTC today", () => {
|
|
10
|
+
assert.equal(parseStandupDate(undefined, new Date("2026-08-18T12:00:00Z")), "2026-08-18");
|
|
11
|
+
assert.throws(() => parseStandupDate("nope"), /YYYY-MM-DD/);
|
|
12
|
+
assert.equal(previousDate("2026-08-18"), "2026-08-17");
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test("buildStandup is deterministic and marks missing days", async () => {
|
|
16
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
17
|
+
try {
|
|
18
|
+
await mkdir(path.join(memoryDir, "activity"), { recursive: true });
|
|
19
|
+
await writeFile(
|
|
20
|
+
path.join(memoryDir, "activity", "2026-08-18.md"),
|
|
21
|
+
"---\ndate: 2026-08-18\n---\n# Today\n- shipped standup\n- blocker: waiting on review\n",
|
|
22
|
+
"utf8",
|
|
23
|
+
);
|
|
24
|
+
const a = buildStandup(memoryDir, "2026-08-18");
|
|
25
|
+
const b = buildStandup(memoryDir, "2026-08-18");
|
|
26
|
+
assert.equal(a.markdown, b.markdown);
|
|
27
|
+
assert.equal(a.yesterday, "2026-08-17");
|
|
28
|
+
assert.match(a.markdown, /blocker: waiting on review/);
|
|
29
|
+
assert.match(a.activityGrid, /yesterday \| \./);
|
|
30
|
+
assert.match(a.activityGrid, /today \| x/);
|
|
31
|
+
} finally {
|
|
32
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { activityDigestPath, isValidActivityDate } from "../activity/digest.js";
|
|
5
|
+
|
|
6
|
+
export interface StandupBrief {
|
|
7
|
+
date: string;
|
|
8
|
+
yesterday: string;
|
|
9
|
+
today: string;
|
|
10
|
+
highlights: string[];
|
|
11
|
+
blockers: string[];
|
|
12
|
+
activityGrid: string;
|
|
13
|
+
markdown: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function parseStandupDate(raw: unknown, now = new Date()): string {
|
|
17
|
+
if (raw === undefined || raw === null || raw === "") {
|
|
18
|
+
return now.toISOString().slice(0, 10);
|
|
19
|
+
}
|
|
20
|
+
const value = String(raw);
|
|
21
|
+
if (!isValidActivityDate(value)) {
|
|
22
|
+
throw new Error(`invalid --date ${value}; expected YYYY-MM-DD`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function previousDate(date: string): string {
|
|
28
|
+
const ms = Date.parse(`${date}T00:00:00Z`);
|
|
29
|
+
return new Date(ms - 86_400_000).toISOString().slice(0, 10);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function buildStandup(memoryDir: string, date: string): StandupBrief {
|
|
33
|
+
const yesterday = previousDate(date);
|
|
34
|
+
const todayBody = readOptional(activityDigestPath(memoryDir, date));
|
|
35
|
+
const yesterdayBody = readOptional(activityDigestPath(memoryDir, yesterday));
|
|
36
|
+
const highlights = extractHighlights(todayBody);
|
|
37
|
+
const blockers = extractBlockers(todayBody);
|
|
38
|
+
const activityGrid = renderGrid(yesterdayBody, todayBody);
|
|
39
|
+
const markdown = [
|
|
40
|
+
`# Standup ${date}`,
|
|
41
|
+
"",
|
|
42
|
+
`## Yesterday (${yesterday})`,
|
|
43
|
+
yesterdayBody ? firstLines(yesterdayBody, 8) : "_No activity digest._",
|
|
44
|
+
"",
|
|
45
|
+
`## Today (${date})`,
|
|
46
|
+
todayBody ? firstLines(todayBody, 8) : "_No activity digest._",
|
|
47
|
+
"",
|
|
48
|
+
"## Highlights",
|
|
49
|
+
...(highlights.length > 0 ? highlights.map((line) => `- ${line}`) : ["- _None._"]),
|
|
50
|
+
"",
|
|
51
|
+
"## Blockers",
|
|
52
|
+
...(blockers.length > 0 ? blockers.map((line) => `- ${line}`) : ["- _None._"]),
|
|
53
|
+
"",
|
|
54
|
+
"## Activity grid",
|
|
55
|
+
"",
|
|
56
|
+
activityGrid,
|
|
57
|
+
"",
|
|
58
|
+
].join("\n");
|
|
59
|
+
return {
|
|
60
|
+
date,
|
|
61
|
+
yesterday,
|
|
62
|
+
today: date,
|
|
63
|
+
highlights,
|
|
64
|
+
blockers,
|
|
65
|
+
activityGrid,
|
|
66
|
+
markdown,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function readOptional(filePath: string): string | null {
|
|
71
|
+
try {
|
|
72
|
+
return readFileSync(filePath, "utf8");
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function firstLines(body: string, n: number): string {
|
|
79
|
+
return body.split("\n").filter((line) => !line.startsWith("---")).slice(0, n).join("\n").trim() || "_Empty digest._";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function extractHighlights(body: string | null): string[] {
|
|
83
|
+
if (!body) return [];
|
|
84
|
+
return body
|
|
85
|
+
.split("\n")
|
|
86
|
+
.map((line) => line.replace(/^[-*]\s+/, "").trim())
|
|
87
|
+
.filter((line) => line.length > 0 && !line.startsWith("#") && !line.startsWith("---"))
|
|
88
|
+
.slice(0, 5);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function extractBlockers(body: string | null): string[] {
|
|
92
|
+
if (!body) return [];
|
|
93
|
+
return body
|
|
94
|
+
.split("\n")
|
|
95
|
+
.map((line) => line.trim())
|
|
96
|
+
.filter((line) => /blocker|blocked|stuck|waiting/i.test(line))
|
|
97
|
+
.slice(0, 5);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function renderGrid(yesterday: string | null, today: string | null): string {
|
|
101
|
+
const y = yesterday ? "x" : ".";
|
|
102
|
+
const t = today ? "x" : ".";
|
|
103
|
+
return ["| day | digest |", "|---|---|", `| yesterday | ${y} |`, `| today | ${t} |`].join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function standupHelp(): string {
|
|
107
|
+
return `Usage: remnic standup [--date YYYY-MM-DD]
|
|
108
|
+
|
|
109
|
+
Deterministic yesterday/today/blockers brief plus an activity grid.
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function standupMemoryDirPlaceholder(memoryDir: string): string {
|
|
114
|
+
return path.resolve(memoryDir);
|
|
115
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import { getOperation } from "../access-boundary.js";
|
|
3
|
+
import type { EngramAccessService } from "../access-service.js";
|
|
4
|
+
|
|
5
|
+
export async function respondStandup(
|
|
6
|
+
date: string | null,
|
|
7
|
+
res: ServerResponse,
|
|
8
|
+
respondJson: (res: ServerResponse, status: number, payload: unknown) => void,
|
|
9
|
+
service: EngramAccessService,
|
|
10
|
+
): Promise<void> {
|
|
11
|
+
const op = getOperation("standup");
|
|
12
|
+
if (!op) throw new Error("access-boundary: operation not registered: standup");
|
|
13
|
+
const output = (await op.run({ ...(date ? { date } : {}) }, { service })) as { result: unknown };
|
|
14
|
+
respondJson(res, 200, output.result);
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { McpTool } from "../access-mcp.js";
|
|
2
|
+
|
|
3
|
+
export const STANDUP_MCP_TOOLS: McpTool[] = [
|
|
4
|
+
{
|
|
5
|
+
name: "engram.standup",
|
|
6
|
+
description:
|
|
7
|
+
"Deterministic standup brief: yesterday highlights, today priorities, blockers, and an activity grid. Pass date as YYYY-MM-DD; default is today UTC.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
date: { type: "string", description: "Standup day (YYYY-MM-DD). Defaults to today UTC." },
|
|
12
|
+
},
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
];
|
|
@@ -307,6 +307,7 @@ function parseSupportPassportCardMetadata(
|
|
|
307
307
|
export function hasLiveSupportPassportCard(memory: Pick<MemoryFile, "frontmatter" | "content">): boolean {
|
|
308
308
|
const metadata = parseSupportPassportCardMetadata(memory);
|
|
309
309
|
if (metadata?.fields.status !== "active" && metadata?.fields.status !== "pending_review") return false;
|
|
310
|
+
if (metadata.sourceMemoryIds.length === 0) return false;
|
|
310
311
|
return SupportPassportCardSchema.omit({ revision: true }).safeParse({
|
|
311
312
|
...metadata.fields,
|
|
312
313
|
statement: stripAttributesSuffix(memory.content),
|
|
@@ -56,6 +56,7 @@ test("rejected-draft recovery forwards the commit notification", async () => {
|
|
|
56
56
|
assert.ok(replacement);
|
|
57
57
|
const storage = {
|
|
58
58
|
getMemoryById: async (id: string) => (id === "draft-one" ? replaced : null),
|
|
59
|
+
getMemoryByIdIncludingArchived: async (id: string) => (id === "draft-one" ? replaced : null),
|
|
59
60
|
} as unknown as StorageManager;
|
|
60
61
|
const service = new SupportPassportCardService({
|
|
61
62
|
resolveOwner: async () => ({ principal: PRINCIPAL, namespace: NAMESPACE, storage }),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rename, rm } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { test } from "node:test";
|
|
@@ -1425,6 +1425,80 @@ test("retrying an interrupted pending-draft replacement reuses one approvable dr
|
|
|
1425
1425
|
}
|
|
1426
1426
|
});
|
|
1427
1427
|
|
|
1428
|
+
test("replacement recovery reads a cold-tier rejected predecessor (#2387)", async () => {
|
|
1429
|
+
const subject = await makeSubject();
|
|
1430
|
+
try {
|
|
1431
|
+
const draft = await subject.service.createManualDraft({
|
|
1432
|
+
principal: "owner:alice",
|
|
1433
|
+
title: "Quiet place",
|
|
1434
|
+
statement: "Offer me a quiet place.",
|
|
1435
|
+
category: "environment",
|
|
1436
|
+
reviewBy: OWNER_REVIEW_BY,
|
|
1437
|
+
});
|
|
1438
|
+
const originalWrite = subject.aliceStorage.writeMemoryFrontmatterIfUnchanged.bind(subject.aliceStorage);
|
|
1439
|
+
let interrupted = false;
|
|
1440
|
+
subject.aliceStorage.writeMemoryFrontmatterIfUnchanged = async (memory, patch, lifecycle) => {
|
|
1441
|
+
if (!interrupted && lifecycle?.reasonCode === "draft-replacement-complete") {
|
|
1442
|
+
interrupted = true;
|
|
1443
|
+
throw new Error("simulated process exit before the prepared marker cleared");
|
|
1444
|
+
}
|
|
1445
|
+
return await originalWrite(memory, patch, lifecycle);
|
|
1446
|
+
};
|
|
1447
|
+
|
|
1448
|
+
await assert.rejects(
|
|
1449
|
+
subject.service.replaceCard({
|
|
1450
|
+
principal: "owner:alice",
|
|
1451
|
+
cardId: draft.cardId,
|
|
1452
|
+
expectedRevision: draft.revision,
|
|
1453
|
+
title: "Quiet place and time",
|
|
1454
|
+
statement: "Offer me a quiet place and time.",
|
|
1455
|
+
category: "environment",
|
|
1456
|
+
reviewBy: OWNER_REVIEW_BY,
|
|
1457
|
+
}),
|
|
1458
|
+
/simulated process exit/
|
|
1459
|
+
);
|
|
1460
|
+
subject.aliceStorage.writeMemoryFrontmatterIfUnchanged = originalWrite;
|
|
1461
|
+
|
|
1462
|
+
// Interrupted state: the prior draft is durably rejected while the
|
|
1463
|
+
// replacement still carries its prepared marker. Simulate tier
|
|
1464
|
+
// migration demoting the rejected predecessor to the cold tier.
|
|
1465
|
+
const beforeRecovery = await subject.aliceStorage.readAllMemories();
|
|
1466
|
+
const replacement = beforeRecovery.find((memory) => memory.frontmatter.id !== draft.cardId);
|
|
1467
|
+
assert.ok(replacement);
|
|
1468
|
+
assert.equal(replacement.frontmatter.status, "pending_review");
|
|
1469
|
+
assert.equal(
|
|
1470
|
+
replacement.frontmatter.structuredAttributes?.["support-passport-draft-replacement-prepared"],
|
|
1471
|
+
"true"
|
|
1472
|
+
);
|
|
1473
|
+
const rejectedDraft = beforeRecovery.find((memory) => memory.frontmatter.id === draft.cardId);
|
|
1474
|
+
assert.ok(rejectedDraft);
|
|
1475
|
+
assert.equal(rejectedDraft.frontmatter.status, "rejected");
|
|
1476
|
+
const coldDir = path.join(subject.aliceStorage.dir, "cold", "preference");
|
|
1477
|
+
await mkdir(coldDir, { recursive: true });
|
|
1478
|
+
await rename(rejectedDraft.path, path.join(coldDir, path.basename(rejectedDraft.path)));
|
|
1479
|
+
StorageManager.clearAllStaticCaches();
|
|
1480
|
+
assert.equal(await subject.aliceStorage.getMemoryById(draft.cardId), null);
|
|
1481
|
+
const replacementCard = projectSupportPassportCard(replacement);
|
|
1482
|
+
assert.ok(replacementCard);
|
|
1483
|
+
const approved = await subject.service.approveCard({
|
|
1484
|
+
principal: "owner:alice",
|
|
1485
|
+
cardId: replacement.frontmatter.id,
|
|
1486
|
+
expectedRevision: replacementCard.card.revision,
|
|
1487
|
+
});
|
|
1488
|
+
assert.equal(approved.status, "active");
|
|
1489
|
+
|
|
1490
|
+
assert.deepEqual(
|
|
1491
|
+
(await subject.service.listCards({ principal: "owner:alice" })).map((card) => [card.cardId, card.status]),
|
|
1492
|
+
[[replacement.frontmatter.id, "active"]]
|
|
1493
|
+
);
|
|
1494
|
+
|
|
1495
|
+
const coldPredecessor = await subject.aliceStorage.getMemoryByIdIncludingArchived(draft.cardId);
|
|
1496
|
+
assert.equal(coldPredecessor?.frontmatter.status, "rejected");
|
|
1497
|
+
} finally {
|
|
1498
|
+
await subject.cleanup();
|
|
1499
|
+
}
|
|
1500
|
+
});
|
|
1501
|
+
|
|
1428
1502
|
test("retrying a recovered pending-draft replacement reuses the exact draft", async () => {
|
|
1429
1503
|
const subject = await makeSubject();
|
|
1430
1504
|
try {
|
|
@@ -832,7 +832,7 @@ export class SupportPassportCardService {
|
|
|
832
832
|
if (currentCard.card.status === "pending_review") {
|
|
833
833
|
const priorId = currentMemory.frontmatter.supersedes;
|
|
834
834
|
if (!priorId) return currentMemory;
|
|
835
|
-
const prior = await storage.
|
|
835
|
+
const prior = await storage.getMemoryByIdIncludingArchived(priorId);
|
|
836
836
|
if (
|
|
837
837
|
prior &&
|
|
838
838
|
ownsMemory(prior, namespace, principal) &&
|
|
@@ -973,7 +973,10 @@ export class SupportPassportCardService {
|
|
|
973
973
|
onCommitted?: () => void
|
|
974
974
|
): Promise<void> {
|
|
975
975
|
if (!replacement.replacesDraftId) return;
|
|
976
|
-
|
|
976
|
+
// Tier-independent: an interrupted edit's rejected predecessor can be
|
|
977
|
+
// demoted to the cold tier before recovery runs; a hot-only lookup would
|
|
978
|
+
// mistake it for deleted and orphan the valid replacement (#2387).
|
|
979
|
+
const replacedDraft = await storage.getMemoryByIdIncludingArchived(replacement.replacesDraftId);
|
|
977
980
|
const projectedDraft = replacedDraft ? projectOwnedCard(replacedDraft, namespace, principal) : null;
|
|
978
981
|
if (
|
|
979
982
|
replacedDraft &&
|
|
@@ -999,7 +1002,7 @@ export class SupportPassportCardService {
|
|
|
999
1002
|
return;
|
|
1000
1003
|
}
|
|
1001
1004
|
}
|
|
1002
|
-
const currentDraft = await storage.
|
|
1005
|
+
const currentDraft = await storage.getMemoryByIdIncludingArchived(replacement.replacesDraftId);
|
|
1003
1006
|
if (
|
|
1004
1007
|
currentDraft &&
|
|
1005
1008
|
ownsMemory(currentDraft, namespace, principal) &&
|
|
@@ -152,7 +152,11 @@ export function ownerListCards(storedCards: StoredSupportPassportCard[]): Stored
|
|
|
152
152
|
if (activeReplacementPredecessors.has(item.card.cardId)) return false;
|
|
153
153
|
if (replacedDraftIds.has(item.card.cardId)) return false;
|
|
154
154
|
if (!item.replacesDraftId) return true;
|
|
155
|
+
// The replaced draft may be demoted to the cold tier or archived after
|
|
156
|
+
// its rejection; a hot-only projection then reports it missing. A
|
|
157
|
+
// missing predecessor must not hide the replacement — only a restored
|
|
158
|
+
// active predecessor does (#2387).
|
|
155
159
|
const replacedStatus = byId.get(item.replacesDraftId)?.card.status;
|
|
156
|
-
return replacedStatus === "pending_review" || replacedStatus === "rejected";
|
|
160
|
+
return replacedStatus === undefined || replacedStatus === "pending_review" || replacedStatus === "rejected";
|
|
157
161
|
});
|
|
158
162
|
}
|
|
@@ -9,9 +9,13 @@ import {
|
|
|
9
9
|
type OfflineSyncApplyChangesetResult,
|
|
10
10
|
type OfflineSyncApplyFileContentChunkResult,
|
|
11
11
|
} from "../offline-sync.js";
|
|
12
|
+
import { parseFrontmatter } from "../storage.js";
|
|
12
13
|
import { validateArchiveRelativePath } from "../transfer/fs-utils.js";
|
|
13
14
|
import type { MemoryFile } from "../types.js";
|
|
14
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
createSupportPassportPrivateFileExclusion,
|
|
17
|
+
isSupportPassportPrivateMemory,
|
|
18
|
+
} from "./card-projection.js";
|
|
15
19
|
|
|
16
20
|
const MAX_SUPPORT_PASSPORT_FRONTMATTER_BYTES = 1_048_576;
|
|
17
21
|
const SUPPORT_PASSPORT_MARKER = "support-passport-";
|
|
@@ -64,6 +68,15 @@ function assertFrontmatterAllowed(frontmatter: string, relativePath: string): vo
|
|
|
64
68
|
if (frontmatter.includes(SUPPORT_PASSPORT_MARKER)) {
|
|
65
69
|
throw new Error(`offline sync cannot modify private support-passport record: ${relativePath}`);
|
|
66
70
|
}
|
|
71
|
+
// Canonical classification (#2387): YAML/JSON escapes — e.g. a
|
|
72
|
+
// structured-attribute key written as `support\u002dpassport-owner` — hide
|
|
73
|
+
// the marker from the raw scan above, while the storage reader's
|
|
74
|
+
// JSON.parse reconstructs it after the write. Validate the parsed
|
|
75
|
+
// frontmatter with the same predicate the read path classifies by.
|
|
76
|
+
const parsed = parseFrontmatter(frontmatter);
|
|
77
|
+
if (parsed && isSupportPassportPrivateMemory({ frontmatter: parsed.frontmatter })) {
|
|
78
|
+
throw new Error(`offline sync cannot modify private support-passport record: ${relativePath}`);
|
|
79
|
+
}
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
function inspectBufferedFrontmatter(
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtemp, readFile, rm, writeFile, symlink } from "node:fs/promises";
|
|
3
|
+
import { existsSync, lstatSync, readdirSync } from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
|
|
8
|
+
import { StorageManager } from "../storage.js";
|
|
9
|
+
import {
|
|
10
|
+
DEFAULT_OKF_LOG_MAX_ENTRIES,
|
|
11
|
+
exportOkfBundle,
|
|
12
|
+
OKF_EXPORT_VERSION,
|
|
13
|
+
OKF_LOG_TRUNCATION_MARKER,
|
|
14
|
+
parseIncludeStatus,
|
|
15
|
+
} from "./export-okf.js";
|
|
16
|
+
|
|
17
|
+
async function seedStore(dir: string): Promise<{ factId: string; decisionId: string }> {
|
|
18
|
+
const storage = new StorageManager(dir);
|
|
19
|
+
await storage.ensureDirectories();
|
|
20
|
+
const decision = await storage.writeMemory("decision", "# Use SQLite\n\nWe use SQLite for the local store.", {
|
|
21
|
+
source: "test",
|
|
22
|
+
confidence: 0.9,
|
|
23
|
+
});
|
|
24
|
+
const fact = await storage.writeMemory(
|
|
25
|
+
"fact",
|
|
26
|
+
"# Rate limit\n\nAPI rate limit is 100/min.\n\n<oai-mem-citation>\n<citation_entries>\nfacts/note.md:1-2|note=[source]\n</citation_entries>\n</oai-mem-citation>\n",
|
|
27
|
+
{
|
|
28
|
+
source: "test",
|
|
29
|
+
confidence: 0.9,
|
|
30
|
+
tags: ["api"],
|
|
31
|
+
links: [{ targetId: decision.id, linkType: "supports", strength: 0.8 }],
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
const superseded = await storage.writeMemory("fact", "# Old limit\n\nAPI rate limit is 10/min.", { source: "test" });
|
|
35
|
+
await storage.writeMemoryFrontmatter((await storage.getMemoryById(superseded.id))!, { status: "superseded" });
|
|
36
|
+
const pending = await storage.writeMemory("correction", "# Pending\n\nNeeds review.", { source: "test" });
|
|
37
|
+
await storage.writeMemoryFrontmatter((await storage.getMemoryById(pending.id))!, { status: "pending_review" });
|
|
38
|
+
await writeFile(path.join(dir, "profile.md"), "# User\n\nPrefers short answers.\n", "utf8");
|
|
39
|
+
return { factId: fact.id, decisionId: decision.id };
|
|
40
|
+
}
|
|
41
|
+
test("parseIncludeStatus rejects unknown values", () => {
|
|
42
|
+
assert.deepEqual(parseIncludeStatus(undefined), ["active"]);
|
|
43
|
+
assert.throws(() => parseIncludeStatus("nope"), /allowed:/);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("exportOkfBundle writes a deterministic active-only bundle", async () => {
|
|
47
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-src-"));
|
|
48
|
+
const outA = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-a-"));
|
|
49
|
+
const outB = path.join(os.tmpdir(), `remnic-okf-b-${Date.now()}`);
|
|
50
|
+
try {
|
|
51
|
+
await seedStore(memoryDir);
|
|
52
|
+
await rm(outA, { recursive: true, force: true });
|
|
53
|
+
const first = await exportOkfBundle({ memoryDir, outDir: outA });
|
|
54
|
+
assert.equal(first.exported, 2);
|
|
55
|
+
assert.ok(first.excluded >= 2);
|
|
56
|
+
const root = await readFile(path.join(outA, "index.md"), "utf8");
|
|
57
|
+
assert.match(root, new RegExp(`okf_version: "${OKF_EXPORT_VERSION}"`));
|
|
58
|
+
assert.doesNotMatch(root, /^type:/m);
|
|
59
|
+
assert.equal(existsSync(path.join(outA, "profile.md")), false);
|
|
60
|
+
const files = collectFiles(outA);
|
|
61
|
+
assert.ok(files.some((f) => f.includes("facts/")));
|
|
62
|
+
const factFile = files.find((f) => f.includes("facts/"))!;
|
|
63
|
+
const factBody = await readFile(path.join(outA, factFile), "utf8");
|
|
64
|
+
assert.match(factBody, /# Citations/);
|
|
65
|
+
assert.match(factBody, /# Related/);
|
|
66
|
+
assert.match(factBody, /type: Memory Fact/);
|
|
67
|
+
await exportOkfBundle({ memoryDir, outDir: outB });
|
|
68
|
+
assert.deepEqual(collectFiles(outA), collectFiles(outB));
|
|
69
|
+
for (const rel of collectFiles(outA)) {
|
|
70
|
+
assert.equal(await readFile(path.join(outA, rel), "utf8"), await readFile(path.join(outB, rel), "utf8"));
|
|
71
|
+
}
|
|
72
|
+
} finally {
|
|
73
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
74
|
+
await rm(outA, { recursive: true, force: true });
|
|
75
|
+
await rm(outB, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("profile stays off unless requested; non-empty out requires --force", async () => {
|
|
80
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-src-"));
|
|
81
|
+
const outDir = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-out-"));
|
|
82
|
+
try {
|
|
83
|
+
await seedStore(memoryDir);
|
|
84
|
+
await rm(outDir, { recursive: true, force: true });
|
|
85
|
+
await exportOkfBundle({ memoryDir, outDir, includeProfile: true });
|
|
86
|
+
const profile = await readFile(path.join(outDir, "profile.md"), "utf8");
|
|
87
|
+
assert.match(profile, /type: Profile/);
|
|
88
|
+
await writeFile(path.join(outDir, "keep.txt"), "old", "utf8");
|
|
89
|
+
await assert.rejects(exportOkfBundle({ memoryDir, outDir }), /not empty/);
|
|
90
|
+
assert.equal(await readFile(path.join(outDir, "keep.txt"), "utf8"), "old");
|
|
91
|
+
await exportOkfBundle({ memoryDir, outDir, force: true });
|
|
92
|
+
assert.equal(existsSync(path.join(outDir, "keep.txt")), false);
|
|
93
|
+
assert.equal(existsSync(path.join(outDir, "index.md")), true);
|
|
94
|
+
} finally {
|
|
95
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
96
|
+
await rm(outDir, { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("log.md is newest-first and marks truncation", async () => {
|
|
101
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-src-"));
|
|
102
|
+
const outDir = path.join(os.tmpdir(), `remnic-okf-log-${Date.now()}`);
|
|
103
|
+
try {
|
|
104
|
+
const storage = new StorageManager(memoryDir);
|
|
105
|
+
await storage.ensureDirectories();
|
|
106
|
+
await storage.writeMemory("fact", "# One\n\nbody", { source: "test" });
|
|
107
|
+
await storage.appendMemoryLifecycleEvents([
|
|
108
|
+
{
|
|
109
|
+
eventId: "e2",
|
|
110
|
+
memoryId: "m1",
|
|
111
|
+
eventType: "created",
|
|
112
|
+
timestamp: "2026-08-02T00:00:00.000Z",
|
|
113
|
+
actor: "test",
|
|
114
|
+
ruleVersion: "1",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
eventId: "e1",
|
|
118
|
+
memoryId: "m1",
|
|
119
|
+
eventType: "updated",
|
|
120
|
+
timestamp: "2026-08-01T00:00:00.000Z",
|
|
121
|
+
actor: "test",
|
|
122
|
+
ruleVersion: "1",
|
|
123
|
+
},
|
|
124
|
+
]);
|
|
125
|
+
await exportOkfBundle({ memoryDir, outDir, includeLog: true, logMaxEntries: 1 });
|
|
126
|
+
const log = await readFile(path.join(outDir, "log.md"), "utf8");
|
|
127
|
+
assert.match(log, /## 20\d{2}-\d{2}-\d{2}/);
|
|
128
|
+
assert.match(log, new RegExp(OKF_LOG_TRUNCATION_MARKER));
|
|
129
|
+
assert.ok(DEFAULT_OKF_LOG_MAX_ENTRIES > 1);
|
|
130
|
+
} finally {
|
|
131
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
132
|
+
await rm(outDir, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("symlink out is rejected", async () => {
|
|
137
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-src-"));
|
|
138
|
+
const real = await mkdtemp(path.join(os.tmpdir(), "remnic-okf-real-"));
|
|
139
|
+
const link = `${real}-link`;
|
|
140
|
+
try {
|
|
141
|
+
await seedStore(memoryDir);
|
|
142
|
+
await symlink(real, link);
|
|
143
|
+
await assert.rejects(exportOkfBundle({ memoryDir, outDir: link }), /symlink/);
|
|
144
|
+
} finally {
|
|
145
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
146
|
+
await rm(real, { recursive: true, force: true });
|
|
147
|
+
await rm(link, { force: true });
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
function collectFiles(root: string): string[] {
|
|
152
|
+
const out: string[] = [];
|
|
153
|
+
const walk = (dir: string): void => {
|
|
154
|
+
for (const name of readdirSync(dir).sort()) {
|
|
155
|
+
const full = path.join(dir, name);
|
|
156
|
+
const stat = lstatSync(full);
|
|
157
|
+
if (stat.isSymbolicLink()) continue;
|
|
158
|
+
if (stat.isDirectory()) walk(full);
|
|
159
|
+
else out.push(path.relative(root, full).split(path.sep).join("/"));
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
walk(root);
|
|
163
|
+
return out.sort();
|
|
164
|
+
}
|