@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
|
@@ -366,3 +366,64 @@ test("an enabled vault rejects relative or whitespace-only vaultPath at config l
|
|
|
366
366
|
const inert = parseActivityConfig({ timeline: { vault: { enabled: false, vaultPath: "." } } });
|
|
367
367
|
assert.equal(inert.timeline.vault.vaultPath, ".");
|
|
368
368
|
});
|
|
369
|
+
|
|
370
|
+
test("insertUnderHeading must be a trimmed single-line heading (#2917)", () => {
|
|
371
|
+
for (const insertUnderHeading of [" ", " Journal ", "Journal\nExtra"]) {
|
|
372
|
+
assert.throws(
|
|
373
|
+
() => parseActivityConfig({ timeline: { vault: { insertUnderHeading } } }),
|
|
374
|
+
/insertUnderHeading must be a non-empty trimmed single-line heading/,
|
|
375
|
+
`value ${JSON.stringify(insertUnderHeading)} must be rejected`,
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
const ok = parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Journal" } } });
|
|
379
|
+
assert.equal(ok.timeline.vault.insertUnderHeading, "Journal");
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
test("readback.journalSection must be a trimmed single-line heading (#2917)", () => {
|
|
383
|
+
for (const journalSection of [" Journal ", "Journal\r\nExtra"]) {
|
|
384
|
+
assert.throws(
|
|
385
|
+
() => parseActivityConfig({ timeline: { vault: { readback: { journalSection } } } }),
|
|
386
|
+
/journalSection must be a non-empty trimmed single-line heading/,
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
const ok = parseActivityConfig({ timeline: { vault: { readback: { journalSection: "Journal" } } } });
|
|
390
|
+
assert.equal(ok.timeline.vault.readback.journalSection, "Journal");
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
test("heading-strategy section names that cannot round-trip are rejected at config load (#2917)", () => {
|
|
394
|
+
// `## Timeline #` parses back as `Timeline`. Accepted at load, every
|
|
395
|
+
// publish would throw before producing a status.
|
|
396
|
+
assert.throws(
|
|
397
|
+
() =>
|
|
398
|
+
parseActivityConfig({
|
|
399
|
+
timeline: {
|
|
400
|
+
vault: { sectionStrategy: "heading", publish: { timeline: { section: "Timeline #" } } },
|
|
401
|
+
},
|
|
402
|
+
}),
|
|
403
|
+
/publish\.timeline\.section must survive a heading render-and-parse round trip/,
|
|
404
|
+
);
|
|
405
|
+
const ok = parseActivityConfig({
|
|
406
|
+
timeline: {
|
|
407
|
+
vault: { sectionStrategy: "heading", publish: { timeline: { section: "Timeline" } } },
|
|
408
|
+
},
|
|
409
|
+
});
|
|
410
|
+
assert.equal(ok.timeline.vault.publish.timeline.section, "Timeline");
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
test("marker-strategy still accepts a section name that would fail heading round-trip (#2917)", () => {
|
|
414
|
+
const ok = parseActivityConfig({
|
|
415
|
+
timeline: {
|
|
416
|
+
vault: { sectionStrategy: "markers", publish: { timeline: { section: "Timeline #" } } },
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
assert.equal(ok.timeline.vault.publish.timeline.section, "Timeline #");
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test("insertUnderHeading that cannot round-trip is rejected at config load (#2917)", () => {
|
|
423
|
+
assert.throws(
|
|
424
|
+
() => parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Timeline #" } } }),
|
|
425
|
+
/insertUnderHeading must survive a heading render-and-parse round trip/,
|
|
426
|
+
);
|
|
427
|
+
const ok = parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Journal" } } });
|
|
428
|
+
assert.equal(ok.timeline.vault.insertUnderHeading, "Journal");
|
|
429
|
+
});
|
package/src/activity/config.ts
CHANGED
|
@@ -2,10 +2,11 @@ import path from "node:path";
|
|
|
2
2
|
|
|
3
3
|
import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
|
|
4
4
|
import { assertValidTimezone } from "./digest.js";
|
|
5
|
-
import { applyLegacyJournalHeading } from "./journal-heading.js";
|
|
5
|
+
import { applyLegacyJournalHeading, normalizeJournalHeading } from "./journal-heading.js";
|
|
6
6
|
import { checkVaultJournalPrerequisites } from "./journal-vault-prereq.js";
|
|
7
7
|
import { resolveJournalSource } from "./journal-source.js";
|
|
8
8
|
import { validateVaultNoteTemplate } from "./vault-path.js";
|
|
9
|
+
import { headingSurvivesRoundTrip } from "./vault-publish.js";
|
|
9
10
|
import { validateRegionName } from "./vault-region.js";
|
|
10
11
|
import { TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS } from "./timeline/analysis.js";
|
|
11
12
|
import { ANALYSIS_METADATA_MAX_FIELD_LENGTH, isAnalysisIdentifier } from "./timeline/analysis-metadata.js";
|
|
@@ -376,6 +377,23 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
|
|
|
376
377
|
const noteTemplate = optionalNonEmptyString(vault.noteTemplate, "activity.timeline.vault.noteTemplate") ?? "";
|
|
377
378
|
const insertUnderHeading =
|
|
378
379
|
optionalNonEmptyString(vault.insertUnderHeading, "activity.timeline.vault.insertUnderHeading") ?? "";
|
|
380
|
+
// The configured insertion heading is matched against parsed note
|
|
381
|
+
// headings, so a blank, padded, or multi-line value can never match
|
|
382
|
+
// (issue #2917). Reuse the journal work's canonical heading validator —
|
|
383
|
+
// no second parser — and require the trimmed form like publish sections.
|
|
384
|
+
if (insertUnderHeading.length > 0) {
|
|
385
|
+
const heading = normalizeJournalHeading(insertUnderHeading);
|
|
386
|
+
if (!heading.ok || heading.heading !== insertUnderHeading) {
|
|
387
|
+
throw new RangeError(
|
|
388
|
+
"activity.timeline.vault.insertUnderHeading must be a non-empty trimmed single-line heading",
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
if (!headingSurvivesRoundTrip(insertUnderHeading)) {
|
|
392
|
+
throw new RangeError(
|
|
393
|
+
"activity.timeline.vault.insertUnderHeading must survive a heading render-and-parse round trip",
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
379
397
|
|
|
380
398
|
if (typeof vault.sectionStrategy !== "undefined" && typeof vault.sectionStrategy !== "string") {
|
|
381
399
|
throw new TypeError("activity.timeline.vault.sectionStrategy must be a string");
|
|
@@ -423,6 +441,15 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
|
|
|
423
441
|
}
|
|
424
442
|
|
|
425
443
|
const publish = parseVaultPublishBlock(vault.publish, weeklyNotePath);
|
|
444
|
+
if (sectionStrategy === "heading") {
|
|
445
|
+
for (const kind of ["timeline", "standup", "weekly", "locations"] as const) {
|
|
446
|
+
if (!headingSurvivesRoundTrip(publish[kind].section)) {
|
|
447
|
+
throw new RangeError(
|
|
448
|
+
`activity.timeline.vault.publish.${kind}.section must survive a heading render-and-parse round trip`,
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
426
453
|
const wikilinksRaw = vault.wikilinks;
|
|
427
454
|
const wikilinks =
|
|
428
455
|
wikilinksRaw === undefined
|
|
@@ -439,6 +466,18 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
|
|
|
439
466
|
(readbackRaw as Record<string, unknown> | undefined)?.journalSection,
|
|
440
467
|
"activity.timeline.vault.readback.journalSection",
|
|
441
468
|
);
|
|
469
|
+
// Readback matches the section by parsed heading text, so a padded or
|
|
470
|
+
// multi-line journalSection can never match and would silently read back
|
|
471
|
+
// an empty journal (issue #2917). Same canonical validator as the legacy
|
|
472
|
+
// journal.heading alias.
|
|
473
|
+
if (readbackJournalSection !== undefined && readbackJournalSection.length > 0) {
|
|
474
|
+
const heading = normalizeJournalHeading(readbackJournalSection);
|
|
475
|
+
if (!heading.ok || heading.heading !== readbackJournalSection) {
|
|
476
|
+
throw new RangeError(
|
|
477
|
+
"activity.timeline.vault.readback.journalSection must be a non-empty trimmed single-line heading",
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
442
481
|
const readback = {
|
|
443
482
|
journalSection: readbackJournalSection ?? "",
|
|
444
483
|
};
|
|
@@ -25,6 +25,7 @@ export interface TimelineAnalysisLocalLlm {
|
|
|
25
25
|
operation?: string;
|
|
26
26
|
redactProviderErrors?: boolean;
|
|
27
27
|
model?: string;
|
|
28
|
+
failureDiag?: { lastError?: unknown };
|
|
28
29
|
},
|
|
29
30
|
): Promise<{ content: string } | null>;
|
|
30
31
|
}
|
|
@@ -40,6 +41,7 @@ export interface TimelineAnalysisRemoteLlm {
|
|
|
40
41
|
modelChain?: { primary?: string; fallbacks?: string[] };
|
|
41
42
|
includeDefaultModelFallback?: boolean;
|
|
42
43
|
redactProviderErrors?: boolean;
|
|
44
|
+
failureDiag?: { lastError?: unknown };
|
|
43
45
|
},
|
|
44
46
|
): Promise<{ content: string } | null>;
|
|
45
47
|
}
|
|
@@ -99,6 +101,7 @@ export function timelineAnalysisCompleteFromClients(input: {
|
|
|
99
101
|
"timeline analysis local provider is not configured",
|
|
100
102
|
);
|
|
101
103
|
}
|
|
104
|
+
const failureDiag: { lastError?: unknown } = {};
|
|
102
105
|
const result = await localLlm.chatCompletion(messages, {
|
|
103
106
|
temperature: 0,
|
|
104
107
|
maxTokens: 2048,
|
|
@@ -106,10 +109,11 @@ export function timelineAnalysisCompleteFromClients(input: {
|
|
|
106
109
|
operation: "timeline-analysis",
|
|
107
110
|
redactProviderErrors: true,
|
|
108
111
|
model,
|
|
112
|
+
failureDiag,
|
|
109
113
|
});
|
|
110
114
|
if (result === null) {
|
|
111
115
|
throw new TimelineAnalysisProviderError(
|
|
112
|
-
|
|
116
|
+
classifyAnalysisProviderError(failureDiag.lastError),
|
|
113
117
|
"timeline analysis local provider returned no completion",
|
|
114
118
|
);
|
|
115
119
|
}
|
|
@@ -121,6 +125,7 @@ export function timelineAnalysisCompleteFromClients(input: {
|
|
|
121
125
|
"timeline analysis remote provider is not configured",
|
|
122
126
|
);
|
|
123
127
|
}
|
|
128
|
+
const failureDiag: { lastError?: unknown } = {};
|
|
124
129
|
const result = await remoteLlm.chatCompletion(messages, {
|
|
125
130
|
temperature: 0,
|
|
126
131
|
maxTokens: 2048,
|
|
@@ -128,10 +133,11 @@ export function timelineAnalysisCompleteFromClients(input: {
|
|
|
128
133
|
modelChain: { primary: `${provider}/${model}` },
|
|
129
134
|
includeDefaultModelFallback: false,
|
|
130
135
|
redactProviderErrors: true,
|
|
136
|
+
failureDiag,
|
|
131
137
|
});
|
|
132
138
|
if (result === null) {
|
|
133
139
|
throw new TimelineAnalysisProviderError(
|
|
134
|
-
|
|
140
|
+
classifyAnalysisProviderError(failureDiag.lastError),
|
|
135
141
|
`timeline analysis provider "${provider}" is not configured`,
|
|
136
142
|
);
|
|
137
143
|
}
|
|
@@ -417,3 +417,85 @@ test("adapter pins the call-time provider verbatim with no chain fallback", asyn
|
|
|
417
417
|
});
|
|
418
418
|
assert.deepEqual(seen, ["anthropic/claude-4_1"]);
|
|
419
419
|
});
|
|
420
|
+
|
|
421
|
+
test("remote failureDiag preserves a rate-limited failure as retryable (issue #2891)", async () => {
|
|
422
|
+
const cards = sampleCards();
|
|
423
|
+
const remoteLlm: TimelineAnalysisRemoteLlm = {
|
|
424
|
+
chatCompletion: async (_messages, options) => {
|
|
425
|
+
assert.ok(options.failureDiag, "adapter must pass a failureDiag out-box");
|
|
426
|
+
options.failureDiag.lastError = Object.assign(new Error("provider throttled"), { status: 429 });
|
|
427
|
+
return null;
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
const result = await runTimelineCardAnalysis({
|
|
431
|
+
date: DATE,
|
|
432
|
+
timezone: TZ,
|
|
433
|
+
cards,
|
|
434
|
+
observations: [observation()],
|
|
435
|
+
config: ENABLED,
|
|
436
|
+
deps: { remoteLlm },
|
|
437
|
+
});
|
|
438
|
+
assert.equal(result.status, "provider_failed");
|
|
439
|
+
assert.equal(result.failure?.kind, "rate_limited");
|
|
440
|
+
assert.equal(result.failure?.retryable, true);
|
|
441
|
+
assert.equal(result.failure?.preservesDeterministic, true);
|
|
442
|
+
assert.equal(result.cards, cards);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test("local failureDiag preserves a rate-limited failure (issue #2891)", async () => {
|
|
446
|
+
const localLlm: TimelineAnalysisLocalLlm = {
|
|
447
|
+
chatCompletion: async (_messages, options) => {
|
|
448
|
+
assert.ok(options.failureDiag, "adapter must pass a failureDiag out-box");
|
|
449
|
+
options.failureDiag.lastError = Object.assign(new Error("local backend throttled"), { status: 429 });
|
|
450
|
+
return null;
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
const result = await runTimelineCardAnalysis({
|
|
454
|
+
date: DATE,
|
|
455
|
+
timezone: TZ,
|
|
456
|
+
cards: sampleCards(),
|
|
457
|
+
observations: [observation()],
|
|
458
|
+
config: { enabled: true, provider: "local", model: "local-test" },
|
|
459
|
+
deps: { localLlm },
|
|
460
|
+
});
|
|
461
|
+
assert.equal(result.status, "provider_failed");
|
|
462
|
+
assert.equal(result.failure?.kind, "rate_limited");
|
|
463
|
+
assert.equal(result.failure?.retryable, true);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("failureDiag without a rate limit still classifies as provider_unavailable", async () => {
|
|
467
|
+
const remoteLlm: TimelineAnalysisRemoteLlm = {
|
|
468
|
+
chatCompletion: async (_messages, options) => {
|
|
469
|
+
options.failureDiag!.lastError = Object.assign(new Error("server error"), { status: 500 });
|
|
470
|
+
return null;
|
|
471
|
+
},
|
|
472
|
+
};
|
|
473
|
+
const result = await runTimelineCardAnalysis({
|
|
474
|
+
date: DATE,
|
|
475
|
+
timezone: TZ,
|
|
476
|
+
cards: sampleCards(),
|
|
477
|
+
observations: [observation()],
|
|
478
|
+
config: ENABLED,
|
|
479
|
+
deps: { remoteLlm },
|
|
480
|
+
});
|
|
481
|
+
assert.equal(result.status, "provider_failed");
|
|
482
|
+
assert.equal(result.failure?.kind, "provider_unavailable");
|
|
483
|
+
assert.equal(result.failure?.retryable, true);
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
test("a null completion with no recorded cause keeps the generic kind", async () => {
|
|
487
|
+
const remoteLlm: TimelineAnalysisRemoteLlm = {
|
|
488
|
+
chatCompletion: async () => null,
|
|
489
|
+
};
|
|
490
|
+
const result = await runTimelineCardAnalysis({
|
|
491
|
+
date: DATE,
|
|
492
|
+
timezone: TZ,
|
|
493
|
+
cards: sampleCards(),
|
|
494
|
+
observations: [observation()],
|
|
495
|
+
config: ENABLED,
|
|
496
|
+
deps: { remoteLlm },
|
|
497
|
+
});
|
|
498
|
+
assert.equal(result.status, "provider_failed");
|
|
499
|
+
assert.equal(result.failure?.kind, "provider_unavailable");
|
|
500
|
+
assert.equal(result.failure?.retryable, true);
|
|
501
|
+
});
|
|
@@ -167,3 +167,33 @@ test("range and search reject publish-only flags instead of ignoring them", asyn
|
|
|
167
167
|
assert.equal(searchCode, 1);
|
|
168
168
|
assert.match(searchSink.err, /unknown flag --dry-run \(valid: --from, --limit, --query, --to\)/);
|
|
169
169
|
});
|
|
170
|
+
|
|
171
|
+
test("an explicitly empty --date is invalid, not treated as absent (#2917)", async () => {
|
|
172
|
+
const { config, notePath, note } = makeFixture();
|
|
173
|
+
const sink = capture();
|
|
174
|
+
|
|
175
|
+
const code = await runTimelineCliCommand(
|
|
176
|
+
{ cards: null, qa: { enabled: false, maxRangeDays: 31 }, timelineEnabled: true, config },
|
|
177
|
+
["publish", "--date", ""],
|
|
178
|
+
sink.io,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
assert.equal(code, 1);
|
|
182
|
+
assert.match(sink.err, /Invalid --date ""/);
|
|
183
|
+
assert.equal(readFileSync(notePath, "utf8"), note, "no note is published on an empty --date");
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test("publish rejects extra positional arguments instead of discarding them (#2917)", async () => {
|
|
187
|
+
const { config, notePath, note } = makeFixture();
|
|
188
|
+
const sink = capture();
|
|
189
|
+
|
|
190
|
+
const code = await runTimelineCliCommand(
|
|
191
|
+
{ cards: null, qa: { enabled: false, maxRangeDays: 31 }, timelineEnabled: true, config },
|
|
192
|
+
["publish", "extra-arg", "--date", DATE],
|
|
193
|
+
sink.io,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
assert.equal(code, 1);
|
|
197
|
+
assert.match(sink.err, /takes no positional arguments/);
|
|
198
|
+
assert.equal(readFileSync(notePath, "utf8"), note, "no note is published on excess syntax");
|
|
199
|
+
});
|
|
@@ -51,6 +51,13 @@ export function runTimelinePublishCli(
|
|
|
51
51
|
return 1;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
// An explicitly empty --date is invalid, not absent (issue #2917): ""
|
|
55
|
+
// can never be a day, and silently falling back to today would publish
|
|
56
|
+
// the wrong note. Only a missing --date means "today".
|
|
57
|
+
if (options.date !== undefined && (typeof options.date !== "string" || options.date.length === 0)) {
|
|
58
|
+
io.stderr.write(`Invalid --date ${JSON.stringify(options.date ?? "")}; expected YYYY-MM-DD.\n`);
|
|
59
|
+
return 1;
|
|
60
|
+
}
|
|
54
61
|
// Timeline artifacts are grouped on the configured activity timezone's
|
|
55
62
|
// calendar day, so "today" must be derived there — the host-local day
|
|
56
63
|
// drifts by one near either timezone's midnight.
|
|
@@ -311,7 +311,14 @@ export async function runTimelineCliCommand(
|
|
|
311
311
|
io.stderr.write("timeline publish requires the Remnic config — run `remnic doctor`\n");
|
|
312
312
|
return 1;
|
|
313
313
|
}
|
|
314
|
-
const publishFlags = parseFlags(rest, PUBLISH_FLAGS)
|
|
314
|
+
const { flags: publishFlags, positional } = parseFlags(rest, PUBLISH_FLAGS);
|
|
315
|
+
// `publish` takes flags only (issue #2917): a stray positional used
|
|
316
|
+
// to be silently discarded while today's note published.
|
|
317
|
+
if (positional.length > 0) {
|
|
318
|
+
throw new TypeError(
|
|
319
|
+
`timeline publish takes no positional arguments (got ${JSON.stringify(positional.join(" "))})`,
|
|
320
|
+
);
|
|
321
|
+
}
|
|
315
322
|
return runTimelinePublishCli(
|
|
316
323
|
deps.config,
|
|
317
324
|
{
|
|
@@ -114,7 +114,6 @@ function priorEditsFromPrompt(prompt: string): unknown {
|
|
|
114
114
|
return parsed.priorEdits;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
|
|
118
117
|
test("disabled analysis persists deterministic cards and makes zero provider calls", async () => {
|
|
119
118
|
await withStore(async (store, memoryDir) => {
|
|
120
119
|
store.insertSnapshot(snapshot());
|
|
@@ -387,6 +386,54 @@ test("resolveTimelineLoadDates keeps a bounded window and expands an unbounded o
|
|
|
387
386
|
assert.deepEqual(empty, ["2026-08-23"]);
|
|
388
387
|
});
|
|
389
388
|
|
|
389
|
+
test("resolveTimelineLoadDates loads the local day of a lone bound, never today (#2931)", () => {
|
|
390
|
+
const store = { snapshotCaptureExtent: () => null };
|
|
391
|
+
const base = { timezone: "UTC" as const, today: "2026-08-23", store, persistedDates: [] as string[] };
|
|
392
|
+
|
|
393
|
+
const loneTo = resolveTimelineLoadDates({
|
|
394
|
+
...base,
|
|
395
|
+
window: { to: "2026-05-02T12:00:00.000Z" },
|
|
396
|
+
});
|
|
397
|
+
assert.deepEqual(loneTo, ["2026-05-02"], "a lone --to must load the day of the to instant, not today");
|
|
398
|
+
|
|
399
|
+
const loneFrom = resolveTimelineLoadDates({
|
|
400
|
+
...base,
|
|
401
|
+
window: { from: "2026-05-02T12:00:00.000Z" },
|
|
402
|
+
});
|
|
403
|
+
assert.deepEqual(loneFrom, ["2026-05-02"], "a lone --from keeps loading its own day");
|
|
404
|
+
|
|
405
|
+
const futureTo = resolveTimelineLoadDates({
|
|
406
|
+
...base,
|
|
407
|
+
window: { to: "2026-09-01T12:00:00.000Z" },
|
|
408
|
+
});
|
|
409
|
+
assert.deepEqual(futureTo, ["2026-09-01"], "a lone future --to loads that future day, not today");
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
test("resolveTimelineLoadDates resolves a lone --to day through the configured timezone (#2931)", () => {
|
|
413
|
+
const store = { snapshotCaptureExtent: () => null };
|
|
414
|
+
// 2026-08-20T23:30Z is 2026-08-21 13:30 in Kiritimati (UTC+14) but still
|
|
415
|
+
// 2026-08-20 in Adak (UTC-10): the same instant must load different local
|
|
416
|
+
// days under the two configured zones, proving the configured timezone —
|
|
417
|
+
// not UTC and not today — drives the resolution.
|
|
418
|
+
const east = resolveTimelineLoadDates({
|
|
419
|
+
window: { to: "2026-08-20T23:30:00.000Z" },
|
|
420
|
+
timezone: "Pacific/Kiritimati",
|
|
421
|
+
today: "2026-08-23",
|
|
422
|
+
store,
|
|
423
|
+
persistedDates: [],
|
|
424
|
+
});
|
|
425
|
+
assert.deepEqual(east, ["2026-08-21"]);
|
|
426
|
+
|
|
427
|
+
const west = resolveTimelineLoadDates({
|
|
428
|
+
window: { to: "2026-08-20T23:30:00.000Z" },
|
|
429
|
+
timezone: "America/Adak",
|
|
430
|
+
today: "2026-08-23",
|
|
431
|
+
store,
|
|
432
|
+
persistedDates: [],
|
|
433
|
+
});
|
|
434
|
+
assert.deepEqual(west, ["2026-08-20"]);
|
|
435
|
+
});
|
|
436
|
+
|
|
390
437
|
test("localDatesForUtcRange covers a multi-year span for unbounded search", () => {
|
|
391
438
|
const dates = localDatesForUtcRange(
|
|
392
439
|
Date.parse("2020-01-01T00:00:00.000Z"),
|
|
@@ -413,6 +460,88 @@ test("listPersistedTimelineDates lists only valid day files", async () => {
|
|
|
413
460
|
}
|
|
414
461
|
});
|
|
415
462
|
|
|
463
|
+
test("a timezone change invalidates the cached day and re-analyzes (issue #2891)", async () => {
|
|
464
|
+
await withStore(async (store, memoryDir) => {
|
|
465
|
+
store.insertSnapshot(snapshot());
|
|
466
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
467
|
+
const analysis = parseActivityConfig({
|
|
468
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
|
|
469
|
+
}).timeline.analysis;
|
|
470
|
+
const first = await regenerateTimelineDay({
|
|
471
|
+
date: DATE,
|
|
472
|
+
timezone: TZ,
|
|
473
|
+
memoryDir,
|
|
474
|
+
store,
|
|
475
|
+
timelineEnabled: true,
|
|
476
|
+
analysis,
|
|
477
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
478
|
+
});
|
|
479
|
+
assert.equal(first.status, "ok");
|
|
480
|
+
assert.equal(remote.calls, 1);
|
|
481
|
+
const sameTz = await regenerateTimelineDay({
|
|
482
|
+
date: DATE,
|
|
483
|
+
timezone: TZ,
|
|
484
|
+
memoryDir,
|
|
485
|
+
store,
|
|
486
|
+
timelineEnabled: true,
|
|
487
|
+
analysis,
|
|
488
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
489
|
+
});
|
|
490
|
+
assert.equal(sameTz.written, false);
|
|
491
|
+
assert.equal(remote.calls, 1);
|
|
492
|
+
const shifted = await regenerateTimelineDay({
|
|
493
|
+
date: DATE,
|
|
494
|
+
timezone: "America/New_York",
|
|
495
|
+
memoryDir,
|
|
496
|
+
store,
|
|
497
|
+
timelineEnabled: true,
|
|
498
|
+
analysis,
|
|
499
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
500
|
+
});
|
|
501
|
+
assert.equal(shifted.status, "ok");
|
|
502
|
+
assert.equal(shifted.written, true);
|
|
503
|
+
assert.equal(shifted.analyzed, true);
|
|
504
|
+
assert.equal(remote.calls, 2);
|
|
505
|
+
const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
|
|
506
|
+
assert.equal(persisted.timezone, "America/New_York");
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
test("an empty day cached under one timezone is rebuilt under another (issue #2891)", async () => {
|
|
511
|
+
await withStore(async (store, memoryDir) => {
|
|
512
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
513
|
+
const analysis = parseActivityConfig({
|
|
514
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
|
|
515
|
+
}).timeline.analysis;
|
|
516
|
+
const first = await regenerateTimelineDay({
|
|
517
|
+
date: DATE,
|
|
518
|
+
timezone: TZ,
|
|
519
|
+
memoryDir,
|
|
520
|
+
store,
|
|
521
|
+
timelineEnabled: true,
|
|
522
|
+
analysis,
|
|
523
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
524
|
+
});
|
|
525
|
+
assert.equal(first.status, "invalid_output");
|
|
526
|
+
assert.equal(first.analyzed, false);
|
|
527
|
+
assert.equal(remote.calls, 0);
|
|
528
|
+
const shifted = await regenerateTimelineDay({
|
|
529
|
+
date: DATE,
|
|
530
|
+
timezone: "America/New_York",
|
|
531
|
+
memoryDir,
|
|
532
|
+
store,
|
|
533
|
+
timelineEnabled: true,
|
|
534
|
+
analysis,
|
|
535
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
536
|
+
});
|
|
537
|
+
// Zero observations under any timezone: still a rebuild, never the
|
|
538
|
+
// UTC-cached file served with the old day derivation.
|
|
539
|
+
assert.equal(shifted.written, true);
|
|
540
|
+
const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
|
|
541
|
+
assert.equal(persisted.timezone, "America/New_York");
|
|
542
|
+
});
|
|
543
|
+
});
|
|
544
|
+
|
|
416
545
|
test("a correction for another day does not change this day's hash, cache, or provider input", async () => {
|
|
417
546
|
await withStore(async (store, memoryDir) => {
|
|
418
547
|
store.insertSnapshot(snapshot());
|
|
@@ -502,4 +631,3 @@ test("a same-day correction updates hash, cards, and priorEdits", async () => {
|
|
|
502
631
|
assert.notEqual(persistedSourceHash(await readFile(timelineDayPath(memoryDir, DATE), "utf8")), firstHash);
|
|
503
632
|
});
|
|
504
633
|
});
|
|
505
|
-
|
|
@@ -143,9 +143,10 @@ export function listPersistedTimelineDates(memoryDir: string): string[] {
|
|
|
143
143
|
|
|
144
144
|
/**
|
|
145
145
|
* Local days a CLI window must load. Bounded windows keep the explicit
|
|
146
|
-
* from/to span
|
|
147
|
-
*
|
|
148
|
-
*
|
|
146
|
+
* from/to span; a window with a single bound loads the local day containing
|
|
147
|
+
* that instant (never today). An unbounded search loads every day the
|
|
148
|
+
* snapshot store or a persisted day file covers (plus today), so historical
|
|
149
|
+
* cards enter the search pool instead of only the current day.
|
|
149
150
|
*/
|
|
150
151
|
export function resolveTimelineLoadDates(input: {
|
|
151
152
|
window: { from?: string; to?: string };
|
|
@@ -156,8 +157,9 @@ export function resolveTimelineLoadDates(input: {
|
|
|
156
157
|
}): string[] {
|
|
157
158
|
const { window, timezone, today, store, persistedDates } = input;
|
|
158
159
|
if (window.from !== undefined || window.to !== undefined) {
|
|
159
|
-
const
|
|
160
|
-
const
|
|
160
|
+
const parsedTo = window.to === undefined ? Number.NaN : Date.parse(window.to);
|
|
161
|
+
const fromMs = window.from === undefined ? parsedTo : Date.parse(window.from);
|
|
162
|
+
const toMs = window.to === undefined ? fromMs + 1 : parsedTo;
|
|
161
163
|
if (!Number.isFinite(fromMs) || !Number.isFinite(toMs)) return [];
|
|
162
164
|
return localDatesForUtcRange(fromMs, toMs > fromMs ? toMs : fromMs + 1, timezone);
|
|
163
165
|
}
|
|
@@ -191,12 +193,18 @@ function resolveClients(input: RegenerateTimelineDayInput): TimelineAnalysisClie
|
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
function sourceHash(input: {
|
|
196
|
+
timezone: string;
|
|
194
197
|
observations: readonly TimelineObservation[];
|
|
195
198
|
analysis: ActivityTimelineAnalysisConfig;
|
|
196
199
|
corrections: readonly TimelineCorrection[];
|
|
197
200
|
}): string {
|
|
198
201
|
return hashActivityBody(
|
|
199
202
|
JSON.stringify({
|
|
203
|
+
// The timezone is a day-window determinant (it bounds which
|
|
204
|
+
// observations the day sees), so it belongs to the source identity:
|
|
205
|
+
// identical observations under a different timezone must not reuse
|
|
206
|
+
// the cached day (issue #2891).
|
|
207
|
+
timezone: input.timezone,
|
|
200
208
|
observations: input.observations.map((observation) => ({
|
|
201
209
|
id: observation.id,
|
|
202
210
|
contentHash: observation.contentHash,
|
|
@@ -310,7 +318,7 @@ async function regenerateUncached(input: RegenerateTimelineDayInput): Promise<Re
|
|
|
310
318
|
const rawCards = buildTimelineDay({ date, timezone, observations }).cards;
|
|
311
319
|
corrections = correctionsForCards(rawCards, corrections);
|
|
312
320
|
const built = applyTimelineCorrections(rawCards, corrections);
|
|
313
|
-
const hash = sourceHash({ observations, analysis: input.analysis, corrections });
|
|
321
|
+
const hash = sourceHash({ timezone, observations, analysis: input.analysis, corrections });
|
|
314
322
|
const prior = readPersisted(filePath);
|
|
315
323
|
if (prior !== null && prior.sourceHash === hash && isCachedDayFinal(prior.status, input.analysis.enabled)) {
|
|
316
324
|
return toResult(filePath, false, false, prior);
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
applyVaultFrontmatter,
|
|
6
|
+
renderVaultPropertyValue,
|
|
7
|
+
validateVaultProperties,
|
|
8
|
+
VAULT_PROPERTY_LIST_MAX_ITEMS,
|
|
9
|
+
VAULT_PROPERTY_SCALAR_MAX_CHARS,
|
|
10
|
+
VAULT_PROPERTY_TOTAL_MAX_CHARS,
|
|
11
|
+
} from "./vault-frontmatter.js";
|
|
5
12
|
|
|
6
13
|
test("applyVaultFrontmatter merges listed keys and sorts", () => {
|
|
7
14
|
const merged = applyVaultFrontmatter("zeta: old\nalpha: keep\n", {
|
|
@@ -26,3 +33,94 @@ test("applyVaultFrontmatter leaves the original body unchanged when updates are
|
|
|
26
33
|
const existing = "zeta: 1\n# comment stays\nalpha: 2\n";
|
|
27
34
|
assert.equal(applyVaultFrontmatter(existing, {}), existing);
|
|
28
35
|
});
|
|
36
|
+
|
|
37
|
+
test("accepts a plain scalar and renders it verbatim (#2917)", () => {
|
|
38
|
+
assert.deepEqual(validateVaultProperties([{ key: "remnic_focus", value: "220" }]), { ok: true });
|
|
39
|
+
assert.equal(renderVaultPropertyValue("220"), "220");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("accepts a list of plain scalars and renders a flow list (#2917)", () => {
|
|
43
|
+
assert.deepEqual(validateVaultProperties([{ key: "remnic_cards", value: ["a", "b"] }]), { ok: true });
|
|
44
|
+
assert.equal(renderVaultPropertyValue(["a", "b"]), "[a, b]");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("rejects newline and control characters — the injection primitives (#2917)", () => {
|
|
48
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\ninjected: yes" }]).ok, false);
|
|
49
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\rinjected: yes" }]).ok, false);
|
|
50
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\ttab" }]).ok, false);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("rejects values whose YAML shape would change on re-read (#2917)", () => {
|
|
54
|
+
for (const value of [" padded", "padded ", "[seq]", "{map}", "#comment", "- item", "a #c", "ends:", "a: b"]) {
|
|
55
|
+
assert.equal(
|
|
56
|
+
validateVaultProperties([{ key: "remnic_x", value }]).ok,
|
|
57
|
+
false,
|
|
58
|
+
`value ${JSON.stringify(value)} must be rejected`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("a negative number stays a plain scalar (#2917)", () => {
|
|
64
|
+
assert.deepEqual(validateVaultProperties([{ key: "remnic_delta", value: "-5" }]), { ok: true });
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("rejects unsupported value shapes (#2917)", () => {
|
|
68
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: 42 as unknown as string }]).ok, false);
|
|
69
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: null as unknown as string }]).ok, false);
|
|
70
|
+
assert.equal(
|
|
71
|
+
validateVaultProperties([{ key: "remnic_x", value: { nested: true } as unknown as string }]).ok,
|
|
72
|
+
false,
|
|
73
|
+
);
|
|
74
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: [] as unknown as string[] }]).ok, false);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("rejects oversize scalars, lists, keys, and totals (#2917)", () => {
|
|
78
|
+
assert.equal(
|
|
79
|
+
validateVaultProperties([{ key: "remnic_x", value: "v".repeat(VAULT_PROPERTY_SCALAR_MAX_CHARS + 1) }]).ok,
|
|
80
|
+
false,
|
|
81
|
+
);
|
|
82
|
+
assert.equal(validateVaultProperties([{ key: "x".repeat(65), value: "v" }]).ok, false);
|
|
83
|
+
const tooMany = Array.from({ length: VAULT_PROPERTY_LIST_MAX_ITEMS + 1 }, (_, i) => `item-${i}`);
|
|
84
|
+
assert.equal(validateVaultProperties([{ key: "remnic_x", value: tooMany }]).ok, false);
|
|
85
|
+
const entries = Array.from({ length: 30 }, (_, i) => ({
|
|
86
|
+
key: `remnic_k${i}`,
|
|
87
|
+
value: "v".repeat(100),
|
|
88
|
+
}));
|
|
89
|
+
assert.equal(
|
|
90
|
+
validateVaultProperties(entries).ok,
|
|
91
|
+
false,
|
|
92
|
+
`30 × 100+ chars must exceed the ${VAULT_PROPERTY_TOTAL_MAX_CHARS}-char total`,
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("rejects malformed keys (#2917)", () => {
|
|
97
|
+
assert.equal(validateVaultProperties([{ key: "remnic x:", value: "v" }]).ok, false);
|
|
98
|
+
assert.equal(validateVaultProperties([{ key: " padded", value: "v" }]).ok, false);
|
|
99
|
+
assert.equal(validateVaultProperties([{ key: "remnic#x", value: "v" }]).ok, false);
|
|
100
|
+
assert.equal(validateVaultProperties([{ key: "", value: "v" }]).ok, false);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("rejects a final key that starts with a YAML indicator (#2917)", () => {
|
|
104
|
+
// Prefix "[" + key "focus" is the review case: the written line would
|
|
105
|
+
// be `[focus: 220`, which is not a mapping entry.
|
|
106
|
+
for (const key of ["[focus", "{focus", "*focus", "&focus", "!focus", "%focus"]) {
|
|
107
|
+
assert.equal(
|
|
108
|
+
validateVaultProperties([{ key, value: "220" }]).ok,
|
|
109
|
+
false,
|
|
110
|
+
`key ${JSON.stringify(key)} must be rejected`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
assert.deepEqual(validateVaultProperties([{ key: "remnic_focus", value: "220" }]), { ok: true });
|
|
114
|
+
assert.deepEqual(validateVaultProperties([{ key: "x_focus", value: "220" }]), { ok: true });
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("rejects flow delimiters inside list scalar items (#2917)", () => {
|
|
118
|
+
for (const item of ["a{", "a}", "a[", "a]", "a,b"]) {
|
|
119
|
+
assert.equal(
|
|
120
|
+
validateVaultProperties([{ key: "remnic_cards", value: [item] }]).ok,
|
|
121
|
+
false,
|
|
122
|
+
`list item ${JSON.stringify(item)} must be rejected`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
assert.deepEqual(validateVaultProperties([{ key: "remnic_cards", value: ["a", "b"] }]), { ok: true });
|
|
126
|
+
});
|