@remnic/core 9.69.39 → 9.69.40
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 +37 -37
- package/dist/access-authorization-probe.d.ts +16 -14
- package/dist/access-authorization-probe.js +38 -38
- package/dist/access-boundary.d.ts +16 -14
- package/dist/access-boundary.js +37 -37
- package/dist/access-cli.js +98 -97
- 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 +37 -37
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +16 -14
- package/dist/access-http-briefing.js +38 -38
- 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 +39 -39
- package/dist/access-http.d.ts +17 -15
- package/dist/access-http.js +53 -53
- package/dist/access-identity-continuity-surface.d.ts +13 -12
- package/dist/access-identity-continuity-surface.js +37 -37
- package/dist/access-lcm-surface.d.ts +16 -14
- package/dist/access-lcm-surface.js +37 -37
- package/dist/access-mcp.d.ts +16 -14
- package/dist/access-mcp.js +45 -45
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-CKBumJ8W.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +37 -37
- 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 +2 -2
- package/dist/access-observe-write-surface.d.ts +16 -14
- package/dist/access-observe-write-surface.js +37 -37
- package/dist/access-offline-manifest.d.ts +37 -13
- package/dist/access-offline-manifest.js +7 -3
- package/dist/access-operations-batch.js +39 -39
- package/dist/access-operations.d.ts +16 -14
- package/dist/access-operations.js +44 -44
- package/dist/access-recall-concurrency.d.ts +16 -14
- package/dist/access-recall-concurrency.js +37 -37
- package/dist/access-recall-response.d.ts +16 -14
- package/dist/access-recall-response.js +37 -37
- package/dist/access-recall-surface.d.ts +16 -14
- package/dist/access-recall-surface.js +37 -37
- package/dist/access-schema.d.ts +5 -3
- package/dist/access-schema.js +1 -1
- package/dist/{access-service-MY4bsr_Q.d.ts → access-service-DJ3qogNt.d.ts} +8 -8
- package/dist/access-service-helpers.d.ts +16 -14
- package/dist/access-service.d.ts +16 -14
- package/dist/access-service.js +37 -37
- package/dist/access-surface-catalog.d.ts +16 -14
- package/dist/access-surface-catalog.js +39 -39
- 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-recall.d.ts +1 -1
- package/dist/active-recall.js +6 -5
- 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-D6BAPIJV.js} +5 -5
- 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 +15 -15
- 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 +5 -5
- 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/{catalog-CW87xGx8.d.ts → catalog-BHXkBVhg.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 +19 -18
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-B36GUU6T.js → chunk-23HFXQ5J.js} +36 -3
- package/dist/chunk-23HFXQ5J.js.map +1 -0
- package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
- package/dist/chunk-27NO2KVB.js.map +1 -0
- package/dist/{chunk-JTQR6L2N.js → chunk-2SKMZUOW.js} +2 -2
- package/dist/{chunk-GG5FHZJJ.js → chunk-2SNCQHJZ.js} +2 -2
- package/dist/{chunk-O76F5QPP.js → chunk-3QEVOQF5.js} +2 -2
- package/dist/{chunk-3N3PBBEH.js → chunk-3XPN7AVY.js} +2 -2
- package/dist/{chunk-X4TD4O2F.js → chunk-46Z3VGWF.js} +2 -2
- package/dist/{chunk-2ZTDRNCS.js → chunk-4CMXI55L.js} +2 -2
- package/dist/{chunk-FWWWUPOE.js → chunk-5LYSEZOF.js} +18 -9
- package/dist/chunk-5LYSEZOF.js.map +1 -0
- package/dist/{chunk-IQEJIOEU.js → chunk-62HFZNCJ.js} +17 -10
- package/dist/chunk-62HFZNCJ.js.map +1 -0
- package/dist/{chunk-YKREX63Z.js → chunk-6L2II3KS.js} +5 -3
- package/dist/chunk-6L2II3KS.js.map +1 -0
- package/dist/{chunk-MUTVRKKY.js → chunk-7D6SER6A.js} +8 -8
- package/dist/{chunk-WBM2MVBK.js → chunk-7Z54NXVS.js} +2 -2
- package/dist/{chunk-ACY4ZPF7.js → chunk-AEOOGXMQ.js} +10 -5
- package/dist/chunk-AEOOGXMQ.js.map +1 -0
- package/dist/{chunk-UHRZ324M.js → chunk-BGRTZOJB.js} +3 -3
- package/dist/{chunk-ZEGL7YCC.js → chunk-BXIJSPCL.js} +2 -2
- package/dist/{chunk-JKKII6GX.js → chunk-BYQX4IOG.js} +2 -2
- package/dist/{chunk-WIWLX65T.js → chunk-C5R73BON.js} +2 -2
- package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
- package/dist/{chunk-TNZNSMVJ.js → chunk-DAZANIYU.js} +249 -295
- package/dist/chunk-DAZANIYU.js.map +1 -0
- package/dist/{chunk-LMLGBG6H.js → chunk-DFVSJFHK.js} +2 -2
- package/dist/{chunk-3NPNBVFR.js → chunk-ES5BUPYB.js} +2 -2
- package/dist/{chunk-MVAQ2WM3.js → chunk-G2XZFGYN.js} +6 -2
- package/dist/chunk-G2XZFGYN.js.map +1 -0
- package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
- package/dist/{chunk-5N4MZLEH.js → chunk-GO5LOHCD.js} +2 -2
- package/dist/{chunk-AECJY3GJ.js → chunk-GSSDHAYH.js} +2 -2
- package/dist/{chunk-TSP5WH72.js → chunk-HJUP3K6L.js} +2 -2
- package/dist/{chunk-AAZEKXUP.js → chunk-ICNJ6J46.js} +2 -2
- package/dist/{chunk-6EHM2AV7.js → chunk-IMBQFHRV.js} +2 -2
- package/dist/{chunk-4RZLTZVM.js → chunk-IOPIGX7Y.js} +1 -1
- package/dist/{chunk-EYKIDK33.js → chunk-IS2IDFJP.js} +13 -13
- package/dist/{chunk-VJIE4D2I.js → chunk-J4WGTN2N.js} +2 -2
- package/dist/{chunk-NXGSONWM.js → chunk-J7FVMLBR.js} +2 -2
- package/dist/{chunk-VSL63CFJ.js → chunk-JAJIMTFB.js} +6 -6
- package/dist/{chunk-4JVQRFZD.js → chunk-JOP7W24J.js} +9 -9
- package/dist/{chunk-YUW66UAH.js → chunk-JUDT33RX.js} +2 -2
- package/dist/{chunk-QHT7MOUF.js → chunk-K4A6UVPB.js} +22 -11
- package/dist/chunk-K4A6UVPB.js.map +1 -0
- package/dist/{chunk-D545Z7UH.js → chunk-K4JKAXMO.js} +2 -2
- package/dist/{chunk-BV4ZKIZH.js → chunk-K75A5XWU.js} +3 -2
- package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
- package/dist/chunk-KG2OOAFF.js.map +1 -0
- package/dist/{chunk-M6HBPLBA.js → chunk-KOTG3RXE.js} +2 -2
- package/dist/{chunk-CWTCMZGE.js → chunk-KTOXQMW3.js} +119 -3
- package/dist/chunk-KTOXQMW3.js.map +1 -0
- package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
- package/dist/{chunk-GI4ZBWPQ.js → chunk-KY236SP5.js} +3 -3
- package/dist/{chunk-4BCHFSC7.js → chunk-LFVZD5EC.js} +3 -3
- package/dist/{chunk-O4M4BDIJ.js → chunk-LKFVVN7R.js} +2 -2
- package/dist/{chunk-IYKZJVL5.js → chunk-MDIEES23.js} +1 -1
- package/dist/chunk-MDIEES23.js.map +1 -0
- package/dist/{chunk-4RX5O34R.js → chunk-MJC7UKH7.js} +2 -2
- package/dist/{chunk-CZTPU65V.js → chunk-MVG3KXON.js} +63 -16
- package/dist/chunk-MVG3KXON.js.map +1 -0
- package/dist/{chunk-YDVAM7S4.js → chunk-NETQXOPY.js} +2 -2
- package/dist/chunk-NETQXOPY.js.map +1 -0
- package/dist/{chunk-UZZ7SQT3.js → chunk-NVVZPBKI.js} +2 -2
- package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
- package/dist/chunk-PJRKLB4Z.js.map +1 -0
- package/dist/{chunk-VBSNUH4J.js → chunk-PKUJNICO.js} +2 -2
- package/dist/{chunk-OPBFP4TF.js → chunk-QE6YVNP5.js} +7 -7
- package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
- package/dist/chunk-QM2SPLKQ.js.map +1 -0
- package/dist/{chunk-ENBPQEVU.js → chunk-QPVNK2VE.js} +2 -2
- package/dist/{chunk-RLJHJQUY.js → chunk-QS5Q5RBV.js} +2 -2
- package/dist/{chunk-3EKVN2OP.js → chunk-RDLPFM7I.js} +2 -2
- package/dist/{chunk-F4EHXVP7.js → chunk-RJQAP333.js} +2 -2
- package/dist/{chunk-QTQ6XKGT.js → chunk-RLU2Y5GV.js} +4 -4
- package/dist/chunk-RLU2Y5GV.js.map +1 -0
- package/dist/{chunk-5SPCMAUC.js → chunk-ROEFLU37.js} +4 -4
- package/dist/{chunk-UZEHHXYC.js → chunk-SFHLQPBF.js} +22 -22
- package/dist/chunk-SK7D34OL.js +68 -0
- package/dist/chunk-SK7D34OL.js.map +1 -0
- package/dist/{chunk-ZBW7A667.js → chunk-SUEOG2S4.js} +2 -2
- package/dist/{chunk-Q7CLGFA7.js → chunk-TEMKBSV6.js} +2 -2
- package/dist/{chunk-LQNRVPTV.js → chunk-THTF2W7M.js} +151 -118
- package/dist/chunk-THTF2W7M.js.map +1 -0
- package/dist/{chunk-GMIQV6DD.js → chunk-TO36VPZI.js} +2 -2
- package/dist/{chunk-6YAIN5XJ.js → chunk-TZ44E732.js} +44 -6
- package/dist/chunk-TZ44E732.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-LPYYY4AP.js → chunk-UZ6JYPJ6.js} +500 -218
- package/dist/chunk-UZ6JYPJ6.js.map +1 -0
- package/dist/{chunk-FXHOZGSE.js → chunk-V2ZA4YWE.js} +2 -2
- package/dist/{chunk-XH3HGI2N.js → chunk-VHKXRYQN.js} +2 -2
- package/dist/{chunk-GAS7KYC7.js → chunk-VKWFNPBH.js} +2 -2
- package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
- package/dist/chunk-VNQRRUNS.js.map +1 -0
- package/dist/{chunk-IL6ODG6M.js → chunk-VQWBUPSJ.js} +2 -2
- package/dist/{chunk-5YCNDC3C.js → chunk-VQYWKCDR.js} +2 -2
- package/dist/{chunk-54NX5EG4.js → chunk-W23JARAQ.js} +2 -2
- package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
- package/dist/{chunk-FNHLI2RE.js → chunk-WZYHPAG5.js} +3 -3
- package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
- package/dist/chunk-XCPNH2MG.js.map +1 -0
- package/dist/{chunk-TA4C3XB7.js → chunk-XM46Y66S.js} +2 -2
- package/dist/{chunk-PCOVEDPK.js → chunk-YRIFXXMI.js} +3 -3
- package/dist/{chunk-TRLOFIQC.js → chunk-YTK5MVNF.js} +2 -2
- package/dist/{chunk-Q432REND.js → chunk-YTZN2UZO.js} +2 -2
- package/dist/{chunk-6AGWBKQU.js → chunk-Z4GUX2M6.js} +2 -2
- package/dist/{chunk-AENM6GKU.js → chunk-ZAEPD4C2.js} +2 -2
- package/dist/{chunk-KQW3YGEN.js → chunk-ZRMMXWYI.js} +2 -2
- package/dist/{chunk-P4ZAEYKG.js → chunk-ZX3AYNNV.js} +6 -3
- package/dist/chunk-ZX3AYNNV.js.map +1 -0
- package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZCR2QYL.js} +2 -2
- package/dist/{cli-DGq0MNpO.d.ts → cli-BWri5-am.d.ts} +5 -5
- package/dist/cli.d.ts +18 -16
- package/dist/cli.js +75 -74
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +14 -14
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +15 -15
- 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 +6 -5
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +15 -15
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +15 -15
- 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/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +17 -17
- 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 +17 -17
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/deep-recall-http-glue.d.ts +16 -14
- package/dist/deep-recall-http-glue.js +2 -2
- package/dist/deep-recall-mcp-tools.d.ts +16 -14
- package/dist/deep-recall-policy-llm.d.ts +4 -3
- package/dist/deep-recall-policy-llm.js +3 -3
- package/dist/deep-recall-seeds.d.ts +1 -1
- 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-ueZlKTQB.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 +15 -15
- 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/external-wiki-access.d.ts +16 -14
- package/dist/external-wiki-access.js +38 -38
- 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 +25 -23
- package/dist/fallback-llm-codex-subscription.d.ts +52 -7
- package/dist/fallback-llm-codex-subscription.js +17 -1
- package/dist/fallback-llm.d.ts +25 -28
- package/dist/fallback-llm.js +4 -3
- package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpyVmA88.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 +1 -1
- 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-BvUA4S7M.d.ts} +3 -3
- package/dist/index.d.ts +79 -39
- package/dist/index.js +119 -103
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +3 -3
- 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-BsJGulur.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 +17 -17
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +15 -15
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +15 -15
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +16 -16
- package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CYubtIRr.d.ts} +9 -3
- 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 +16 -16
- 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 +15 -15
- 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 +18 -18
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +29 -28
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +26 -26
- package/dist/{orchestrator-ComHLm49.d.ts → orchestrator-BWDRJ_0d.d.ts} +24 -11
- package/dist/orchestrator.d.ts +13 -12
- package/dist/orchestrator.js +101 -98
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-7JMn2yMH.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-CJWs3mo9.d.ts} +1 -1
- package/dist/{qmd-qXD4vatU.d.ts → qmd-CxCH9G9m.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 +8 -8
- 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 +1 -0
- package/dist/recall-state-view.js +1 -1
- 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/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- 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/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +7 -6
- 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-BGAUqhBR.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 +10 -10
- 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-CCeRD9pV.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +16 -16
- package/dist/semantic-rule-promotion.js +15 -15
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +15 -15
- package/dist/{service-CLkA7AQB.d.ts → service-BwpzRduk.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/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +18 -18
- package/dist/standup/build.js +15 -15
- package/dist/{storage-wvX01lht.d.ts → storage-BprAGBG0.d.ts} +2 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +14 -14
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +5 -5
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +18 -17
- package/dist/support-passport/index.js +40 -40
- 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/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +15 -15
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-Cyr32ABj.d.ts → types-nJV23pa3.d.ts} +1 -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 +15 -15
- package/dist/who-knows-cli.d.ts +16 -14
- package/dist/who-knows-cli.js +16 -16
- package/dist/who-knows.d.ts +16 -14
- package/dist/who-knows.js +15 -15
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-category-alias.test.ts +93 -0
- package/src/access-offline-manifest.ts +52 -2
- package/src/access-schema.ts +9 -4
- 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 +82 -2
- package/src/activity/timeline/regenerate.ts +7 -1
- 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/timeline-publish-commands.ts +9 -0
- package/src/config.test.ts +170 -43
- package/src/config.ts +17 -5
- 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 +193 -7
- package/src/fallback-llm-parse-failure.test.ts +156 -0
- package/src/fallback-llm.test.ts +58 -0
- package/src/fallback-llm.ts +187 -186
- 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/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/orchestrator-helpers.test.ts +104 -0
- package/src/orchestration/orchestrator-init.ts +366 -106
- package/src/orchestration/recall-internal.ts +5 -11
- 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/qmd.ts +21 -10
- package/src/recall-state-view-admission.ts +11 -1
- 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 +5 -2
- package/src/reconcile-identity-cache.test.ts +82 -1
- package/src/search/port.ts +1 -1
- 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 +1 -0
- package/dist/chunk-3CBI2ZSA.js.map +0 -1
- package/dist/chunk-5HYUUFMQ.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-CWTCMZGE.js.map +0 -1
- package/dist/chunk-CZTPU65V.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-LPYYY4AP.js.map +0 -1
- package/dist/chunk-LQNRVPTV.js.map +0 -1
- package/dist/chunk-MVAQ2WM3.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-TNZNSMVJ.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/{auto-sync-RP4C6ZPF.js.map → auto-sync-D6BAPIJV.js.map} +0 -0
- /package/dist/{chunk-JTQR6L2N.js.map → chunk-2SKMZUOW.js.map} +0 -0
- /package/dist/{chunk-GG5FHZJJ.js.map → chunk-2SNCQHJZ.js.map} +0 -0
- /package/dist/{chunk-O76F5QPP.js.map → chunk-3QEVOQF5.js.map} +0 -0
- /package/dist/{chunk-3N3PBBEH.js.map → chunk-3XPN7AVY.js.map} +0 -0
- /package/dist/{chunk-X4TD4O2F.js.map → chunk-46Z3VGWF.js.map} +0 -0
- /package/dist/{chunk-2ZTDRNCS.js.map → chunk-4CMXI55L.js.map} +0 -0
- /package/dist/{chunk-MUTVRKKY.js.map → chunk-7D6SER6A.js.map} +0 -0
- /package/dist/{chunk-WBM2MVBK.js.map → chunk-7Z54NXVS.js.map} +0 -0
- /package/dist/{chunk-UHRZ324M.js.map → chunk-BGRTZOJB.js.map} +0 -0
- /package/dist/{chunk-ZEGL7YCC.js.map → chunk-BXIJSPCL.js.map} +0 -0
- /package/dist/{chunk-JKKII6GX.js.map → chunk-BYQX4IOG.js.map} +0 -0
- /package/dist/{chunk-WIWLX65T.js.map → chunk-C5R73BON.js.map} +0 -0
- /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
- /package/dist/{chunk-LMLGBG6H.js.map → chunk-DFVSJFHK.js.map} +0 -0
- /package/dist/{chunk-3NPNBVFR.js.map → chunk-ES5BUPYB.js.map} +0 -0
- /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
- /package/dist/{chunk-5N4MZLEH.js.map → chunk-GO5LOHCD.js.map} +0 -0
- /package/dist/{chunk-AECJY3GJ.js.map → chunk-GSSDHAYH.js.map} +0 -0
- /package/dist/{chunk-TSP5WH72.js.map → chunk-HJUP3K6L.js.map} +0 -0
- /package/dist/{chunk-AAZEKXUP.js.map → chunk-ICNJ6J46.js.map} +0 -0
- /package/dist/{chunk-6EHM2AV7.js.map → chunk-IMBQFHRV.js.map} +0 -0
- /package/dist/{chunk-4RZLTZVM.js.map → chunk-IOPIGX7Y.js.map} +0 -0
- /package/dist/{chunk-EYKIDK33.js.map → chunk-IS2IDFJP.js.map} +0 -0
- /package/dist/{chunk-VJIE4D2I.js.map → chunk-J4WGTN2N.js.map} +0 -0
- /package/dist/{chunk-NXGSONWM.js.map → chunk-J7FVMLBR.js.map} +0 -0
- /package/dist/{chunk-VSL63CFJ.js.map → chunk-JAJIMTFB.js.map} +0 -0
- /package/dist/{chunk-4JVQRFZD.js.map → chunk-JOP7W24J.js.map} +0 -0
- /package/dist/{chunk-YUW66UAH.js.map → chunk-JUDT33RX.js.map} +0 -0
- /package/dist/{chunk-D545Z7UH.js.map → chunk-K4JKAXMO.js.map} +0 -0
- /package/dist/{chunk-BV4ZKIZH.js.map → chunk-K75A5XWU.js.map} +0 -0
- /package/dist/{chunk-M6HBPLBA.js.map → chunk-KOTG3RXE.js.map} +0 -0
- /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
- /package/dist/{chunk-GI4ZBWPQ.js.map → chunk-KY236SP5.js.map} +0 -0
- /package/dist/{chunk-4BCHFSC7.js.map → chunk-LFVZD5EC.js.map} +0 -0
- /package/dist/{chunk-O4M4BDIJ.js.map → chunk-LKFVVN7R.js.map} +0 -0
- /package/dist/{chunk-4RX5O34R.js.map → chunk-MJC7UKH7.js.map} +0 -0
- /package/dist/{chunk-UZZ7SQT3.js.map → chunk-NVVZPBKI.js.map} +0 -0
- /package/dist/{chunk-VBSNUH4J.js.map → chunk-PKUJNICO.js.map} +0 -0
- /package/dist/{chunk-OPBFP4TF.js.map → chunk-QE6YVNP5.js.map} +0 -0
- /package/dist/{chunk-ENBPQEVU.js.map → chunk-QPVNK2VE.js.map} +0 -0
- /package/dist/{chunk-RLJHJQUY.js.map → chunk-QS5Q5RBV.js.map} +0 -0
- /package/dist/{chunk-3EKVN2OP.js.map → chunk-RDLPFM7I.js.map} +0 -0
- /package/dist/{chunk-F4EHXVP7.js.map → chunk-RJQAP333.js.map} +0 -0
- /package/dist/{chunk-5SPCMAUC.js.map → chunk-ROEFLU37.js.map} +0 -0
- /package/dist/{chunk-UZEHHXYC.js.map → chunk-SFHLQPBF.js.map} +0 -0
- /package/dist/{chunk-ZBW7A667.js.map → chunk-SUEOG2S4.js.map} +0 -0
- /package/dist/{chunk-Q7CLGFA7.js.map → chunk-TEMKBSV6.js.map} +0 -0
- /package/dist/{chunk-GMIQV6DD.js.map → chunk-TO36VPZI.js.map} +0 -0
- /package/dist/{chunk-FXHOZGSE.js.map → chunk-V2ZA4YWE.js.map} +0 -0
- /package/dist/{chunk-XH3HGI2N.js.map → chunk-VHKXRYQN.js.map} +0 -0
- /package/dist/{chunk-GAS7KYC7.js.map → chunk-VKWFNPBH.js.map} +0 -0
- /package/dist/{chunk-IL6ODG6M.js.map → chunk-VQWBUPSJ.js.map} +0 -0
- /package/dist/{chunk-5YCNDC3C.js.map → chunk-VQYWKCDR.js.map} +0 -0
- /package/dist/{chunk-54NX5EG4.js.map → chunk-W23JARAQ.js.map} +0 -0
- /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
- /package/dist/{chunk-FNHLI2RE.js.map → chunk-WZYHPAG5.js.map} +0 -0
- /package/dist/{chunk-TA4C3XB7.js.map → chunk-XM46Y66S.js.map} +0 -0
- /package/dist/{chunk-PCOVEDPK.js.map → chunk-YRIFXXMI.js.map} +0 -0
- /package/dist/{chunk-TRLOFIQC.js.map → chunk-YTK5MVNF.js.map} +0 -0
- /package/dist/{chunk-Q432REND.js.map → chunk-YTZN2UZO.js.map} +0 -0
- /package/dist/{chunk-6AGWBKQU.js.map → chunk-Z4GUX2M6.js.map} +0 -0
- /package/dist/{chunk-AENM6GKU.js.map → chunk-ZAEPD4C2.js.map} +0 -0
- /package/dist/{chunk-KQW3YGEN.js.map → chunk-ZRMMXWYI.js.map} +0 -0
- /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZCR2QYL.js.map} +0 -0
|
@@ -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());
|
|
@@ -413,6 +412,88 @@ test("listPersistedTimelineDates lists only valid day files", async () => {
|
|
|
413
412
|
}
|
|
414
413
|
});
|
|
415
414
|
|
|
415
|
+
test("a timezone change invalidates the cached day and re-analyzes (issue #2891)", async () => {
|
|
416
|
+
await withStore(async (store, memoryDir) => {
|
|
417
|
+
store.insertSnapshot(snapshot());
|
|
418
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
419
|
+
const analysis = parseActivityConfig({
|
|
420
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
|
|
421
|
+
}).timeline.analysis;
|
|
422
|
+
const first = await regenerateTimelineDay({
|
|
423
|
+
date: DATE,
|
|
424
|
+
timezone: TZ,
|
|
425
|
+
memoryDir,
|
|
426
|
+
store,
|
|
427
|
+
timelineEnabled: true,
|
|
428
|
+
analysis,
|
|
429
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
430
|
+
});
|
|
431
|
+
assert.equal(first.status, "ok");
|
|
432
|
+
assert.equal(remote.calls, 1);
|
|
433
|
+
const sameTz = await regenerateTimelineDay({
|
|
434
|
+
date: DATE,
|
|
435
|
+
timezone: TZ,
|
|
436
|
+
memoryDir,
|
|
437
|
+
store,
|
|
438
|
+
timelineEnabled: true,
|
|
439
|
+
analysis,
|
|
440
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
441
|
+
});
|
|
442
|
+
assert.equal(sameTz.written, false);
|
|
443
|
+
assert.equal(remote.calls, 1);
|
|
444
|
+
const shifted = await regenerateTimelineDay({
|
|
445
|
+
date: DATE,
|
|
446
|
+
timezone: "America/New_York",
|
|
447
|
+
memoryDir,
|
|
448
|
+
store,
|
|
449
|
+
timelineEnabled: true,
|
|
450
|
+
analysis,
|
|
451
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
452
|
+
});
|
|
453
|
+
assert.equal(shifted.status, "ok");
|
|
454
|
+
assert.equal(shifted.written, true);
|
|
455
|
+
assert.equal(shifted.analyzed, true);
|
|
456
|
+
assert.equal(remote.calls, 2);
|
|
457
|
+
const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
|
|
458
|
+
assert.equal(persisted.timezone, "America/New_York");
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
test("an empty day cached under one timezone is rebuilt under another (issue #2891)", async () => {
|
|
463
|
+
await withStore(async (store, memoryDir) => {
|
|
464
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
465
|
+
const analysis = parseActivityConfig({
|
|
466
|
+
timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
|
|
467
|
+
}).timeline.analysis;
|
|
468
|
+
const first = await regenerateTimelineDay({
|
|
469
|
+
date: DATE,
|
|
470
|
+
timezone: TZ,
|
|
471
|
+
memoryDir,
|
|
472
|
+
store,
|
|
473
|
+
timelineEnabled: true,
|
|
474
|
+
analysis,
|
|
475
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
476
|
+
});
|
|
477
|
+
assert.equal(first.status, "invalid_output");
|
|
478
|
+
assert.equal(first.analyzed, false);
|
|
479
|
+
assert.equal(remote.calls, 0);
|
|
480
|
+
const shifted = await regenerateTimelineDay({
|
|
481
|
+
date: DATE,
|
|
482
|
+
timezone: "America/New_York",
|
|
483
|
+
memoryDir,
|
|
484
|
+
store,
|
|
485
|
+
timelineEnabled: true,
|
|
486
|
+
analysis,
|
|
487
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
488
|
+
});
|
|
489
|
+
// Zero observations under any timezone: still a rebuild, never the
|
|
490
|
+
// UTC-cached file served with the old day derivation.
|
|
491
|
+
assert.equal(shifted.written, true);
|
|
492
|
+
const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
|
|
493
|
+
assert.equal(persisted.timezone, "America/New_York");
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
|
|
416
497
|
test("a correction for another day does not change this day's hash, cache, or provider input", async () => {
|
|
417
498
|
await withStore(async (store, memoryDir) => {
|
|
418
499
|
store.insertSnapshot(snapshot());
|
|
@@ -502,4 +583,3 @@ test("a same-day correction updates hash, cards, and priorEdits", async () => {
|
|
|
502
583
|
assert.notEqual(persistedSourceHash(await readFile(timelineDayPath(memoryDir, DATE), "utf8")), firstHash);
|
|
503
584
|
});
|
|
504
585
|
});
|
|
505
|
-
|
|
@@ -191,12 +191,18 @@ function resolveClients(input: RegenerateTimelineDayInput): TimelineAnalysisClie
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
function sourceHash(input: {
|
|
194
|
+
timezone: string;
|
|
194
195
|
observations: readonly TimelineObservation[];
|
|
195
196
|
analysis: ActivityTimelineAnalysisConfig;
|
|
196
197
|
corrections: readonly TimelineCorrection[];
|
|
197
198
|
}): string {
|
|
198
199
|
return hashActivityBody(
|
|
199
200
|
JSON.stringify({
|
|
201
|
+
// The timezone is a day-window determinant (it bounds which
|
|
202
|
+
// observations the day sees), so it belongs to the source identity:
|
|
203
|
+
// identical observations under a different timezone must not reuse
|
|
204
|
+
// the cached day (issue #2891).
|
|
205
|
+
timezone: input.timezone,
|
|
200
206
|
observations: input.observations.map((observation) => ({
|
|
201
207
|
id: observation.id,
|
|
202
208
|
contentHash: observation.contentHash,
|
|
@@ -310,7 +316,7 @@ async function regenerateUncached(input: RegenerateTimelineDayInput): Promise<Re
|
|
|
310
316
|
const rawCards = buildTimelineDay({ date, timezone, observations }).cards;
|
|
311
317
|
corrections = correctionsForCards(rawCards, corrections);
|
|
312
318
|
const built = applyTimelineCorrections(rawCards, corrections);
|
|
313
|
-
const hash = sourceHash({ observations, analysis: input.analysis, corrections });
|
|
319
|
+
const hash = sourceHash({ timezone, observations, analysis: input.analysis, corrections });
|
|
314
320
|
const prior = readPersisted(filePath);
|
|
315
321
|
if (prior !== null && prior.sourceHash === hash && isCachedDayFinal(prior.status, input.analysis.enabled)) {
|
|
316
322
|
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
|
+
});
|
|
@@ -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
|
+
});
|