@remnic/core 9.69.39 → 9.69.41
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 +16 -14
- package/dist/access-admin-ops-surface.js +75 -74
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +16 -14
- package/dist/access-authorization-probe.js +76 -75
- package/dist/access-boundary.d.ts +16 -14
- package/dist/access-boundary.js +75 -74
- package/dist/access-cli.js +173 -170
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +16 -14
- package/dist/access-extraction-force-flush.js +75 -74
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +16 -14
- package/dist/access-http-briefing.js +76 -75
- package/dist/access-http-lcm-compaction.d.ts +16 -14
- package/dist/access-http-lifecycle-flush.d.ts +16 -14
- package/dist/access-http-offline-stream.d.ts +16 -14
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +77 -76
- package/dist/access-http.d.ts +17 -15
- package/dist/access-http.js +95 -92
- package/dist/access-identity-continuity-surface.d.ts +13 -12
- package/dist/access-identity-continuity-surface.js +75 -74
- package/dist/access-lcm-surface.d.ts +16 -14
- package/dist/access-lcm-surface.js +75 -74
- package/dist/access-mcp-shared-context-tools.d.ts +156 -0
- package/dist/access-mcp-shared-context-tools.js +8 -0
- package/dist/access-mcp.d.ts +16 -14
- package/dist/access-mcp.js +86 -83
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-DWsMc9Dh.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +75 -74
- package/dist/access-observe-transcript.d.ts +13 -12
- package/dist/access-observe-write-category.d.ts +1 -1
- package/dist/access-observe-write-category.js +4 -4
- package/dist/access-observe-write-surface.d.ts +16 -14
- package/dist/access-observe-write-surface.js +75 -74
- package/dist/access-offline-manifest.d.ts +37 -13
- package/dist/access-offline-manifest.js +15 -11
- package/dist/access-operations-batch.js +79 -77
- package/dist/access-operations.d.ts +16 -14
- package/dist/access-operations.js +84 -82
- package/dist/access-recall-concurrency.d.ts +16 -14
- package/dist/access-recall-concurrency.js +75 -74
- package/dist/access-recall-response.d.ts +16 -14
- package/dist/access-recall-response.js +75 -74
- package/dist/access-recall-surface.d.ts +16 -14
- package/dist/access-recall-surface.js +75 -74
- package/dist/access-schema.d.ts +5 -3
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-MY4bsr_Q.d.ts → access-service-Cisy5YDq.d.ts} +14 -9
- package/dist/access-service-helpers.d.ts +16 -14
- package/dist/access-service.d.ts +16 -14
- package/dist/access-service.js +75 -74
- package/dist/access-surface-catalog.d.ts +16 -14
- package/dist/access-surface-catalog.js +77 -76
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +6 -5
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-memory-bridge.js +3 -3
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +10 -9
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +1 -1
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-7PGUFY7U.js} +7 -7
- package/dist/background-generation-config.d.ts +1 -1
- package/dist/background-generation-config.js +3 -1
- package/dist/background-generation.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +13 -12
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +23 -23
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +7 -7
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +3 -2
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
- package/dist/{catalog-CW87xGx8.d.ts → catalog-wcX1QhtQ.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +29 -28
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
- package/dist/chunk-27NO2KVB.js.map +1 -0
- package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
- package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
- package/dist/{chunk-XH3HGI2N.js → chunk-2HQPE2NM.js} +2 -2
- package/dist/{chunk-3EKVN2OP.js → chunk-2ZG2LLZT.js} +2 -2
- package/dist/{chunk-6EHM2AV7.js → chunk-3BLHPQHT.js} +5 -5
- package/dist/{chunk-YKREX63Z.js → chunk-3D75XIYO.js} +5 -3
- package/dist/chunk-3D75XIYO.js.map +1 -0
- package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
- package/dist/{chunk-F4EHXVP7.js → chunk-46RII65S.js} +2 -2
- package/dist/{chunk-YUW66UAH.js → chunk-4AX5OYKC.js} +2 -2
- package/dist/{chunk-AECJY3GJ.js → chunk-4IGOLIWM.js} +2 -2
- package/dist/{chunk-2ZTDRNCS.js → chunk-54QPOE45.js} +2 -2
- package/dist/{chunk-O4M4BDIJ.js → chunk-563X6JJX.js} +2 -2
- package/dist/{chunk-IL6ODG6M.js → chunk-5EQT62HH.js} +2 -2
- package/dist/{chunk-JKKII6GX.js → chunk-6MQMYXSQ.js} +2 -2
- package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
- package/dist/{chunk-BV4ZKIZH.js → chunk-7ZLC4DTZ.js} +5 -4
- package/dist/{chunk-WBM2MVBK.js → chunk-A4OIJYCV.js} +2 -2
- package/dist/{chunk-RLJHJQUY.js → chunk-AFJHNHAM.js} +8 -8
- package/dist/{chunk-6YAIN5XJ.js → chunk-AIVRD66I.js} +44 -6
- package/dist/chunk-AIVRD66I.js.map +1 -0
- package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
- package/dist/chunk-AJBWVDRV.js.map +1 -0
- package/dist/{chunk-4RZLTZVM.js → chunk-AKABVXFS.js} +2 -2
- package/dist/{chunk-M6HBPLBA.js → chunk-AUSRUOMQ.js} +2 -2
- package/dist/{chunk-QHT7MOUF.js → chunk-BTPCP535.js} +25 -14
- package/dist/chunk-BTPCP535.js.map +1 -0
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-Q7CLGFA7.js → chunk-C3G6MW4W.js} +3 -3
- package/dist/{chunk-O76F5QPP.js → chunk-D6PY63OM.js} +2 -2
- package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
- package/dist/{chunk-LMLGBG6H.js → chunk-DBB5JPSL.js} +2 -2
- package/dist/{chunk-TSP5WH72.js → chunk-DIXZQTGY.js} +2 -2
- package/dist/{chunk-P4ZAEYKG.js → chunk-DM5CU5J7.js} +7 -4
- package/dist/chunk-DM5CU5J7.js.map +1 -0
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-UHRZ324M.js → chunk-E3I3NDUP.js} +4 -4
- package/dist/{chunk-AENM6GKU.js → chunk-E4LMQTST.js} +2 -2
- package/dist/{chunk-YDVAM7S4.js → chunk-EH3HNCAM.js} +13 -8
- package/dist/chunk-EH3HNCAM.js.map +1 -0
- package/dist/{chunk-MUTVRKKY.js → chunk-EMSYMYXO.js} +14 -14
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-FXHOZGSE.js → chunk-F5H6YG5P.js} +2 -2
- package/dist/{chunk-TRLOFIQC.js → chunk-FGFC2EFR.js} +14 -13
- package/dist/chunk-FGFC2EFR.js.map +1 -0
- package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
- package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
- package/dist/{chunk-EYKIDK33.js → chunk-GMH5QPUU.js} +22 -22
- package/dist/chunk-GMH5QPUU.js.map +1 -0
- package/dist/{chunk-4BCHFSC7.js → chunk-GWNSKQDA.js} +3 -3
- package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
- package/dist/{chunk-GG5FHZJJ.js → chunk-I33QYUAF.js} +6 -6
- package/dist/{chunk-LPYYY4AP.js → chunk-I46BYY7U.js} +653 -328
- package/dist/chunk-I46BYY7U.js.map +1 -0
- package/dist/{chunk-CZTPU65V.js → chunk-ICN37XHG.js} +74 -27
- package/dist/chunk-ICN37XHG.js.map +1 -0
- package/dist/chunk-IFBSZGW3.js +42 -0
- package/dist/chunk-IFBSZGW3.js.map +1 -0
- package/dist/{chunk-AAZEKXUP.js → chunk-IYIPXAIJ.js} +2 -2
- package/dist/{chunk-ACY4ZPF7.js → chunk-J2MGTGKC.js} +10 -5
- package/dist/chunk-J2MGTGKC.js.map +1 -0
- package/dist/chunk-JATHBCAV.js +94 -0
- package/dist/chunk-JATHBCAV.js.map +1 -0
- package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
- package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
- package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
- package/dist/{chunk-UZZ7SQT3.js → chunk-JMWUPUE6.js} +2 -2
- package/dist/{chunk-ENBPQEVU.js → chunk-JSD7Q7LD.js} +2 -2
- package/dist/{chunk-QTQ6XKGT.js → chunk-K5D2XVNN.js} +4 -4
- package/dist/chunk-K5D2XVNN.js.map +1 -0
- package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
- package/dist/chunk-KG2OOAFF.js.map +1 -0
- package/dist/{chunk-Q432REND.js → chunk-KJLLPG26.js} +2 -2
- package/dist/{chunk-JTQR6L2N.js → chunk-KLUC2GSG.js} +6 -6
- package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
- package/dist/{chunk-PCOVEDPK.js → chunk-KZJM7R4F.js} +3 -3
- package/dist/{chunk-X4TD4O2F.js → chunk-LE2KZ72G.js} +3 -3
- package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
- package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
- package/dist/{chunk-FWWWUPOE.js → chunk-MCMS4VUK.js} +25 -15
- package/dist/chunk-MCMS4VUK.js.map +1 -0
- package/dist/{chunk-5SPCMAUC.js → chunk-N6XTC56E.js} +13 -81
- package/dist/chunk-N6XTC56E.js.map +1 -0
- package/dist/{chunk-VBSNUH4J.js → chunk-ND7MAIJC.js} +2 -2
- package/dist/{chunk-TNZNSMVJ.js → chunk-NYWCFC3K.js} +301 -348
- package/dist/chunk-NYWCFC3K.js.map +1 -0
- package/dist/{chunk-54NX5EG4.js → chunk-P66QH6R6.js} +2 -2
- package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
- package/dist/{chunk-TA4C3XB7.js → chunk-PFKIOYJH.js} +2 -2
- package/dist/{chunk-WIWLX65T.js → chunk-PGGPRF6J.js} +2 -2
- package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
- package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
- package/dist/chunk-PJRKLB4Z.js.map +1 -0
- package/dist/{chunk-4JVQRFZD.js → chunk-PLJ2MQFT.js} +11 -11
- package/dist/{chunk-4RX5O34R.js → chunk-PQ42DJNG.js} +2 -2
- package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
- package/dist/{chunk-ZEGL7YCC.js → chunk-Q62GA5U2.js} +2 -2
- package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
- package/dist/chunk-QKCXRS5A.js.map +1 -0
- package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
- package/dist/chunk-QM2SPLKQ.js.map +1 -0
- package/dist/{chunk-GAS7KYC7.js → chunk-RQQO3ORQ.js} +2 -2
- package/dist/{chunk-UZEHHXYC.js → chunk-S4MJTIPG.js} +85 -81
- package/dist/chunk-S4MJTIPG.js.map +1 -0
- package/dist/chunk-SK7D34OL.js +68 -0
- package/dist/chunk-SK7D34OL.js.map +1 -0
- package/dist/{chunk-LQNRVPTV.js → chunk-TRTLWUDD.js} +164 -130
- package/dist/chunk-TRTLWUDD.js.map +1 -0
- package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
- package/dist/chunk-U2VDCFXW.js.map +1 -0
- package/dist/{chunk-CWTCMZGE.js → chunk-UHSOPTNB.js} +132 -6
- package/dist/chunk-UHSOPTNB.js.map +1 -0
- package/dist/{chunk-3NPNBVFR.js → chunk-UZGHKD3T.js} +2 -2
- package/dist/{chunk-IQEJIOEU.js → chunk-V2EXYQEQ.js} +20 -12
- package/dist/chunk-V2EXYQEQ.js.map +1 -0
- package/dist/{chunk-OPBFP4TF.js → chunk-V2TOGJPM.js} +46 -13
- package/dist/chunk-V2TOGJPM.js.map +1 -0
- package/dist/{chunk-VJIE4D2I.js → chunk-V62YYBBY.js} +4 -4
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
- package/dist/chunk-VNQRRUNS.js.map +1 -0
- package/dist/{chunk-6AGWBKQU.js → chunk-VSN2DMQK.js} +2 -2
- package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
- package/dist/{chunk-GI4ZBWPQ.js → chunk-W7UV2ZCA.js} +3 -3
- package/dist/{chunk-GMIQV6DD.js → chunk-WBQ4ONQJ.js} +2 -2
- package/dist/{chunk-FNHLI2RE.js → chunk-WFMQN7JE.js} +3 -3
- package/dist/{chunk-MVAQ2WM3.js → chunk-WGZHSQDV.js} +9 -5
- package/dist/chunk-WGZHSQDV.js.map +1 -0
- package/dist/{chunk-IYKZJVL5.js → chunk-WN2OXGGH.js} +1 -1
- package/dist/chunk-WN2OXGGH.js.map +1 -0
- package/dist/{chunk-ZBW7A667.js → chunk-WPGA4RYI.js} +2 -2
- package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
- package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
- package/dist/chunk-WUUGE7QC.js.map +1 -0
- package/dist/{chunk-NXGSONWM.js → chunk-WZIO3TW6.js} +2 -2
- package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
- package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
- package/dist/chunk-XCPNH2MG.js.map +1 -0
- package/dist/{chunk-VSL63CFJ.js → chunk-XRS65T4O.js} +9 -9
- package/dist/{chunk-5N4MZLEH.js → chunk-YFXAWGMR.js} +2 -2
- package/dist/{chunk-KQW3YGEN.js → chunk-YR5QT4SR.js} +32 -9
- package/dist/chunk-YR5QT4SR.js.map +1 -0
- package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
- package/dist/chunk-Z22M4JCY.js.map +1 -0
- package/dist/{chunk-D545Z7UH.js → chunk-Z535ADTC.js} +3 -3
- package/dist/{chunk-B36GUU6T.js → chunk-Z7NBT6AK.js} +38 -5
- package/dist/chunk-Z7NBT6AK.js.map +1 -0
- package/dist/{chunk-5YCNDC3C.js → chunk-ZX6NNFSY.js} +3 -3
- package/dist/{chunk-3N3PBBEH.js → chunk-ZYSOT6HD.js} +2 -2
- package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZEIL3MI.js} +2 -2
- package/dist/{cli-DGq0MNpO.d.ts → cli-CUlMlS2N.d.ts} +5 -5
- package/dist/cli.d.ts +18 -16
- package/dist/cli.js +129 -126
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +22 -22
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +25 -25
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +10 -9
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +25 -25
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/codex-materialize.js +2 -2
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +25 -25
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +6 -5
- package/dist/contradiction/index.js +4 -4
- package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +26 -26
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +25 -25
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +1 -1
- package/dist/deep-recall-config.d.ts +12 -1
- package/dist/deep-recall-config.js +5 -3
- package/dist/deep-recall-http-glue.d.ts +19 -15
- package/dist/deep-recall-http-glue.js +7 -4
- package/dist/deep-recall-mcp-tools.d.ts +16 -14
- package/dist/deep-recall-policy-llm.d.ts +14 -3
- package/dist/deep-recall-policy-llm.js +3 -3
- package/dist/deep-recall-seeds.d.ts +4 -1
- package/dist/deep-recall-seeds.js +1 -1
- package/dist/deep-recall.d.ts +12 -1
- package/dist/deep-recall.js +3 -2
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-BDDjImQn.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-origin-fields.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +24 -24
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/eval-trajectory-contracts.d.ts +1 -1
- package/dist/eval-trajectory-store.d.ts +1 -1
- package/dist/eval-trajectory.d.ts +1 -1
- package/dist/explicit-capture.d.ts +13 -12
- package/dist/explicit-capture.js +3 -3
- package/dist/external-wiki-access.d.ts +16 -14
- package/dist/external-wiki-access.js +76 -75
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +16 -14
- package/dist/extraction-error-classification.d.ts +14 -3
- package/dist/extraction-error-classification.js +5 -3
- package/dist/extraction-faithfulness.d.ts +4 -3
- package/dist/extraction-faithfulness.js +3 -3
- package/dist/extraction-judge-telemetry.d.ts +4 -3
- package/dist/extraction-judge-training.d.ts +4 -3
- package/dist/extraction-judge.d.ts +4 -3
- package/dist/extraction-judge.js +3 -3
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-normalization.d.ts +1 -1
- package/dist/extraction-prompt.d.ts +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction-span-config.d.ts +1 -1
- package/dist/extraction-span-materialize.d.ts +1 -1
- package/dist/extraction.d.ts +4 -4
- package/dist/extraction.js +40 -38
- package/dist/fallback-llm-codex-subscription.d.ts +65 -10
- package/dist/fallback-llm-codex-subscription.js +19 -1
- package/dist/fallback-llm.d.ts +25 -28
- package/dist/fallback-llm.js +4 -3
- package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
- package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpDzNO_I.d.ts} +1 -1
- package/dist/graph-append-error.d.ts +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-jsonl.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/harmonic-retrieval.js +3 -3
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/importers/test-utils.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-DWOb4wz9.d.ts → index-CtmmCJoo.d.ts} +3 -3
- package/dist/index.d.ts +80 -40
- package/dist/index.js +316 -296
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +11 -11
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm-DpXIvm6F.d.ts +247 -0
- package/dist/local-llm-config.d.ts +4 -1
- package/dist/local-llm-config.js +4 -2
- package/dist/local-llm-helpers.d.ts +18 -69
- package/dist/local-llm-helpers.js +1 -1
- package/dist/local-llm.d.ts +3 -170
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +3 -3
- package/dist/location/index.js +25 -25
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +24 -24
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +25 -25
- package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CNgoLsoM.d.ts} +13 -6
- package/dist/mcp-memory-inspector-app.d.ts +16 -14
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-controller.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-snapshot.d.ts +1 -1
- package/dist/memory-subject-cli.d.ts +16 -14
- package/dist/memory-subject.d.ts +16 -14
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +24 -24
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +12 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +23 -23
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +26 -26
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +45 -44
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +36 -36
- package/dist/{orchestrator-ComHLm49.d.ts → orchestrator-DT7ybIFz.d.ts} +32 -11
- package/dist/orchestrator.d.ts +13 -12
- package/dist/orchestrator.js +176 -171
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-CgBEmHcz.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +2 -2
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-CuK4_Cb1.d.ts → public-http-C8P8fyiO.d.ts} +1 -1
- package/dist/{qmd-qXD4vatU.d.ts → qmd-BkY8KpCh.d.ts} +2 -2
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/qmd.js +2 -2
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-navigate-access.d.ts +1 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +1 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +3 -2
- package/dist/recall-planner-llm.js +4 -3
- package/dist/recall-planner-llm.js.map +1 -1
- package/dist/recall-state-view-admission.d.ts +13 -3
- package/dist/recall-state-view-admission.js +9 -9
- package/dist/recall-state-view-anchors.d.ts +1 -1
- package/dist/recall-state-view-anchors.js +2 -2
- package/dist/recall-state-view-inject.js +2 -2
- package/dist/recall-state-view-render.js +2 -2
- package/dist/recall-state-view-widen.js +2 -2
- package/dist/recall-state-view-wire.js +3 -3
- package/dist/recall-state-view.d.ts +10 -1
- package/dist/recall-state-view.js +5 -3
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/cursor.js +2 -2
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/manifest.js +4 -4
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/reconcile/plan.js +2 -2
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +5 -5
- package/dist/resolution-LXFQQ4AE.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +12 -11
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BBPjZ9jb.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +2 -2
- package/dist/search/port.js +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-BPFFVO84.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +26 -26
- package/dist/semantic-rule-promotion.js +23 -23
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +23 -23
- package/dist/{service-CLkA7AQB.d.ts → service-jKcr6Jvr.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +1 -1
- package/dist/shared-context/manager.js +2 -2
- package/dist/shared-context/write-output-controls.d.ts +34 -0
- package/dist/shared-context/write-output-controls.js +10 -0
- package/dist/shared-context/write-output-controls.js.map +1 -0
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +31 -31
- package/dist/source-attribution.d.ts +23 -1
- package/dist/source-attribution.js +13 -3
- package/dist/standup/build.js +23 -23
- package/dist/{storage-wvX01lht.d.ts → storage-C-0Ah5OY.d.ts} +2 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +22 -22
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +6 -6
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +18 -17
- package/dist/support-passport/index.js +78 -77
- package/dist/task-llm-config.d.ts +16 -0
- package/dist/task-llm-config.js +12 -0
- package/dist/task-llm-config.js.map +1 -0
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/tier-routing.js +3 -3
- package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +3 -3
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +23 -23
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-Cyr32ABj.d.ts → types-cK5LydjL.d.ts} +6 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +23 -23
- package/dist/who-knows-cli.d.ts +16 -14
- package/dist/who-knows-cli.js +24 -24
- package/dist/who-knows.d.ts +16 -14
- package/dist/who-knows.js +23 -23
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +12 -2
- package/src/access-category-alias.test.ts +93 -0
- package/src/access-http.ts +1 -1
- package/src/access-mcp-shared-context-tools.ts +103 -0
- package/src/access-mcp.ts +4 -74
- package/src/access-offline-manifest.ts +52 -2
- package/src/access-operations-batch.ts +45 -2
- package/src/access-schema.ts +9 -4
- package/src/access-service.ts +14 -7
- package/src/activity/config.test.ts +61 -0
- package/src/activity/config.ts +40 -1
- package/src/activity/timeline/analysis-provider.ts +8 -2
- package/src/activity/timeline/analysis-run.test.ts +82 -0
- package/src/activity/timeline/publish-cli.test.ts +30 -0
- package/src/activity/timeline/publish-cli.ts +7 -0
- package/src/activity/timeline/query.ts +8 -1
- package/src/activity/timeline/regenerate.test.ts +130 -2
- package/src/activity/timeline/regenerate.ts +14 -6
- package/src/activity/vault-frontmatter.test.ts +99 -1
- package/src/activity/vault-frontmatter.ts +131 -0
- package/src/activity/vault-publish.ts +6 -0
- package/src/activity/vault-publisher.test.ts +172 -0
- package/src/activity/vault-publisher.ts +69 -15
- package/src/activity/vault-region.test.ts +7 -2
- package/src/activity/vault-region.ts +7 -3
- package/src/background-generation-config.ts +32 -6
- package/src/background-generation.test.ts +10 -1
- package/src/cli/deep-recall-commands.ts +22 -10
- package/src/cli/timeline-publish-commands.ts +9 -0
- package/src/config.test.ts +170 -43
- package/src/config.ts +22 -5
- package/src/dedup/merge.test.ts +283 -0
- package/src/deep-recall-boundary.test.ts +66 -0
- package/src/deep-recall-cli.test.ts +82 -0
- package/src/deep-recall-config.test.ts +56 -0
- package/src/deep-recall-config.ts +32 -0
- package/src/deep-recall-http-glue.ts +10 -10
- package/src/deep-recall-policy-llm.test.ts +242 -0
- package/src/deep-recall-policy-llm.ts +37 -7
- package/src/deep-recall-seeds.test.ts +53 -0
- package/src/deep-recall-seeds.ts +7 -1
- package/src/deep-recall-surface.test.ts +93 -0
- package/src/deep-recall.test.ts +121 -0
- package/src/deep-recall.ts +88 -28
- package/src/extraction-error-classification.ts +36 -1
- package/src/extraction-timeout.test.ts +110 -1
- package/src/extraction.test.ts +19 -1
- package/src/extraction.ts +23 -21
- package/src/fallback-llm-codex-subscription.ts +220 -12
- package/src/fallback-llm-parse-failure.test.ts +156 -0
- package/src/fallback-llm.test.ts +178 -0
- package/src/fallback-llm.ts +200 -198
- package/src/index.ts +1 -0
- package/src/local-llm-config.ts +11 -10
- package/src/local-llm-headers-timeout.test.ts +30 -0
- package/src/local-llm-helpers.ts +28 -0
- package/src/local-llm.ts +8 -19
- package/src/meetings/config.test.ts +58 -0
- package/src/namespaces/search.test.ts +51 -1
- package/src/namespaces/search.ts +48 -3
- package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
- package/src/orchestration/extraction-persist-promotion.ts +17 -14
- package/src/orchestration/extraction-persist.ts +1 -1
- package/src/orchestration/orchestrator-helpers.test.ts +104 -0
- package/src/orchestration/orchestrator-init.ts +366 -106
- package/src/orchestration/recall-entry.ts +15 -1
- package/src/orchestration/recall-internal.ts +6 -11
- package/src/orchestration/recall-section-coordinator.ts +65 -28
- package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
- package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
- package/src/orchestration/semantic-merge-persist.ts +23 -36
- package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
- package/src/orchestration/startup-collection-checks.ts +85 -0
- package/src/orchestrator-flush.test.ts +7 -0
- package/src/orchestrator-init.test.ts +1539 -0
- package/src/orchestrator.ts +7 -0
- package/src/providers/codex-subscription.test.ts +127 -0
- package/src/providers/codex-subscription.ts +1 -1
- package/src/qmd.ts +21 -10
- package/src/recall-state-view-admission.ts +11 -1
- package/src/recall-state-view-budget.test.ts +424 -0
- package/src/recall-state-view-cron-intent.test.ts +268 -0
- package/src/recall-state-view-widen.test.ts +14 -5
- package/src/recall-state-view-widen.ts +8 -1
- package/src/recall-state-view.ts +35 -18
- package/src/reconcile-identity-cache.test.ts +82 -1
- package/src/search/port.ts +1 -1
- package/src/shared-context/envelope-io.ts +25 -0
- package/src/shared-context/envelope-wiring.test.ts +4 -2
- package/src/shared-context/manager.ts +1 -0
- package/src/shared-context/write-output-controls.test.ts +192 -0
- package/src/shared-context/write-output-controls.ts +72 -0
- package/src/source-attribution.test.ts +39 -0
- package/src/source-attribution.ts +72 -0
- package/src/storage/cas-revision-store.test.ts +4 -0
- package/src/storage/cas-revision-store.ts +104 -12
- package/src/storage-frontmatter-cas.test.ts +19 -17
- package/src/summarizer.ts +5 -1
- package/src/task-llm-config.test.ts +124 -0
- package/src/task-llm-config.ts +88 -0
- package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
- package/src/types.ts +6 -0
- package/dist/chunk-3CBI2ZSA.js.map +0 -1
- package/dist/chunk-5HYUUFMQ.js.map +0 -1
- package/dist/chunk-5SPCMAUC.js.map +0 -1
- package/dist/chunk-6H2G7RFT.js.map +0 -1
- package/dist/chunk-6YAIN5XJ.js.map +0 -1
- package/dist/chunk-ACY4ZPF7.js.map +0 -1
- package/dist/chunk-B36GUU6T.js.map +0 -1
- package/dist/chunk-BLDBT6HZ.js.map +0 -1
- package/dist/chunk-CARRTDKC.js.map +0 -1
- package/dist/chunk-CC37E3QM.js.map +0 -1
- package/dist/chunk-CWTCMZGE.js.map +0 -1
- package/dist/chunk-CZTPU65V.js.map +0 -1
- package/dist/chunk-EYKIDK33.js.map +0 -1
- package/dist/chunk-FWWWUPOE.js.map +0 -1
- package/dist/chunk-IQEJIOEU.js.map +0 -1
- package/dist/chunk-IYKZJVL5.js.map +0 -1
- package/dist/chunk-JXN77SGO.js.map +0 -1
- package/dist/chunk-KQW3YGEN.js.map +0 -1
- package/dist/chunk-LPYYY4AP.js.map +0 -1
- package/dist/chunk-LQNRVPTV.js.map +0 -1
- package/dist/chunk-MVAQ2WM3.js.map +0 -1
- package/dist/chunk-OEDW4ER7.js.map +0 -1
- package/dist/chunk-OPBFP4TF.js.map +0 -1
- package/dist/chunk-P4ZAEYKG.js.map +0 -1
- package/dist/chunk-QHT7MOUF.js.map +0 -1
- package/dist/chunk-QTQ6XKGT.js.map +0 -1
- package/dist/chunk-SV4Z2S67.js.map +0 -1
- package/dist/chunk-TNZNSMVJ.js.map +0 -1
- package/dist/chunk-TRLOFIQC.js.map +0 -1
- package/dist/chunk-UZEHHXYC.js.map +0 -1
- package/dist/chunk-WKDFJXW5.js.map +0 -1
- package/dist/chunk-YDVAM7S4.js.map +0 -1
- package/dist/chunk-YFTNZMGR.js.map +0 -1
- package/dist/chunk-YKREX63Z.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
- /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-7PGUFY7U.js.map} +0 -0
- /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
- /package/dist/{chunk-XH3HGI2N.js.map → chunk-2HQPE2NM.js.map} +0 -0
- /package/dist/{chunk-3EKVN2OP.js.map → chunk-2ZG2LLZT.js.map} +0 -0
- /package/dist/{chunk-6EHM2AV7.js.map → chunk-3BLHPQHT.js.map} +0 -0
- /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
- /package/dist/{chunk-F4EHXVP7.js.map → chunk-46RII65S.js.map} +0 -0
- /package/dist/{chunk-YUW66UAH.js.map → chunk-4AX5OYKC.js.map} +0 -0
- /package/dist/{chunk-AECJY3GJ.js.map → chunk-4IGOLIWM.js.map} +0 -0
- /package/dist/{chunk-2ZTDRNCS.js.map → chunk-54QPOE45.js.map} +0 -0
- /package/dist/{chunk-O4M4BDIJ.js.map → chunk-563X6JJX.js.map} +0 -0
- /package/dist/{chunk-IL6ODG6M.js.map → chunk-5EQT62HH.js.map} +0 -0
- /package/dist/{chunk-JKKII6GX.js.map → chunk-6MQMYXSQ.js.map} +0 -0
- /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
- /package/dist/{chunk-BV4ZKIZH.js.map → chunk-7ZLC4DTZ.js.map} +0 -0
- /package/dist/{chunk-WBM2MVBK.js.map → chunk-A4OIJYCV.js.map} +0 -0
- /package/dist/{chunk-RLJHJQUY.js.map → chunk-AFJHNHAM.js.map} +0 -0
- /package/dist/{chunk-4RZLTZVM.js.map → chunk-AKABVXFS.js.map} +0 -0
- /package/dist/{chunk-M6HBPLBA.js.map → chunk-AUSRUOMQ.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-Q7CLGFA7.js.map → chunk-C3G6MW4W.js.map} +0 -0
- /package/dist/{chunk-O76F5QPP.js.map → chunk-D6PY63OM.js.map} +0 -0
- /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
- /package/dist/{chunk-LMLGBG6H.js.map → chunk-DBB5JPSL.js.map} +0 -0
- /package/dist/{chunk-TSP5WH72.js.map → chunk-DIXZQTGY.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-UHRZ324M.js.map → chunk-E3I3NDUP.js.map} +0 -0
- /package/dist/{chunk-AENM6GKU.js.map → chunk-E4LMQTST.js.map} +0 -0
- /package/dist/{chunk-MUTVRKKY.js.map → chunk-EMSYMYXO.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-FXHOZGSE.js.map → chunk-F5H6YG5P.js.map} +0 -0
- /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
- /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
- /package/dist/{chunk-4BCHFSC7.js.map → chunk-GWNSKQDA.js.map} +0 -0
- /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
- /package/dist/{chunk-GG5FHZJJ.js.map → chunk-I33QYUAF.js.map} +0 -0
- /package/dist/{chunk-AAZEKXUP.js.map → chunk-IYIPXAIJ.js.map} +0 -0
- /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
- /package/dist/{chunk-UZZ7SQT3.js.map → chunk-JMWUPUE6.js.map} +0 -0
- /package/dist/{chunk-ENBPQEVU.js.map → chunk-JSD7Q7LD.js.map} +0 -0
- /package/dist/{chunk-Q432REND.js.map → chunk-KJLLPG26.js.map} +0 -0
- /package/dist/{chunk-JTQR6L2N.js.map → chunk-KLUC2GSG.js.map} +0 -0
- /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
- /package/dist/{chunk-PCOVEDPK.js.map → chunk-KZJM7R4F.js.map} +0 -0
- /package/dist/{chunk-X4TD4O2F.js.map → chunk-LE2KZ72G.js.map} +0 -0
- /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
- /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
- /package/dist/{chunk-VBSNUH4J.js.map → chunk-ND7MAIJC.js.map} +0 -0
- /package/dist/{chunk-54NX5EG4.js.map → chunk-P66QH6R6.js.map} +0 -0
- /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
- /package/dist/{chunk-TA4C3XB7.js.map → chunk-PFKIOYJH.js.map} +0 -0
- /package/dist/{chunk-WIWLX65T.js.map → chunk-PGGPRF6J.js.map} +0 -0
- /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
- /package/dist/{chunk-4JVQRFZD.js.map → chunk-PLJ2MQFT.js.map} +0 -0
- /package/dist/{chunk-4RX5O34R.js.map → chunk-PQ42DJNG.js.map} +0 -0
- /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
- /package/dist/{chunk-ZEGL7YCC.js.map → chunk-Q62GA5U2.js.map} +0 -0
- /package/dist/{chunk-GAS7KYC7.js.map → chunk-RQQO3ORQ.js.map} +0 -0
- /package/dist/{chunk-3NPNBVFR.js.map → chunk-UZGHKD3T.js.map} +0 -0
- /package/dist/{chunk-VJIE4D2I.js.map → chunk-V62YYBBY.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-6AGWBKQU.js.map → chunk-VSN2DMQK.js.map} +0 -0
- /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
- /package/dist/{chunk-GI4ZBWPQ.js.map → chunk-W7UV2ZCA.js.map} +0 -0
- /package/dist/{chunk-GMIQV6DD.js.map → chunk-WBQ4ONQJ.js.map} +0 -0
- /package/dist/{chunk-FNHLI2RE.js.map → chunk-WFMQN7JE.js.map} +0 -0
- /package/dist/{chunk-ZBW7A667.js.map → chunk-WPGA4RYI.js.map} +0 -0
- /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
- /package/dist/{chunk-NXGSONWM.js.map → chunk-WZIO3TW6.js.map} +0 -0
- /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
- /package/dist/{chunk-VSL63CFJ.js.map → chunk-XRS65T4O.js.map} +0 -0
- /package/dist/{chunk-5N4MZLEH.js.map → chunk-YFXAWGMR.js.map} +0 -0
- /package/dist/{chunk-D545Z7UH.js.map → chunk-Z535ADTC.js.map} +0 -0
- /package/dist/{chunk-5YCNDC3C.js.map → chunk-ZX6NNFSY.js.map} +0 -0
- /package/dist/{chunk-3N3PBBEH.js.map → chunk-ZYSOT6HD.js.map} +0 -0
- /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZEIL3MI.js.map} +0 -0
- /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
- /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
- /package/dist/{tier-stats-LUSUUNU6.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
|
@@ -96,11 +96,20 @@ test("#1952 precedence is OR: per-call false never disables a global true", () =
|
|
|
96
96
|
assert.equal(labeled[1]?.stateLabel, "historical");
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
test("#
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
test("#2893 threaded stateViewActive is trusted: no intent re-check at the seam", () => {
|
|
100
|
+
// The threaded flag means change intent was already classified on the
|
|
101
|
+
// ORIGINAL prompt at recall entry (resolveRecallStateViewActive); the
|
|
102
|
+
// query reaching this seam is the cron-normalized retrievalQuery and
|
|
103
|
+
// can lack the intent signal. Non-change ORIGINAL prompts never thread
|
|
104
|
+
// a true flag — pinned in recall-state-view-cron-intent.test.ts.
|
|
105
|
+
const labeled = widenRecallStateViews([CURRENT], NON_CHANGE, { recallStateViews: false }, [HISTORICAL], true);
|
|
106
|
+
assert.deepEqual(
|
|
107
|
+
labeled.map((row) => [row.id, row.stateLabel]),
|
|
108
|
+
[
|
|
109
|
+
["new-job", "current"],
|
|
110
|
+
["old-job", "historical"],
|
|
111
|
+
],
|
|
112
|
+
);
|
|
104
113
|
});
|
|
105
114
|
|
|
106
115
|
test("asOf mode keeps a pin-filtered predecessor and never widens the pool (#1952)", () => {
|
|
@@ -43,7 +43,13 @@ export function widenRecallStateViews<T extends StateViewResult>(
|
|
|
43
43
|
? config.recallStateViews
|
|
44
44
|
: undefined;
|
|
45
45
|
const enabled = stateViewActive === true || parseRecallStateViews(raw);
|
|
46
|
-
if (!enabled
|
|
46
|
+
if (!enabled) return results;
|
|
47
|
+
// #2893 — a threaded stateViewActive was gated on change intent
|
|
48
|
+
// classified from the ORIGINAL prompt at recall entry; `query` here is
|
|
49
|
+
// the cron-normalized retrievalQuery and may have lost the intent
|
|
50
|
+
// signal (truncation / stop-word compaction), so do not re-check it.
|
|
51
|
+
// Only the legacy config-only path re-checks intent against this query.
|
|
52
|
+
if (stateViewActive !== true && !isChangeOrientedQuery(query)) return results;
|
|
47
53
|
const asOfActive = typeof asOfMs === "number" && Number.isFinite(asOfMs);
|
|
48
54
|
|
|
49
55
|
// #2859: matches are namespace-qualified, and a successor's `supersedes`
|
|
@@ -79,6 +85,7 @@ export function widenRecallStateViews<T extends StateViewResult>(
|
|
|
79
85
|
|
|
80
86
|
return annotateStateView(extra.length > 0 ? results.concat(extra) : results, query, [], {
|
|
81
87
|
enabled: true,
|
|
88
|
+
...(stateViewActive === true ? { changeIntent: true } : {}),
|
|
82
89
|
...(asOfActive ? { asOfMs } : {}),
|
|
83
90
|
});
|
|
84
91
|
}
|
package/src/recall-state-view.ts
CHANGED
|
@@ -205,10 +205,13 @@ export function annotateStateView<T extends StateViewResult>(
|
|
|
205
205
|
results: T[],
|
|
206
206
|
query: string,
|
|
207
207
|
chains: readonly StateViewChain[],
|
|
208
|
-
options: { enabled?: boolean; asOfMs?: number } = {},
|
|
208
|
+
options: { enabled?: boolean; asOfMs?: number; changeIntent?: boolean } = {},
|
|
209
209
|
): T[] {
|
|
210
210
|
const enabled = options.enabled === true;
|
|
211
|
-
|
|
211
|
+
// #2893 — changeIntent:true marks intent as already classified from the
|
|
212
|
+
// ORIGINAL prompt; `query` may be cron-normalized (intent signal
|
|
213
|
+
// truncated or stop-worded away) and must not be re-checked then.
|
|
214
|
+
if (!enabled || (options.changeIntent !== true && !isChangeOrientedQuery(query))) return results;
|
|
212
215
|
// #1952 asOf mode: under a historical pin the pipeline's isValidAsOf
|
|
213
216
|
// gate already decided validity at the pinned instant, so a predecessor
|
|
214
217
|
// must not be discarded merely because its successor is absent under
|
|
@@ -293,22 +296,15 @@ export function reconcileStateViewPairs<T extends StateViewResult>(results: read
|
|
|
293
296
|
}
|
|
294
297
|
|
|
295
298
|
/**
|
|
296
|
-
* #
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
* reconcileStateViewPairs first so orphans never consume a slot.
|
|
299
|
+
* #2928 — per-row packet root keys for the final output budget. Runs the
|
|
300
|
+
* same namespace-qualified union-find as {@link capStateViewPackets}:
|
|
301
|
+
* every row of one evidence packet shares the root key, so a downstream
|
|
302
|
+
* budget that admits one row of the packet can admit them all or none.
|
|
303
|
+
* Blank-key rows get unique per-index roots (distinct singletons).
|
|
302
304
|
*/
|
|
303
|
-
export function
|
|
305
|
+
export function stateViewPacketKeys<T extends StateViewResult>(
|
|
304
306
|
ordered: readonly T[],
|
|
305
|
-
|
|
306
|
-
): T[] {
|
|
307
|
-
const safeLimit =
|
|
308
|
-
typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
|
|
309
|
-
if (safeLimit === 0) return [];
|
|
310
|
-
if (ordered.length === 0) return [];
|
|
311
|
-
|
|
307
|
+
): string[] {
|
|
312
308
|
const byPred = buildSuccessorMap(ordered, []);
|
|
313
309
|
// Union-find over row keys; blank-key rows become per-index singletons.
|
|
314
310
|
const parent = new Map<string, string>();
|
|
@@ -344,14 +340,35 @@ export function capStateViewPackets<T extends StateViewResult>(
|
|
|
344
340
|
const succIdx = keyToIndex.get(succKey);
|
|
345
341
|
if (predIdx !== undefined && succIdx !== undefined) union(keys[predIdx]!, keys[succIdx]!);
|
|
346
342
|
}
|
|
343
|
+
return keys.map((key) => root(key));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* #2859 — packet-counting cap. A predecessor/successor chain admitted
|
|
348
|
+
* together is ONE complete evidence packet: it consumes a single slot of
|
|
349
|
+
* the user cap, and the slice never splits a packet at the boundary (no
|
|
350
|
+
* underfill from post-cap orphan removal). Rows keep their incoming
|
|
351
|
+
* (MMR) order; packets are ordered by first appearance. Call
|
|
352
|
+
* reconcileStateViewPairs first so orphans never consume a slot.
|
|
353
|
+
*/
|
|
354
|
+
export function capStateViewPackets<T extends StateViewResult>(
|
|
355
|
+
ordered: readonly T[],
|
|
356
|
+
limit: number,
|
|
357
|
+
): T[] {
|
|
358
|
+
const safeLimit =
|
|
359
|
+
typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
|
|
360
|
+
if (safeLimit === 0) return [];
|
|
361
|
+
if (ordered.length === 0) return [];
|
|
362
|
+
|
|
363
|
+
const keys = stateViewPacketKeys(ordered);
|
|
347
364
|
// Packets ordered by first appearance; admit whole packets until the cap.
|
|
348
365
|
const selectedRoots = new Set<string>();
|
|
349
366
|
for (let i = 0; i < ordered.length && selectedRoots.size < safeLimit; i += 1) {
|
|
350
|
-
selectedRoots.add(
|
|
367
|
+
selectedRoots.add(keys[i]!);
|
|
351
368
|
}
|
|
352
369
|
const selected: T[] = [];
|
|
353
370
|
for (let i = 0; i < ordered.length; i += 1) {
|
|
354
|
-
if (selectedRoots.has(
|
|
371
|
+
if (selectedRoots.has(keys[i]!)) selected.push(ordered[i]!);
|
|
355
372
|
}
|
|
356
373
|
return selected;
|
|
357
374
|
}
|
|
@@ -3,9 +3,15 @@ import * as fs from "node:fs";
|
|
|
3
3
|
import * as os from "node:os";
|
|
4
4
|
import * as path from "node:path";
|
|
5
5
|
import test from "node:test";
|
|
6
|
+
import * as fsp from "node:fs/promises";
|
|
6
7
|
|
|
7
8
|
import { createHash } from "node:crypto";
|
|
8
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
type ServerIdentityCacheEntry,
|
|
11
|
+
mergeServerIdentityCacheEntries,
|
|
12
|
+
planServerIdentityCacheWrite,
|
|
13
|
+
retainExcludedClassifications,
|
|
14
|
+
} from "./access-offline-manifest.js";
|
|
9
15
|
import { isInternalRemnicStatePath } from "./offline-sync.js";
|
|
10
16
|
import { convergeIdentityCachePath } from "./reconcile/cursor.js";
|
|
11
17
|
import {
|
|
@@ -375,4 +381,79 @@ test("a thrown memory-file read is not cached as a reusable negative", async ()
|
|
|
375
381
|
assert.equal(reads, 1, "a failed read must not become a warm negative hit");
|
|
376
382
|
});
|
|
377
383
|
|
|
384
|
+
test("the write plan retains never-yielded excluded paths on a completed walk", () => {
|
|
385
|
+
const persisted = new Map<string, ServerIdentityCacheEntry>([
|
|
386
|
+
["facts/gone.md", { path: "facts/gone.md", sha256: "aa" }],
|
|
387
|
+
["facts/private.md", { path: "facts/private.md", sha256: "", statIdentity: "s", excluded: true }],
|
|
388
|
+
]);
|
|
389
|
+
const plan = planServerIdentityCacheWrite({
|
|
390
|
+
persisted,
|
|
391
|
+
yieldedPaths: new Set([]),
|
|
392
|
+
retainedPaths: new Set(["facts/private.md"]),
|
|
393
|
+
streamCompleted: true,
|
|
394
|
+
cacheDirty: false,
|
|
395
|
+
});
|
|
396
|
+
assert.ok(plan.shouldWrite, "the vanished path still forces a write");
|
|
397
|
+
assert.deepEqual(
|
|
398
|
+
plan.entries.map((entry) => entry.path),
|
|
399
|
+
["facts/private.md"],
|
|
400
|
+
"an excluded file's entry survives the deleted-path prune; a vanished path's does not"
|
|
401
|
+
);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
test("excluded classifications persist for never-yielded paths without retaining unseen ones", () => {
|
|
405
|
+
const persisted = new Map<string, ServerIdentityCacheEntry>([
|
|
406
|
+
["facts/deleted.md", { path: "facts/deleted.md", sha256: "aa" }],
|
|
407
|
+
]);
|
|
408
|
+
const classifications = new Map([
|
|
409
|
+
["facts/private.md", { statIdentity: "1:1:1:1:1", excluded: true }],
|
|
410
|
+
["facts/yielded.md", { statIdentity: "2:2:2:2:2", excluded: false }],
|
|
411
|
+
]);
|
|
412
|
+
const { retained, changed } = retainExcludedClassifications({
|
|
413
|
+
persisted,
|
|
414
|
+
classifications,
|
|
415
|
+
yieldedPaths: new Set(["facts/yielded.md"]),
|
|
416
|
+
});
|
|
417
|
+
assert.deepEqual([...retained], ["facts/private.md"]);
|
|
418
|
+
assert.equal(changed, true);
|
|
419
|
+
assert.equal(persisted.get("facts/private.md")?.excluded, true);
|
|
420
|
+
assert.equal(typeof persisted.get("facts/private.md")?.statIdentity, "string");
|
|
421
|
+
assert.ok(!retained.has("facts/deleted.md"), "a path the walk never saw must not be retained");
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
test("a concurrent server merge preserves the other writer's classification", async () => {
|
|
425
|
+
const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "server-identity-merge-"));
|
|
426
|
+
try {
|
|
427
|
+
const cachePath = path.join(dir, "identity.json");
|
|
428
|
+
await fs.promises.writeFile(
|
|
429
|
+
cachePath,
|
|
430
|
+
JSON.stringify({
|
|
431
|
+
citationTemplate: citationTemplateFingerprint(undefined),
|
|
432
|
+
files: [
|
|
433
|
+
{ path: "facts/a.md", sha256: "aa", statIdentity: "1:2:3:4:5", excluded: false },
|
|
434
|
+
{ path: "facts/dropped.md", sha256: "dd", statIdentity: "9:9:9:9:9", excluded: true },
|
|
435
|
+
],
|
|
436
|
+
})
|
|
437
|
+
);
|
|
438
|
+
const merged = await mergeServerIdentityCacheEntries(
|
|
439
|
+
fsp,
|
|
440
|
+
cachePath,
|
|
441
|
+
[{ path: "facts/b.md", sha256: "bb" }],
|
|
442
|
+
undefined,
|
|
443
|
+
new Set(["facts/dropped.md"])
|
|
444
|
+
);
|
|
445
|
+
const byPath = new Map(merged.map((entry) => [entry.path, entry]));
|
|
446
|
+
assert.equal(
|
|
447
|
+
byPath.get("facts/a.md")?.statIdentity,
|
|
448
|
+
"1:2:3:4:5",
|
|
449
|
+
"the other writer's classification survives the merge"
|
|
450
|
+
);
|
|
451
|
+
assert.equal(byPath.get("facts/a.md")?.excluded, false);
|
|
452
|
+
assert.ok(byPath.has("facts/b.md"), "this writer's entry survives too");
|
|
453
|
+
assert.equal(byPath.has("facts/dropped.md"), false, "a dropped path is still not resurrected");
|
|
454
|
+
} finally {
|
|
455
|
+
await fs.promises.rm(dir, { recursive: true, force: true });
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
|
|
378
459
|
|
package/src/search/port.ts
CHANGED
|
@@ -91,7 +91,7 @@ export interface SearchBackendStatus {
|
|
|
91
91
|
*/
|
|
92
92
|
export interface SearchBackend {
|
|
93
93
|
// ── Lifecycle ──
|
|
94
|
-
probe(): Promise<boolean>;
|
|
94
|
+
probe(execution?: SearchExecutionOptions): Promise<boolean>;
|
|
95
95
|
/**
|
|
96
96
|
* Optional non-mutating availability probe for health/readiness checks.
|
|
97
97
|
* Implementations must avoid auto-upgrades, collection creation, daemon
|
|
@@ -29,6 +29,13 @@ export interface ComposeWriteEnvelopeInput {
|
|
|
29
29
|
supersedes?: string;
|
|
30
30
|
/** Config opt-in (`sharedContextAllowBindingAuthority`). Binding throws without it. */
|
|
31
31
|
allowBinding: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Write instant for the expiry TTL policy (issue #2920). When finite, an
|
|
34
|
+
* `expiresAt` must land strictly after it and within the maximum TTL —
|
|
35
|
+
* a past or effectively-immortal expiry is a client input error, never a
|
|
36
|
+
* silently accepted stamp.
|
|
37
|
+
*/
|
|
38
|
+
nowMs?: number;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
function requireEnvelopeActor(agentId: string): string {
|
|
@@ -48,6 +55,21 @@ function optionalEnvelopeAt(expiresAt: string | undefined): string | undefined {
|
|
|
48
55
|
return parsed.at;
|
|
49
56
|
}
|
|
50
57
|
|
|
58
|
+
/** Maximum write-side TTL: 10 years. A farther `expiresAt` is rejected. */
|
|
59
|
+
export const MAX_WRITE_EXPIRES_AT_TTL_MS = 3650 * 24 * 60 * 60 * 1000;
|
|
60
|
+
|
|
61
|
+
function assertBoundedFutureExpiry(expiresAt: string, nowMs: number): void {
|
|
62
|
+
const expiresAtMs = Date.parse(expiresAt);
|
|
63
|
+
if (expiresAtMs <= nowMs) {
|
|
64
|
+
throw new Error("composeWriteEnvelope: expiresAt must be an instant strictly after the write time");
|
|
65
|
+
}
|
|
66
|
+
if (expiresAtMs - nowMs > MAX_WRITE_EXPIRES_AT_TTL_MS) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
`composeWriteEnvelope: expiresAt exceeds the maximum TTL of ${MAX_WRITE_EXPIRES_AT_TTL_MS}ms`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
51
73
|
function optionalEnvelopeId(supersedes: string | undefined): string | undefined {
|
|
52
74
|
if (supersedes === undefined) return undefined;
|
|
53
75
|
const parsed = parseEnvelopeId(supersedes);
|
|
@@ -137,6 +159,9 @@ function requireProducer(value: string): string {
|
|
|
137
159
|
export function composeWriteEnvelope(input: ComposeWriteEnvelopeInput): SharedEnvelope {
|
|
138
160
|
const sharedBy = requireEnvelopeActor(input.origin);
|
|
139
161
|
const expiresAt = optionalEnvelopeAt(input.expiresAt);
|
|
162
|
+
if (expiresAt !== undefined && Number.isFinite(input.nowMs ?? Number.NaN)) {
|
|
163
|
+
assertBoundedFutureExpiry(expiresAt, input.nowMs as number);
|
|
164
|
+
}
|
|
140
165
|
const supersedes = optionalEnvelopeId(input.supersedes);
|
|
141
166
|
return applyDefaultEnvelope(
|
|
142
167
|
{ sharedBy, authority: input.authority, expiresAt, supersedes },
|
|
@@ -36,12 +36,14 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
|
|
|
36
36
|
const { manager, dir } = await makeManager();
|
|
37
37
|
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
38
38
|
|
|
39
|
+
// Within the write TTL policy (issue #2920): strictly future, ≤10 years.
|
|
40
|
+
const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
39
41
|
const fp = await manager.writeAgentOutput({
|
|
40
42
|
agentId: "agent-alpha",
|
|
41
43
|
title: "Deploy checklist",
|
|
42
44
|
content: "Verified the deploy checklist end to end.",
|
|
43
45
|
authority: "advisory",
|
|
44
|
-
expiresAt
|
|
46
|
+
expiresAt,
|
|
45
47
|
supersedes: "out-0001",
|
|
46
48
|
});
|
|
47
49
|
|
|
@@ -49,7 +51,7 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
|
|
|
49
51
|
assert.match(raw, /^kind: agent_output$/m);
|
|
50
52
|
assert.match(raw, /^sharedBy: "agent-alpha"$/m);
|
|
51
53
|
assert.match(raw, /^authority: "advisory"$/m);
|
|
52
|
-
assert.
|
|
54
|
+
assert.ok(raw.includes(`expiresAt: ${JSON.stringify(expiresAt)}`));
|
|
53
55
|
assert.match(raw, /^supersedes: "out-0001"$/m);
|
|
54
56
|
|
|
55
57
|
const signals = await manager.synthesizeCrossSignals({ date: today() });
|
|
@@ -605,6 +605,7 @@ export class SharedContextManager {
|
|
|
605
605
|
expiresAt: opts.expiresAt,
|
|
606
606
|
supersedes: opts.supersedes,
|
|
607
607
|
allowBinding: this.allowBindingAuthority,
|
|
608
|
+
nowMs: createdAt.getTime(),
|
|
608
609
|
});
|
|
609
610
|
|
|
610
611
|
const dir = path.join(this.outputsDir, agentPathSegment, date);
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression: governed write-output envelope controls exposed on BOTH
|
|
3
|
+
* documented surfaces (issue #2920).
|
|
4
|
+
*
|
|
5
|
+
* Covers the canonical client-input parse, the Access MCP operation
|
|
6
|
+
* (`shared_context_write_output` via the real operation registry), and the
|
|
7
|
+
* access-service adapter against the REAL manager write path:
|
|
8
|
+
* - authority: finite allow-list, binding gated by config
|
|
9
|
+
* - expiresAt: strict ISO, strictly future, bounded by the 10-year TTL
|
|
10
|
+
* - supersedes: validated id shape
|
|
11
|
+
* - client `principal`/`namespace` overrides are rejected
|
|
12
|
+
* - no idempotent replay/dedup semantics on this surface (two identical
|
|
13
|
+
* calls write two files — nothing silently swallows a re-send)
|
|
14
|
+
*
|
|
15
|
+
* All fixtures are synthetic — no real user data.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import assert from "node:assert/strict";
|
|
19
|
+
import test from "node:test";
|
|
20
|
+
import os from "node:os";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
23
|
+
|
|
24
|
+
import "../access-operations.js";
|
|
25
|
+
import { getOperation } from "../access-boundary.js";
|
|
26
|
+
import { EngramAccessInputError, EngramAccessService, type EngramAccessService as Service } from "../access-service.js";
|
|
27
|
+
import type { Orchestrator } from "../orchestrator.js";
|
|
28
|
+
import { SharedContextManager } from "./manager.js";
|
|
29
|
+
import { MAX_WRITE_EXPIRES_AT_TTL_MS } from "./envelope-io.js";
|
|
30
|
+
import { parseSharedWriteOutputControls } from "./write-output-controls.js";
|
|
31
|
+
import { parseConfig } from "../config.js";
|
|
32
|
+
|
|
33
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
34
|
+
|
|
35
|
+
async function makeService(overrides: Record<string, unknown> = {}) {
|
|
36
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-shared-controls-"));
|
|
37
|
+
const config = parseConfig({ sharedContextEnabled: true, sharedContextDir: dir, memoryDir: dir, ...overrides });
|
|
38
|
+
const manager = new SharedContextManager(config);
|
|
39
|
+
await manager.ensureStructure();
|
|
40
|
+
const service = new EngramAccessService({ config, sharedContext: manager } as unknown as Orchestrator);
|
|
41
|
+
return { service, manager, dir, config };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
test("parse: controls are strings-or-absent; empty or non-string values reject", () => {
|
|
45
|
+
assert.deepEqual(parseSharedWriteOutputControls({}), {});
|
|
46
|
+
assert.deepEqual(parseSharedWriteOutputControls(undefined), {});
|
|
47
|
+
assert.deepEqual(parseSharedWriteOutputControls(null), {});
|
|
48
|
+
assert.deepEqual(
|
|
49
|
+
parseSharedWriteOutputControls({ authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" }),
|
|
50
|
+
{ authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" },
|
|
51
|
+
);
|
|
52
|
+
assert.throws(() => parseSharedWriteOutputControls({ authority: 7 }), /authority must be a string/);
|
|
53
|
+
assert.throws(() => parseSharedWriteOutputControls({ expiresAt: "" }), /expiresAt must be a non-empty string/);
|
|
54
|
+
assert.throws(() => parseSharedWriteOutputControls({ supersedes: " " }), /supersedes must be a non-empty string/);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("parse: client principal/namespace overrides are rejected", () => {
|
|
58
|
+
assert.throws(
|
|
59
|
+
() => parseSharedWriteOutputControls({ principal: "attacker" }),
|
|
60
|
+
/principal is server-resolved and cannot be supplied by the caller/,
|
|
61
|
+
);
|
|
62
|
+
assert.throws(
|
|
63
|
+
() => parseSharedWriteOutputControls({ namespace: "victim-ns" }),
|
|
64
|
+
/namespace is server-resolved and cannot be supplied by the caller/,
|
|
65
|
+
);
|
|
66
|
+
// Absent keys (and stripped nulls) pass through untouched.
|
|
67
|
+
assert.deepEqual(parseSharedWriteOutputControls({ sessionKey: "ctx" }), {});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("operation: forwards the envelope controls with the authenticated principal", async () => {
|
|
71
|
+
let received: Record<string, unknown> | undefined;
|
|
72
|
+
const service = {
|
|
73
|
+
sharedContextWriteOutput: async (request: Record<string, unknown>) => {
|
|
74
|
+
received = request;
|
|
75
|
+
return { written: true, path: "written.md" };
|
|
76
|
+
},
|
|
77
|
+
} as unknown as Service;
|
|
78
|
+
const operation = getOperation("shared_context_write_output");
|
|
79
|
+
assert.ok(operation);
|
|
80
|
+
|
|
81
|
+
await operation.run(
|
|
82
|
+
{ agentId: "agent", title: "t", content: "c", authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" },
|
|
83
|
+
{ service, authenticatedPrincipal: "real-principal" },
|
|
84
|
+
);
|
|
85
|
+
assert.equal(received?.authority, "advisory");
|
|
86
|
+
assert.equal(received?.expiresAt, "2030-01-01T00:00:00Z");
|
|
87
|
+
assert.equal(received?.supersedes, "out-1");
|
|
88
|
+
assert.equal(received?.principal, "real-principal");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("operation: client principal/namespace and malformed controls are input errors", async () => {
|
|
92
|
+
const service = {
|
|
93
|
+
sharedContextWriteOutput: async () => ({ written: true, path: "x" }),
|
|
94
|
+
} as unknown as Service;
|
|
95
|
+
const operation = getOperation("shared_context_write_output");
|
|
96
|
+
assert.ok(operation);
|
|
97
|
+
|
|
98
|
+
for (const payload of [
|
|
99
|
+
{ agentId: "a", title: "t", content: "c", principal: "spoofed" },
|
|
100
|
+
{ agentId: "a", title: "t", content: "c", namespace: "other" },
|
|
101
|
+
{ agentId: "a", title: "t", content: "c", authority: "" },
|
|
102
|
+
{ agentId: "a", title: "t", content: "c", expiresAt: 42 },
|
|
103
|
+
]) {
|
|
104
|
+
await assert.rejects(
|
|
105
|
+
() => operation.run(payload, { service, authenticatedPrincipal: "real-principal" }),
|
|
106
|
+
(error: unknown) => error instanceof EngramAccessInputError,
|
|
107
|
+
`must reject ${JSON.stringify(payload)}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("service: controls stamp the envelope; absent controls stay informational", async (t) => {
|
|
113
|
+
const { service, dir } = await makeService();
|
|
114
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
115
|
+
|
|
116
|
+
const expiresAt = new Date(Date.now() + 90 * DAY_MS).toISOString();
|
|
117
|
+
const result = (await service.sharedContextWriteOutput({
|
|
118
|
+
agentId: "agent-alpha",
|
|
119
|
+
title: "Plan",
|
|
120
|
+
content: "x",
|
|
121
|
+
authority: "advisory",
|
|
122
|
+
expiresAt,
|
|
123
|
+
supersedes: "out-0001",
|
|
124
|
+
})) as { written: boolean; path: string };
|
|
125
|
+
const raw = await readFile(result.path, "utf-8");
|
|
126
|
+
assert.match(raw, /^authority: "advisory"$/m);
|
|
127
|
+
assert.ok(raw.includes(`expiresAt: ${JSON.stringify(expiresAt)}`));
|
|
128
|
+
assert.match(raw, /^supersedes: "out-0001"$/m);
|
|
129
|
+
|
|
130
|
+
const plain = (await service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Plain", content: "x" })) as {
|
|
131
|
+
written: boolean;
|
|
132
|
+
path: string;
|
|
133
|
+
};
|
|
134
|
+
const plainRaw = await readFile(plain.path, "utf-8");
|
|
135
|
+
assert.match(plainRaw, /^authority: "informational"$/m);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test("service: binding requires the operator opt-in, else is a client input error", async (t) => {
|
|
139
|
+
const gated = await makeService();
|
|
140
|
+
t.after(() => rm(gated.dir, { recursive: true, force: true }));
|
|
141
|
+
await assert.rejects(
|
|
142
|
+
() =>
|
|
143
|
+
gated.service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Directive", content: "x", authority: "binding" }),
|
|
144
|
+
(error: unknown) => error instanceof EngramAccessInputError && /requires an explicit binding flag/.test(error.message),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const open = await makeService({ sharedContextAllowBindingAuthority: true });
|
|
148
|
+
t.after(() => rm(open.dir, { recursive: true, force: true }));
|
|
149
|
+
const result = (await open.service.sharedContextWriteOutput({
|
|
150
|
+
agentId: "agent-alpha",
|
|
151
|
+
title: "Directive",
|
|
152
|
+
content: "x",
|
|
153
|
+
authority: "binding",
|
|
154
|
+
})) as { path: string };
|
|
155
|
+
assert.match(await readFile(result.path, "utf-8"), /^authority: "binding"$/m);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("service: expiresAt must be strictly future and within the 10-year TTL", async (t) => {
|
|
159
|
+
const { service, dir } = await makeService();
|
|
160
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
161
|
+
|
|
162
|
+
const cases: Array<{ expiresAt: string; message: string }> = [
|
|
163
|
+
{ expiresAt: new Date(Date.now() - DAY_MS).toISOString(), message: "strictly after the write time" },
|
|
164
|
+
{ expiresAt: new Date(Date.now() + MAX_WRITE_EXPIRES_AT_TTL_MS + DAY_MS).toISOString(), message: "maximum TTL" },
|
|
165
|
+
{ expiresAt: "2030-02-31T00:00:00Z", message: "valid ISO-8601 timestamp" },
|
|
166
|
+
];
|
|
167
|
+
for (const { expiresAt, message } of cases) {
|
|
168
|
+
await assert.rejects(
|
|
169
|
+
() => service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Expiry", content: "x", expiresAt }),
|
|
170
|
+
(error: unknown) => error instanceof EngramAccessInputError && error.message.includes(message),
|
|
171
|
+
`must reject expiresAt=${expiresAt}`,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("service: supersedes must be a non-blank single-line id", async (t) => {
|
|
177
|
+
const { service, dir } = await makeService();
|
|
178
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
179
|
+
await assert.rejects(
|
|
180
|
+
() => service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Supersede", content: "x", supersedes: "out-1\nout-2" }),
|
|
181
|
+
(error: unknown) => error instanceof EngramAccessInputError && /supersedes/.test(error.message),
|
|
182
|
+
);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("service: no idempotent replay — an identical re-send writes a second file", async (t) => {
|
|
186
|
+
const { service, dir } = await makeService();
|
|
187
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
188
|
+
const base = { agentId: "agent-alpha", title: "Same", content: "same bytes" };
|
|
189
|
+
const first = (await service.sharedContextWriteOutput(base)) as { path: string };
|
|
190
|
+
const second = (await service.sharedContextWriteOutput(base)) as { path: string };
|
|
191
|
+
assert.notEqual(first.path, second.path, "this surface has no replay/dedup semantics; a re-send must not be swallowed");
|
|
192
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical client-input parse for shared-context write-output envelope
|
|
3
|
+
* controls (issue #2920).
|
|
4
|
+
*
|
|
5
|
+
* One module feeds BOTH documented surfaces — the Access MCP
|
|
6
|
+
* `shared_context_write_output` operation and the OpenClaw
|
|
7
|
+
* `shared_context_write_output` tool — so surface policy can never drift.
|
|
8
|
+
* This layer owns only what is a SURFACE concern: field type/shape and the
|
|
9
|
+
* rejection of client-supplied identity. Semantic validation (authority
|
|
10
|
+
* allow-list, the binding gate, strict ISO instants, the future/TTL expiry
|
|
11
|
+
* policy, id shape) stays in `composeWriteEnvelope`, the single write-side
|
|
12
|
+
* gate every path already routes through — there is no in-process bypass
|
|
13
|
+
* with looser rules than the tool surfaces.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export interface SharedWriteOutputControls {
|
|
17
|
+
authority?: string;
|
|
18
|
+
expiresAt?: string;
|
|
19
|
+
supersedes?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const CONTROL_FIELDS = ["authority", "expiresAt", "supersedes"] as const;
|
|
23
|
+
|
|
24
|
+
/** Server-resolved fields a caller must never supply (issue #2920). */
|
|
25
|
+
const SERVER_RESOLVED_FIELDS = ["principal", "namespace"] as const;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Parse the optional envelope controls off a raw client request.
|
|
29
|
+
*
|
|
30
|
+
* - Absent fields are omitted; a control must be a non-blank string when
|
|
31
|
+
* present (an explicit empty string is a client error, not "unspecified").
|
|
32
|
+
* - A client-supplied `principal` or `namespace` is rejected: identity and
|
|
33
|
+
* scoping are resolved by the surface, never accepted from the caller.
|
|
34
|
+
*
|
|
35
|
+
* Throws `Error` with a `shared-context write output:` prefix; access
|
|
36
|
+
* surfaces map that to their input-error class.
|
|
37
|
+
*/
|
|
38
|
+
export function parseSharedWriteOutputControls(raw: unknown): SharedWriteOutputControls {
|
|
39
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
40
|
+
const record = raw as Record<string, unknown>;
|
|
41
|
+
for (const field of SERVER_RESOLVED_FIELDS) {
|
|
42
|
+
if (Object.hasOwn(record, field) && record[field] !== undefined) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`shared-context write output: ${field} is server-resolved and cannot be supplied by the caller`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const controls: SharedWriteOutputControls = {};
|
|
49
|
+
for (const field of CONTROL_FIELDS) {
|
|
50
|
+
const value = record[field];
|
|
51
|
+
if (value === undefined) continue;
|
|
52
|
+
if (typeof value !== "string") {
|
|
53
|
+
throw new Error(`shared-context write output: ${field} must be a string`);
|
|
54
|
+
}
|
|
55
|
+
if (value.trim().length === 0) {
|
|
56
|
+
throw new Error(`shared-context write output: ${field} must be a non-empty string`);
|
|
57
|
+
}
|
|
58
|
+
controls[field] = value;
|
|
59
|
+
}
|
|
60
|
+
return controls;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const WRITE_INPUT_PREFIXES = [
|
|
64
|
+
"shared-context write origin mismatch",
|
|
65
|
+
"applyDefaultEnvelope:",
|
|
66
|
+
"composeWriteEnvelope:",
|
|
67
|
+
"shared-context write output:",
|
|
68
|
+
] as const;
|
|
69
|
+
|
|
70
|
+
export function isSharedContextWriteInputError(message: string): boolean {
|
|
71
|
+
return WRITE_INPUT_PREFIXES.some((prefix) => message.startsWith(prefix));
|
|
72
|
+
}
|
|
@@ -9,6 +9,9 @@ import { ContentHashIndex, StorageManager } from "./storage.js";
|
|
|
9
9
|
import {
|
|
10
10
|
DEFAULT_CITATION_FORMAT,
|
|
11
11
|
attachCitation,
|
|
12
|
+
citationTemplateIsDetectable,
|
|
13
|
+
citationTemplatesForMerge,
|
|
14
|
+
citationTemplatesToRecognize,
|
|
12
15
|
deriveSessionId,
|
|
13
16
|
formatCitation,
|
|
14
17
|
hasCitation,
|
|
@@ -17,6 +20,7 @@ import {
|
|
|
17
20
|
parseCitation,
|
|
18
21
|
stripCitation,
|
|
19
22
|
stripCitationForTemplate,
|
|
23
|
+
stripRecognizedCitations,
|
|
20
24
|
} from "./source-attribution.js";
|
|
21
25
|
|
|
22
26
|
test("formatCitation emits the default template with provided fields", () => {
|
|
@@ -171,6 +175,7 @@ test("parseConfig disables inline source attribution by default", () => {
|
|
|
171
175
|
cfg.inlineSourceAttributionFormat,
|
|
172
176
|
"[Source: agent={agent}, session={sessionId}, ts={ts}]",
|
|
173
177
|
);
|
|
178
|
+
assert.deepEqual(cfg.inlineSourceAttributionFormatHistory, []);
|
|
174
179
|
});
|
|
175
180
|
|
|
176
181
|
test("parseConfig honors explicit inline source attribution overrides", () => {
|
|
@@ -196,6 +201,22 @@ test("parseConfig falls back to default format when override is empty", () => {
|
|
|
196
201
|
);
|
|
197
202
|
});
|
|
198
203
|
|
|
204
|
+
test("parseConfig keeps inlineSourceAttributionFormatHistory when format is normalized", () => {
|
|
205
|
+
const prior = "[src:{agent}/{sessionId}@{date}]";
|
|
206
|
+
const current = "[via:{agent}]";
|
|
207
|
+
const cfg = parseConfig({
|
|
208
|
+
inlineSourceAttributionFormat: " ",
|
|
209
|
+
inlineSourceAttributionFormatHistory: [prior, "", 12, " ", current],
|
|
210
|
+
});
|
|
211
|
+
assert.equal(cfg.inlineSourceAttributionFormat, DEFAULT_CITATION_FORMAT);
|
|
212
|
+
assert.deepEqual(cfg.inlineSourceAttributionFormatHistory, [prior, current]);
|
|
213
|
+
assert.deepEqual(citationTemplatesForMerge(cfg), [
|
|
214
|
+
DEFAULT_CITATION_FORMAT,
|
|
215
|
+
prior,
|
|
216
|
+
current,
|
|
217
|
+
]);
|
|
218
|
+
});
|
|
219
|
+
|
|
199
220
|
// ── Finding 1 regression: custom citation template dedup detection ────────────
|
|
200
221
|
|
|
201
222
|
test("hasCitationForTemplate detects default [Source:...] marker regardless of template", () => {
|
|
@@ -539,6 +560,24 @@ test("hasCitationForTemplate: '{agent}{sessionId}' all-placeholder template retu
|
|
|
539
560
|
);
|
|
540
561
|
});
|
|
541
562
|
|
|
563
|
+
test("citationTemplateIsDetectable rejects all-placeholder templates", () => {
|
|
564
|
+
assert.equal(citationTemplateIsDetectable("{agent}{sessionId}"), false);
|
|
565
|
+
assert.equal(citationTemplateIsDetectable(DEFAULT_CITATION_FORMAT), true);
|
|
566
|
+
assert.equal(citationTemplateIsDetectable("[src:{agent}/{sessionId}@{date}]"), true);
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
test("citationTemplatesToRecognize drops undetectable shapes and keeps prior history", () => {
|
|
570
|
+
const prior = "[src:{agent}/{sessionId}@{date}]";
|
|
571
|
+
const recognized = citationTemplatesToRecognize("{agent}{sessionId}", [prior]);
|
|
572
|
+
assert.deepEqual(recognized, [DEFAULT_CITATION_FORMAT, prior]);
|
|
573
|
+
const body = "The cadence is weekly. [src:agent-a/s-old@2026-08-19]";
|
|
574
|
+
assert.equal(stripRecognizedCitations(body, recognized), "The cadence is weekly.");
|
|
575
|
+
assert.deepEqual(citationTemplatesForMerge({ inlineSourceAttributionFormat: prior }), [
|
|
576
|
+
DEFAULT_CITATION_FORMAT,
|
|
577
|
+
prior,
|
|
578
|
+
]);
|
|
579
|
+
});
|
|
580
|
+
|
|
542
581
|
test("formatCitation: substituted values containing placeholder syntax are not re-interpreted", () => {
|
|
543
582
|
// Regression for PR #401 (low-severity): the previous implementation chained
|
|
544
583
|
// `.replace(/\{agent\}/g, ...)`, `.replace(/\{ts\}/g, ...)` etc. If the agent
|