@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
|
@@ -37,3 +37,134 @@ export function applyVaultFrontmatter(
|
|
|
37
37
|
.map((key) => `${key}: ${merged.get(key)}`)
|
|
38
38
|
.join("\n");
|
|
39
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Frontmatter property boundary for the vault publisher (issue #2917).
|
|
43
|
+
*
|
|
44
|
+
* Property values written into note frontmatter must be single-line
|
|
45
|
+
* plain YAML scalars (or lists of them) whose rendered `key: value` line
|
|
46
|
+
* cannot change shape or inject keys when a YAML parser reads the note
|
|
47
|
+
* back. Validation is pure and total; the publisher runs it before any
|
|
48
|
+
* note byte is read or written, so a rejection can never leave a
|
|
49
|
+
* half-merged note behind.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/** A supported property value: one plain scalar, or a list of them. */
|
|
53
|
+
export type VaultPropertyValue = string | readonly string[];
|
|
54
|
+
|
|
55
|
+
export const VAULT_PROPERTY_KEY_MAX_CHARS = 64;
|
|
56
|
+
export const VAULT_PROPERTY_SCALAR_MAX_CHARS = 200;
|
|
57
|
+
export const VAULT_PROPERTY_LIST_MAX_ITEMS = 20;
|
|
58
|
+
export const VAULT_PROPERTY_TOTAL_MAX_CHARS = 2_000;
|
|
59
|
+
|
|
60
|
+
// C0 controls, DEL, and C1 controls. Covers \n, \r, \t — a newline is the
|
|
61
|
+
// frontmatter-injection primitive (`v\ninjected: yes` becomes a new key).
|
|
62
|
+
const CONTROL_RE = /[\u0000-\u001f\u007f-\u009f]/;
|
|
63
|
+
// Characters that make the first character a YAML indicator. `-`, `?`,
|
|
64
|
+
// and `:` only indicate when followed by a space, so `-5` stays a plain
|
|
65
|
+
// scalar while `- 5` does not.
|
|
66
|
+
const INDICATOR_CHARS = ",[]{}#&*!|>'\"%@`";
|
|
67
|
+
const INJECTION_RE = /: | #/;
|
|
68
|
+
// Flow-collection delimiters. Lists render as `[a, b]`; a bare delimiter
|
|
69
|
+
// inside an item splits or closes the sequence on re-read.
|
|
70
|
+
const FLOW_ITEM_DELIM_RE = /[[\]{},]/;
|
|
71
|
+
|
|
72
|
+
export type ValidateVaultPropertyResult = { ok: true } | { ok: false; reason: string };
|
|
73
|
+
|
|
74
|
+
/** Render a validated value the way `mergeFrontmatterKeys` writes it. */
|
|
75
|
+
export function renderVaultPropertyValue(value: VaultPropertyValue): string {
|
|
76
|
+
return typeof value === "string" ? value : `[${value.join(", ")}]`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function hasLeadingYamlIndicator(text: string): boolean {
|
|
80
|
+
const first = text[0];
|
|
81
|
+
if (first === undefined) return false;
|
|
82
|
+
return INDICATOR_CHARS.includes(first) || ("-?:".includes(first) && text[1] === " ");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function validateScalar(value: string, label: string): ValidateVaultPropertyResult {
|
|
86
|
+
if (value.length === 0) {
|
|
87
|
+
return { ok: false, reason: `${label} must not be empty` };
|
|
88
|
+
}
|
|
89
|
+
if (value.length > VAULT_PROPERTY_SCALAR_MAX_CHARS) {
|
|
90
|
+
return { ok: false, reason: `${label} exceeds ${VAULT_PROPERTY_SCALAR_MAX_CHARS} characters` };
|
|
91
|
+
}
|
|
92
|
+
if (CONTROL_RE.test(value)) {
|
|
93
|
+
return { ok: false, reason: `${label} must not contain control characters or line breaks` };
|
|
94
|
+
}
|
|
95
|
+
if (value !== value.trim()) {
|
|
96
|
+
return { ok: false, reason: `${label} must not carry leading or trailing whitespace` };
|
|
97
|
+
}
|
|
98
|
+
if (hasLeadingYamlIndicator(value)) {
|
|
99
|
+
return { ok: false, reason: `${label} must be a plain scalar (leading "${value[0]}" changes its YAML shape)` };
|
|
100
|
+
}
|
|
101
|
+
if (INJECTION_RE.test(value)) {
|
|
102
|
+
return { ok: false, reason: `${label} must not contain ": " or " #"` };
|
|
103
|
+
}
|
|
104
|
+
if (value.endsWith(":")) {
|
|
105
|
+
return { ok: false, reason: `${label} must not end with ":"` };
|
|
106
|
+
}
|
|
107
|
+
return { ok: true };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Validate the final (already-prefixed) property set a publish would
|
|
112
|
+
* write: key shape, per-value scalar/list shape, per-value bounds, and
|
|
113
|
+
* the total rendered size across every entry.
|
|
114
|
+
*/
|
|
115
|
+
export function validateVaultProperties(
|
|
116
|
+
entries: ReadonlyArray<{ key: string; value: VaultPropertyValue }>,
|
|
117
|
+
): ValidateVaultPropertyResult {
|
|
118
|
+
let total = 0;
|
|
119
|
+
for (const { key, value } of entries) {
|
|
120
|
+
if (key.length === 0) {
|
|
121
|
+
return { ok: false, reason: "property keys must not be empty" };
|
|
122
|
+
}
|
|
123
|
+
if (key.length > VAULT_PROPERTY_KEY_MAX_CHARS) {
|
|
124
|
+
return { ok: false, reason: `property key exceeds ${VAULT_PROPERTY_KEY_MAX_CHARS} characters` };
|
|
125
|
+
}
|
|
126
|
+
if (
|
|
127
|
+
CONTROL_RE.test(key) ||
|
|
128
|
+
key !== key.trim() ||
|
|
129
|
+
key.includes(":") ||
|
|
130
|
+
key.includes("#") ||
|
|
131
|
+
hasLeadingYamlIndicator(key)
|
|
132
|
+
) {
|
|
133
|
+
return { ok: false, reason: `property key ${JSON.stringify(key)} is not a plain mapping key` };
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === "string") {
|
|
136
|
+
const scalar = validateScalar(value, `property ${key}`);
|
|
137
|
+
if (!scalar.ok) return scalar;
|
|
138
|
+
} else {
|
|
139
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
140
|
+
return { ok: false, reason: `property ${key} must be a scalar string or a non-empty list of scalar strings` };
|
|
141
|
+
}
|
|
142
|
+
if (value.length > VAULT_PROPERTY_LIST_MAX_ITEMS) {
|
|
143
|
+
return { ok: false, reason: `property ${key} exceeds ${VAULT_PROPERTY_LIST_MAX_ITEMS} list items` };
|
|
144
|
+
}
|
|
145
|
+
for (const item of value) {
|
|
146
|
+
if (typeof item !== "string") {
|
|
147
|
+
return { ok: false, reason: `property ${key} must be a scalar string or a list of scalar strings` };
|
|
148
|
+
}
|
|
149
|
+
const scalar = validateScalar(item, `property ${key} list item`);
|
|
150
|
+
if (!scalar.ok) return scalar;
|
|
151
|
+
// Lists render in flow form `[a, b]`; a bare delimiter inside an
|
|
152
|
+
// item would split or close the sequence on re-read.
|
|
153
|
+
if (FLOW_ITEM_DELIM_RE.test(item)) {
|
|
154
|
+
return {
|
|
155
|
+
ok: false,
|
|
156
|
+
reason: `property ${key} list item must not contain flow delimiters "[", "]", "{", "}", or ","`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
total += key.length + 2 + renderVaultPropertyValue(value).length;
|
|
162
|
+
if (total > VAULT_PROPERTY_TOTAL_MAX_CHARS) {
|
|
163
|
+
return {
|
|
164
|
+
ok: false,
|
|
165
|
+
reason: `frontmatter properties exceed the ${VAULT_PROPERTY_TOTAL_MAX_CHARS}-character total`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { ok: true };
|
|
170
|
+
}
|
|
@@ -261,6 +261,12 @@ export function parseAtxHeading(line: string): { level: number; text: string } |
|
|
|
261
261
|
return { level, text: line.slice(start, end) };
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
/** True when `## ${name}` parses back to the same heading text. */
|
|
265
|
+
export function headingSurvivesRoundTrip(name: string): boolean {
|
|
266
|
+
const parsed = parseAtxHeading(`## ${name}`);
|
|
267
|
+
return parsed !== null && parsed.text === name;
|
|
268
|
+
}
|
|
269
|
+
|
|
264
270
|
export function publishVaultRegion(input: {
|
|
265
271
|
vaultPath: string;
|
|
266
272
|
relativeFile: string;
|
|
@@ -879,3 +879,175 @@ test("a concurrent editor save between read and rename aborts the publish and ke
|
|
|
879
879
|
setVaultPublisherTestHooks(null);
|
|
880
880
|
}
|
|
881
881
|
});
|
|
882
|
+
|
|
883
|
+
// ── Input-boundary regressions (issue #2917) ────────────────────────────
|
|
884
|
+
// Every rejection below must fire before any file byte is read or written.
|
|
885
|
+
|
|
886
|
+
test("a whitespace-padded section name is rejected, not silently trimmed (#2917)", () => {
|
|
887
|
+
const { vault, notePath } = makeVault();
|
|
888
|
+
const before = readFileSync(notePath, "utf8");
|
|
889
|
+
assert.throws(
|
|
890
|
+
() =>
|
|
891
|
+
publishVaultNote({
|
|
892
|
+
vaultPath: vault,
|
|
893
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
894
|
+
date: DATE,
|
|
895
|
+
sections: [{ name: " timeline ", content: "fresh recap" }],
|
|
896
|
+
}),
|
|
897
|
+
/is not a valid region name/,
|
|
898
|
+
);
|
|
899
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
test("a heading-strategy section name that cannot round-trip through the heading parser is rejected (#2917)", () => {
|
|
903
|
+
const { vault, notePath } = makeVault();
|
|
904
|
+
const before = readFileSync(notePath, "utf8");
|
|
905
|
+
// `## Timeline #` parses back as `Timeline` (closing hash sequence), so
|
|
906
|
+
// the region could never be matched on any publish.
|
|
907
|
+
assert.throws(
|
|
908
|
+
() =>
|
|
909
|
+
publishVaultNote({
|
|
910
|
+
vaultPath: vault,
|
|
911
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
912
|
+
date: DATE,
|
|
913
|
+
strategy: "heading",
|
|
914
|
+
sections: [{ name: "Timeline #", content: "fresh recap" }],
|
|
915
|
+
}),
|
|
916
|
+
/not matchable by the heading parser/,
|
|
917
|
+
);
|
|
918
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
919
|
+
});
|
|
920
|
+
|
|
921
|
+
test("a newline-bearing frontmatter value is rejected before any file mutation (#2917)", () => {
|
|
922
|
+
const { vault, notePath } = makeVault();
|
|
923
|
+
const before = readFileSync(notePath, "utf8");
|
|
924
|
+
const mtime = statSync(notePath).mtimeMs;
|
|
925
|
+
assert.throws(
|
|
926
|
+
() =>
|
|
927
|
+
publishVaultNote({
|
|
928
|
+
vaultPath: vault,
|
|
929
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
930
|
+
date: DATE,
|
|
931
|
+
sections: [
|
|
932
|
+
{
|
|
933
|
+
name: "timeline",
|
|
934
|
+
content: "fresh recap",
|
|
935
|
+
properties: { focus: "220\ninjected: yes" },
|
|
936
|
+
},
|
|
937
|
+
],
|
|
938
|
+
propertiesMode: "frontmatter",
|
|
939
|
+
}),
|
|
940
|
+
/control characters or line breaks/,
|
|
941
|
+
);
|
|
942
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
943
|
+
assert.equal(statSync(notePath).mtimeMs, mtime, "no write attempt was made");
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
test("an oversize or injection-shaped frontmatter value is rejected before any file mutation (#2917)", () => {
|
|
947
|
+
const { vault, notePath } = makeVault();
|
|
948
|
+
const before = readFileSync(notePath, "utf8");
|
|
949
|
+
for (const value of ["x".repeat(201), "[flow]", "a #comment", " leading-space"] as const) {
|
|
950
|
+
assert.throws(
|
|
951
|
+
() =>
|
|
952
|
+
publishVaultNote({
|
|
953
|
+
vaultPath: vault,
|
|
954
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
955
|
+
date: DATE,
|
|
956
|
+
sections: [{ name: "timeline", content: "fresh recap", properties: { focus: value } }],
|
|
957
|
+
propertiesMode: "frontmatter",
|
|
958
|
+
}),
|
|
959
|
+
RangeError,
|
|
960
|
+
`value ${JSON.stringify(value)} must be rejected at the boundary`,
|
|
961
|
+
);
|
|
962
|
+
}
|
|
963
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
test("a valid list property publishes as a flow list in frontmatter (#2917)", () => {
|
|
967
|
+
const { vault, notePath } = makeVault();
|
|
968
|
+
const status = publishVaultNote({
|
|
969
|
+
vaultPath: vault,
|
|
970
|
+
notePathTemplate: "Daily Notes/{yyyy}/{MM}/{yyyy}-{MM}-{dd}.md",
|
|
971
|
+
date: DATE,
|
|
972
|
+
sections: [{ name: "timeline", content: "fresh recap", properties: { cards: ["a", "b"] } }],
|
|
973
|
+
propertiesMode: "frontmatter",
|
|
974
|
+
});
|
|
975
|
+
const after = readFileSync(notePath, "utf8");
|
|
976
|
+
assert.match(after, /^remnic_cards: \[a, b\]$/m);
|
|
977
|
+
});
|
|
978
|
+
|
|
979
|
+
test("frontmatter property totals are bounded across sections (#2917)", () => {
|
|
980
|
+
const { vault, notePath } = makeVault();
|
|
981
|
+
const before = readFileSync(notePath, "utf8");
|
|
982
|
+
// Each value is under the per-scalar cap; the SUM crosses the total.
|
|
983
|
+
const big = "v".repeat(200);
|
|
984
|
+
const properties = Object.fromEntries(
|
|
985
|
+
Array.from({ length: 12 }, (_, i) => [`k${i}`, big]),
|
|
986
|
+
);
|
|
987
|
+
assert.throws(
|
|
988
|
+
() =>
|
|
989
|
+
publishVaultNote({
|
|
990
|
+
vaultPath: vault,
|
|
991
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
992
|
+
date: DATE,
|
|
993
|
+
sections: [
|
|
994
|
+
{ name: "timeline", content: "fresh recap", properties },
|
|
995
|
+
],
|
|
996
|
+
propertiesMode: "frontmatter",
|
|
997
|
+
}),
|
|
998
|
+
/character total/,
|
|
999
|
+
);
|
|
1000
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
1001
|
+
});
|
|
1002
|
+
|
|
1003
|
+
test("a prefix that makes the final key start with a YAML indicator is rejected before any file mutation (#2917)", () => {
|
|
1004
|
+
const { vault, notePath } = makeVault();
|
|
1005
|
+
const before = readFileSync(notePath, "utf8");
|
|
1006
|
+
const mtime = statSync(notePath).mtimeMs;
|
|
1007
|
+
assert.throws(
|
|
1008
|
+
() =>
|
|
1009
|
+
publishVaultNote({
|
|
1010
|
+
vaultPath: vault,
|
|
1011
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
1012
|
+
date: DATE,
|
|
1013
|
+
sections: [{ name: "timeline", content: "fresh recap", properties: { focus: "220" } }],
|
|
1014
|
+
propertiesMode: "frontmatter",
|
|
1015
|
+
propertiesPrefix: "[",
|
|
1016
|
+
}),
|
|
1017
|
+
/not a plain mapping key/,
|
|
1018
|
+
);
|
|
1019
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
1020
|
+
assert.equal(statSync(notePath).mtimeMs, mtime, "no write attempt was made");
|
|
1021
|
+
});
|
|
1022
|
+
|
|
1023
|
+
test("a list item carrying a flow delimiter is rejected before any file mutation (#2917)", () => {
|
|
1024
|
+
const { vault, notePath } = makeVault();
|
|
1025
|
+
const before = readFileSync(notePath, "utf8");
|
|
1026
|
+
const mtime = statSync(notePath).mtimeMs;
|
|
1027
|
+
assert.throws(
|
|
1028
|
+
() =>
|
|
1029
|
+
publishVaultNote({
|
|
1030
|
+
vaultPath: vault,
|
|
1031
|
+
notePathTemplate: "{yyyy}-{MM}-{dd}.md",
|
|
1032
|
+
date: DATE,
|
|
1033
|
+
sections: [{ name: "timeline", content: "fresh recap", properties: { cards: ["a{"] } }],
|
|
1034
|
+
propertiesMode: "frontmatter",
|
|
1035
|
+
}),
|
|
1036
|
+
/flow delimiter/,
|
|
1037
|
+
);
|
|
1038
|
+
assert.equal(readFileSync(notePath, "utf8"), before, "the note is untouched");
|
|
1039
|
+
assert.equal(statSync(notePath).mtimeMs, mtime, "no write attempt was made");
|
|
1040
|
+
});
|
|
1041
|
+
|
|
1042
|
+
test("a valid prefix still publishes a plain final key (#2917)", () => {
|
|
1043
|
+
const { vault, notePath } = makeVault();
|
|
1044
|
+
publishVaultNote({
|
|
1045
|
+
vaultPath: vault,
|
|
1046
|
+
notePathTemplate: "Daily Notes/{yyyy}/{MM}/{yyyy}-{MM}-{dd}.md",
|
|
1047
|
+
date: DATE,
|
|
1048
|
+
sections: [{ name: "timeline", content: "fresh recap", properties: { focus: "220" } }],
|
|
1049
|
+
propertiesMode: "frontmatter",
|
|
1050
|
+
propertiesPrefix: "x_",
|
|
1051
|
+
});
|
|
1052
|
+
assert.match(readFileSync(notePath, "utf8"), /^x_focus: 220$/m);
|
|
1053
|
+
});
|
|
@@ -19,7 +19,12 @@ import { chmodSync, chownSync, lstatSync, mkdirSync, readFileSync, realpathSync,
|
|
|
19
19
|
import path from "node:path";
|
|
20
20
|
|
|
21
21
|
import { expandTildePath } from "../utils/path.js";
|
|
22
|
-
import { applyManagedRegion, fileLines } from "./vault-publish.js";
|
|
22
|
+
import { applyManagedRegion, fileLines, headingSurvivesRoundTrip } from "./vault-publish.js";
|
|
23
|
+
import {
|
|
24
|
+
renderVaultPropertyValue,
|
|
25
|
+
validateVaultProperties,
|
|
26
|
+
type VaultPropertyValue,
|
|
27
|
+
} from "./vault-frontmatter.js";
|
|
23
28
|
import { insertMarkersUnderHeading } from "./vault-insert.js";
|
|
24
29
|
import { validateRegionName } from "./vault-region.js";
|
|
25
30
|
import { assertBeginEndPair } from "./vault-region-pair.js";
|
|
@@ -37,8 +42,8 @@ export interface VaultSectionPublish {
|
|
|
37
42
|
name: string;
|
|
38
43
|
/** Rendered artifact body the region owns. */
|
|
39
44
|
content: string;
|
|
40
|
-
/** Unprefixed stats, e.g. `{ focus_minutes: "220" }`; keys get the configured prefix. */
|
|
41
|
-
properties?: Readonly<Record<string,
|
|
45
|
+
/** Unprefixed stats, e.g. `{ focus_minutes: "220" }`; keys get the configured prefix. Values are plain single-line scalars or lists of them (vault-frontmatter.ts). */
|
|
46
|
+
properties?: Readonly<Record<string, VaultPropertyValue>>;
|
|
42
47
|
/** When present, a provenance footer line is appended inside the region. */
|
|
43
48
|
provenance?: VaultSectionProvenance;
|
|
44
49
|
}
|
|
@@ -97,6 +102,48 @@ export function publishVaultNote(input: PublishVaultNoteInput): VaultPublishStat
|
|
|
97
102
|
}
|
|
98
103
|
}
|
|
99
104
|
|
|
105
|
+
|
|
106
|
+
// Issue #2917: input boundaries are total and run BEFORE any note byte
|
|
107
|
+
// is read or written, so a rejection can never leave a half-merged
|
|
108
|
+
// note behind.
|
|
109
|
+
|
|
110
|
+
// The heading strategy matches a section by scanning note headings with
|
|
111
|
+
// the shared ATX parser (`applyHeadingRegion`/`insertMarkersUnderHeading`).
|
|
112
|
+
// A name whose rendered heading parses back to something else — a
|
|
113
|
+
// trailing `#` run is stripped as a closing sequence (`## Timeline #`
|
|
114
|
+
// reads as `Timeline`) — can never be matched, so every publish would
|
|
115
|
+
// no-op or mis-scope. Reject it here rather than at match time.
|
|
116
|
+
const headingsToProbe =
|
|
117
|
+
strategy === "heading" ? input.sections.map((section) => section.name) : [];
|
|
118
|
+
if (typeof input.insertUnderHeading === "string" && input.insertUnderHeading.length > 0) {
|
|
119
|
+
headingsToProbe.push(input.insertUnderHeading);
|
|
120
|
+
}
|
|
121
|
+
for (const headingName of headingsToProbe) {
|
|
122
|
+
if (!headingSurvivesRoundTrip(headingName)) {
|
|
123
|
+
throw new RangeError(
|
|
124
|
+
`Section name ${JSON.stringify(headingName)} is not matchable by the heading parser; it must survive a render-and-parse round trip.`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Property values land in note frontmatter or inline fields; validate
|
|
130
|
+
// their shape and bounds (vault-frontmatter.ts) against the final
|
|
131
|
+
// prefixed keys, in every mode, before any file access.
|
|
132
|
+
const propertyEntries: Array<{ key: string; value: VaultPropertyValue }> = [];
|
|
133
|
+
for (const section of input.sections) {
|
|
134
|
+
if (!section.properties) continue;
|
|
135
|
+
for (const key of Object.keys(section.properties)) {
|
|
136
|
+
const value = section.properties[key];
|
|
137
|
+
if (value === undefined) continue;
|
|
138
|
+
propertyEntries.push({ key: `${prefix}${key}`, value });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (propertyEntries.length > 0) {
|
|
142
|
+
const checked = validateVaultProperties(propertyEntries);
|
|
143
|
+
if (!checked.ok) {
|
|
144
|
+
throw new RangeError(`Vault publish properties rejected: ${checked.reason}.`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
100
147
|
const relative = resolveVaultNotePath(input.notePathTemplate, input.date);
|
|
101
148
|
const result = publishRelative(input, relative, { strategy, propertiesMode, prefix });
|
|
102
149
|
return summarizeVaultPublish(result);
|
|
@@ -262,13 +309,13 @@ function refuse(relative: string, outcome: "skipped" | "error", reason: string):
|
|
|
262
309
|
|
|
263
310
|
function decorate(
|
|
264
311
|
section: VaultSectionPublish,
|
|
265
|
-
prefixed: Record<string,
|
|
312
|
+
prefixed: Record<string, VaultPropertyValue> | undefined,
|
|
266
313
|
mode: string,
|
|
267
314
|
): string {
|
|
268
315
|
const parts: string[] = [section.content];
|
|
269
316
|
if (prefixed !== undefined && mode === "dataview-inline") {
|
|
270
317
|
for (const [key, value] of Object.entries(prefixed)) {
|
|
271
|
-
parts.push(`${key}:: ${value}`);
|
|
318
|
+
parts.push(`${key}:: ${renderVaultPropertyValue(value)}`);
|
|
272
319
|
}
|
|
273
320
|
}
|
|
274
321
|
if (section.provenance !== undefined) {
|
|
@@ -388,8 +435,8 @@ function looksLikeRemnicMarkerLine(trimmed: string): boolean {
|
|
|
388
435
|
function frontmatterUpdates(
|
|
389
436
|
sections: readonly VaultSectionPublish[],
|
|
390
437
|
prefix: string,
|
|
391
|
-
): Record<string,
|
|
392
|
-
const updates: Record<string,
|
|
438
|
+
): Record<string, VaultPropertyValue> {
|
|
439
|
+
const updates: Record<string, VaultPropertyValue> = {};
|
|
393
440
|
for (const section of sections) {
|
|
394
441
|
if (!section.properties) continue;
|
|
395
442
|
for (const [key, value] of Object.entries(section.properties)) {
|
|
@@ -406,14 +453,16 @@ function frontmatterUpdates(
|
|
|
406
453
|
*/
|
|
407
454
|
export function mergeFrontmatterKeys(
|
|
408
455
|
noteText: string,
|
|
409
|
-
updates: Readonly<Record<string,
|
|
456
|
+
updates: Readonly<Record<string, VaultPropertyValue>>,
|
|
410
457
|
): { ok: true; text: string } | { ok: false; reason: string } {
|
|
411
458
|
const entries = Object.entries(updates);
|
|
412
459
|
if (entries.length === 0) return { ok: true, text: noteText };
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
460
|
+
// The writer re-validates the same boundary the publisher entry checked
|
|
461
|
+
// (issue #2917): this function is exported, so a direct caller must not
|
|
462
|
+
// be able to smuggle a newline-bearing or unbounded value into a note.
|
|
463
|
+
const checked = validateVaultProperties(entries.map(([key, value]) => ({ key, value })));
|
|
464
|
+
if (!checked.ok) {
|
|
465
|
+
return { ok: false, reason: "invalid_property" };
|
|
417
466
|
}
|
|
418
467
|
|
|
419
468
|
const eol = noteText.includes("\r\n") ? "\r\n" : "\n";
|
|
@@ -422,7 +471,12 @@ export function mergeFrontmatterKeys(
|
|
|
422
471
|
const firstLine = firstLineEnd === -1 ? noteText : noteText.slice(0, firstLineEnd);
|
|
423
472
|
|
|
424
473
|
if (!openRe.test(firstLine)) {
|
|
425
|
-
const block = [
|
|
474
|
+
const block = [
|
|
475
|
+
"---",
|
|
476
|
+
...entries.map(([key, value]) => `${key}: ${renderVaultPropertyValue(value)}`),
|
|
477
|
+
"---",
|
|
478
|
+
"",
|
|
479
|
+
].join(eol);
|
|
426
480
|
return { ok: true, text: block + eol + noteText };
|
|
427
481
|
}
|
|
428
482
|
|
|
@@ -451,13 +505,13 @@ export function mergeFrontmatterKeys(
|
|
|
451
505
|
if (rawKey !== rawKey.trimStart()) continue;
|
|
452
506
|
const key = rawKey.trimEnd();
|
|
453
507
|
if (!pending.has(key)) continue;
|
|
454
|
-
lines[i] = `${rawKey}: ${pending.get(key)}`;
|
|
508
|
+
lines[i] = `${rawKey}: ${renderVaultPropertyValue(pending.get(key)!)}`;
|
|
455
509
|
pending.delete(key);
|
|
456
510
|
}
|
|
457
511
|
const insertAt = closeIdx;
|
|
458
512
|
const added: string[] = [];
|
|
459
513
|
for (const [key, value] of pending.entries()) {
|
|
460
|
-
added.push(`${key}: ${value}`);
|
|
514
|
+
added.push(`${key}: ${renderVaultPropertyValue(value)}`);
|
|
461
515
|
}
|
|
462
516
|
lines.splice(insertAt, 0, ...added);
|
|
463
517
|
return { ok: true, text: lines.join(eol) };
|
|
@@ -3,9 +3,14 @@ import test from "node:test";
|
|
|
3
3
|
|
|
4
4
|
import { validateRegionName } from "./vault-region.js";
|
|
5
5
|
|
|
6
|
-
test("validateRegionName
|
|
6
|
+
test("validateRegionName accepts a valid name unchanged", () => {
|
|
7
7
|
assert.deepEqual(validateRegionName("timeline"), { ok: true, name: "timeline" });
|
|
8
|
-
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test("validateRegionName rejects whitespace-padded names instead of trimming them (#2917)", () => {
|
|
11
|
+
assert.deepEqual(validateRegionName(" weekly"), { ok: false, error: "invalid_name" });
|
|
12
|
+
assert.deepEqual(validateRegionName("weekly "), { ok: false, error: "invalid_name" });
|
|
13
|
+
assert.deepEqual(validateRegionName(" weekly "), { ok: false, error: "invalid_name" });
|
|
9
14
|
});
|
|
10
15
|
|
|
11
16
|
test("validateRegionName rejects empty and whitespace-only names", () => {
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* or as name `A` with a `B:start` suffix) and a publisher that resolved
|
|
9
9
|
* that ambiguity differently from the note's own markers would pair a
|
|
10
10
|
* start with a later end and delete the user bytes in between.
|
|
11
|
+
*
|
|
12
|
+
* Whitespace-padded names are rejected, not trimmed (issue #2917): the
|
|
13
|
+
* old silent trim validated one name and wrote another, so markers and
|
|
14
|
+
* heading matches were computed against bytes the caller never saw.
|
|
11
15
|
*/
|
|
12
16
|
|
|
13
17
|
export type ValidateRegionNameResult =
|
|
@@ -21,9 +25,9 @@ export function validateRegionName(name: string): ValidateRegionNameResult {
|
|
|
21
25
|
if (name.includes("\n") || name.includes("\r") || name.includes("-->") || name.includes(":")) {
|
|
22
26
|
return { ok: false, error: "invalid_name" };
|
|
23
27
|
}
|
|
24
|
-
|
|
25
|
-
if (trimmed.length === 0) {
|
|
28
|
+
if (name.trim() !== name || name.trim().length === 0) {
|
|
26
29
|
return { ok: false, error: "invalid_name" };
|
|
27
30
|
}
|
|
28
|
-
return { ok: true, name
|
|
31
|
+
return { ok: true, name };
|
|
29
32
|
}
|
|
33
|
+
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
|
|
1
3
|
import { isLoopbackHost } from "./runtime/http-transport.js";
|
|
4
|
+
import { expandTildePath } from "./utils/path.js";
|
|
2
5
|
|
|
3
6
|
export interface BackgroundGenerationConfig {
|
|
4
7
|
/** Full chat-completions URL. Never used as the global OpenAI base URL. */
|
|
@@ -54,14 +57,13 @@ function parseBackgroundGenerationObject(
|
|
|
54
57
|
if (typeof tokenRaw !== "string" || tokenRaw.length === 0) {
|
|
55
58
|
throw new Error(`${keyName} must include a token`);
|
|
56
59
|
}
|
|
57
|
-
const timeoutRaw = record.timeoutSeconds;
|
|
60
|
+
const timeoutRaw = record.timeoutSeconds ?? record.timeout_seconds;
|
|
58
61
|
let timeoutSeconds = 120;
|
|
59
62
|
if (timeoutRaw !== undefined) {
|
|
60
|
-
|
|
61
|
-
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
63
|
+
if (typeof timeoutRaw !== "number" || !Number.isFinite(timeoutRaw) || timeoutRaw <= 0) {
|
|
62
64
|
throw new Error(`${keyName} timeoutSeconds must be a finite number > 0`);
|
|
63
65
|
}
|
|
64
|
-
timeoutSeconds =
|
|
66
|
+
timeoutSeconds = timeoutRaw;
|
|
65
67
|
}
|
|
66
68
|
return {
|
|
67
69
|
endpoint: parseBackgroundEndpoint(endpointRaw, `${keyName}.endpoint`),
|
|
@@ -72,8 +74,32 @@ function parseBackgroundGenerationObject(
|
|
|
72
74
|
|
|
73
75
|
export function parseBackgroundGeneration(
|
|
74
76
|
cfg: Record<string, unknown>,
|
|
77
|
+
expandEnv: (value: string) => string,
|
|
75
78
|
): BackgroundGenerationConfig | undefined {
|
|
79
|
+
const pathRaw = cfg.llmBridgeClientConfigPath;
|
|
80
|
+
let fromFile: BackgroundGenerationConfig | undefined;
|
|
81
|
+
if (pathRaw !== undefined && pathRaw !== null && pathRaw !== "") {
|
|
82
|
+
if (typeof pathRaw !== "string") {
|
|
83
|
+
throw new Error("llmBridgeClientConfigPath must be a string");
|
|
84
|
+
}
|
|
85
|
+
const expanded = expandTildePath(expandEnv(pathRaw.trim()));
|
|
86
|
+
let parsed: unknown;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(readFileSync(expanded, "utf8"));
|
|
89
|
+
} catch {
|
|
90
|
+
throw new Error(`llmBridgeClientConfigPath could not be read: ${expanded}`);
|
|
91
|
+
}
|
|
92
|
+
fromFile = parseBackgroundGenerationObject(parsed, "llmBridgeClientConfigPath");
|
|
93
|
+
}
|
|
76
94
|
const explicitRaw = cfg.backgroundGeneration;
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
const fromExplicit =
|
|
96
|
+
explicitRaw === undefined || explicitRaw === null
|
|
97
|
+
? undefined
|
|
98
|
+
: parseBackgroundGenerationObject(explicitRaw, "backgroundGeneration");
|
|
99
|
+
if (!fromFile && !fromExplicit) return undefined;
|
|
100
|
+
return {
|
|
101
|
+
endpoint: fromExplicit?.endpoint ?? fromFile!.endpoint,
|
|
102
|
+
token: fromExplicit?.token ?? fromFile!.token,
|
|
103
|
+
timeoutSeconds: fromExplicit?.timeoutSeconds ?? fromFile!.timeoutSeconds,
|
|
104
|
+
};
|
|
79
105
|
}
|
|
@@ -83,11 +83,13 @@ test("HourlySummarizer uses backgroundGeneration and not openaiBaseUrl", async (
|
|
|
83
83
|
timeoutSeconds: 12,
|
|
84
84
|
},
|
|
85
85
|
});
|
|
86
|
-
|
|
86
|
+
let sentBody: string | undefined;
|
|
87
|
+
globalThis.fetch = (async (url, init) => {
|
|
87
88
|
calls.push(String(url));
|
|
88
89
|
if (String(url) !== "http://127.0.0.1:8765/v1/chat/completions") {
|
|
89
90
|
return new Response("not the bridge", { status: 404 });
|
|
90
91
|
}
|
|
92
|
+
sentBody = String(init?.body);
|
|
91
93
|
return new Response(
|
|
92
94
|
JSON.stringify({
|
|
93
95
|
choices: [{ message: { content: '{"bullets":["bridge-only"]}' } }],
|
|
@@ -114,6 +116,13 @@ test("HourlySummarizer uses backgroundGeneration and not openaiBaseUrl", async (
|
|
|
114
116
|
assert.deepEqual(summary?.bullets, ["bridge-only"]);
|
|
115
117
|
assert.deepEqual(calls, ["http://127.0.0.1:8765/v1/chat/completions"]);
|
|
116
118
|
assert.equal(config.openaiBaseUrl, "http://127.0.0.1:9999/v1");
|
|
119
|
+
// The bridge prompt must spell out the required JSON shape; without it a
|
|
120
|
+
// literal host model returns {"summary": "..."} and the schema rejects it.
|
|
121
|
+
const sent = JSON.parse(String(sentBody)) as {
|
|
122
|
+
messages: Array<{ role: string; content: string }>;
|
|
123
|
+
};
|
|
124
|
+
const system = sent.messages.find((message) => message.role === "system")?.content ?? "";
|
|
125
|
+
assert.match(system, /"bullets"/);
|
|
117
126
|
} finally {
|
|
118
127
|
globalThis.fetch = previousFetch;
|
|
119
128
|
if (previousXdg === undefined) delete process.env.XDG_CONFIG_HOME;
|