@remnic/core 9.69.33 → 9.69.34
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 +13 -11
- package/dist/access-admin-ops-surface.js +61 -56
- package/dist/access-authorization-probe.d.ts +13 -11
- package/dist/access-authorization-probe.js +62 -57
- package/dist/access-boundary.d.ts +13 -11
- package/dist/access-boundary.js +61 -56
- package/dist/access-cli.js +129 -125
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-coding-context-resolution.js +3 -3
- package/dist/access-extraction-force-flush.d.ts +13 -11
- package/dist/access-extraction-force-flush.js +61 -56
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-briefing.d.ts +13 -11
- package/dist/access-http-briefing.js +62 -57
- package/dist/access-http-lcm-compaction.d.ts +13 -11
- package/dist/access-http-lifecycle-flush.d.ts +13 -11
- package/dist/access-http-offline-stream.d.ts +13 -11
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +63 -58
- package/dist/access-http.d.ts +14 -12
- package/dist/access-http.js +82 -78
- package/dist/access-identity-continuity-surface.d.ts +11 -9
- package/dist/access-identity-continuity-surface.js +61 -56
- package/dist/access-lcm-surface.d.ts +13 -11
- package/dist/access-lcm-surface.js +61 -56
- package/dist/access-mcp.d.ts +13 -11
- package/dist/access-mcp.js +70 -66
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-DMR-jOMS.d.ts → access-namespace-preflight-kXG8MvYx.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +61 -56
- package/dist/access-observe-transcript.d.ts +11 -9
- package/dist/access-observe-transcript.js +3 -3
- package/dist/access-observe-write-surface.d.ts +15 -13
- package/dist/access-observe-write-surface.js +61 -56
- package/dist/access-offline-manifest.d.ts +47 -11
- package/dist/access-offline-manifest.js +18 -16
- package/dist/access-operations-batch.js +64 -60
- package/dist/access-operations.d.ts +14 -12
- package/dist/access-operations.js +69 -65
- package/dist/access-recall-concurrency.d.ts +13 -11
- package/dist/access-recall-concurrency.js +61 -56
- package/dist/access-recall-response.d.ts +13 -11
- package/dist/access-recall-response.js +61 -56
- package/dist/access-recall-surface.d.ts +13 -11
- package/dist/access-recall-surface.js +61 -56
- package/dist/access-schema.d.ts +55 -13
- package/dist/access-schema.js +15 -1
- package/dist/{access-service-CJQoQvRa.d.ts → access-service-WUm2LnXZ.d.ts} +52 -50
- package/dist/access-service-helpers.d.ts +13 -11
- package/dist/access-service.d.ts +13 -11
- package/dist/access-service.js +61 -56
- package/dist/access-surface-catalog.d.ts +13 -11
- package/dist/access-surface-catalog.js +63 -58
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +12 -10
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +2 -1
- package/dist/adapters/index.d.ts +46 -1
- package/dist/adapters/index.js +10 -6
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
- package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +11 -9
- package/dist/briefing-window.d.ts +3 -2
- package/dist/briefing.d.ts +3 -2
- package/dist/briefing.js +25 -24
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +3 -2
- package/dist/buffer.js +11 -10
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/calibration.js +3 -2
- package/dist/calibration.js.map +1 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
- package/dist/{catalog-8O9KY9eA.d.ts → catalog-BaCx29iv.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +2 -1
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +26 -25
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +2 -1
- package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
- package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
- package/dist/chunk-255PC37A.js.map +1 -0
- package/dist/{chunk-7BMXZCOT.js → chunk-2AU4D4HQ.js} +3 -3
- package/dist/{chunk-LTIZHLV7.js → chunk-2JCA2PQT.js} +2 -2
- package/dist/{chunk-XXIHX75O.js → chunk-2UZ5ZH6W.js} +3 -3
- package/dist/{chunk-QOIOACIE.js → chunk-326KUXIR.js} +15 -648
- package/dist/chunk-326KUXIR.js.map +1 -0
- package/dist/{chunk-P3SB5BNT.js → chunk-34QW2LK2.js} +2 -2
- package/dist/{chunk-EONF76DT.js → chunk-36UBSLFN.js} +2 -2
- package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.js} +2 -2
- package/dist/{chunk-NZXEK3UF.js → chunk-3Q3N35W7.js} +2 -2
- package/dist/{chunk-YYGZJPOK.js → chunk-42DJ235G.js} +2 -2
- package/dist/{chunk-TCUKRAMK.js → chunk-4JVQRFZD.js} +7 -7
- package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
- package/dist/chunk-4MIS4CQW.js.map +1 -0
- package/dist/{chunk-PYLL63BF.js → chunk-4PB2MBY6.js} +9 -9
- package/dist/{chunk-UUQG7HAD.js → chunk-4WCNPQQ5.js} +4 -4
- package/dist/{chunk-UGPUYIET.js → chunk-5A7ZUOBA.js} +220 -399
- package/dist/chunk-5A7ZUOBA.js.map +1 -0
- package/dist/chunk-5HYUUFMQ.js +1280 -0
- package/dist/chunk-5HYUUFMQ.js.map +1 -0
- package/dist/{chunk-H4VH5VIB.js → chunk-5QBDLMGG.js} +2 -2
- package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
- package/dist/{chunk-DGGB65KC.js → chunk-5THU7NFP.js} +3 -3
- package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
- package/dist/chunk-65RENJGB.js.map +1 -0
- package/dist/{chunk-BPJNF7J2.js → chunk-6CCRSQWT.js} +2 -2
- package/dist/{chunk-XXE5P6HJ.js → chunk-6XYC7NM4.js} +2 -2
- package/dist/{chunk-J7HFPA6O.js → chunk-6YAIN5XJ.js} +2 -2
- package/dist/{chunk-I5DZ3WGR.js → chunk-757NP436.js} +3 -3
- package/dist/{chunk-2C3S7J2S.js → chunk-7CAY3YKP.js} +741 -28
- package/dist/chunk-7CAY3YKP.js.map +1 -0
- package/dist/{chunk-E6TDQRF6.js → chunk-7J2CGXG3.js} +2 -2
- package/dist/{chunk-BUTCAMJM.js → chunk-A2YQL2FF.js} +5 -5
- package/dist/chunk-A5UQ52YQ.js +211 -0
- package/dist/chunk-A5UQ52YQ.js.map +1 -0
- package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
- package/dist/{chunk-R3HKWWUB.js → chunk-A7WOWDZK.js} +2 -2
- package/dist/{chunk-6N3TQFZU.js → chunk-AIKTQVV3.js} +3 -3
- package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
- package/dist/{chunk-W27OW7AB.js → chunk-APFKZVJS.js} +2 -2
- package/dist/{chunk-B325AGLK.js → chunk-AQIRQUCP.js} +2 -2
- package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
- package/dist/{chunk-FCSZ4K2X.js → chunk-BJJWRWER.js} +3 -3
- package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
- package/dist/chunk-BRZWWUCJ.js +13 -0
- package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
- package/dist/{chunk-N57A4KPV.js → chunk-C2BFTYD7.js} +2 -2
- package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
- package/dist/{chunk-Q726HSJO.js → chunk-CRUFVJOX.js} +16 -15
- package/dist/chunk-CRUFVJOX.js.map +1 -0
- package/dist/{chunk-X35W4S3L.js → chunk-D3IZCN5P.js} +4 -4
- package/dist/{chunk-44T3Y7SZ.js → chunk-EJIEQOPB.js} +5 -5
- package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
- package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
- package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
- package/dist/{chunk-N2ZNPHA3.js → chunk-IFFLUCCU.js} +2 -2
- package/dist/{chunk-RHQMKJFG.js → chunk-ISYZ5DUI.js} +51 -47
- package/dist/{chunk-RHQMKJFG.js.map → chunk-ISYZ5DUI.js.map} +1 -1
- package/dist/{chunk-PFFZWDPE.js → chunk-JZDH2ZZK.js} +3 -3
- package/dist/{chunk-TX2UTLXC.js → chunk-K6IPSW5B.js} +2 -2
- package/dist/{chunk-4MHYKEOM.js → chunk-KDJHLOZP.js} +10 -10
- package/dist/{chunk-KCB7F4J7.js → chunk-KYGOQV37.js} +2 -2
- package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
- package/dist/chunk-L2QLDZJC.js.map +1 -0
- package/dist/{chunk-A7XEPMQ6.js → chunk-LAVJC57X.js} +3 -3
- package/dist/chunk-LAVJC57X.js.map +1 -0
- package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
- package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
- package/dist/chunk-LSLCFCCQ.js.map +1 -0
- package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
- package/dist/{chunk-PL7FYKHT.js → chunk-MMG5K6XJ.js} +2 -2
- package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
- package/dist/{chunk-E6JA6XWY.js → chunk-ND2O2PVN.js} +1013 -1317
- package/dist/chunk-ND2O2PVN.js.map +1 -0
- package/dist/chunk-NPNSKE76.js +220 -0
- package/dist/chunk-NPNSKE76.js.map +1 -0
- package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
- package/dist/{chunk-DB5TGMLZ.js → chunk-OZUXKUPD.js} +6 -4
- package/dist/{chunk-DB5TGMLZ.js.map → chunk-OZUXKUPD.js.map} +1 -1
- package/dist/chunk-PCEYGOSL.js +66 -0
- package/dist/chunk-PCEYGOSL.js.map +1 -0
- package/dist/{chunk-LSYDG6MJ.js → chunk-PEXW2JCK.js} +2 -2
- package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
- package/dist/chunk-PWPIERBM.js.map +1 -0
- package/dist/chunk-Q4AUIFUA.js +111 -0
- package/dist/chunk-Q4AUIFUA.js.map +1 -0
- package/dist/{chunk-SO7SV523.js → chunk-Q6LCCIZN.js} +1 -1
- package/dist/chunk-Q6LCCIZN.js.map +1 -0
- package/dist/{chunk-MOZXTRC2.js → chunk-QF4J3KMV.js} +19 -19
- package/dist/{chunk-JGHXXQ2G.js → chunk-QLJ6762U.js} +2 -2
- package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
- package/dist/{chunk-CETXNLEX.js → chunk-RQO3J4MR.js} +2 -2
- package/dist/{chunk-5NANRSCD.js → chunk-RR7G2X7C.js} +5 -5
- package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
- package/dist/{chunk-EQHDH4C2.js → chunk-S76KRJDG.js} +3 -3
- package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
- package/dist/chunk-SHEHQBCG.js.map +1 -0
- package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
- package/dist/{chunk-MFDTVQJX.js → chunk-SZWEDG3H.js} +12 -6
- package/dist/chunk-SZWEDG3H.js.map +1 -0
- package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
- package/dist/{chunk-JSN44KIB.js → chunk-T2YFZ27G.js} +9 -9
- package/dist/{chunk-227UFSEQ.js → chunk-TFA6HPOA.js} +2 -2
- package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
- package/dist/chunk-TLHNF6GA.js +647 -0
- package/dist/chunk-TLHNF6GA.js.map +1 -0
- package/dist/{chunk-NB5BCFUY.js → chunk-TWYTGIBR.js} +4 -4
- package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
- package/dist/chunk-UBG4GAEP.js.map +1 -0
- package/dist/{chunk-MWFGUESQ.js → chunk-UEZKN6VR.js} +2 -2
- package/dist/{chunk-H5AFCNGA.js → chunk-UJX4I26O.js} +2 -2
- package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
- package/dist/chunk-VELCIWJZ.js.map +1 -0
- package/dist/{chunk-PBGVVDLY.js → chunk-VIZR45AN.js} +2 -2
- package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
- package/dist/{chunk-JTH2SE6B.js → chunk-W5BLTZZJ.js} +8 -8
- package/dist/chunk-W6IJMWTZ.js +72 -0
- package/dist/chunk-W6IJMWTZ.js.map +1 -0
- package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
- package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
- package/dist/{chunk-MN3LK3KN.js → chunk-X424T5JQ.js} +2 -2
- package/dist/{chunk-5BCNEBEN.js → chunk-XPJNT6PI.js} +4 -4
- package/dist/{chunk-2JVJ7UHC.js → chunk-XQU3CPF2.js} +4 -2
- package/dist/chunk-XQU3CPF2.js.map +1 -0
- package/dist/chunk-XW2T4QAW.js +1 -0
- package/dist/{chunk-D223ZDQV.js → chunk-YEDVOYL2.js} +2 -2
- package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
- package/dist/chunk-YEN4TREG.js.map +1 -0
- package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
- package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
- package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
- package/dist/{chunk-OQDPBRQ6.js → chunk-Z7YDVHDI.js} +2 -2
- package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
- package/dist/chunk-ZEFVK7XC.js.map +1 -0
- package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
- package/dist/{chunk-HV7OY4DM.js → chunk-ZMKYCFJ7.js} +640 -199
- package/dist/chunk-ZMKYCFJ7.js.map +1 -0
- package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
- package/dist/{cli-D57e2Mqt.d.ts → cli-5mTYh1Tn.d.ts} +5 -5
- package/dist/cli-fallback.d.ts +11 -4
- package/dist/cli-fallback.js +5 -1
- package/dist/cli.d.ts +15 -13
- package/dist/cli.js +102 -98
- package/dist/coding/export-okf-codegraph.d.ts +2 -1
- package/dist/coding/export-okf-codegraph.js +31 -29
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/compat/checks.js +2 -2
- package/dist/compat/codex-cli-fallback.d.ts +1 -1
- package/dist/compat/codex-cli-fallback.js +5 -1
- package/dist/compat/codex-cli-fallback.js.map +1 -1
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +26 -25
- package/dist/compounding/preference-consolidator.d.ts +2 -1
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.js +12 -10
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +25 -24
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +27 -26
- package/dist/consolidation-provenance-check.d.ts +3 -2
- package/dist/consolidation-undo.d.ts +3 -2
- package/dist/contradiction/index.d.ts +4 -3
- package/dist/contradiction/index.js +5 -5
- package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +3 -2
- package/dist/convergence-refresh.js +27 -26
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/backend.js +3 -3
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.js +2 -2
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +28 -27
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/day-summary.d.ts +2 -1
- package/dist/deep-recall-http-glue.d.ts +13 -11
- package/dist/deep-recall-http-glue.js +12 -2
- package/dist/deep-recall-mcp-tools.d.ts +13 -11
- package/dist/deep-recall-policy-llm.d.ts +2 -1
- package/dist/deep-recall-policy-llm.js +4 -3
- package/dist/deep-recall-seeds.d.ts +2 -1
- package/dist/delinearize.d.ts +2 -1
- package/dist/dependency-propagation-config.d.ts +2 -1
- package/dist/{dependency-propagation-delivery-CmniEsUK.d.ts → dependency-propagation-delivery-CDQCxNll.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-origin-fields.d.ts +2 -1
- package/dist/entity-retrieval.d.ts +3 -2
- package/dist/entity-retrieval.js +25 -24
- package/dist/entity-schema.d.ts +2 -1
- package/dist/episodic-context.d.ts +2 -1
- package/dist/eval-trajectory-contracts.d.ts +2 -1
- package/dist/eval-trajectory-store.d.ts +2 -1
- package/dist/eval-trajectory.d.ts +2 -1
- package/dist/explicit-capture.d.ts +11 -9
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.d.ts +13 -11
- package/dist/external-wiki-access.js +62 -57
- package/dist/external-wiki-collection-registration.d.ts +2 -1
- package/dist/external-wiki-collection.d.ts +2 -1
- package/dist/external-wiki-mcp-tools.d.ts +13 -11
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-faithfulness.js +4 -3
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-judge.js +5 -4
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-normalization.d.ts +2 -1
- package/dist/extraction-prompt.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +36 -34
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/fallback-llm.js +3 -2
- package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
- package/dist/generic-recall-paths-CqAZyXKX.d.ts +23 -0
- package/dist/graph-append-error.d.ts +2 -1
- package/dist/graph-dashboard-diff.d.ts +2 -1
- package/dist/graph-dashboard-key.d.ts +2 -1
- package/dist/graph-dashboard-parser.d.ts +2 -1
- package/dist/graph-edge-reinforcement.d.ts +2 -1
- package/dist/graph-jsonl.d.ts +2 -1
- package/dist/graph-path-reconstruction.d.ts +2 -1
- package/dist/graph-path-scoring.d.ts +2 -1
- package/dist/graph-snapshot.d.ts +2 -1
- package/dist/graph.d.ts +2 -1
- package/dist/harmonic-retrieval.js +2 -2
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/importers/test-utils.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index-BTAsSkPG.d.ts → index-BNluTxBp.d.ts} +2 -2
- package/dist/index.d.ts +302 -245
- package/dist/index.js +307 -205
- package/dist/intent.d.ts +2 -1
- package/dist/lcm/engine.d.ts +2 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +2 -1
- package/dist/lcm/index.js +4 -4
- package/dist/lcm/tools.d.ts +2 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/local-llm.d.ts +4 -1
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/location/index.d.ts +4 -3
- package/dist/location/index.js +28 -27
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +25 -24
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -24
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +26 -25
- package/dist/{maintenance-DCvQGTzL.d.ts → maintenance-8hmWOMY_.d.ts} +378 -4
- package/dist/mcp-memory-inspector-app.d.ts +13 -11
- package/dist/memory-action-policy.d.ts +2 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-snapshot.d.ts +2 -1
- package/dist/memory-subject-cli.d.ts +13 -11
- package/dist/memory-subject.d.ts +13 -11
- package/dist/memory-worth-outcomes.d.ts +3 -2
- package/dist/migrate/from-engram.js +2 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +4 -3
- package/dist/namespaces/migrate.js +26 -25
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +25 -24
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/network/tailscale.js +2 -2
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +6 -6
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +29 -28
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +4 -3
- package/dist/operator-toolkit.js +43 -41
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +43 -38
- package/dist/{orchestrator-CvCsp1tz.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
- package/dist/orchestrator.d.ts +11 -9
- package/dist/orchestrator.js +133 -127
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-JAdwKBS7.d.ts → pipeline-Dv1Bv0ma.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/{public-http-h-yWu9rj.d.ts → public-http-L-IymRBN.d.ts} +1 -1
- package/dist/{qmd-Cvw9RWKr.d.ts → qmd-Mj508lHA.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +3 -2
- package/dist/qmd.js +2 -2
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-navigate-access.d.ts +2 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +2 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +2 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-planner-llm.js +3 -2
- package/dist/recall-planner-llm.js.map +1 -1
- package/dist/recall-state-view-admission.d.ts +56 -0
- package/dist/recall-state-view-admission.js +39 -0
- package/dist/recall-state-view-inject.js +2 -2
- package/dist/recall-state-view-render.js +2 -2
- package/dist/recall-state-view-widen.d.ts +18 -1
- package/dist/recall-state-view-widen.js +2 -2
- package/dist/recall-state-view-wire.d.ts +1 -1
- package/dist/recall-state-view-wire.js +3 -3
- package/dist/recall-state-view.d.ts +1 -0
- package/dist/recall-state-view.js +1 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +9 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +11 -2
- package/dist/reconcile/cursor.js +6 -4
- package/dist/reconcile/cursor.js.map +1 -1
- package/dist/reconcile/manifest.d.ts +37 -2
- package/dist/reconcile/manifest.js +15 -5
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
- package/dist/resolution-OHJZG45O.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +13 -11
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/runtime/child-process.d.ts +1 -1
- package/dist/runtime/child-process.js +1 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +2 -2
- package/dist/{scope-profiles-BShpTPeV.d.ts → scope-profiles-B6BGVbxm.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +7 -7
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +11 -11
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/{semantic-consolidation-CusOpe9F.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +26 -25
- package/dist/semantic-rule-promotion.js +25 -24
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +25 -24
- package/dist/{service-BbuVh1eS.d.ts → service-ZQkJ52cz.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +2 -1
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +34 -32
- package/dist/standup/build.js +25 -24
- package/dist/{storage-BBLLuVTF.d.ts → storage-CU_hZUgP.d.ts} +67 -6
- package/dist/storage.d.ts +4 -3
- package/dist/storage.js +24 -23
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +2 -2
- package/dist/summarizer.d.ts +2 -1
- package/dist/summarizer.js +5 -5
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +49 -15
- package/dist/support-passport/index.js +69 -60
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +3 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/capsule-import.js +1 -1
- package/dist/transfer/export-okf.d.ts +2 -1
- package/dist/transfer/export-okf.js +26 -25
- package/dist/transfer/types.d.ts +24 -24
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-igV4-sbB.d.ts → types-BGxTvLBO.d.ts} +58 -13
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/verified-recall.js +25 -24
- package/dist/who-knows-cli.d.ts +13 -11
- package/dist/who-knows-cli.js +26 -25
- package/dist/who-knows.d.ts +13 -11
- package/dist/who-knows.js +25 -24
- package/dist/write-envelope.d.ts +4 -2
- package/dist/write-envelope.js +3 -1
- package/package.json +2 -2
- package/src/access-category-alias.test.ts +216 -0
- package/src/access-mcp.test.ts +73 -0
- package/src/access-mcp.ts +6 -6
- package/src/access-observe-write-surface.ts +19 -4
- package/src/access-offline-manifest.ts +297 -16
- package/src/access-recall-surface.ts +5 -5
- package/src/access-schema.ts +76 -7
- package/src/access-service.ts +11 -2
- package/src/activity/config.test.ts +124 -1
- package/src/activity/config.ts +150 -18
- package/src/activity/index.ts +3 -0
- package/src/activity/journal-extract-storage.test.ts +129 -0
- package/src/activity/journal-extract.test.ts +314 -0
- package/src/activity/journal-extract.ts +247 -0
- package/src/activity/journal-heading.test.ts +24 -1
- package/src/activity/journal-heading.ts +36 -0
- package/src/activity/journal-read.test.ts +242 -0
- package/src/activity/journal-read.ts +183 -0
- package/src/activity/journal-source.test.ts +15 -15
- package/src/activity/journal-source.ts +21 -14
- package/src/activity/journal-state.lock-worker.ts +30 -0
- package/src/activity/journal-state.test.ts +144 -0
- package/src/activity/journal-state.ts +107 -0
- package/src/activity/journal-strip.test.ts +106 -52
- package/src/activity/journal-strip.ts +35 -10
- package/src/activity/journal-vault-integration.test.ts +230 -0
- package/src/activity/journal-vault-provenance.test.ts +9 -7
- package/src/activity/journal-vault-provenance.ts +4 -10
- package/src/activity/journal-vault-read.test.ts +3 -2
- package/src/activity/journal-vault-read.ts +9 -139
- package/src/activity/journal.test.ts +74 -23
- package/src/activity/runner.test.ts +116 -1
- package/src/activity/runner.ts +25 -0
- package/src/activity/scheduler.ts +4 -0
- package/src/activity/store.test.ts +18 -0
- package/src/activity/store.ts +14 -0
- package/src/activity/sync-registration.ts +4 -0
- package/src/activity/timeline/analysis-metadata.ts +2 -0
- package/src/activity/timeline/analysis-provider.ts +140 -0
- package/src/activity/timeline/analysis-run.test.ts +419 -0
- package/src/activity/timeline/analysis-run.ts +106 -0
- package/src/activity/timeline/analysis.ts +66 -37
- package/src/activity/timeline/corrections.ts +9 -0
- package/src/activity/timeline/index.ts +3 -0
- package/src/activity/timeline/query.test.ts +71 -0
- package/src/activity/timeline/query.ts +57 -8
- package/src/activity/timeline/regenerate.test.ts +505 -0
- package/src/activity/timeline/regenerate.ts +373 -0
- package/src/activity/types.ts +40 -5
- package/src/adapters/grok-opencode.test.ts +146 -0
- package/src/adapters/grok.ts +53 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/opencode.ts +52 -0
- package/src/adapters/registry.ts +4 -0
- package/src/cli-fallback.ts +13 -4
- package/src/config.test.ts +3 -1
- package/src/config.ts +4 -0
- package/src/dedup/merge.test.ts +732 -25
- package/src/fallback-llm.test.ts +53 -0
- package/src/fallback-llm.ts +12 -0
- package/src/index.ts +2 -0
- package/src/local-llm.ts +3 -1
- package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
- package/src/orchestration/extraction-persist-deps.ts +9 -0
- package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
- package/src/orchestration/extraction-persist-promotion.ts +42 -3
- package/src/orchestration/extraction-persist.ts +3 -3
- package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
- package/src/orchestration/harmonic-construction-persist.ts +34 -6
- package/src/orchestration/maintenance.ts +1 -0
- package/src/orchestration/orchestrator-helpers.ts +6 -0
- package/src/orchestration/recall-entry.ts +16 -0
- package/src/orchestration/recall-internal-deps.ts +14 -0
- package/src/orchestration/recall-internal.ts +41 -58
- package/src/orchestration/recall-result-formatter.ts +11 -1
- package/src/orchestration/recall-search-pipeline.ts +121 -11
- package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
- package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
- package/src/orchestration/semantic-merge-persist.ts +121 -16
- package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
- package/src/orchestrator.ts +7 -35
- package/src/providers/codex-subscription.test.ts +666 -0
- package/src/providers/codex-subscription.ts +743 -0
- package/src/recall-disclosure.test.ts +20 -0
- package/src/recall-state-view-admission.ts +114 -0
- package/src/recall-state-view-asof.test.ts +176 -0
- package/src/recall-state-view-call.test.ts +175 -0
- package/src/recall-state-view-config.test.ts +16 -0
- package/src/recall-state-view-widen.test.ts +70 -0
- package/src/recall-state-view-widen.ts +28 -7
- package/src/recall-state-view-wire.ts +3 -1
- package/src/recall-state-view-zero-diff.test.ts +20 -11
- package/src/recall-state-view.test.ts +142 -0
- package/src/recall-state-view.ts +72 -24
- package/src/recall-xray-renderer.test.ts +27 -0
- package/src/recall-xray-renderer.ts +4 -0
- package/src/recall-xray.ts +13 -0
- package/src/reconcile/cursor.ts +23 -33
- package/src/reconcile/manifest.ts +96 -11
- package/src/reconcile-identity-cache.test.ts +378 -0
- package/src/runtime/child-process.ts +1 -1
- package/src/storage/cas-revision-host.ts +75 -0
- package/src/storage/cas-revision-store.test.ts +459 -0
- package/src/storage/cas-revision-store.ts +661 -0
- package/src/storage/deletion-revision-store.ts +80 -6
- package/src/storage/tombstone-blocked-capture-index.ts +15 -0
- package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
- package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
- package/src/storage-contract/failure-semantics.test.ts +1 -1
- package/src/storage-frontmatter-cas.test.ts +698 -1
- package/src/storage-replay.test.ts +166 -3
- package/src/storage.ts +41 -41
- package/src/support-passport/card-projection.ts +82 -33
- package/src/temporal-supersession.test.ts +10 -10
- package/src/types.ts +7 -7
- package/src/write-envelope.ts +1 -1
- package/dist/chunk-22FVR2KE.js.map +0 -1
- package/dist/chunk-2C3S7J2S.js.map +0 -1
- package/dist/chunk-2JVJ7UHC.js.map +0 -1
- package/dist/chunk-2QSZNTDO.js +0 -56
- package/dist/chunk-2QSZNTDO.js.map +0 -1
- package/dist/chunk-3QQTXYZ6.js.map +0 -1
- package/dist/chunk-5VCDKQWQ.js +0 -560
- package/dist/chunk-5VCDKQWQ.js.map +0 -1
- package/dist/chunk-A7XEPMQ6.js.map +0 -1
- package/dist/chunk-BLUYQFRH.js.map +0 -1
- package/dist/chunk-E6JA6XWY.js.map +0 -1
- package/dist/chunk-EEOUMG3J.js.map +0 -1
- package/dist/chunk-FDLDOEO6.js.map +0 -1
- package/dist/chunk-FYDW33ZB.js +0 -13
- package/dist/chunk-H272ZPQ3.js.map +0 -1
- package/dist/chunk-HV7OY4DM.js.map +0 -1
- package/dist/chunk-HVAEXYPL.js.map +0 -1
- package/dist/chunk-JEIXTYVG.js.map +0 -1
- package/dist/chunk-LRICZIGN.js +0 -52
- package/dist/chunk-LRICZIGN.js.map +0 -1
- package/dist/chunk-MFDTVQJX.js.map +0 -1
- package/dist/chunk-N7RWREIQ.js.map +0 -1
- package/dist/chunk-O75CRYGF.js.map +0 -1
- package/dist/chunk-Q726HSJO.js.map +0 -1
- package/dist/chunk-QOIOACIE.js.map +0 -1
- package/dist/chunk-SEDEKFYQ.js +0 -1
- package/dist/chunk-SO7SV523.js.map +0 -1
- package/dist/chunk-TLPZ6MKZ.js.map +0 -1
- package/dist/chunk-UGPUYIET.js.map +0 -1
- package/src/activity/journal-mode.test.ts +0 -32
- package/src/activity/journal-mode.ts +0 -20
- /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
- /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
- /package/dist/{chunk-7BMXZCOT.js.map → chunk-2AU4D4HQ.js.map} +0 -0
- /package/dist/{chunk-LTIZHLV7.js.map → chunk-2JCA2PQT.js.map} +0 -0
- /package/dist/{chunk-XXIHX75O.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
- /package/dist/{chunk-P3SB5BNT.js.map → chunk-34QW2LK2.js.map} +0 -0
- /package/dist/{chunk-EONF76DT.js.map → chunk-36UBSLFN.js.map} +0 -0
- /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
- /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
- /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
- /package/dist/{chunk-TCUKRAMK.js.map → chunk-4JVQRFZD.js.map} +0 -0
- /package/dist/{chunk-PYLL63BF.js.map → chunk-4PB2MBY6.js.map} +0 -0
- /package/dist/{chunk-UUQG7HAD.js.map → chunk-4WCNPQQ5.js.map} +0 -0
- /package/dist/{chunk-H4VH5VIB.js.map → chunk-5QBDLMGG.js.map} +0 -0
- /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
- /package/dist/{chunk-DGGB65KC.js.map → chunk-5THU7NFP.js.map} +0 -0
- /package/dist/{chunk-BPJNF7J2.js.map → chunk-6CCRSQWT.js.map} +0 -0
- /package/dist/{chunk-XXE5P6HJ.js.map → chunk-6XYC7NM4.js.map} +0 -0
- /package/dist/{chunk-J7HFPA6O.js.map → chunk-6YAIN5XJ.js.map} +0 -0
- /package/dist/{chunk-I5DZ3WGR.js.map → chunk-757NP436.js.map} +0 -0
- /package/dist/{chunk-E6TDQRF6.js.map → chunk-7J2CGXG3.js.map} +0 -0
- /package/dist/{chunk-BUTCAMJM.js.map → chunk-A2YQL2FF.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
- /package/dist/{chunk-R3HKWWUB.js.map → chunk-A7WOWDZK.js.map} +0 -0
- /package/dist/{chunk-6N3TQFZU.js.map → chunk-AIKTQVV3.js.map} +0 -0
- /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
- /package/dist/{chunk-W27OW7AB.js.map → chunk-APFKZVJS.js.map} +0 -0
- /package/dist/{chunk-B325AGLK.js.map → chunk-AQIRQUCP.js.map} +0 -0
- /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
- /package/dist/{chunk-FCSZ4K2X.js.map → chunk-BJJWRWER.js.map} +0 -0
- /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
- /package/dist/{chunk-N57A4KPV.js.map → chunk-C2BFTYD7.js.map} +0 -0
- /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
- /package/dist/{chunk-X35W4S3L.js.map → chunk-D3IZCN5P.js.map} +0 -0
- /package/dist/{chunk-44T3Y7SZ.js.map → chunk-EJIEQOPB.js.map} +0 -0
- /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
- /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
- /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
- /package/dist/{chunk-N2ZNPHA3.js.map → chunk-IFFLUCCU.js.map} +0 -0
- /package/dist/{chunk-PFFZWDPE.js.map → chunk-JZDH2ZZK.js.map} +0 -0
- /package/dist/{chunk-TX2UTLXC.js.map → chunk-K6IPSW5B.js.map} +0 -0
- /package/dist/{chunk-4MHYKEOM.js.map → chunk-KDJHLOZP.js.map} +0 -0
- /package/dist/{chunk-KCB7F4J7.js.map → chunk-KYGOQV37.js.map} +0 -0
- /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
- /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
- /package/dist/{chunk-PL7FYKHT.js.map → chunk-MMG5K6XJ.js.map} +0 -0
- /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
- /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
- /package/dist/{chunk-LSYDG6MJ.js.map → chunk-PEXW2JCK.js.map} +0 -0
- /package/dist/{chunk-MOZXTRC2.js.map → chunk-QF4J3KMV.js.map} +0 -0
- /package/dist/{chunk-JGHXXQ2G.js.map → chunk-QLJ6762U.js.map} +0 -0
- /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
- /package/dist/{chunk-CETXNLEX.js.map → chunk-RQO3J4MR.js.map} +0 -0
- /package/dist/{chunk-5NANRSCD.js.map → chunk-RR7G2X7C.js.map} +0 -0
- /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
- /package/dist/{chunk-EQHDH4C2.js.map → chunk-S76KRJDG.js.map} +0 -0
- /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
- /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
- /package/dist/{chunk-JSN44KIB.js.map → chunk-T2YFZ27G.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-TFA6HPOA.js.map} +0 -0
- /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
- /package/dist/{chunk-NB5BCFUY.js.map → chunk-TWYTGIBR.js.map} +0 -0
- /package/dist/{chunk-MWFGUESQ.js.map → chunk-UEZKN6VR.js.map} +0 -0
- /package/dist/{chunk-H5AFCNGA.js.map → chunk-UJX4I26O.js.map} +0 -0
- /package/dist/{chunk-PBGVVDLY.js.map → chunk-VIZR45AN.js.map} +0 -0
- /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
- /package/dist/{chunk-JTH2SE6B.js.map → chunk-W5BLTZZJ.js.map} +0 -0
- /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
- /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
- /package/dist/{chunk-MN3LK3KN.js.map → chunk-X424T5JQ.js.map} +0 -0
- /package/dist/{chunk-5BCNEBEN.js.map → chunk-XPJNT6PI.js.map} +0 -0
- /package/dist/{chunk-SEDEKFYQ.js.map → chunk-XW2T4QAW.js.map} +0 -0
- /package/dist/{chunk-D223ZDQV.js.map → chunk-YEDVOYL2.js.map} +0 -0
- /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
- /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
- /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
- /package/dist/{chunk-OQDPBRQ6.js.map → chunk-Z7YDVHDI.js.map} +0 -0
- /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
- /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
- /package/dist/{contradiction-scan-NOYMFG66.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
- /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
- /package/dist/{resolution-VKATP2HT.js.map → recall-state-view-admission.js.map} +0 -0
- /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
package/src/access-schema.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
// field-level detail so consumers get clear feedback on malformed requests.
|
|
4
4
|
|
|
5
5
|
import { z } from "zod";
|
|
6
|
+
import { isMemoryCategory, MEMORY_CATEGORY_NAMES } from "./write-envelope.js";
|
|
7
|
+
import type { MemoryCategory } from "./types.js";
|
|
6
8
|
import {
|
|
7
9
|
ACTION_CONFIDENCE_CONTEXT_READINESS,
|
|
8
10
|
ACTION_CONFIDENCE_RISK_CATEGORIES,
|
|
@@ -145,6 +147,13 @@ export const recallRequestSchema = z.object({
|
|
|
145
147
|
* recall traversal (issue #681). Defaults to false.
|
|
146
148
|
*/
|
|
147
149
|
includeLowConfidence: z.boolean().optional(),
|
|
150
|
+
/**
|
|
151
|
+
* #1952 — per-call opt-in to state-aware recall views for this recall.
|
|
152
|
+
* ORs with the `recallStateViews` config flag; a change-intent query
|
|
153
|
+
* (e.g. "when did", "used to", "switched") is still required for any
|
|
154
|
+
* effect, so this can never perturb ordinary recalls.
|
|
155
|
+
*/
|
|
156
|
+
stateView: z.boolean().optional(),
|
|
148
157
|
});
|
|
149
158
|
|
|
150
159
|
export const recallExplainRequestSchema = z.object({
|
|
@@ -258,13 +267,73 @@ export const deepRecallRequestSchema = z.object({
|
|
|
258
267
|
// ---------------------------------------------------------------------------
|
|
259
268
|
|
|
260
269
|
const writeContentSchema = z.string().min(1, "content is required").max(50000);
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
270
|
+
/**
|
|
271
|
+
* #2780: the canonical category set stays authoritative (`isMemoryCategory`),
|
|
272
|
+
* with exactly four admitted input-compat aliases — the project-shaped
|
|
273
|
+
* spellings fleet telemetry actually shows (`project`, `project_state`,
|
|
274
|
+
* `project-state`, `project_update`) — for a project-shaped category that
|
|
275
|
+
* does not exist. Exact match only, no case folding: `Project_State` and
|
|
276
|
+
* near-misses like `projection` reject like any other invalid category.
|
|
277
|
+
* Aliases are NOT enum members: the write-surface funnel coerces them to
|
|
278
|
+
* "fact" and reports the coercion on the response. Everything else rejects
|
|
279
|
+
* naming the full valid set plus a "use fact" hint so callers learn the
|
|
280
|
+
* canonical name.
|
|
281
|
+
*/
|
|
282
|
+
const PROJECT_CATEGORY_ALIASES: Record<string, true> = {
|
|
283
|
+
project: true,
|
|
284
|
+
project_state: true,
|
|
285
|
+
"project-state": true,
|
|
286
|
+
project_update: true,
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export interface CategoryAliasCoercion {
|
|
290
|
+
from: string;
|
|
291
|
+
to: "fact";
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function coerceProjectCategoryAlias<T extends { category?: string }>(
|
|
295
|
+
request: T,
|
|
296
|
+
): { request: T; categoryCoercion?: CategoryAliasCoercion } {
|
|
297
|
+
const category = request.category;
|
|
298
|
+
if (category === undefined || PROJECT_CATEGORY_ALIASES[category] !== true) {
|
|
299
|
+
return { request };
|
|
300
|
+
}
|
|
301
|
+
return { request: { ...request, category: "fact" }, categoryCoercion: { from: category, to: "fact" } };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* #2780 fix B: an idempotent replay returns the FIRST request's stored
|
|
306
|
+
* response, whose coercion note names that request's spelling. Rewrite the
|
|
307
|
+
* note from the CURRENT raw request so every response identifies what its
|
|
308
|
+
* caller actually sent; the stored idempotent result is reused untouched.
|
|
309
|
+
*/
|
|
310
|
+
export function reapplyCategoryCoercion<T extends { categoryCoercion?: CategoryAliasCoercion }>(
|
|
311
|
+
response: T,
|
|
312
|
+
categoryCoercion: CategoryAliasCoercion | undefined,
|
|
313
|
+
): T {
|
|
314
|
+
if (categoryCoercion !== undefined) {
|
|
315
|
+
return { ...response, categoryCoercion };
|
|
316
|
+
}
|
|
317
|
+
if (response.categoryCoercion === undefined) {
|
|
318
|
+
return response;
|
|
319
|
+
}
|
|
320
|
+
const { categoryCoercion: _stored, ...rest } = response;
|
|
321
|
+
return rest as T;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const categorySchema = (
|
|
325
|
+
z
|
|
326
|
+
.string()
|
|
327
|
+
.superRefine((value, ctx) => {
|
|
328
|
+
if (isMemoryCategory(value)) return;
|
|
329
|
+
if (PROJECT_CATEGORY_ALIASES[value] === true) return;
|
|
330
|
+
ctx.addIssue({
|
|
331
|
+
code: z.ZodIssueCode.custom,
|
|
332
|
+
message: `category must be one of: ${MEMORY_CATEGORY_NAMES.join(", ")}; for project state/facts use "fact"`,
|
|
333
|
+
});
|
|
334
|
+
})
|
|
335
|
+
.optional() as unknown as z.ZodType<MemoryCategory | undefined, z.ZodTypeDef, MemoryCategory | undefined>
|
|
336
|
+
);
|
|
268
337
|
const confidenceSchema = z.number().min(0).max(1).optional();
|
|
269
338
|
const tagsSchema = z.array(z.string().max(256)).max(50).optional();
|
|
270
339
|
const entityRefSchema = z.string().trim().max(512).optional();
|
package/src/access-service.ts
CHANGED
|
@@ -291,6 +291,7 @@ import {
|
|
|
291
291
|
} from "./memory-worth-outcomes.js";
|
|
292
292
|
import type { LcmMessagePartInput, MessagePartSourceFormat } from "./message-parts/index.js";
|
|
293
293
|
import type { ObserveRequest, RecallRequest } from "./access-schema.js";
|
|
294
|
+
import { coerceProjectCategoryAlias, type CategoryAliasCoercion } from "./access-schema.js";
|
|
294
295
|
import { recordObjectiveStateSnapshotsFromObservedMessages } from "./objective-state-writers.js";
|
|
295
296
|
import { objectiveStateStoreOverrideForNamespace } from "./objective-state.js";
|
|
296
297
|
import { offlineSyncStorageForSnapshot } from "./offline-sync-impression-drain.js";
|
|
@@ -980,6 +981,8 @@ export interface EngramAccessWriteResponse {
|
|
|
980
981
|
duplicateOf?: string;
|
|
981
982
|
idempotencyKey?: string;
|
|
982
983
|
idempotencyReplay?: boolean;
|
|
984
|
+
/** #2780: set when a project-shaped category alias was coerced to "fact". */
|
|
985
|
+
categoryCoercion?: CategoryAliasCoercion;
|
|
983
986
|
}
|
|
984
987
|
|
|
985
988
|
export interface EngramAccessObserveMessage {
|
|
@@ -2935,7 +2938,11 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
|
|
|
2935
2938
|
return this.accessObserveWriteSurface.memoryStore(request, hooks);
|
|
2936
2939
|
}
|
|
2937
2940
|
|
|
2938
|
-
async peekMemoryStoreIdempotency(
|
|
2941
|
+
async peekMemoryStoreIdempotency(
|
|
2942
|
+
rawRequest: EngramAccessMemoryStoreRequest
|
|
2943
|
+
): Promise<EngramAccessIdempotencyStatus> {
|
|
2944
|
+
// #2780: fingerprint the COERCED category so peek never diverges from the write it predicts.
|
|
2945
|
+
const { request } = coerceProjectCategoryAlias(rawRequest);
|
|
2939
2946
|
const namespace = await this.resolveCodingScopedWriteNamespace(request);
|
|
2940
2947
|
const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
|
|
2941
2948
|
if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
|
|
@@ -2970,8 +2977,10 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
|
|
|
2970
2977
|
}
|
|
2971
2978
|
|
|
2972
2979
|
async peekSuggestionSubmitIdempotency(
|
|
2973
|
-
|
|
2980
|
+
rawRequest: EngramAccessSuggestionSubmitRequest
|
|
2974
2981
|
): Promise<EngramAccessIdempotencyStatus> {
|
|
2982
|
+
// #2780: fingerprint the COERCED category so peek never diverges from the write it predicts.
|
|
2983
|
+
const { request } = coerceProjectCategoryAlias(rawRequest);
|
|
2975
2984
|
const namespace = await this.resolveCodingScopedWriteNamespace(request);
|
|
2976
2985
|
const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
|
|
2977
2986
|
if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
|
|
@@ -19,7 +19,8 @@ test("parseActivityConfig defaults to an inert, search-only configuration", () =
|
|
|
19
19
|
maxMemoriesPerDay: 0,
|
|
20
20
|
timeline: {
|
|
21
21
|
enabled: false,
|
|
22
|
-
|
|
22
|
+
analysis: { enabled: false },
|
|
23
|
+
journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
|
|
23
24
|
qa: { enabled: false, maxRangeDays: 31 },
|
|
24
25
|
vault: {
|
|
25
26
|
enabled: false,
|
|
@@ -36,6 +37,7 @@ test("parseActivityConfig defaults to an inert, search-only configuration", () =
|
|
|
36
37
|
locations: { enabled: false, target: "daily", section: "Locations" },
|
|
37
38
|
},
|
|
38
39
|
insertUnderHeading: "",
|
|
40
|
+
readback: { journalSection: "" },
|
|
39
41
|
wikilinks: { places: false, placesFolder: "Places" },
|
|
40
42
|
properties: { mode: "off", prefix: "remnic_" },
|
|
41
43
|
autoPublish: true,
|
|
@@ -174,6 +176,127 @@ test("activity config rejects a null maxMemoriesPerDay instead of silently uncap
|
|
|
174
176
|
assert.throws(() => parseActivityConfig({ maxMemoriesPerDay: null }), /maxMemoriesPerDay/);
|
|
175
177
|
});
|
|
176
178
|
|
|
179
|
+
test("activity timeline analysis defaults off with no provider settings stored", () => {
|
|
180
|
+
const timeline = parseActivityConfig(undefined).timeline;
|
|
181
|
+
assert.deepEqual(timeline.analysis, { enabled: false });
|
|
182
|
+
// The gate is independent of the timeline master switch and of capture.
|
|
183
|
+
assert.equal(parseActivityConfig({ timeline: { enabled: true } }).timeline.analysis.enabled, false);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test("activity timeline analysis parses a valid enabled block", () => {
|
|
187
|
+
const analysis = parseActivityConfig({
|
|
188
|
+
timeline: {
|
|
189
|
+
analysis: {
|
|
190
|
+
enabled: true,
|
|
191
|
+
provider: "openai",
|
|
192
|
+
model: "gpt-5.2",
|
|
193
|
+
timeoutMs: 30_000,
|
|
194
|
+
preferences: ["terse titles", "no emoji"],
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
}).timeline.analysis;
|
|
198
|
+
assert.deepEqual(analysis, {
|
|
199
|
+
enabled: true,
|
|
200
|
+
provider: "openai",
|
|
201
|
+
model: "gpt-5.2",
|
|
202
|
+
timeoutMs: 30_000,
|
|
203
|
+
preferences: ["terse titles", "no emoji"],
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test("activity timeline analysis rejects enabling without an explicit provider and model", () => {
|
|
208
|
+
assert.throws(
|
|
209
|
+
() => parseActivityConfig({ timeline: { analysis: { enabled: true } } }),
|
|
210
|
+
/provider and model are required/,
|
|
211
|
+
);
|
|
212
|
+
assert.throws(
|
|
213
|
+
() => parseActivityConfig({ timeline: { analysis: { enabled: true, provider: "openai" } } }),
|
|
214
|
+
/provider and model are required/,
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test("activity timeline analysis rejects prose or blank provider/model identifiers", () => {
|
|
219
|
+
for (const provider of ["Summarize this user's activity", " ", "has space"]) {
|
|
220
|
+
assert.throws(
|
|
221
|
+
() => parseActivityConfig({ timeline: { analysis: { provider, model: "m" } } }),
|
|
222
|
+
/activity\.timeline\.analysis\.provider must be an identifier/,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
assert.throws(
|
|
226
|
+
() => parseActivityConfig({ timeline: { analysis: { provider: "openai", model: "" } } }),
|
|
227
|
+
/activity\.timeline\.analysis\.model must be an identifier/,
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("activity timeline analysis rejects a slash in the provider segment", () => {
|
|
232
|
+
assert.throws(
|
|
233
|
+
() =>
|
|
234
|
+
parseActivityConfig({
|
|
235
|
+
timeline: { analysis: { enabled: true, provider: "gateway/openai", model: "gpt-test" } },
|
|
236
|
+
}),
|
|
237
|
+
/provider must be a single provider segment/,
|
|
238
|
+
);
|
|
239
|
+
const ok = parseActivityConfig({
|
|
240
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: "org/gpt-test" } },
|
|
241
|
+
}).timeline.analysis;
|
|
242
|
+
assert.equal(ok.model, "org/gpt-test");
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test("activity timeline analysis rejects provider and model longer than metadata max", () => {
|
|
246
|
+
const tooLong = `m${"x".repeat(120)}`;
|
|
247
|
+
assert.throws(
|
|
248
|
+
() =>
|
|
249
|
+
parseActivityConfig({
|
|
250
|
+
timeline: { analysis: { enabled: true, provider: tooLong, model: "gpt-test" } },
|
|
251
|
+
}),
|
|
252
|
+
/provider must be at most 120 characters/,
|
|
253
|
+
);
|
|
254
|
+
assert.throws(
|
|
255
|
+
() =>
|
|
256
|
+
parseActivityConfig({
|
|
257
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: tooLong } },
|
|
258
|
+
}),
|
|
259
|
+
/model must be at most 120 characters/,
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
test("activity timeline analysis rejects invalid timeout and preferences shapes", () => {
|
|
264
|
+
const base = { provider: "openai", model: "gpt-5.2" } as const;
|
|
265
|
+
for (const timeoutMs of [0, 999, 120_001, 1.5, "fast"]) {
|
|
266
|
+
assert.throws(
|
|
267
|
+
() => parseActivityConfig({ timeline: { analysis: { ...base, enabled: true, timeoutMs } } }),
|
|
268
|
+
/timeoutMs/,
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
assert.throws(
|
|
272
|
+
() => parseActivityConfig({ timeline: { analysis: { ...base, preferences: "terse" } } }),
|
|
273
|
+
/preferences must be an array/,
|
|
274
|
+
);
|
|
275
|
+
assert.throws(
|
|
276
|
+
() => parseActivityConfig({ timeline: { analysis: { ...base, preferences: [""] } } }),
|
|
277
|
+
/preferences entries/,
|
|
278
|
+
);
|
|
279
|
+
assert.throws(
|
|
280
|
+
() =>
|
|
281
|
+
parseActivityConfig({
|
|
282
|
+
timeline: { analysis: { ...base, preferences: Array.from({ length: 17 }, () => "p") } },
|
|
283
|
+
}),
|
|
284
|
+
/at most 16/,
|
|
285
|
+
);
|
|
286
|
+
assert.throws(
|
|
287
|
+
() => parseActivityConfig({ timeline: { analysis: { ...base, preferences: ["x".repeat(201)] } } }),
|
|
288
|
+
/at most 200 characters/,
|
|
289
|
+
);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
test("activity timeline analysis rejects a non-object or non-boolean block", () => {
|
|
293
|
+
assert.throws(() => parseActivityConfig({ timeline: { analysis: "on" } }), /analysis must be an object/);
|
|
294
|
+
assert.throws(
|
|
295
|
+
() => parseActivityConfig({ timeline: { analysis: { enabled: 3 } } }),
|
|
296
|
+
/analysis\.enabled must be a boolean/,
|
|
297
|
+
);
|
|
298
|
+
});
|
|
299
|
+
|
|
177
300
|
test("vault publish section names are rejected at config load when the publisher would reject them", () => {
|
|
178
301
|
// `Timeline-->` and an embedded newline both pass a trimmed-string check
|
|
179
302
|
// but break the `<!-- remnic:<name>:start -->` marker, so `publishVaultNote`
|
package/src/activity/config.ts
CHANGED
|
@@ -2,13 +2,18 @@ import path from "node:path";
|
|
|
2
2
|
|
|
3
3
|
import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
|
|
4
4
|
import { assertValidTimezone } from "./digest.js";
|
|
5
|
+
import { applyLegacyJournalHeading } from "./journal-heading.js";
|
|
6
|
+
import { checkVaultJournalPrerequisites } from "./journal-vault-prereq.js";
|
|
5
7
|
import { resolveJournalSource } from "./journal-source.js";
|
|
6
8
|
import { validateVaultNoteTemplate } from "./vault-path.js";
|
|
7
9
|
import { validateRegionName } from "./vault-region.js";
|
|
10
|
+
import { TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS } from "./timeline/analysis.js";
|
|
11
|
+
import { ANALYSIS_METADATA_MAX_FIELD_LENGTH, isAnalysisIdentifier } from "./timeline/analysis-metadata.js";
|
|
8
12
|
import type {
|
|
9
13
|
ActivityConfig,
|
|
10
14
|
ActivityExtractionMode,
|
|
11
15
|
ActivitySourceConfig,
|
|
16
|
+
ActivityTimelineAnalysisConfig,
|
|
12
17
|
ActivityTimelineConfig,
|
|
13
18
|
ActivityTimelineJournalConfig,
|
|
14
19
|
ActivityTimelineQaConfig,
|
|
@@ -38,7 +43,8 @@ export function defaultActivityConfig(): ActivityConfig {
|
|
|
38
43
|
maxMemoriesPerDay: 0,
|
|
39
44
|
timeline: {
|
|
40
45
|
enabled: false,
|
|
41
|
-
|
|
46
|
+
analysis: parseTimelineAnalysisConfig(undefined),
|
|
47
|
+
journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
|
|
42
48
|
qa: { enabled: false, maxRangeDays: 31 },
|
|
43
49
|
vault: parseTimelineVaultConfig(undefined),
|
|
44
50
|
},
|
|
@@ -215,7 +221,8 @@ function parseTimelineConfig(raw: unknown): ActivityTimelineConfig {
|
|
|
215
221
|
if (raw === undefined) {
|
|
216
222
|
return {
|
|
217
223
|
enabled: false,
|
|
218
|
-
|
|
224
|
+
analysis: parseTimelineAnalysisConfig(undefined),
|
|
225
|
+
journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
|
|
219
226
|
qa: parseTimelineQaConfig(undefined),
|
|
220
227
|
vault: parseTimelineVaultConfig(undefined),
|
|
221
228
|
};
|
|
@@ -228,11 +235,123 @@ function parseTimelineConfig(raw: unknown): ActivityTimelineConfig {
|
|
|
228
235
|
if (timeline.enabled !== undefined && enabledValue === undefined) {
|
|
229
236
|
throw new TypeError("activity.timeline.enabled must be a boolean");
|
|
230
237
|
}
|
|
238
|
+
const journal = parseTimelineJournalConfig(timeline.journal);
|
|
239
|
+
let vault = parseTimelineVaultConfig(timeline.vault);
|
|
240
|
+
const journalRaw = timeline.journal;
|
|
241
|
+
const headingRaw =
|
|
242
|
+
typeof journalRaw === "object" && journalRaw !== null && !Array.isArray(journalRaw)
|
|
243
|
+
? (journalRaw as Record<string, unknown>).heading
|
|
244
|
+
: undefined;
|
|
245
|
+
if (headingRaw !== undefined) {
|
|
246
|
+
const aliased = applyLegacyJournalHeading({
|
|
247
|
+
journalSection: vault.readback.journalSection,
|
|
248
|
+
heading: headingRaw,
|
|
249
|
+
});
|
|
250
|
+
process.emitWarning(
|
|
251
|
+
aliased.ignoredLegacyHeading
|
|
252
|
+
? 'activity.timeline.journal.heading is deprecated and ignored because activity.timeline.vault.readback.journalSection is set; use vault.readback.journalSection.'
|
|
253
|
+
: 'activity.timeline.journal.heading is deprecated; use activity.timeline.vault.readback.journalSection.',
|
|
254
|
+
{ type: "DeprecationWarning", code: "REMNIC_DEP_JOURNAL_HEADING" },
|
|
255
|
+
);
|
|
256
|
+
if (aliased.usedLegacyHeading) {
|
|
257
|
+
vault = { ...vault, readback: { ...vault.readback, journalSection: aliased.journalSection } };
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (journal.source === "vault") {
|
|
261
|
+
// Parse-time prerequisite gate (issue #1987): the error names EVERY
|
|
262
|
+
// missing prerequisite, never just the first (§1/§39).
|
|
263
|
+
const prereq = checkVaultJournalPrerequisites({
|
|
264
|
+
vaultEnabled: vault.enabled,
|
|
265
|
+
dailyNotePath: vault.dailyNotePath,
|
|
266
|
+
journalSection: vault.readback.journalSection,
|
|
267
|
+
});
|
|
268
|
+
if (!prereq.ok) {
|
|
269
|
+
throw new RangeError(
|
|
270
|
+
`activity.timeline.journal.source "vault" requires ${prereq.message}`,
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
231
274
|
return {
|
|
232
275
|
enabled: enabledValue ?? false,
|
|
233
|
-
|
|
276
|
+
analysis: parseTimelineAnalysisConfig(timeline.analysis),
|
|
277
|
+
journal,
|
|
234
278
|
qa: parseTimelineQaConfig(timeline.qa),
|
|
235
|
-
vault
|
|
279
|
+
vault,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Parse the `activity.timeline.analysis.*` block (issue #2050). Independent
|
|
285
|
+
* gate, default off: disabled means zero provider calls and zero analysis
|
|
286
|
+
* artifacts. Enabling requires an explicit provider and model; every invalid
|
|
287
|
+
* value is rejected at parse time — never silently defaulted or fallen back.
|
|
288
|
+
*/
|
|
289
|
+
function parseTimelineAnalysisConfig(raw: unknown): ActivityTimelineAnalysisConfig {
|
|
290
|
+
if (raw === undefined) return { enabled: false };
|
|
291
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
292
|
+
throw new TypeError("activity.timeline.analysis must be an object");
|
|
293
|
+
}
|
|
294
|
+
const analysis = raw as Record<string, unknown>;
|
|
295
|
+
const enabled = requireBool(analysis.enabled, "activity.timeline.analysis.enabled", false);
|
|
296
|
+
const provider = optionalNonEmptyString(analysis.provider, "activity.timeline.analysis.provider")?.trim();
|
|
297
|
+
const model = optionalNonEmptyString(analysis.model, "activity.timeline.analysis.model")?.trim();
|
|
298
|
+
for (const [key, value] of [
|
|
299
|
+
["provider", provider],
|
|
300
|
+
["model", model],
|
|
301
|
+
] as const) {
|
|
302
|
+
if (value === undefined) continue;
|
|
303
|
+
if (key === "provider" && value.includes("/")) {
|
|
304
|
+
throw new RangeError(
|
|
305
|
+
"activity.timeline.analysis.provider must be a single provider segment (no '/')",
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
if (!isAnalysisIdentifier(value)) {
|
|
309
|
+
throw new RangeError(
|
|
310
|
+
`activity.timeline.analysis.${key} must be an identifier (letters, digits, and ._:-/ only)`,
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
if (value.length > ANALYSIS_METADATA_MAX_FIELD_LENGTH) {
|
|
314
|
+
throw new RangeError(
|
|
315
|
+
`activity.timeline.analysis.${key} must be at most ${ANALYSIS_METADATA_MAX_FIELD_LENGTH} characters`,
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (enabled && (provider === undefined || model === undefined)) {
|
|
320
|
+
throw new RangeError(
|
|
321
|
+
"activity.timeline.analysis.provider and model are required when analysis is enabled",
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
const timeoutMsValue = coerceNumber(analysis.timeoutMs, "activity.timeline.analysis.timeoutMs");
|
|
325
|
+
if (analysis.timeoutMs !== undefined && timeoutMsValue === undefined) {
|
|
326
|
+
throw new TypeError("activity.timeline.analysis.timeoutMs must be a finite number");
|
|
327
|
+
}
|
|
328
|
+
const timeoutMs = timeoutMsValue ?? TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS;
|
|
329
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs > 120_000) {
|
|
330
|
+
throw new RangeError("activity.timeline.analysis.timeoutMs must be an integer from 1000 to 120000");
|
|
331
|
+
}
|
|
332
|
+
if (analysis.preferences !== undefined) {
|
|
333
|
+
if (!Array.isArray(analysis.preferences)) {
|
|
334
|
+
throw new TypeError("activity.timeline.analysis.preferences must be an array of strings");
|
|
335
|
+
}
|
|
336
|
+
if (analysis.preferences.length > 16) {
|
|
337
|
+
throw new RangeError("activity.timeline.analysis.preferences supports at most 16 entries");
|
|
338
|
+
}
|
|
339
|
+
for (const entry of analysis.preferences) {
|
|
340
|
+
if (typeof entry !== "string" || entry.trim().length === 0) {
|
|
341
|
+
throw new TypeError("activity.timeline.analysis.preferences entries must be non-empty strings");
|
|
342
|
+
}
|
|
343
|
+
if (entry.length > 200) {
|
|
344
|
+
throw new RangeError("activity.timeline.analysis.preferences entries must be at most 200 characters");
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const preferences = analysis.preferences as string[] | undefined;
|
|
349
|
+
return {
|
|
350
|
+
enabled,
|
|
351
|
+
...(provider === undefined ? {} : { provider }),
|
|
352
|
+
...(model === undefined ? {} : { model }),
|
|
353
|
+
...(analysis.timeoutMs !== undefined || timeoutMsValue !== undefined ? { timeoutMs } : {}),
|
|
354
|
+
...(preferences === undefined ? {} : { preferences }),
|
|
236
355
|
};
|
|
237
356
|
}
|
|
238
357
|
|
|
@@ -312,6 +431,17 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
|
|
|
312
431
|
const propertiesRaw = vault.properties;
|
|
313
432
|
const properties: ActivityTimelineVaultConfig["properties"] =
|
|
314
433
|
propertiesRaw === undefined ? { mode: "off", prefix: "remnic_" } : parseVaultProperties(propertiesRaw);
|
|
434
|
+
const readbackRaw = vault.readback;
|
|
435
|
+
if (readbackRaw !== undefined && (typeof readbackRaw !== "object" || readbackRaw === null || Array.isArray(readbackRaw))) {
|
|
436
|
+
throw new TypeError("activity.timeline.vault.readback must be an object");
|
|
437
|
+
}
|
|
438
|
+
const readbackJournalSection = optionalNonEmptyString(
|
|
439
|
+
(readbackRaw as Record<string, unknown> | undefined)?.journalSection,
|
|
440
|
+
"activity.timeline.vault.readback.journalSection",
|
|
441
|
+
);
|
|
442
|
+
const readback = {
|
|
443
|
+
journalSection: readbackJournalSection ?? "",
|
|
444
|
+
};
|
|
315
445
|
|
|
316
446
|
return {
|
|
317
447
|
enabled,
|
|
@@ -323,6 +453,7 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
|
|
|
323
453
|
sectionStrategy,
|
|
324
454
|
publish,
|
|
325
455
|
insertUnderHeading,
|
|
456
|
+
readback,
|
|
326
457
|
wikilinks,
|
|
327
458
|
properties,
|
|
328
459
|
autoPublish,
|
|
@@ -348,6 +479,7 @@ function defaultVaultConfig(): ActivityTimelineVaultConfig {
|
|
|
348
479
|
wikilinks: { places: false, placesFolder: "Places" },
|
|
349
480
|
properties: { mode: "off", prefix: "remnic_" },
|
|
350
481
|
autoPublish: true,
|
|
482
|
+
readback: { journalSection: "" },
|
|
351
483
|
};
|
|
352
484
|
}
|
|
353
485
|
|
|
@@ -470,7 +602,7 @@ function parseVaultProperties(raw: unknown): ActivityTimelineVaultConfig["proper
|
|
|
470
602
|
}
|
|
471
603
|
|
|
472
604
|
function parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig {
|
|
473
|
-
if (raw === undefined) return { enabled: false, source: "
|
|
605
|
+
if (raw === undefined) return { enabled: false, source: "memoryDir", extractionMode: "off" };
|
|
474
606
|
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
475
607
|
throw new TypeError("activity.timeline.journal must be an object");
|
|
476
608
|
}
|
|
@@ -479,22 +611,22 @@ function parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig
|
|
|
479
611
|
if (journal.enabled !== undefined && enabledValue === undefined) {
|
|
480
612
|
throw new TypeError("activity.timeline.journal.enabled must be a boolean");
|
|
481
613
|
}
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
throw new TypeError("activity.timeline.journal.heading must be a string");
|
|
485
|
-
}
|
|
486
|
-
const source = journal.source === undefined ? "file" : typeof journal.source === "string" ? journal.source : "";
|
|
487
|
-
const resolved = resolveJournalSource({ source, heading: heading ?? "" });
|
|
614
|
+
const source = journal.source === undefined ? "memoryDir" : typeof journal.source === "string" ? journal.source : "";
|
|
615
|
+
const resolved = resolveJournalSource({ source });
|
|
488
616
|
if (!resolved.ok) {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
617
|
+
throw new RangeError('activity.timeline.journal.source must be one of "memoryDir", "vault"');
|
|
618
|
+
}
|
|
619
|
+
if (resolved.deprecatedAlias === "file") {
|
|
620
|
+
process.emitWarning(
|
|
621
|
+
'activity.timeline.journal.source "file" is deprecated; use "memoryDir".',
|
|
622
|
+
{ type: "DeprecationWarning", code: "REMNIC_DEP_JOURNAL_SOURCE_FILE" },
|
|
623
|
+
);
|
|
493
624
|
}
|
|
494
|
-
|
|
495
|
-
|
|
625
|
+
const extractionMode = journal.extractionMode === undefined ? "off" : journal.extractionMode;
|
|
626
|
+
if (extractionMode !== "off" && extractionMode !== "review") {
|
|
627
|
+
throw new RangeError('activity.timeline.journal.extractionMode must be one of "off", "review"');
|
|
496
628
|
}
|
|
497
|
-
return { enabled: enabledValue ?? false, source:
|
|
629
|
+
return { enabled: enabledValue ?? false, source: resolved.mode, extractionMode };
|
|
498
630
|
}
|
|
499
631
|
|
|
500
632
|
function parseTimelineQaConfig(raw: unknown): ActivityTimelineQaConfig {
|
package/src/activity/index.ts
CHANGED
|
@@ -16,6 +16,9 @@ export * from "./config.js";
|
|
|
16
16
|
export * from "./reindex.js";
|
|
17
17
|
export * from "./timeline/index.js";
|
|
18
18
|
export * from "./journal.js";
|
|
19
|
+
export * from "./journal-read.js";
|
|
20
|
+
export * from "./journal-state.js";
|
|
21
|
+
export * from "./journal-extract.js";
|
|
19
22
|
export * from "./journal-vault-read.js";
|
|
20
23
|
export * from "./journal-vault-prereq.js";
|
|
21
24
|
export * from "./journal-vault-provenance.js";
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
|
|
6
|
+
import { parseConfig } from "../config.js";
|
|
7
|
+
import { NamespaceStorageRouter } from "../namespaces/storage.js";
|
|
8
|
+
import { StorageManager } from "../storage.js";
|
|
9
|
+
import { withTempDir } from "../testing/tmp-dir.js";
|
|
10
|
+
import {
|
|
11
|
+
createJournalMemoryWriter,
|
|
12
|
+
runJournalReviewExtraction,
|
|
13
|
+
type JournalExtractionDeps,
|
|
14
|
+
} from "./journal-extract.js";
|
|
15
|
+
|
|
16
|
+
const FACT = "I decided to encrypt the journal write path.";
|
|
17
|
+
const MAGIC = Buffer.from("REMNIC-ENC");
|
|
18
|
+
|
|
19
|
+
function walkFiles(root: string): string[] {
|
|
20
|
+
const out: string[] = [];
|
|
21
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
22
|
+
const full = path.join(root, entry.name);
|
|
23
|
+
if (entry.isDirectory()) out.push(...walkFiles(full));
|
|
24
|
+
else out.push(full);
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function extractDeps(storage: StorageManager, category: "decision" | "fact" = "decision"): JournalExtractionDeps {
|
|
30
|
+
return {
|
|
31
|
+
extract: async () => ({
|
|
32
|
+
facts: [
|
|
33
|
+
{
|
|
34
|
+
content: FACT,
|
|
35
|
+
category,
|
|
36
|
+
confidence: 0.9,
|
|
37
|
+
tags: [],
|
|
38
|
+
entityRef: undefined,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
profileUpdates: [],
|
|
42
|
+
entities: [],
|
|
43
|
+
questions: [],
|
|
44
|
+
}),
|
|
45
|
+
writer: createJournalMemoryWriter(storage),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
test("journal writer encrypts on-disk bodies and never stores the fact as plaintext", async () => {
|
|
50
|
+
await withTempDir(async (dir) => {
|
|
51
|
+
const config = parseConfig({ memoryDir: dir });
|
|
52
|
+
const storage = new StorageManager(config.memoryDir);
|
|
53
|
+
await storage.ensureDirectories();
|
|
54
|
+
storage.setSecureStoreRequired(true);
|
|
55
|
+
storage.setSecureStoreKey(Buffer.alloc(32, 7));
|
|
56
|
+
const result = await runJournalReviewExtraction({
|
|
57
|
+
date: "2026-08-20",
|
|
58
|
+
journalText: FACT,
|
|
59
|
+
source: "memoryDir",
|
|
60
|
+
journalConfig: { extractionMode: "review" },
|
|
61
|
+
deps: extractDeps(storage),
|
|
62
|
+
});
|
|
63
|
+
assert.equal(result.completed, true);
|
|
64
|
+
assert.equal(result.pendingReview, 1);
|
|
65
|
+
const bodies = walkFiles(dir)
|
|
66
|
+
.filter((file) => !file.includes(`${path.sep}state${path.sep}`))
|
|
67
|
+
.map((file) => readFileSync(file));
|
|
68
|
+
assert.ok(bodies.some((buf) => buf.subarray(0, MAGIC.length).equals(MAGIC)));
|
|
69
|
+
assert.equal(
|
|
70
|
+
bodies.some((buf) => buf.toString("utf8").includes(FACT)),
|
|
71
|
+
false,
|
|
72
|
+
"encrypted journal writes must not leave the fact as plaintext",
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("journal writer uses NamespaceStorageRouter.storageFor(defaultNamespace)", async () => {
|
|
78
|
+
await withTempDir(async (dir) => {
|
|
79
|
+
const config = parseConfig({ memoryDir: dir });
|
|
80
|
+
const router = new NamespaceStorageRouter(config);
|
|
81
|
+
const storage = await router.storageFor(config.defaultNamespace);
|
|
82
|
+
await storage.ensureDirectories();
|
|
83
|
+
const result = await runJournalReviewExtraction({
|
|
84
|
+
date: "2026-08-20",
|
|
85
|
+
journalText: FACT,
|
|
86
|
+
source: "memoryDir",
|
|
87
|
+
journalConfig: { extractionMode: "review" },
|
|
88
|
+
deps: extractDeps(storage),
|
|
89
|
+
});
|
|
90
|
+
assert.equal(result.completed, true);
|
|
91
|
+
assert.equal(result.pendingReview, 1);
|
|
92
|
+
assert.ok(walkFiles(dir).some((file) => statSync(file).isFile()));
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("tombstoned journal facts are skipped and not written as pending_review", async () => {
|
|
97
|
+
await withTempDir(async (dir) => {
|
|
98
|
+
const config = parseConfig({ memoryDir: dir });
|
|
99
|
+
const storage = new StorageManager(config.memoryDir);
|
|
100
|
+
await storage.ensureDirectories();
|
|
101
|
+
storage.setTombstonesConfig({
|
|
102
|
+
enabled: true,
|
|
103
|
+
semanticMatch: false,
|
|
104
|
+
semanticThreshold: 0.9,
|
|
105
|
+
namespace: config.defaultNamespace,
|
|
106
|
+
});
|
|
107
|
+
const tombstoneId = await storage.appendTombstone({
|
|
108
|
+
reason: "correction",
|
|
109
|
+
createdBy: "user_correction",
|
|
110
|
+
sourceMemoryId: "retired-journal-fact",
|
|
111
|
+
rawContent: FACT,
|
|
112
|
+
});
|
|
113
|
+
assert.ok(tombstoneId);
|
|
114
|
+
const before = walkFiles(dir);
|
|
115
|
+
const result = await runJournalReviewExtraction({
|
|
116
|
+
date: "2026-08-20",
|
|
117
|
+
journalText: FACT,
|
|
118
|
+
source: "memoryDir",
|
|
119
|
+
journalConfig: { extractionMode: "review" },
|
|
120
|
+
deps: extractDeps(storage, "fact"),
|
|
121
|
+
});
|
|
122
|
+
assert.equal(result.completed, true);
|
|
123
|
+
assert.equal(result.pendingReview, 0);
|
|
124
|
+
assert.equal(result.skipped, 1);
|
|
125
|
+
const after = walkFiles(dir).filter((file) => !before.includes(file));
|
|
126
|
+
const pending = after.filter((file) => file.includes("pending_review") || file.includes("pending-review"));
|
|
127
|
+
assert.equal(pending.length, 0, "tombstoned content must not land as a new pending_review file");
|
|
128
|
+
});
|
|
129
|
+
});
|