@remnic/core 9.69.32 → 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 +64 -59
- package/dist/access-authorization-probe.d.ts +13 -11
- package/dist/access-authorization-probe.js +65 -60
- package/dist/access-boundary.d.ts +13 -11
- package/dist/access-boundary.js +64 -59
- package/dist/access-cli.js +140 -136
- 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 +64 -59
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-briefing.d.ts +13 -11
- package/dist/access-http-briefing.js +65 -60
- 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 +66 -61
- package/dist/access-http.d.ts +14 -12
- package/dist/access-http.js +86 -82
- package/dist/access-identity-continuity-surface.d.ts +11 -9
- package/dist/access-identity-continuity-surface.js +64 -59
- package/dist/access-lcm-surface.d.ts +13 -11
- package/dist/access-lcm-surface.js +64 -59
- package/dist/access-mcp.d.ts +13 -11
- package/dist/access-mcp.js +73 -69
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-BsvmyENS.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 +64 -59
- 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 +64 -59
- package/dist/access-offline-manifest.d.ts +47 -11
- package/dist/access-offline-manifest.js +18 -16
- package/dist/access-operations-batch.js +67 -63
- package/dist/access-operations.d.ts +18 -16
- package/dist/access-operations.js +72 -68
- package/dist/access-recall-concurrency.d.ts +13 -11
- package/dist/access-recall-concurrency.js +64 -59
- package/dist/access-recall-response.d.ts +13 -11
- package/dist/access-recall-response.js +64 -59
- package/dist/access-recall-surface.d.ts +13 -11
- package/dist/access-recall-surface.js +64 -59
- package/dist/access-schema.d.ts +138 -96
- package/dist/access-schema.js +15 -1
- package/dist/{access-service-CCpOuS46.d.ts → access-service-WUm2LnXZ.d.ts} +110 -108
- package/dist/access-service-helpers.d.ts +13 -11
- package/dist/access-service.d.ts +13 -11
- package/dist/access-service.js +64 -59
- package/dist/access-surface-catalog.d.ts +13 -11
- package/dist/access-surface-catalog.js +66 -61
- 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 +14 -12
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +56 -0
- package/dist/activity/digest.js +32 -0
- package/dist/adapters/index.d.ts +46 -1
- package/dist/adapters/index.js +13 -9
- package/dist/adapters/registry.js +3 -3
- 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 +28 -27
- 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 +12 -11
- 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-CDZLyiXL.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 +29 -28
- 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-IY2FVXM6.js → chunk-2AU4D4HQ.js} +3 -3
- package/dist/{chunk-QDY6KYTN.js → chunk-2JCA2PQT.js} +3 -3
- package/dist/{chunk-RSVEP77Y.js → chunk-2UZ5ZH6W.js} +3 -3
- package/dist/{chunk-XQ2Q43XD.js → chunk-326KUXIR.js} +15 -648
- package/dist/chunk-326KUXIR.js.map +1 -0
- package/dist/{chunk-NWWXSJX5.js → chunk-34QW2LK2.js} +2 -2
- package/dist/{chunk-S7DPKM5W.js → chunk-353C5UNV.js} +1 -1
- package/dist/{chunk-GQOMZ3MK.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-7VJXIDOC.js → chunk-4JVQRFZD.js} +9 -9
- package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
- package/dist/chunk-4MIS4CQW.js.map +1 -0
- package/dist/{chunk-WHBVXTUI.js → chunk-4PB2MBY6.js} +9 -9
- package/dist/{chunk-TEYN7ZYF.js → chunk-4WCNPQQ5.js} +4 -4
- package/dist/{chunk-Z4PCVRTN.js → chunk-5A7ZUOBA.js} +217 -396
- 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-RBGREYVJ.js → chunk-5QBDLMGG.js} +2 -2
- package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
- package/dist/{chunk-LPECRQO4.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-LWA7MDVO.js → chunk-6CCRSQWT.js} +2 -2
- package/dist/{chunk-TIT2C6WX.js → chunk-6XYC7NM4.js} +2 -2
- package/dist/{chunk-FHQSPTPZ.js → chunk-6YAIN5XJ.js} +2 -2
- package/dist/{chunk-PV36INNL.js → chunk-757NP436.js} +3 -3
- package/dist/{chunk-WJBZMNNS.js → chunk-7CAY3YKP.js} +742 -29
- package/dist/chunk-7CAY3YKP.js.map +1 -0
- package/dist/{chunk-6H5JYDOM.js → chunk-7J2CGXG3.js} +2 -2
- package/dist/{chunk-FBMYGNOC.js → chunk-A2YQL2FF.js} +6 -6
- 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-MPYD657E.js → chunk-A7WOWDZK.js} +2 -2
- package/dist/{chunk-C4OTC6WY.js → chunk-AIKTQVV3.js} +3 -3
- package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
- package/dist/{chunk-VP67GZ7T.js → chunk-APFKZVJS.js} +2 -2
- package/dist/{chunk-M75RYSHS.js → chunk-AQIRQUCP.js} +2 -2
- package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
- package/dist/{chunk-PSPABFN2.js → chunk-BD7JTBYP.js} +4 -4
- 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-MFJBANPX.js → chunk-C2BFTYD7.js} +2 -2
- package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
- package/dist/{chunk-Q3O3VKRB.js → chunk-CRUFVJOX.js} +16 -15
- package/dist/chunk-CRUFVJOX.js.map +1 -0
- package/dist/{chunk-AOCP6JA7.js → chunk-D3IZCN5P.js} +4 -4
- package/dist/{chunk-ROKKIMON.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-ROGRI25A.js → chunk-I3H5LFOI.js} +2 -2
- package/dist/{chunk-S65WXHNK.js → chunk-IFFLUCCU.js} +2 -2
- package/dist/{chunk-MYMNC6O5.js → chunk-ISYZ5DUI.js} +64 -60
- package/dist/{chunk-MYMNC6O5.js.map → chunk-ISYZ5DUI.js.map} +1 -1
- package/dist/{chunk-D5LORF7A.js → chunk-JZDH2ZZK.js} +3 -3
- package/dist/{chunk-2GPE5UCR.js → chunk-K6IPSW5B.js} +2 -2
- package/dist/{chunk-HG6HXVHQ.js → chunk-KDJHLOZP.js} +10 -10
- package/dist/{chunk-I27RSQRR.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-DITMGZOL.js → chunk-MMG5K6XJ.js} +2 -2
- package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
- package/dist/{chunk-CZYYJZB6.js → chunk-ND2O2PVN.js} +1014 -1318
- 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-MKWKYHXJ.js → chunk-OB3XMWX5.js} +4 -4
- package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
- package/dist/{chunk-GTWHVXPA.js → chunk-OZUXKUPD.js} +6 -4
- package/dist/{chunk-GTWHVXPA.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-47DEYNMR.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-42SDNZCU.js → chunk-QF4J3KMV.js} +19 -19
- package/dist/{chunk-SB6PSOP7.js → chunk-QLJ6762U.js} +2 -2
- package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
- package/dist/{chunk-PHNAB54Q.js → chunk-RQO3J4MR.js} +2 -2
- package/dist/{chunk-5N53UBH2.js → chunk-RR7G2X7C.js} +5 -5
- package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
- package/dist/{chunk-GY5WZBA6.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-SQJ3SDIW.js → chunk-SZWEDG3H.js} +13 -7
- package/dist/chunk-SZWEDG3H.js.map +1 -0
- package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
- package/dist/{chunk-QMGXMJ2O.js → chunk-T2YFZ27G.js} +9 -9
- package/dist/{chunk-LEPOP46W.js → chunk-TFA6HPOA.js} +4 -4
- 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-ZNJSBIP4.js → chunk-TNSCIPBQ.js} +4 -4
- package/dist/{chunk-YUMDFDUA.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-EZZV7OQL.js → chunk-UEZKN6VR.js} +2 -2
- package/dist/{chunk-HY55QQD7.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-CBCNKKZD.js → chunk-VIZR45AN.js} +2 -2
- package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
- package/dist/{chunk-ITPS5DDH.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-FGGYSN4P.js → chunk-X424T5JQ.js} +2 -2
- package/dist/{chunk-NAXDPKVM.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-VED2YHUD.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-565C6ZFO.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-GVG3JYBI.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-NEEdq5Rt.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 +110 -106
- package/dist/coding/export-okf-codegraph.d.ts +2 -1
- package/dist/coding/export-okf-codegraph.js +34 -32
- 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 +29 -28
- 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 +14 -12
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +28 -27
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +30 -29
- 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 +30 -29
- 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 +31 -30
- 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-CQPCu0o5.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 +28 -27
- 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 +65 -60
- 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 +40 -38
- 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-C9VXenR8.d.ts → index-BNluTxBp.d.ts} +2 -2
- package/dist/index.d.ts +963 -945
- package/dist/index.js +323 -221
- 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 +7 -7
- 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 +33 -32
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +28 -27
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -27
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +29 -28
- package/dist/{maintenance-C14sorKa.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 +29 -28
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +11 -11
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +28 -27
- 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 +32 -31
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +4 -3
- package/dist/operator-toolkit.js +48 -46
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +47 -42
- package/dist/{orchestrator-kqSzGv7e.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
- package/dist/orchestrator.d.ts +11 -9
- package/dist/orchestrator.js +144 -138
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-DRUwHb1X.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-CW3l0g3P.d.ts → public-http-L-IymRBN.d.ts} +1 -1
- package/dist/{qmd-BVWlg1YS.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-admission.js.map +1 -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 +15 -13
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/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/schemas.d.ts +176 -176
- package/dist/{scope-profiles-Vl00B1KU.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 +10 -10
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +14 -14
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/{semantic-consolidation-BC9-GFuT.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +29 -28
- package/dist/semantic-rule-promotion.js +28 -27
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +28 -27
- package/dist/{service-BOy6dHfc.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 +8 -7
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +38 -36
- package/dist/standup/build.js +29 -28
- package/dist/{storage-BLJRnFi6.d.ts → storage-CU_hZUgP.d.ts} +67 -6
- package/dist/storage.d.ts +4 -3
- package/dist/storage.js +27 -26
- 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 +72 -63
- 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 +29 -28
- package/dist/transfer/types.d.ts +102 -102
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-YY-eKKU7.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 +28 -27
- package/dist/who-knows-cli.d.ts +13 -11
- package/dist/who-knows-cli.js +29 -28
- package/dist/who-knows.d.ts +13 -11
- package/dist/who-knows.js +28 -27
- package/dist/write-envelope.d.ts +4 -2
- package/dist/write-envelope.js +3 -1
- package/package.json +12 -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-2JVJ7UHC.js.map +0 -1
- package/dist/chunk-3QQTXYZ6.js.map +0 -1
- package/dist/chunk-4UDQUPT5.js +0 -560
- package/dist/chunk-4UDQUPT5.js.map +0 -1
- package/dist/chunk-A7XEPMQ6.js.map +0 -1
- package/dist/chunk-AU7Q3LSC.js +0 -56
- package/dist/chunk-AU7Q3LSC.js.map +0 -1
- package/dist/chunk-BLUYQFRH.js.map +0 -1
- package/dist/chunk-CZYYJZB6.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-GVG3JYBI.js.map +0 -1
- package/dist/chunk-H272ZPQ3.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-N7RWREIQ.js.map +0 -1
- package/dist/chunk-O75CRYGF.js.map +0 -1
- package/dist/chunk-Q3O3VKRB.js.map +0 -1
- package/dist/chunk-SEDEKFYQ.js +0 -1
- package/dist/chunk-SO7SV523.js.map +0 -1
- package/dist/chunk-SQJ3SDIW.js.map +0 -1
- package/dist/chunk-TLPZ6MKZ.js.map +0 -1
- package/dist/chunk-WJBZMNNS.js.map +0 -1
- package/dist/chunk-XQ2Q43XD.js.map +0 -1
- package/dist/chunk-Z4PCVRTN.js.map +0 -1
- package/src/activity/journal-mode.test.ts +0 -32
- package/src/activity/journal-mode.ts +0 -20
- /package/dist/{chunk-SEDEKFYQ.js.map → activity/digest.js.map} +0 -0
- /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-IY2FVXM6.js.map → chunk-2AU4D4HQ.js.map} +0 -0
- /package/dist/{chunk-QDY6KYTN.js.map → chunk-2JCA2PQT.js.map} +0 -0
- /package/dist/{chunk-RSVEP77Y.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
- /package/dist/{chunk-NWWXSJX5.js.map → chunk-34QW2LK2.js.map} +0 -0
- /package/dist/{chunk-S7DPKM5W.js.map → chunk-353C5UNV.js.map} +0 -0
- /package/dist/{chunk-GQOMZ3MK.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-7VJXIDOC.js.map → chunk-4JVQRFZD.js.map} +0 -0
- /package/dist/{chunk-WHBVXTUI.js.map → chunk-4PB2MBY6.js.map} +0 -0
- /package/dist/{chunk-TEYN7ZYF.js.map → chunk-4WCNPQQ5.js.map} +0 -0
- /package/dist/{chunk-RBGREYVJ.js.map → chunk-5QBDLMGG.js.map} +0 -0
- /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
- /package/dist/{chunk-LPECRQO4.js.map → chunk-5THU7NFP.js.map} +0 -0
- /package/dist/{chunk-LWA7MDVO.js.map → chunk-6CCRSQWT.js.map} +0 -0
- /package/dist/{chunk-TIT2C6WX.js.map → chunk-6XYC7NM4.js.map} +0 -0
- /package/dist/{chunk-FHQSPTPZ.js.map → chunk-6YAIN5XJ.js.map} +0 -0
- /package/dist/{chunk-PV36INNL.js.map → chunk-757NP436.js.map} +0 -0
- /package/dist/{chunk-6H5JYDOM.js.map → chunk-7J2CGXG3.js.map} +0 -0
- /package/dist/{chunk-FBMYGNOC.js.map → chunk-A2YQL2FF.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
- /package/dist/{chunk-MPYD657E.js.map → chunk-A7WOWDZK.js.map} +0 -0
- /package/dist/{chunk-C4OTC6WY.js.map → chunk-AIKTQVV3.js.map} +0 -0
- /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
- /package/dist/{chunk-VP67GZ7T.js.map → chunk-APFKZVJS.js.map} +0 -0
- /package/dist/{chunk-M75RYSHS.js.map → chunk-AQIRQUCP.js.map} +0 -0
- /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
- /package/dist/{chunk-PSPABFN2.js.map → chunk-BD7JTBYP.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-MFJBANPX.js.map → chunk-C2BFTYD7.js.map} +0 -0
- /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
- /package/dist/{chunk-AOCP6JA7.js.map → chunk-D3IZCN5P.js.map} +0 -0
- /package/dist/{chunk-ROKKIMON.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-ROGRI25A.js.map → chunk-I3H5LFOI.js.map} +0 -0
- /package/dist/{chunk-S65WXHNK.js.map → chunk-IFFLUCCU.js.map} +0 -0
- /package/dist/{chunk-D5LORF7A.js.map → chunk-JZDH2ZZK.js.map} +0 -0
- /package/dist/{chunk-2GPE5UCR.js.map → chunk-K6IPSW5B.js.map} +0 -0
- /package/dist/{chunk-HG6HXVHQ.js.map → chunk-KDJHLOZP.js.map} +0 -0
- /package/dist/{chunk-I27RSQRR.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-DITMGZOL.js.map → chunk-MMG5K6XJ.js.map} +0 -0
- /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
- /package/dist/{chunk-MKWKYHXJ.js.map → chunk-OB3XMWX5.js.map} +0 -0
- /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
- /package/dist/{chunk-47DEYNMR.js.map → chunk-PEXW2JCK.js.map} +0 -0
- /package/dist/{chunk-42SDNZCU.js.map → chunk-QF4J3KMV.js.map} +0 -0
- /package/dist/{chunk-SB6PSOP7.js.map → chunk-QLJ6762U.js.map} +0 -0
- /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
- /package/dist/{chunk-PHNAB54Q.js.map → chunk-RQO3J4MR.js.map} +0 -0
- /package/dist/{chunk-5N53UBH2.js.map → chunk-RR7G2X7C.js.map} +0 -0
- /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
- /package/dist/{chunk-GY5WZBA6.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-QMGXMJ2O.js.map → chunk-T2YFZ27G.js.map} +0 -0
- /package/dist/{chunk-LEPOP46W.js.map → chunk-TFA6HPOA.js.map} +0 -0
- /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
- /package/dist/{chunk-ZNJSBIP4.js.map → chunk-TNSCIPBQ.js.map} +0 -0
- /package/dist/{chunk-YUMDFDUA.js.map → chunk-TWYTGIBR.js.map} +0 -0
- /package/dist/{chunk-EZZV7OQL.js.map → chunk-UEZKN6VR.js.map} +0 -0
- /package/dist/{chunk-HY55QQD7.js.map → chunk-UJX4I26O.js.map} +0 -0
- /package/dist/{chunk-CBCNKKZD.js.map → chunk-VIZR45AN.js.map} +0 -0
- /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
- /package/dist/{chunk-ITPS5DDH.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-FGGYSN4P.js.map → chunk-X424T5JQ.js.map} +0 -0
- /package/dist/{chunk-NAXDPKVM.js.map → chunk-XPJNT6PI.js.map} +0 -0
- /package/dist/{contradiction-scan-NOYMFG66.js.map → chunk-XW2T4QAW.js.map} +0 -0
- /package/dist/{chunk-VED2YHUD.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-565C6ZFO.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/{resolution-VKATP2HT.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/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import * as nodePath from "node:path";
|
|
2
|
-
import type { Orchestrator } from "./orchestrator.js";
|
|
3
|
-
import { iterateOfflineSyncSnapshotFileRecords } from "./offline-sync.js";
|
|
4
2
|
import { offlineSyncStorageForSnapshot } from "./offline-sync-impression-drain.js";
|
|
3
|
+
import { iterateOfflineSyncSnapshotFileRecords } from "./offline-sync.js";
|
|
4
|
+
import type { Orchestrator } from "./orchestrator.js";
|
|
5
5
|
import {
|
|
6
|
-
|
|
6
|
+
CONTENT_HASH_NORMALIZER_VERSION,
|
|
7
|
+
IDENTITY_RESOLUTION_VERSION,
|
|
7
8
|
RECONCILE_MANIFEST_FORMAT,
|
|
8
9
|
RECONCILE_MANIFEST_SCHEMA_VERSION,
|
|
9
10
|
type ReconcileManifest,
|
|
10
11
|
type ReconcileManifestFile,
|
|
12
|
+
type ReconcileMemoryIdentity,
|
|
11
13
|
type ReconcileMemoryParser,
|
|
14
|
+
buildReconcileManifestFile,
|
|
15
|
+
citationTemplateFingerprint,
|
|
16
|
+
isCachedIdentityReusable,
|
|
17
|
+
isReconcileMemoryIdentity,
|
|
12
18
|
} from "./reconcile/manifest.js";
|
|
13
|
-
import {
|
|
19
|
+
import { createPersistedSupportPassportPrivateFileExclusion } from "./support-passport/card-projection.js";
|
|
14
20
|
|
|
15
21
|
export interface OfflineSyncManifestRequest {
|
|
16
22
|
includeTranscripts?: boolean;
|
|
@@ -22,14 +28,179 @@ export interface OfflineSyncManifestStreamResponse extends Omit<ReconcileManifes
|
|
|
22
28
|
files: AsyncIterable<ReconcileManifestFile>;
|
|
23
29
|
}
|
|
24
30
|
|
|
31
|
+
export interface ServerIdentityCacheEntry {
|
|
32
|
+
path: string;
|
|
33
|
+
sha256: string;
|
|
34
|
+
memory?: ReconcileMemoryIdentity;
|
|
35
|
+
/** Stamped on sha-only entries so an upgrade re-parses them. */
|
|
36
|
+
normalizerVersion?: number;
|
|
37
|
+
identityResolutionVersion?: number;
|
|
38
|
+
/** Stat identity the exclusion classification was computed against. */
|
|
39
|
+
statIdentity?: string;
|
|
40
|
+
/** Persisted support-passport private-memory classification for statIdentity. */
|
|
41
|
+
excluded?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Decide what the manifest stream should persist, and whether a write is
|
|
46
|
+
* needed at all.
|
|
47
|
+
*
|
|
48
|
+
* A write is required whenever the persisted set changed — an identity was
|
|
49
|
+
* rebuilt, or an entry was dropped because its file lost its identity — and
|
|
50
|
+
* also when a completed walk leaves entries for paths it never saw, which are
|
|
51
|
+
* files that have since been deleted. Skipping the write in that last case
|
|
52
|
+
* would strand those entries on disk forever.
|
|
53
|
+
*
|
|
54
|
+
* Pruning is gated on the walk completing: an aborted or partially consumed
|
|
55
|
+
* stream has simply not observed the remaining paths, so it may only add.
|
|
56
|
+
*/
|
|
57
|
+
export function planServerIdentityCacheWrite(input: {
|
|
58
|
+
persisted: ReadonlyMap<string, ServerIdentityCacheEntry>;
|
|
59
|
+
yieldedPaths: ReadonlySet<string>;
|
|
60
|
+
streamCompleted: boolean;
|
|
61
|
+
cacheDirty: boolean;
|
|
62
|
+
}): { shouldWrite: boolean; entries: ServerIdentityCacheEntry[] } {
|
|
63
|
+
const entries = input.streamCompleted
|
|
64
|
+
? [...input.persisted.values()].filter((entry) => input.yieldedPaths.has(entry.path))
|
|
65
|
+
: [...input.persisted.values()];
|
|
66
|
+
return { shouldWrite: input.cacheDirty || entries.length !== input.persisted.size, entries };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The cache lives under `.remnic/` rather than `state/`: snapshot enumeration
|
|
71
|
+
* excludes internal `.remnic/` paths structurally (`isInternalRemnicStatePath`),
|
|
72
|
+
* whereas `state/` is only filtered by an allowlist of known node-local
|
|
73
|
+
* artifacts. Under `state/` this node-local cache would be advertised as a peer
|
|
74
|
+
* file, so convergence would transfer the cache itself — and the stream rewrites
|
|
75
|
+
* it during finalization, so the advertised digest could go stale mid-transfer.
|
|
76
|
+
*/
|
|
77
|
+
function serverIdentityCachePath(storageDir: string): string {
|
|
78
|
+
return nodePath.join(storageDir, ".remnic", "state", "converge-identity-cache.json");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function loadServerIdentityCache(
|
|
82
|
+
storageDir: string,
|
|
83
|
+
citationTemplate?: string
|
|
84
|
+
): Promise<Map<string, ServerIdentityCacheEntry>> {
|
|
85
|
+
const cache = new Map<string, ServerIdentityCacheEntry>();
|
|
86
|
+
try {
|
|
87
|
+
const raw = JSON.parse(
|
|
88
|
+
await import("node:fs/promises").then((fs) => fs.readFile(serverIdentityCachePath(storageDir), "utf8"))
|
|
89
|
+
) as {
|
|
90
|
+
citationTemplate?: string;
|
|
91
|
+
files?: unknown[];
|
|
92
|
+
};
|
|
93
|
+
// Identities are derived after stripping inline attribution for a specific
|
|
94
|
+
// citation template; entries written under a different one would produce
|
|
95
|
+
// wrong contentHash values for unchanged files.
|
|
96
|
+
if (raw.citationTemplate !== citationTemplateFingerprint(citationTemplate)) return cache;
|
|
97
|
+
for (const candidate of raw.files ?? []) {
|
|
98
|
+
const entry = candidate as Partial<ServerIdentityCacheEntry> | null;
|
|
99
|
+
if (typeof entry?.path !== "string" || typeof entry.sha256 !== "string") continue;
|
|
100
|
+
if (entry.memory !== undefined && !isReconcileMemoryIdentity(entry.memory)) continue;
|
|
101
|
+
if (entry.statIdentity !== undefined && typeof entry.statIdentity !== "string") continue;
|
|
102
|
+
if (entry.excluded !== undefined && typeof entry.excluded !== "boolean") continue;
|
|
103
|
+
if (entry.normalizerVersion !== undefined && typeof entry.normalizerVersion !== "number") continue;
|
|
104
|
+
if (entry.identityResolutionVersion !== undefined && typeof entry.identityResolutionVersion !== "number") {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
cache.set(entry.path, {
|
|
108
|
+
path: entry.path,
|
|
109
|
+
sha256: entry.sha256,
|
|
110
|
+
...(entry.memory ? { memory: entry.memory } : {}),
|
|
111
|
+
...(entry.memory
|
|
112
|
+
? {}
|
|
113
|
+
: {
|
|
114
|
+
...(typeof entry.normalizerVersion === "number" ? { normalizerVersion: entry.normalizerVersion } : {}),
|
|
115
|
+
...(typeof entry.identityResolutionVersion === "number"
|
|
116
|
+
? { identityResolutionVersion: entry.identityResolutionVersion }
|
|
117
|
+
: {}),
|
|
118
|
+
}),
|
|
119
|
+
...(entry.statIdentity !== undefined && entry.excluded !== undefined
|
|
120
|
+
? { statIdentity: entry.statIdentity, excluded: entry.excluded }
|
|
121
|
+
: {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
} catch {
|
|
125
|
+
// missing or corrupt cache: cold build
|
|
126
|
+
}
|
|
127
|
+
return cache;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const serverIdentityCacheWriteLocks = new Map<string, Promise<void>>();
|
|
131
|
+
|
|
132
|
+
/** Serialize cache replacements per path: overlapping manifest streams for one
|
|
133
|
+
* namespace would otherwise each publish a whole-file snapshot, and the slower
|
|
134
|
+
* stream built from older filesystem state would overwrite the newer one. */
|
|
135
|
+
async function withServerIdentityCacheWriteLock(cachePath: string, write: () => Promise<void>): Promise<void> {
|
|
136
|
+
const previous = serverIdentityCacheWriteLocks.get(cachePath) ?? Promise.resolve();
|
|
137
|
+
const next = previous.then(write, write);
|
|
138
|
+
serverIdentityCacheWriteLocks.set(cachePath, next);
|
|
139
|
+
try {
|
|
140
|
+
await next;
|
|
141
|
+
} finally {
|
|
142
|
+
if (serverIdentityCacheWriteLocks.get(cachePath) === next) {
|
|
143
|
+
serverIdentityCacheWriteLocks.delete(cachePath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Union of the entries being written and the current on-disk set; on conflict
|
|
149
|
+
* the write wins (it reflects the newer run). Callers hold the write lock. */
|
|
150
|
+
async function mergeServerIdentityCacheEntries(
|
|
151
|
+
fs: typeof import("node:fs/promises"),
|
|
152
|
+
cachePath: string,
|
|
153
|
+
entries: readonly ServerIdentityCacheEntry[],
|
|
154
|
+
citationTemplate: string | undefined,
|
|
155
|
+
dropped: ReadonlySet<string> = new Set()
|
|
156
|
+
): Promise<ServerIdentityCacheEntry[]> {
|
|
157
|
+
const merged = new Map(entries.map((entry) => [entry.path, entry]));
|
|
158
|
+
try {
|
|
159
|
+
const raw = JSON.parse(await fs.readFile(cachePath, "utf8")) as {
|
|
160
|
+
citationTemplate?: string;
|
|
161
|
+
files?: unknown[];
|
|
162
|
+
};
|
|
163
|
+
if (raw.citationTemplate === citationTemplateFingerprint(citationTemplate)) {
|
|
164
|
+
for (const candidate of raw.files ?? []) {
|
|
165
|
+
const entry = candidate as Partial<ServerIdentityCacheEntry> | null;
|
|
166
|
+
if (typeof entry?.path !== "string" || typeof entry.sha256 !== "string") continue;
|
|
167
|
+
if (entry.memory !== undefined && !isReconcileMemoryIdentity(entry.memory)) continue;
|
|
168
|
+
if (dropped.has(entry.path) || merged.has(entry.path)) continue;
|
|
169
|
+
merged.set(entry.path, {
|
|
170
|
+
path: entry.path,
|
|
171
|
+
sha256: entry.sha256,
|
|
172
|
+
...(entry.memory ? { memory: entry.memory } : {}),
|
|
173
|
+
...(entry.memory
|
|
174
|
+
? {}
|
|
175
|
+
: {
|
|
176
|
+
...(typeof entry.normalizerVersion === "number" ? { normalizerVersion: entry.normalizerVersion } : {}),
|
|
177
|
+
...(typeof entry.identityResolutionVersion === "number"
|
|
178
|
+
? { identityResolutionVersion: entry.identityResolutionVersion }
|
|
179
|
+
: {}),
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} catch {
|
|
185
|
+
// missing or unreadable current cache: the write set stands alone
|
|
186
|
+
}
|
|
187
|
+
return [...merged.values()];
|
|
188
|
+
}
|
|
189
|
+
|
|
25
190
|
export async function createOfflineSyncManifestStream(
|
|
26
191
|
orchestrator: Orchestrator,
|
|
27
192
|
namespace: string,
|
|
28
193
|
userExcludeRegexps: RegExp[],
|
|
29
194
|
options: OfflineSyncManifestRequest,
|
|
30
|
-
parseMemory: ReconcileMemoryParser
|
|
195
|
+
parseMemory: ReconcileMemoryParser
|
|
31
196
|
): Promise<OfflineSyncManifestStreamResponse> {
|
|
32
197
|
const storage = await offlineSyncStorageForSnapshot(orchestrator, namespace);
|
|
198
|
+
const citationTemplate = orchestrator.config.inlineSourceAttributionFormat;
|
|
199
|
+
const identityCache = await loadServerIdentityCache(storage.dir, citationTemplate);
|
|
200
|
+
// The exclusion callback runs before every yield; without the persisted
|
|
201
|
+
// classification it would read and parse every candidate file, defeating the
|
|
202
|
+
// warm-cache skip entirely.
|
|
203
|
+
const classificationUpdates = new Map<string, { statIdentity: string; excluded: boolean }>();
|
|
33
204
|
const snapshotFiles = iterateOfflineSyncSnapshotFileRecords({
|
|
34
205
|
root: storage.dir,
|
|
35
206
|
includeContent: false,
|
|
@@ -37,23 +208,133 @@ export async function createOfflineSyncManifestStream(
|
|
|
37
208
|
readFileDigest: async ({ filePath }) => storage.digestOfflineSyncFile(filePath),
|
|
38
209
|
signal: options.signal,
|
|
39
210
|
userExcludeRegexps,
|
|
40
|
-
excludeFile:
|
|
41
|
-
const memory = await storage.readMemoryByPath(filePath);
|
|
42
|
-
return memory ? isSupportPassportPrivateMemory(memory) : false;
|
|
43
|
-
},
|
|
211
|
+
excludeFile: createPersistedSupportPassportPrivateFileExclusion(storage, identityCache, classificationUpdates),
|
|
44
212
|
});
|
|
45
213
|
return {
|
|
46
214
|
namespace,
|
|
47
215
|
format: RECONCILE_MANIFEST_FORMAT,
|
|
48
216
|
schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,
|
|
49
217
|
files: (async function* () {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
218
|
+
// Any change to the persisted set, not just a rebuilt identity: a file
|
|
219
|
+
// that lost its identity, or a completed walk that must prune vanished
|
|
220
|
+
// paths, also has to reach disk or the removal is lost forever.
|
|
221
|
+
let cacheDirty = false;
|
|
222
|
+
let streamCompleted = false;
|
|
223
|
+
// Seeded with every previously cached entry so a partially consumed
|
|
224
|
+
// stream (client disconnect, abort) can only add to the cache. Writing
|
|
225
|
+
// just this run's rebuilds would drop every cache hit, so one edit to a
|
|
226
|
+
// large corpus would shrink the cache to that single entry and force a
|
|
227
|
+
// near-cold rebuild on the next request.
|
|
228
|
+
const persistedEntries = new Map(identityCache);
|
|
229
|
+
const yieldedPaths = new Set<string>();
|
|
230
|
+
const flush = async (): Promise<void> => {
|
|
231
|
+
const { shouldWrite, entries } = planServerIdentityCacheWrite({
|
|
232
|
+
persisted: persistedEntries,
|
|
233
|
+
yieldedPaths,
|
|
234
|
+
streamCompleted,
|
|
235
|
+
cacheDirty,
|
|
236
|
+
});
|
|
237
|
+
if (!shouldWrite) return;
|
|
238
|
+
try {
|
|
239
|
+
const fs = await import("node:fs/promises");
|
|
240
|
+
const cachePath = serverIdentityCachePath(storage.dir);
|
|
241
|
+
await withServerIdentityCacheWriteLock(cachePath, async () => {
|
|
242
|
+
// Merge with whatever is on disk NOW: a concurrent stream for the
|
|
243
|
+
// same namespace may have published newer entries after this
|
|
244
|
+
// request loaded its snapshot, and a blind whole-file replace
|
|
245
|
+
// would discard them.
|
|
246
|
+
const written = new Set(entries.map((entry) => entry.path));
|
|
247
|
+
const dropped = streamCompleted
|
|
248
|
+
? new Set([...identityCache.keys()].filter((pathName) => !written.has(pathName)))
|
|
249
|
+
: new Set<string>();
|
|
250
|
+
const merged = await mergeServerIdentityCacheEntries(
|
|
251
|
+
fs,
|
|
252
|
+
cachePath,
|
|
253
|
+
entries,
|
|
254
|
+
citationTemplate,
|
|
255
|
+
dropped
|
|
256
|
+
);
|
|
257
|
+
await fs.mkdir(nodePath.dirname(cachePath), { recursive: true });
|
|
258
|
+
const tmp = `${cachePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
259
|
+
await fs.writeFile(
|
|
260
|
+
tmp,
|
|
261
|
+
JSON.stringify({ citationTemplate: citationTemplateFingerprint(citationTemplate), files: merged })
|
|
262
|
+
);
|
|
263
|
+
await fs.rename(tmp, cachePath);
|
|
264
|
+
});
|
|
265
|
+
} catch {
|
|
266
|
+
// cache persistence is best-effort
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
try {
|
|
270
|
+
const applyClassification = (path: string, sha256: string): void => {
|
|
271
|
+
const classification = classificationUpdates.get(path);
|
|
272
|
+
if (classification === undefined) return;
|
|
273
|
+
const entry = persistedEntries.get(path) ?? { path, sha256 };
|
|
274
|
+
if (entry.statIdentity === classification.statIdentity && entry.excluded === classification.excluded) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
persistedEntries.set(path, {
|
|
278
|
+
...entry,
|
|
279
|
+
...(entry.memory ? { memory: entry.memory } : {}),
|
|
280
|
+
statIdentity: classification.statIdentity,
|
|
281
|
+
excluded: classification.excluded,
|
|
282
|
+
});
|
|
283
|
+
cacheDirty = true;
|
|
284
|
+
};
|
|
285
|
+
for await (const file of snapshotFiles) {
|
|
286
|
+
yieldedPaths.add(file.path);
|
|
287
|
+
const cached = identityCache.get(file.path);
|
|
288
|
+
if (
|
|
289
|
+
cached !== undefined &&
|
|
290
|
+
cached.sha256.toLowerCase() === file.sha256.toLowerCase() &&
|
|
291
|
+
isCachedIdentityReusable(cached)
|
|
292
|
+
) {
|
|
293
|
+
applyClassification(file.path, file.sha256);
|
|
294
|
+
yield {
|
|
295
|
+
...file,
|
|
296
|
+
...(cached.memory
|
|
297
|
+
? { memory: cached.memory }
|
|
298
|
+
: {
|
|
299
|
+
normalizerVersion: cached.normalizerVersion,
|
|
300
|
+
identityResolutionVersion: cached.identityResolutionVersion,
|
|
301
|
+
}),
|
|
302
|
+
};
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
const built = await buildReconcileManifestFile(
|
|
306
|
+
file,
|
|
307
|
+
async ({ path }) => storage.readOfflineSyncFile(nodePath.join(storage.dir, path)),
|
|
308
|
+
parseMemory,
|
|
309
|
+
citationTemplate
|
|
310
|
+
);
|
|
311
|
+
// Negative results persist too: a memory-shaped file that parses
|
|
312
|
+
// without an identity would otherwise be re-read on every warm run.
|
|
313
|
+
const previous = persistedEntries.get(built.path);
|
|
314
|
+
if (previous?.sha256 !== built.sha256 || (built.memory !== undefined && previous?.memory !== built.memory)) {
|
|
315
|
+
cacheDirty = true;
|
|
316
|
+
}
|
|
317
|
+
if (built.memory === undefined && built.normalizerVersion === undefined) {
|
|
318
|
+
// Read failed: do not persist a negative identity for this SHA.
|
|
319
|
+
yield built;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
persistedEntries.set(built.path, {
|
|
323
|
+
path: built.path,
|
|
324
|
+
sha256: built.sha256,
|
|
325
|
+
...(built.memory !== undefined
|
|
326
|
+
? { memory: built.memory }
|
|
327
|
+
: {
|
|
328
|
+
normalizerVersion: built.normalizerVersion,
|
|
329
|
+
identityResolutionVersion: built.identityResolutionVersion,
|
|
330
|
+
}),
|
|
331
|
+
});
|
|
332
|
+
applyClassification(built.path, built.sha256);
|
|
333
|
+
yield built;
|
|
334
|
+
}
|
|
335
|
+
streamCompleted = true;
|
|
336
|
+
} finally {
|
|
337
|
+
await flush();
|
|
57
338
|
}
|
|
58
339
|
})(),
|
|
59
340
|
};
|
|
@@ -833,11 +833,10 @@ export class AccessRecallSurface {
|
|
|
833
833
|
this.deps.budget.gc();
|
|
834
834
|
}
|
|
835
835
|
const topK = Number.isFinite(request.topK) ? Math.max(0, Math.floor(request.topK ?? 0)) : undefined;
|
|
836
|
-
// Issue #680 — historical recall pin. Validate at the input
|
|
837
|
-
//
|
|
838
|
-
//
|
|
839
|
-
//
|
|
840
|
-
// means "no pin".
|
|
836
|
+
// Issue #680 — historical recall pin. Validate at the input boundary so
|
|
837
|
+
// a malformed `asOf` is rejected with a structured 400 instead of
|
|
838
|
+
// silently flooring at NaN inside the orchestrator (rule 51, gotcha #51).
|
|
839
|
+
// Empty / undefined is fine — means "no pin".
|
|
841
840
|
let asOf: string | undefined;
|
|
842
841
|
if (request.asOf !== undefined && request.asOf !== null) {
|
|
843
842
|
if (typeof request.asOf !== "string" || request.asOf.trim().length === 0) {
|
|
@@ -863,6 +862,7 @@ export class AccessRecallSurface {
|
|
|
863
862
|
},
|
|
864
863
|
...(authenticatedPrincipal ? { principalOverride: authenticatedPrincipal } : {}),
|
|
865
864
|
...(request.sourceConnector ? { sourceConnector: request.sourceConnector } : {}),
|
|
865
|
+
...(request.stateView !== undefined ? { stateView: request.stateView } : {}),
|
|
866
866
|
...(asOf !== undefined ? { asOf } : {}),
|
|
867
867
|
...(request.includeLowConfidence === true ? { includeLowConfidence: true } : {}),
|
|
868
868
|
...(request.abortSignal ? { abortSignal: request.abortSignal } : {}),
|
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`
|