@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/activity/journal-vault-prereq.ts","../src/activity/vault-path.ts","../src/activity/vault-publish.ts","../src/activity/vault-region.ts","../src/activity/timeline/analysis-failure.ts","../src/activity/timeline/analysis-provider.ts","../src/activity/timeline/categories.ts","../src/activity/timeline/analysis.ts","../src/activity/timeline/analysis-metadata.ts","../src/activity/config.ts","../src/activity/journal-heading.ts","../src/activity/journal-source.ts"],"sourcesContent":["/**\n * Vault journal read-back prerequisites (issue #1987).\n *\n * Pure. `journal.source: \"vault\"` requires all three prerequisites; the\n * caller checks `source` first via the journal-source parser and calls this\n * only for vault mode. Reports EVERY unmet prerequisite at once so the user\n * gets one actionable error, not the first hit.\n */\n\nexport const VAULT_JOURNAL_PREREQUISITES = [\n \"vault.enabled\",\n \"vault.dailyNotePath\",\n \"vault.readback.journalSection\",\n] as const;\nexport type VaultJournalPrerequisite = (typeof VAULT_JOURNAL_PREREQUISITES)[number];\n\nexport type VaultJournalPrereqResult =\n | { ok: true }\n | { ok: false; missing: VaultJournalPrerequisite[]; message: string };\n\nexport function checkVaultJournalPrerequisites(input: {\n vaultEnabled?: unknown;\n dailyNotePath?: unknown;\n journalSection?: unknown;\n}): VaultJournalPrereqResult {\n const missing: VaultJournalPrerequisite[] = [];\n if (input.vaultEnabled !== true) missing.push(\"vault.enabled\");\n // Exact values are validated: trim() only detects blankness, never rewrites.\n if (typeof input.dailyNotePath !== \"string\" || input.dailyNotePath.trim().length === 0) {\n missing.push(\"vault.dailyNotePath\");\n }\n if (typeof input.journalSection !== \"string\" || input.journalSection.trim().length === 0) {\n missing.push(\"vault.readback.journalSection\");\n }\n if (missing.length === 0) return { ok: true };\n return {\n ok: false,\n missing,\n message: `vault journal read-back prerequisites unmet: ${missing.join(\", \")}`,\n };\n}\n","/**\n * Vault note path templates (issue #1985).\n *\n * Expands date tokens on a YYYY-MM-DD day. Returns a vault-relative path.\n * Rejects `..` segments, absolute templates, and unknown `{...}` tokens —\n * naming the token and the full valid set (never a silent pass-through).\n */\nimport path from \"node:path\";\n\nimport { assertValidTimezone, isValidActivityDate } from \"./digest.js\";\n\n/** Every token a vault template accepts (English names in v1). */\nexport const VAULT_TEMPLATE_TOKENS = [\n \"{yyyy}\",\n \"{yy}\",\n \"{M}\",\n \"{MM}\",\n \"{d}\",\n \"{dd}\",\n \"{ww}\",\n \"{MMM}\",\n \"{MMMM}\",\n \"{ddd}\",\n \"{dddd}\",\n] as const;\n\nexport type VaultTemplateToken = (typeof VAULT_TEMPLATE_TOKENS)[number];\n\nconst TOKEN_LOOKUP: Record<string, true> = Object.fromEntries(VAULT_TEMPLATE_TOKENS.map((t) => [t, true]));\n\nconst ANY_BRACED_RE = /\\{[^{}]*\\}/g;\n\nconst MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n] as const;\n\nconst WEEKDAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"] as const;\n\nfunction templateValues(date: string): Record<string, string> {\n const [yyyy, mm, dd] = date.split(\"-\");\n const monthIndex = Number(mm) - 1;\n const weekday = new Date(Date.UTC(Number(yyyy), monthIndex, Number(dd))).getUTCDay();\n return {\n \"{yyyy}\": yyyy,\n \"{yy}\": yyyy.slice(2),\n \"{MM}\": mm,\n \"{dd}\": dd,\n \"{M}\": String(Number(mm)),\n \"{d}\": String(Number(dd)),\n \"{ww}\": isoWeekNumber(date),\n \"{MMM}\": MONTH_NAMES[monthIndex]!.slice(0, 3),\n \"{MMMM}\": MONTH_NAMES[monthIndex]!,\n \"{ddd}\": WEEKDAY_NAMES[weekday]!.slice(0, 3),\n \"{dddd}\": WEEKDAY_NAMES[weekday]!,\n };\n}\n\n/**\n * Expand vault date tokens in any template text (a note path or a note\n * template body). Unknown `{...}` tokens are rejected naming the token and\n * the full valid set; an unreplaced token in a path would silently publish\n * to the wrong file.\n */\nexport function expandVaultTemplateTokens(text: string, date: string): string {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid vault date \"${date}\"; expected YYYY-MM-DD.`);\n }\n if (typeof text !== \"string\" || text.length === 0) {\n throw new RangeError(\"Vault template must be a non-empty string.\");\n }\n const values = templateValues(date);\n return text.replace(ANY_BRACED_RE, (token) => {\n if (TOKEN_LOOKUP[token] === true) return values[token]!;\n throw new RangeError(\n `Unknown vault template token ${token}; valid tokens are ${VAULT_TEMPLATE_TOKENS.join(\" \")}.`,\n );\n });\n}\n\n/**\n * Validate a vault note path template without resolving it to a date:\n * token allow-list plus the relative/no-`..` shape checks shared with\n * `resolveVaultNotePath`.\n */\nexport function validateVaultNoteTemplate(template: string): void {\n if (typeof template !== \"string\" || template.length === 0) {\n throw new RangeError(\"Vault note path template must be a non-empty relative path.\");\n }\n if (path.posix.isAbsolute(template) || path.win32.isAbsolute(template)) {\n throw new RangeError(\"Vault note path template must be relative; absolute templates are rejected.\");\n }\n if (template.split(/[\\\\/]/).some((segment) => segment === \"..\")) {\n throw new RangeError(\"Vault note path template must not contain `..` segments.\");\n }\n expandVaultTemplateTokens(template, \"2026-01-04\");\n}\n\nexport function resolveVaultNotePath(\n template: string,\n date: string,\n options?: { timezone?: string },\n): string {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid vault date \"${date}\"; expected YYYY-MM-DD.`);\n }\n if (options?.timezone !== undefined) {\n assertValidTimezone(options.timezone);\n }\n validateVaultNoteTemplate(template);\n\n const expanded = expandVaultTemplateTokens(template, date);\n if (path.posix.isAbsolute(expanded) || path.win32.isAbsolute(expanded)) {\n throw new RangeError(\"Vault note path template must be relative; absolute templates are rejected.\");\n }\n return expanded;\n}\n\nfunction isoWeekNumber(date: string): string {\n const [year, month, day] = date.split(\"-\").map(Number);\n const utc = new Date(Date.UTC(year, month - 1, day));\n const dayNum = utc.getUTCDay() || 7;\n utc.setUTCDate(utc.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(utc.getUTCFullYear(), 0, 1));\n const weekNo = Math.ceil(((utc.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return String(weekNo).padStart(2, \"0\");\n}\n","/**\n * Managed-region vault publisher (issue #1985).\n *\n * Markers replace bytes between `<!-- remnic:<name>:start -->` and\n * `<!-- remnic:<name>:end -->`. Heading replaces the body after a unique\n * ATX heading until the next same-or-higher heading. The heading line stays.\n * This module does not read config.\n */\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { expandTildePath } from \"../utils/path.js\";\n\nexport type ApplyManagedRegionResult =\n | { ok: true; text: string }\n | { ok: false; reason: \"no_marker\" | \"no_heading\"; text: string }\n | { ok: false; reason: \"duplicate_heading\"; lines: readonly number[]; text: string };\n\nexport type PublishVaultRegionResult =\n | { ok: true; status: \"updated\" | \"unchanged\" }\n | { ok: false; reason: \"no_marker\" | \"missing_file\" | \"not_directory\" };\n\nexport function applyManagedRegion(\n fileText: string,\n opts: { strategy: \"markers\" | \"heading\"; name: string; content: string },\n): ApplyManagedRegionResult {\n if (opts.strategy === \"heading\") return applyHeadingRegion(fileText, opts.name, opts.content);\n\n const startMarker = `<!-- remnic:${opts.name}:start -->`;\n const endMarker = `<!-- remnic:${opts.name}:end -->`;\n // Markers are owned only outside a code block — fenced or indented: a\n // complete pair inside a ``` or four-space-indented example is sample\n // text the user wrote, and replacing between it would overwrite their\n // bytes (issue #1985).\n const rows = fileLines(fileText);\n let startRow: FileLine | undefined;\n let endRow: FileLine | undefined;\n for (const row of rows) {\n if (row.fenced) continue;\n const trimmed = row.line.trim();\n if (startRow === undefined) {\n if (trimmed === startMarker) startRow = row;\n } else if (endRow === undefined && trimmed === endMarker) {\n endRow = row;\n break;\n }\n }\n if (startRow === undefined || endRow === undefined) {\n return { ok: false, reason: \"no_marker\", text: fileText };\n }\n\n const { body, eol } = ownedBody(fileText, opts.content);\n return {\n ok: true,\n text: `${fileText.slice(0, startRow.start + startRow.line.length)}${eol}${body}${eol}${fileText.slice(endRow.start)}`,\n };\n}\n\nfunction applyHeadingRegion(fileText: string, name: string, content: string): ApplyManagedRegionResult {\n const wanted = name.trim();\n const rows = fileLines(fileText);\n const hits: Array<{ line: number; level: number; next: number }> = [];\n for (const row of rows) {\n if (row.fenced) continue;\n const heading = parseAtxHeading(row.line);\n if (heading && heading.text === wanted) {\n hits.push({ line: row.number, level: heading.level, next: row.next });\n }\n }\n if (hits.length === 0) return { ok: false, reason: \"no_heading\", text: fileText };\n if (hits.length > 1) {\n return { ok: false, reason: \"duplicate_heading\", lines: hits.map((hit) => hit.line), text: fileText };\n }\n\n const hit = hits[0]!;\n let sectionEnd = fileText.length;\n for (const row of rows) {\n if (row.start < hit.next || row.fenced) continue;\n const heading = parseAtxHeading(row.line);\n if (heading && heading.level <= hit.level) {\n sectionEnd = row.start;\n break;\n }\n }\n\n const { body, eol } = ownedBody(fileText, demoteOwnedHeadings(content, hit.level));\n const prefix =\n hit.next === fileText.length && !fileText.endsWith(\"\\n\") && !fileText.endsWith(\"\\r\")\n ? `${fileText}${eol}`\n : fileText.slice(0, hit.next);\n return { ok: true, text: `${prefix}${body}${eol}${fileText.slice(sectionEnd)}` };\n}\n\n/**\n * Re-level every ATX heading in the owned content so it sits strictly\n * below the owning heading (issue #1985 review). A published recap that\n * itself starts with `#`/`##` headings would otherwise terminate its own\n * managed region on the NEXT publish — the new copy lands before the old\n * heading and each republish leaves a stale duplicate behind. New level is\n * owning + original, clamped at six. A level-6 owning heading has no\n * deeper ATX level, so its owned headings flatten to bold text — still\n * rendered, never a terminator. Headings inside fenced or indented code\n * are content, not structure, and pass through untouched.\n */\nfunction demoteOwnedHeadings(content: string, owningLevel: number): string {\n const rows = fileLines(content);\n let out = \"\";\n let cursor = 0;\n for (const row of rows) {\n const heading = row.fenced ? null : parseAtxHeading(row.line);\n if (heading === null) continue;\n const level = Math.min(owningLevel + heading.level, 6);\n const replacement = level > owningLevel ? `${\"#\".repeat(level)} ${heading.text}` : `**${heading.text}**`;\n out += content.slice(cursor, row.start) + replacement;\n cursor = row.start + row.line.length;\n }\n return out + content.slice(cursor);\n}\n\nfunction ownedBody(fileText: string, content: string): { body: string; eol: string } {\n const eol = fileText.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n let body = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n if (eol === \"\\r\\n\") body = body.replace(/\\n/g, \"\\r\\n\");\n if (body.endsWith(eol)) body = body.slice(0, -eol.length);\n return { body, eol };\n}\n\nexport interface FileLine {\n line: string;\n start: number;\n next: number;\n number: number;\n /** True inside a fenced or indented code block, delimiter lines included. */\n fenced: boolean;\n}\n\n/**\n * The one shared code-aware line scanner (issue #1985): marker discovery,\n * marker replacement, mismatch scanning, and heading insertion all classify\n * lines through it, so code examples are invisible to every scan.\n *\n * A line is code when a fence is open, or when its own indentation reaches\n * four columns (CommonMark indented code block; one tab covers all four).\n * Classification reads the RAW line — no consumer trims first — so the\n * indentation cannot be erased before it is seen.\n *\n * Two deliberate simplifications, both resolving toward \"code\" (skip):\n * - CommonMark lets an indented line lazily continue an open paragraph\n * instead of opening a code block; we still call it code.\n * - CommonMark measures indentation relative to the containing block, so\n * a marker indented under a list item can be live content; we call it\n * code. Distinguishing either case needs full block tracking.\n * Skipping a line refuses a publish; mis-reading one as live overwrites the\n * user's bytes. The refusal is recoverable, the overwrite is not.\n *\n * A fence delimiter run is only live at indent < 4: deeper, the run is\n * literal text inside an indented code block (and inside an open fence a\n * 4+-indented closing run is content, not a closer), so `fenceRun` never\n * sees an indented line.\n */\nexport function fileLines(fileText: string): FileLine[] {\n const rows: FileLine[] = [];\n let start = 0;\n let number = 1;\n let fence: { char: string; len: number } | null = null;\n while (start < fileText.length) {\n let i = start;\n while (i < fileText.length && fileText[i] !== \"\\n\" && fileText[i] !== \"\\r\") i++;\n let next = i;\n if (fileText[i] === \"\\r\" && fileText[i + 1] === \"\\n\") next = i + 2;\n else if (fileText[i] === \"\\n\" || fileText[i] === \"\\r\") next = i + 1;\n else next = fileText.length;\n const line = fileText.slice(start, i);\n\n const indentedCode = indentColumn(line) >= 4;\n const run = indentedCode ? null : fenceRun(line);\n let fenced: boolean;\n if (fence === null) {\n // A backtick fence's info string may not contain a backtick, so a\n // ``` ` ``` run with one is not an opening delimiter.\n if (run !== null && !(run.char === \"`\" && run.info.includes(\"`\"))) {\n fence = { char: run.char, len: run.len };\n }\n fenced = fence !== null || indentedCode;\n } else {\n fenced = true;\n if (run !== null && run.char === fence.char && run.len >= fence.len && run.info.length === 0) {\n fence = null;\n }\n }\n\n rows.push({ line, start, next, number, fenced });\n number += 1;\n start = next;\n }\n return rows;\n}\n\n/**\n * The column a line's first non-whitespace character sits at: spaces count\n * one, a tab advances to the next multiple of four (CommonMark tab handling).\n */\nfunction indentColumn(line: string): number {\n let col = 0;\n for (let i = 0; i < line.length; i += 1) {\n const ch = line[i];\n if (ch === \" \") col += 1;\n else if (ch === \"\\t\") col += 4 - (col % 4);\n else break;\n }\n return col;\n}\n\n/**\n * A fence delimiter run: three or more backticks or tildes at the line's\n * start (leading whitespace allowed), plus the trailing info string. An\n * unterminated fence therefore keeps every following line fenced, which\n * makes a malformed note refuse to publish instead of overwriting bytes.\n */\nfunction fenceRun(line: string): { char: string; len: number; info: string } | null {\n const body = line.trimStart();\n const char = body[0];\n if (char !== \"`\" && char !== \"~\") return null;\n let len = 0;\n while (len < body.length && body[len] === char) len++;\n if (len < 3) return null;\n return { char, len, info: body.slice(len).trim() };\n}\n\nexport function parseAtxHeading(line: string): { level: number; text: string } | null {\n // CommonMark permits up to three columns of indentation before the\n // hashes; the fourth column is an indented code block, which\n // `fileLines` already classifies as fenced (a tab advances to the\n // next multiple of four, matching `indentColumn`). Replacement and\n // insertion both scan headings through this one parser.\n let at = 0;\n let indent = 0;\n while (at < line.length && (line[at] === \" \" || line[at] === \"\\t\")) {\n indent += line[at] === \" \" ? 1 : 4 - (indent % 4);\n if (indent >= 4) return null;\n at += 1;\n }\n let level = 0;\n while (level < 6 && line[at + level] === \"#\") level++;\n if (level === 0) return null;\n const after = line[at + level];\n if (after !== \" \" && after !== \"\\t\") return null;\n\n let start = at + level + 1;\n let end = line.length;\n while (start < end && (line[start] === \" \" || line[start] === \"\\t\")) start++;\n while (end > start && (line[end - 1] === \" \" || line[end - 1] === \"\\t\")) end--;\n\n let hashEnd = end;\n while (hashEnd > start && line[hashEnd - 1] === \"#\") hashEnd--;\n if (hashEnd < end && hashEnd > start && (line[hashEnd - 1] === \" \" || line[end - 1] === \"\\t\")) {\n end = hashEnd;\n while (end > start && (line[end - 1] === \" \" || line[end - 1] === \"\\t\")) end--;\n }\n return { level, text: line.slice(start, end) };\n}\n\n/** True when `## ${name}` parses back to the same heading text. */\nexport function headingSurvivesRoundTrip(name: string): boolean {\n const parsed = parseAtxHeading(`## ${name}`);\n return parsed !== null && parsed.text === name;\n}\n\nexport function publishVaultRegion(input: {\n vaultPath: string;\n relativeFile: string;\n name: string;\n content: string;\n}): PublishVaultRegionResult {\n const vault = expandTildePath(input.vaultPath);\n try {\n if (!statSync(vault).isDirectory()) return { ok: false, reason: \"not_directory\" };\n } catch {\n return { ok: false, reason: \"not_directory\" };\n }\n\n if (input.relativeFile.length === 0 || path.isAbsolute(input.relativeFile)) {\n return { ok: false, reason: \"missing_file\" };\n }\n const root = path.resolve(vault);\n const dest = path.resolve(root, input.relativeFile);\n const rel = path.relative(root, dest);\n if (rel.length === 0 || rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n return { ok: false, reason: \"missing_file\" };\n }\n\n let existing: string;\n try {\n if (!statSync(dest).isFile()) return { ok: false, reason: \"missing_file\" };\n existing = readFileSync(dest, \"utf8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return { ok: false, reason: \"missing_file\" };\n throw err;\n }\n\n const applied = applyManagedRegion(existing, {\n strategy: \"markers\",\n name: input.name,\n content: input.content,\n });\n if (!applied.ok) return { ok: false, reason: \"no_marker\" };\n\n const prevHash = createHash(\"sha256\").update(existing, \"utf8\").digest(\"hex\");\n const nextHash = createHash(\"sha256\").update(applied.text, \"utf8\").digest(\"hex\");\n if (prevHash === nextHash) return { ok: true, status: \"unchanged\" };\n\n const tmpPath = path.join(path.dirname(dest), `.remnic-vault-${randomBytes(8).toString(\"hex\")}.tmp`);\n writeFileSync(tmpPath, applied.text);\n try {\n renameSync(tmpPath, dest);\n } catch (renameErr) {\n try {\n unlinkSync(tmpPath);\n } catch {\n // temp cleanup is best-effort\n }\n throw renameErr;\n }\n return { ok: true, status: \"updated\" };\n}\n","/**\n * Validate a managed-region name for vault markers (issue #1985).\n *\n * Empty, whitespace-only, newline, and `-->` names are rejected so they\n * cannot break `<!-- remnic:<name>:start -->` markers. `:` is rejected\n * too: the marker grammar is colon-delimited, so a colon-bearing name\n * makes a marker line ambiguous (`remnic:A:B:start` reads as name `A:B`\n * or as name `A` with a `B:start` suffix) and a publisher that resolved\n * that ambiguity differently from the note's own markers would pair a\n * start with a later end and delete the user bytes in between.\n *\n * Whitespace-padded names are rejected, not trimmed (issue #2917): the\n * old silent trim validated one name and wrote another, so markers and\n * heading matches were computed against bytes the caller never saw.\n */\n\nexport type ValidateRegionNameResult =\n | { ok: true; name: string }\n | { ok: false; error: \"invalid_name\" };\n\nexport function validateRegionName(name: string): ValidateRegionNameResult {\n if (typeof name !== \"string\") {\n return { ok: false, error: \"invalid_name\" };\n }\n if (name.includes(\"\\n\") || name.includes(\"\\r\") || name.includes(\"-->\") || name.includes(\":\")) {\n return { ok: false, error: \"invalid_name\" };\n }\n if (name.trim() !== name || name.trim().length === 0) {\n return { ok: false, error: \"invalid_name\" };\n }\n return { ok: true, name };\n}\n\n","/**\n * Typed failure classification for timeline analysis (issue #2050).\n *\n * Unknown kinds fail closed with a TypeError. Pure: no I/O, no clock, no randomness.\n */\n\nexport const ANALYSIS_FAILURE_KINDS = [\n \"provider_unavailable\",\n \"timeout\",\n \"aborted\",\n \"rate_limited\",\n \"malformed_json\",\n \"invalid_schema\",\n \"partial_output\",\n \"invalid_config\",\n] as const;\nexport type AnalysisFailureKind = (typeof ANALYSIS_FAILURE_KINDS)[number];\n\nexport interface AnalysisFailure {\n kind: AnalysisFailureKind;\n /** True only when retrying the same request could plausibly succeed. */\n retryable: boolean;\n /** True when the deterministic cards must be preserved unchanged. */\n preservesDeterministic: true;\n}\n\nconst RETRYABLE_BY_KIND: Readonly<Record<AnalysisFailureKind, boolean>> = {\n provider_unavailable: true,\n timeout: true,\n rate_limited: true,\n aborted: false,\n malformed_json: false,\n invalid_schema: false,\n partial_output: false,\n invalid_config: false,\n};\n\n/** True when the value is one of the known failure kinds. */\nexport function isAnalysisFailureKind(\n value: unknown,\n): value is AnalysisFailureKind {\n return (\n typeof value === \"string\" &&\n (ANALYSIS_FAILURE_KINDS as readonly string[]).includes(value)\n );\n}\n\n/** Classify a failure kind. Unknown kinds throw; there is no permissive default. */\nexport function classifyAnalysisFailure(kind: string): AnalysisFailure {\n if (!isAnalysisFailureKind(kind)) {\n throw new TypeError(\n `unknown analysis failure kind: ${String(kind)}; allowed kinds: ${ANALYSIS_FAILURE_KINDS.join(\", \")}`,\n );\n }\n return {\n kind,\n retryable: RETRYABLE_BY_KIND[kind],\n preservesDeterministic: true,\n };\n}\n","/**\n * Provider-neutral completion adapter for timeline analysis (issue #2050).\n *\n * Routes the analysis prompt through the existing LLM contracts — the local\n * client (`provider: \"local\"`) or the gateway fallback client pinned to the\n * ONE explicitly configured remote provider/model. An invalid or missing\n * explicit provider surfaces as a typed failure; there is no chain fallback,\n * so a bad config can never silently answer from a different provider.\n *\n * Structural seams (not concrete classes) so hosts and tests inject fakes.\n * Never logs prompt or response content.\n */\nimport type { AnalysisFailureKind } from \"./analysis-failure.js\";\nimport type { TimelineAnalysisComplete } from \"./analysis.js\";\n\n/** Structural slice of LocalLlmClient.chatCompletion (local seam). */\nexport interface TimelineAnalysisLocalLlm {\n chatCompletion(\n messages: Array<{ role: \"system\" | \"user\"; content: string }>,\n options: {\n temperature?: number;\n maxTokens?: number;\n responseFormat?: { type: string };\n signal?: AbortSignal;\n operation?: string;\n redactProviderErrors?: boolean;\n model?: string;\n failureDiag?: { lastError?: unknown };\n },\n ): Promise<{ content: string } | null>;\n}\n\n/** Structural slice of FallbackLlmClient.chatCompletion (remote seam). */\nexport interface TimelineAnalysisRemoteLlm {\n chatCompletion(\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n options: {\n temperature?: number;\n maxTokens?: number;\n signal?: AbortSignal;\n modelChain?: { primary?: string; fallbacks?: string[] };\n includeDefaultModelFallback?: boolean;\n redactProviderErrors?: boolean;\n failureDiag?: { lastError?: unknown };\n },\n ): Promise<{ content: string } | null>;\n}\n\n/** Marker base for provider errors the analysis run classifies by kind. */\nexport class TimelineAnalysisProviderError extends Error {\n override readonly name = \"TimelineAnalysisProviderError\";\n constructor(\n readonly kind: AnalysisFailureKind,\n message: string,\n ) {\n super(message);\n }\n}\n\n/** The provider id that routes to the local LLM client. */\nexport const TIMELINE_ANALYSIS_LOCAL_PROVIDER_ID = \"local\";\n\nconst RATE_LIMIT_MESSAGE = /rate limit|too many requests/i;\n\n/**\n * Map a thrown provider error onto the typed failure kinds. Name- and\n * status-based only: the message is matched, never logged, so provider error\n * text cannot become a log line.\n */\nexport function classifyAnalysisProviderError(error: unknown): AnalysisFailureKind {\n if (error instanceof TimelineAnalysisProviderError) return error.kind;\n if (error instanceof Error) {\n if (error.name === \"AbortError\" || (\"code\" in error && error.code === \"ABORT_ERR\")) {\n return \"aborted\";\n }\n if (error.name === \"TimeoutError\") return \"timeout\";\n const status = \"status\" in error ? error.status : \"statusCode\" in error ? error.statusCode : undefined;\n if (status === 429 || RATE_LIMIT_MESSAGE.test(error.message)) return \"rate_limited\";\n }\n return \"provider_unavailable\";\n}\n\n/**\n * Build the `complete` function `analyzeTimelineCards` calls, from the local\n * and remote client seams. Selection is by the explicit provider id carried\n * on each call: `\"local\"` uses the local client; anything else is a remote\n * provider id pinned as the single-model chain (no default-chain fallback is\n * ever appended).\n */\nexport function timelineAnalysisCompleteFromClients(input: {\n localLlm: TimelineAnalysisLocalLlm | null;\n remoteLlm: TimelineAnalysisRemoteLlm | null;\n}): TimelineAnalysisComplete {\n const { localLlm, remoteLlm } = input;\n return async ({ prompt, provider, model, signal }) => {\n const messages = [{ role: \"user\" as const, content: prompt }];\n if (provider === TIMELINE_ANALYSIS_LOCAL_PROVIDER_ID) {\n if (!localLlm) {\n throw new TimelineAnalysisProviderError(\n \"provider_unavailable\",\n \"timeline analysis local provider is not configured\",\n );\n }\n const failureDiag: { lastError?: unknown } = {};\n const result = await localLlm.chatCompletion(messages, {\n temperature: 0,\n maxTokens: 2048,\n signal,\n operation: \"timeline-analysis\",\n redactProviderErrors: true,\n model,\n failureDiag,\n });\n if (result === null) {\n throw new TimelineAnalysisProviderError(\n classifyAnalysisProviderError(failureDiag.lastError),\n \"timeline analysis local provider returned no completion\",\n );\n }\n return result.content;\n }\n if (!remoteLlm) {\n throw new TimelineAnalysisProviderError(\n \"provider_unavailable\",\n \"timeline analysis remote provider is not configured\",\n );\n }\n const failureDiag: { lastError?: unknown } = {};\n const result = await remoteLlm.chatCompletion(messages, {\n temperature: 0,\n maxTokens: 2048,\n signal,\n modelChain: { primary: `${provider}/${model}` },\n includeDefaultModelFallback: false,\n redactProviderErrors: true,\n failureDiag,\n });\n if (result === null) {\n throw new TimelineAnalysisProviderError(\n classifyAnalysisProviderError(failureDiag.lastError),\n `timeline analysis provider \"${provider}\" is not configured`,\n );\n }\n return result.content;\n };\n}\n","/**\n * Timeline category registry (issue #2049): ordered definitions with stable\n * IDs, names, colors, descriptions, and system/idle flags. Reserved system\n * categories (`system.*`) must always be present; unknown activity stays\n * visible in `system.unknown` rather than being silently reassigned.\n */\n\nimport type { TimelineCategory } from \"./types.js\";\n\nexport const TIMELINE_RESERVED_UNKNOWN = \"system.unknown\";\nexport const TIMELINE_RESERVED_IDLE = \"system.idle\";\nexport const TIMELINE_RESERVED_PAUSE = \"system.pause\";\n\nconst COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;\n\nfunction isTimelineCategoryId(id: string): boolean {\n const parts = id.split(\".\");\n if (parts.length === 0) return false;\n for (const part of parts) {\n if (part.length === 0) return false;\n const first = part.charCodeAt(0);\n if (first < 97 || first > 122) return false;\n for (let i = 1; i < part.length; i += 1) {\n const code = part.charCodeAt(i);\n const ok = (code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code === 45;\n if (!ok) return false;\n }\n }\n return true;\n}\n\n\n/**\n * Default registry. User category orders step by 10 so a corrected registry\n * can insert between without renumbering; system categories sort last.\n */\nexport const DEFAULT_TIMELINE_CATEGORIES: readonly TimelineCategory[] = [\n { id: \"development\", name: \"Development\", color: \"#3b82f6\", description: \"Editors, terminals, IDEs, and code forges.\", order: 10 },\n { id: \"communication\", name: \"Communication\", color: \"#f59e0b\", description: \"Mail, chat, and meetings.\", order: 20 },\n { id: \"browsing\", name: \"Browsing\", color: \"#6366f1\", description: \"Web browsing without a more specific domain match.\", order: 30 },\n { id: \"documents\", name: \"Documents\", color: \"#10b981\", description: \"Writing, notes, and PDFs.\", order: 40 },\n { id: \"design\", name: \"Design & Media\", color: \"#ec4899\", description: \"Design, audio, and video tools.\", order: 50 },\n { id: \"data\", name: \"Data & Analysis\", color: \"#84cc16\", description: \"Spreadsheets, dashboards, and databases.\", order: 60 },\n { id: \"admin\", name: \"Admin\", color: \"#64748b\", description: \"File managers, settings, and system utilities.\", order: 70 },\n { id: \"entertainment\", name: \"Entertainment\", color: \"#ef4444\", description: \"Video, music, and games.\", order: 80 },\n { id: TIMELINE_RESERVED_UNKNOWN, name: \"Uncategorized\", color: \"#9ca3af\", description: \"Activity with no matching classification signal. Kept visible, never silently reassigned.\", order: 990, system: true },\n { id: TIMELINE_RESERVED_IDLE, name: \"Idle\", color: \"#d1d5db\", description: \"Derived gap between cards where no activity was observed.\", order: 991, system: true, idle: true },\n { id: TIMELINE_RESERVED_PAUSE, name: \"Paused\", color: \"#a78bfa\", description: \"User-declared pause interval.\", order: 992, system: true },\n];\n\n/**\n * Validate a registry: unique well-formed ids, non-empty names, hex colors,\n * integer orders, reserved categories present and correctly flagged, and the\n * `system.` namespace reserved. Throws with the offending key path.\n */\nexport function validateTimelineCategories(categories: readonly TimelineCategory[]): void {\n if (!Array.isArray(categories) || categories.length === 0) {\n throw new RangeError(\"timeline categories must be a non-empty array\");\n }\n const seen = new Set<string>();\n for (const category of categories) {\n if (typeof category.id !== \"string\" || !isTimelineCategoryId(category.id)) {\n throw new RangeError(`timeline category id must be dotted kebab-case: ${String(category.id)}`);\n }\n if (seen.has(category.id)) {\n throw new RangeError(`timeline category id must be unique: ${category.id}`);\n }\n seen.add(category.id);\n if (typeof category.name !== \"string\" || category.name.length === 0) {\n throw new RangeError(`timeline category ${category.id}: name must be a non-empty string`);\n }\n if (typeof category.color !== \"string\" || !COLOR_PATTERN.test(category.color)) {\n throw new RangeError(`timeline category ${category.id}: color must be #RRGGBB`);\n }\n if (typeof category.description !== \"string\" || category.description.length === 0) {\n throw new RangeError(`timeline category ${category.id}: description must be a non-empty string`);\n }\n if (!Number.isInteger(category.order)) {\n throw new RangeError(`timeline category ${category.id}: order must be an integer`);\n }\n const isReserved = category.id === TIMELINE_RESERVED_UNKNOWN || category.id === TIMELINE_RESERVED_IDLE || category.id === TIMELINE_RESERVED_PAUSE;\n if (isReserved && category.system !== true) {\n throw new RangeError(`timeline category ${category.id} is reserved and must set system: true`);\n }\n if (!isReserved) {\n if (category.id.startsWith(\"system.\")) {\n throw new RangeError(`timeline category id namespace \"system.\" is reserved: ${category.id}`);\n }\n if (category.system === true || category.idle === true) {\n throw new RangeError(`timeline category ${category.id}: only reserved categories may set system/idle flags`);\n }\n }\n }\n const idle = categories.find((category) => category.id === TIMELINE_RESERVED_IDLE);\n if (idle !== undefined && idle.idle !== true) {\n throw new RangeError(`timeline category ${TIMELINE_RESERVED_IDLE} must set idle: true`);\n }\n for (const reserved of [TIMELINE_RESERVED_UNKNOWN, TIMELINE_RESERVED_IDLE, TIMELINE_RESERVED_PAUSE]) {\n if (!categories.some((category) => category.id === reserved)) {\n throw new RangeError(`timeline categories must include the reserved \"${reserved}\" category`);\n }\n }\n}\n\n/**\n * Deterministic presentation order: by `order`, then by id as the equal-order\n * tie-breaker, so two categories sharing an order never swap between runs.\n */\nexport function sortTimelineCategories(categories: readonly TimelineCategory[]): TimelineCategory[] {\n return [...categories].sort((a, b) => a.order - b.order || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n}\n","/**\n * Optional evidence-bound AI analysis over deterministic timeline cards\n * (issue #2050). Provider calls arrive through the injected `complete`\n * function; hosts build it from the local/remote seams in analysis-provider.js\n * and the parsed `activity.timeline.analysis` config. Failures leave the\n * cards unchanged and carry a typed failure kind. Disabled makes zero\n * provider calls.\n */\nimport { classifyAnalysisFailure, type AnalysisFailure, type AnalysisFailureKind } from \"./analysis-failure.js\";\nimport { classifyAnalysisProviderError } from \"./analysis-provider.js\";\nimport { extractJsonCandidates } from \"../../json-extract.js\";\nimport { log } from \"../../logger.js\";\nimport { DEFAULT_TIMELINE_CATEGORIES } from \"./categories.js\";\nimport type { TimelineCard, TimelineCategory, TimelineCorrection, TimelineEvidenceRange, TimelineObservation } from \"./types.js\";\n\nexport const TIMELINE_ANALYSIS_PROMPT_VERSION = 1;\nexport const TIMELINE_ANALYSIS_BATCH_SIZE = 40;\nexport const TIMELINE_ANALYSIS_BATCH_OVERLAP = 2;\nexport const TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS = 15_000;\n\nexport class TimelineAnalysisConfigError extends Error {\n override readonly name = \"TimelineAnalysisConfigError\";\n readonly code = \"invalid_config\" as const;\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type TimelineAnalysisStatus = \"ok\" | \"disabled\" | \"provider_failed\" | \"invalid_output\";\n\nexport interface TimelineAnalysisCompleteInput {\n prompt: string;\n provider: string;\n model: string;\n signal: AbortSignal;\n}\n\nexport type TimelineAnalysisComplete = (input: TimelineAnalysisCompleteInput) => Promise<string>;\n\nexport interface TimelineAnalysisInput {\n enabled: boolean;\n cards: readonly TimelineCard[];\n observations: readonly TimelineObservation[];\n provider?: string;\n model?: string;\n complete?: TimelineAnalysisComplete;\n timeoutMs?: number;\n date?: string;\n timezone?: string;\n categories?: readonly TimelineCategory[];\n preferences?: readonly string[];\n priorEdits?: readonly TimelineCorrection[];\n signal?: AbortSignal;\n}\n\nexport interface TimelineAnalysisResult {\n status: TimelineAnalysisStatus;\n cards: TimelineCard[];\n provider?: string;\n model?: string;\n promptVersion?: number;\n /** Typed failure detail; present only when status is a failure. */\n failure?: AnalysisFailure;\n}\n\ninterface AnalysisOp {\n cardId: string;\n title?: string;\n summary?: string;\n categoryId?: string;\n confidence?: number;\n uncertainty?: string;\n evidenceRange: TimelineEvidenceRange;\n}\n\nconst INSTRUCTIONS = [\n \"Use only supplied evidence.\",\n \"Preserve chronology.\",\n \"Do not invent people, places, or tasks.\",\n \"Avoid productivity or emotional claims.\",\n \"Merge adjacent activity only when the evidence justifies it.\",\n \"Return strict JSON: {\\\"ops\\\":[...]} with evidenceRange, title, summary, categoryId, confidence, uncertainty.\",\n \"Cite evidence ranges for every op. Empty ops is a valid no-op.\",\n].join(\" \");\n\nfunction fail(\n status: Exclude<TimelineAnalysisStatus, \"ok\" | \"disabled\">,\n cards: readonly TimelineCard[],\n provider: string,\n model: string,\n kind: AnalysisFailureKind,\n): TimelineAnalysisResult {\n log.info(`timeline analysis status=${status} provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);\n return {\n status,\n cards: cards as TimelineCard[],\n provider,\n model,\n promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,\n failure: classifyAnalysisFailure(kind),\n };\n}\n\nfunction requiredToken(value: string | undefined, name: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TimelineAnalysisConfigError(`${name} is required`);\n }\n return value.trim();\n}\n\nfunction evidenceKeyOf(observation: TimelineObservation): string {\n const parsed = Date.parse(observation.capturedAtUtc);\n const instant = Number.isFinite(parsed) ? new Date(parsed).toISOString() : observation.capturedAtUtc;\n return `${observation.machine}|${instant}|${observation.contentHash}`;\n}\n\nfunction sortObservations(observations: readonly TimelineObservation[]): TimelineObservation[] {\n return [...observations].sort((a, b) => {\n const time = Date.parse(a.capturedAtUtc) - Date.parse(b.capturedAtUtc);\n if (time !== 0) return time;\n if (a.contentHash !== b.contentHash) return a.contentHash < b.contentHash ? -1 : 1;\n return a.id - b.id;\n });\n}\n\nfunction batchObservations(observations: readonly TimelineObservation[]): TimelineObservation[][] {\n if (observations.length === 0) return [[]];\n const size = TIMELINE_ANALYSIS_BATCH_SIZE;\n const overlap = TIMELINE_ANALYSIS_BATCH_OVERLAP;\n const step = size - overlap;\n const batches: TimelineObservation[][] = [];\n for (let start = 0; start < observations.length; start += step) {\n batches.push(observations.slice(start, start + size));\n if (start + size >= observations.length) break;\n }\n return batches;\n}\n\nfunction safeObservation(observation: TimelineObservation) {\n return {\n id: observation.id,\n machine: observation.machine,\n capturedAtUtc: observation.capturedAtUtc,\n app: observation.app,\n windowTitle: observation.windowTitle,\n ...(observation.browserUrl ? { browserUrl: observation.browserUrl } : {}),\n contentHash: observation.contentHash,\n };\n}\n\nfunction safeCard(card: TimelineCard) {\n return {\n id: card.id,\n kind: card.kind,\n title: card.title,\n summary: card.summary,\n categoryId: card.categoryId,\n confidence: card.confidence,\n startUtc: card.startUtc,\n endUtc: card.endUtc,\n machine: card.machine,\n evidenceIds: card.evidenceIds,\n evidenceRange: card.evidenceRange,\n ...(card.manualEdit ? { manualEdit: card.manualEdit } : {}),\n };\n}\n\nexport function buildTimelineAnalysisPrompt(input: {\n date?: string;\n timezone?: string;\n cards: readonly TimelineCard[];\n observations: readonly TimelineObservation[];\n categories: readonly TimelineCategory[];\n preferences?: readonly string[];\n priorEdits?: readonly TimelineCorrection[];\n}): string {\n const payload = {\n date: input.date ?? null,\n timezone: input.timezone ?? null,\n categories: input.categories.map((category) => ({ id: category.id, name: category.name })),\n preferences: input.preferences ?? [],\n priorEdits: input.priorEdits ?? [],\n cards: input.cards.map(safeCard),\n observations: input.observations.map(safeObservation),\n };\n return `${INSTRUCTIONS}\\n${JSON.stringify(payload)}`;\n}\n\nasync function callComplete(\n complete: TimelineAnalysisComplete,\n prompt: string,\n provider: string,\n model: string,\n timeoutMs: number,\n parent?: AbortSignal,\n): Promise<string> {\n const { promise: timeoutPromise, reject } = Promise.withResolvers<string>();\n const failOnce = (message: string, name: string) => {\n reject(Object.assign(new Error(message), { name }));\n };\n const timer = setTimeout(() => failOnce(\"timeline analysis timed out\", \"TimeoutError\"), timeoutMs);\n if (parent?.aborted) {\n clearTimeout(timer);\n throw Object.assign(new Error(\"timeline analysis aborted\"), { name: \"AbortError\" });\n }\n const onAbort = () => failOnce(\"timeline analysis aborted\", \"AbortError\");\n parent?.addEventListener(\"abort\", onAbort, { once: true });\n const signal = parent ? AbortSignal.any([parent, AbortSignal.timeout(timeoutMs)]) : AbortSignal.timeout(timeoutMs);\n try {\n return await Promise.race([complete({ prompt, provider, model, signal }), timeoutPromise]);\n } finally {\n clearTimeout(timer);\n parent?.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction asOp(value: unknown): AnalysisOp | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n if (!(\"cardId\" in value) || typeof value.cardId !== \"string\" || value.cardId.length === 0) return null;\n if (!(\"evidenceRange\" in value)) return null;\n const range = value.evidenceRange;\n if (!range || typeof range !== \"object\" || Array.isArray(range)) return null;\n if (!(\"firstKey\" in range) || typeof range.firstKey !== \"string\" || range.firstKey.length === 0) return null;\n if (!(\"lastKey\" in range) || typeof range.lastKey !== \"string\" || range.lastKey.length === 0) return null;\n if (\"title\" in value && value.title !== undefined && typeof value.title !== \"string\") return null;\n if (\"summary\" in value && value.summary !== undefined && typeof value.summary !== \"string\") return null;\n if (\"categoryId\" in value && value.categoryId !== undefined && typeof value.categoryId !== \"string\") return null;\n if (\"uncertainty\" in value && value.uncertainty !== undefined && typeof value.uncertainty !== \"string\") return null;\n if (\n \"confidence\" in value &&\n value.confidence !== undefined &&\n (typeof value.confidence !== \"number\" || value.confidence < 0 || value.confidence > 1)\n ) {\n return null;\n }\n return {\n cardId: value.cardId,\n title: \"title\" in value && typeof value.title === \"string\" ? value.title : undefined,\n summary: \"summary\" in value && typeof value.summary === \"string\" ? value.summary : undefined,\n categoryId: \"categoryId\" in value && typeof value.categoryId === \"string\" ? value.categoryId : undefined,\n confidence: \"confidence\" in value && typeof value.confidence === \"number\" ? value.confidence : undefined,\n uncertainty: \"uncertainty\" in value && typeof value.uncertainty === \"string\" ? value.uncertainty : undefined,\n evidenceRange: { firstKey: range.firstKey, lastKey: range.lastKey },\n };\n}\n\ntype ParseOpsResult = { ok: true; ops: AnalysisOp[] } | { ok: false; kind: AnalysisFailureKind };\n\n/**\n * Parse the provider response. An empty/whitespace body is `partial_output`\n * (nothing came back); a body whose JSON candidates never parse is\n * `malformed_json`; parseable JSON in the wrong shape — missing `ops`, or an\n * op that fails validation — is `invalid_schema`.\n */\nfunction parseOps(raw: string): ParseOpsResult {\n if (typeof raw !== \"string\" || raw.trim().length === 0) return { ok: false, kind: \"partial_output\" };\n let sawParsableShape = false;\n for (const candidate of extractJsonCandidates(raw)) {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) continue;\n if (!(\"ops\" in parsed) || !Array.isArray(parsed.ops)) {\n sawParsableShape = true;\n continue;\n }\n const out: AnalysisOp[] = [];\n let valid = true;\n for (const item of parsed.ops) {\n const op = asOp(item);\n if (!op) {\n valid = false;\n break;\n }\n out.push(op);\n }\n if (valid) return { ok: true, ops: out };\n sawParsableShape = true;\n } catch {\n continue;\n }\n }\n if (sawParsableShape) return { ok: false, kind: \"invalid_schema\" };\n return { ok: false, kind: \"malformed_json\" };\n}\n\nfunction knownEvidenceKeys(cards: readonly TimelineCard[], observations: readonly TimelineObservation[]): Set<string> {\n const keys = new Set<string>();\n for (const observation of observations) keys.add(evidenceKeyOf(observation));\n for (const card of cards) {\n if (card.evidenceRange) {\n keys.add(card.evidenceRange.firstKey);\n keys.add(card.evidenceRange.lastKey);\n }\n }\n return keys;\n}\n\nfunction applyOps(\n cards: readonly TimelineCard[],\n ops: readonly AnalysisOp[],\n categories: readonly TimelineCategory[],\n evidenceKeys: ReadonlySet<string>,\n): TimelineCard[] | null {\n if (ops.length === 0) return cards as TimelineCard[];\n const byId = new Map(cards.map((card) => [card.id, card]));\n const allowedCategories = new Set(categories.map((category) => category.id));\n const next = new Map<string, TimelineCard>();\n for (const op of ops) {\n const card = byId.get(op.cardId);\n if (!card) return null;\n if (!evidenceKeys.has(op.evidenceRange.firstKey) || !evidenceKeys.has(op.evidenceRange.lastKey)) return null;\n if (op.categoryId !== undefined && !allowedCategories.has(op.categoryId)) return null;\n if (card.manualEdit) continue;\n next.set(card.id, {\n ...card,\n ...(op.title !== undefined ? { title: op.title } : {}),\n ...(op.summary !== undefined ? { summary: op.summary } : {}),\n ...(op.categoryId !== undefined ? { categoryId: op.categoryId } : {}),\n ...(op.confidence !== undefined ? { confidence: op.confidence } : {}),\n });\n }\n if (next.size === 0) return cards as TimelineCard[];\n return cards.map((card) => next.get(card.id) ?? card);\n}\n\n/** Analyze one day of cards. Failures return the input cards unchanged. */\nexport async function analyzeTimelineCards(input: TimelineAnalysisInput): Promise<TimelineAnalysisResult> {\n const cards = input.cards as TimelineCard[];\n if (!input.enabled) {\n return { status: \"disabled\", cards };\n }\n\n const provider = requiredToken(input.provider, \"provider\");\n const model = requiredToken(input.model, \"model\");\n const complete = input.complete;\n if (typeof complete !== \"function\") {\n throw new TimelineAnalysisConfigError(\"complete is required\");\n }\n const timeoutMs = input.timeoutMs ?? TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {\n throw new TimelineAnalysisConfigError(\"timeoutMs must be a positive integer\");\n }\n if (input.cards.length === 0 && input.observations.length === 0) {\n // Caller-side guard, not a provider failure: nothing to analyze and zero\n // calls must be made, so no typed response failure is attached.\n return {\n status: \"invalid_output\",\n cards,\n provider,\n model,\n promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,\n };\n }\n\n const categories = input.categories ?? DEFAULT_TIMELINE_CATEGORIES;\n const ordered = sortObservations(input.observations);\n const batches = batchObservations(ordered);\n const merged = new Map<string, AnalysisOp>();\n\n try {\n for (const batch of batches) {\n const prompt = buildTimelineAnalysisPrompt({\n date: input.date,\n timezone: input.timezone,\n cards: input.cards,\n observations: batch,\n categories,\n preferences: input.preferences,\n priorEdits: input.priorEdits,\n });\n const raw = await callComplete(complete, prompt, provider, model, timeoutMs, input.signal);\n const parsed = parseOps(raw);\n if (!parsed.ok) return fail(\"invalid_output\", cards, provider, model, parsed.kind);\n for (const op of parsed.ops) merged.set(op.cardId, op);\n }\n } catch (error) {\n return fail(\"provider_failed\", cards, provider, model, classifyAnalysisProviderError(error));\n }\n\n const applied = applyOps(cards, [...merged.values()], categories, knownEvidenceKeys(cards, ordered));\n if (!applied) return fail(\"invalid_output\", cards, provider, model, \"invalid_schema\");\n\n log.info(`timeline analysis status=ok provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);\n return {\n status: \"ok\",\n cards: applied,\n provider,\n model,\n promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,\n };\n}\n","/**\n * Analysis run metadata (issue #2050).\n *\n * Pure builder for the provider/model/prompt-version record attached to\n * stored analysis results and telemetry.\n *\n * The no-content guarantee is enforced by SHAPE, not by length: each field\n * must match an identifier/version syntax, so prose cannot be stored as a\n * \"model name\". A 200-character single-line string is happily prose\n * (\"Summarize this user\\u0027s activity\"), which is why a length cap alone was\n * not the boundary this record needs. Errors never echo a rejected value,\n * so a mis-passed prompt cannot reach logs through the failure path either.\n */\nexport interface AnalysisRunMetadata {\n provider: string;\n model: string;\n promptVersion: string;\n /** Observation ids the run consumed, for evidence tracing. */\n observationCount: number;\n}\n\nexport const ANALYSIS_METADATA_MAX_FIELD_LENGTH = 120;\n/** True when value is an identifier-safe provider/model/promptVersion string. */\nexport const isAnalysisIdentifier = (value: string): boolean => IDENTIFIER.test(value);\n\n/**\n * Identifier syntax for provider and model: letters, digits, and the\n * separators real provider/model slugs use (`openai`, `gpt-5.2`,\n * `anthropic/claude-4_1`, `llama3:8b`). No spaces, so a sentence cannot pass.\n */\nconst IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:\\-\\/]*$/;\n\n/**\n * Prompt versions are identifiers or dates (`v3`, `2026-08-01`,\n * `timeline-analysis.v2`), so the same syntax applies.\n */\nconst FIELD_PATTERNS: Readonly<Record<string, RegExp>> = {\n provider: IDENTIFIER,\n model: IDENTIFIER,\n promptVersion: IDENTIFIER,\n};\n\nfunction validateMetadataField(field: string, value: unknown): string {\n // Never interpolate the value itself: an error string is a log line, and a\n // caller that mis-passes prompt text must not have it echoed there.\n if (typeof value !== \"string\") {\n throw new RangeError(\n `analysis run metadata ${field} must be a string; received ${typeof value}`,\n );\n }\n if (value.length === 0) {\n throw new RangeError(`analysis run metadata ${field} must not be empty`);\n }\n if (value.length > ANALYSIS_METADATA_MAX_FIELD_LENGTH) {\n throw new RangeError(\n `analysis run metadata ${field} is too long (max ${ANALYSIS_METADATA_MAX_FIELD_LENGTH} characters)`,\n );\n }\n // Report a line break as a line break even though the pattern would also\n // reject it. U+2028 and U+2029 are line separators too: they break\n // line-oriented log consumers exactly like CR and LF.\n if (/[\\n\\r\\u2028\\u2029]/.test(value)) {\n throw new RangeError(`analysis run metadata ${field} must not contain a line break`);\n }\n const pattern = FIELD_PATTERNS[field];\n if (pattern === undefined) {\n throw new RangeError(`analysis run metadata has no pattern for field ${field}`);\n }\n if (!pattern.test(value)) {\n throw new RangeError(\n `analysis run metadata ${field} must be an identifier (letters, digits, and ._:-/ only)`,\n );\n }\n return value;\n}\n\nexport function buildAnalysisRunMetadata(input: {\n provider: string;\n model: string;\n promptVersion: string;\n observationCount: number;\n}): AnalysisRunMetadata {\n const provider = validateMetadataField(\"provider\", input.provider);\n const model = validateMetadataField(\"model\", input.model);\n const promptVersion = validateMetadataField(\"promptVersion\", input.promptVersion);\n const observationCount = input.observationCount;\n if (\n typeof observationCount !== \"number\" ||\n !Number.isInteger(observationCount) ||\n observationCount < 0\n ) {\n // Report the type only. JSON.stringify would echo mis-passed content into\n // the log, and it throws outright on a bigint or a circular object.\n throw new RangeError(\n `analysis run metadata observationCount must be a non-negative integer; received ${typeof observationCount}`,\n );\n }\n return { provider, model, promptVersion, observationCount };\n}\n","import path from \"node:path\";\n\nimport { coerceBooleanLike, coerceNumber } from \"../connectors/coerce.js\";\nimport { assertValidTimezone } from \"./digest.js\";\nimport { applyLegacyJournalHeading, normalizeJournalHeading } from \"./journal-heading.js\";\nimport { checkVaultJournalPrerequisites } from \"./journal-vault-prereq.js\";\nimport { resolveJournalSource } from \"./journal-source.js\";\nimport { validateVaultNoteTemplate } from \"./vault-path.js\";\nimport { headingSurvivesRoundTrip } from \"./vault-publish.js\";\nimport { validateRegionName } from \"./vault-region.js\";\nimport { TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS } from \"./timeline/analysis.js\";\nimport { ANALYSIS_METADATA_MAX_FIELD_LENGTH, isAnalysisIdentifier } from \"./timeline/analysis-metadata.js\";\nimport type {\n ActivityConfig,\n ActivityExtractionMode,\n ActivitySourceConfig,\n ActivityTimelineAnalysisConfig,\n ActivityTimelineConfig,\n ActivityTimelineJournalConfig,\n ActivityTimelineQaConfig,\n ActivityTimelineVaultConfig,\n ActivityTimelineVaultTargetConfig,\n} from \"./types.js\";\nimport type { ImportanceLevel } from \"../types.js\";\n\nconst EXTRACTION_MODES: readonly ActivityExtractionMode[] = [\"off\", \"smart\"];\nconst IMPORTANCE_LEVELS: readonly ImportanceLevel[] = [\"critical\", \"high\", \"normal\", \"low\", \"trivial\"];\nconst LOOPBACK_HOSTS: Record<string, true> = { localhost: true, \"127.0.0.1\": true, \"::1\": true };\n\n/** The inert default: disabled, search-only, no sources, no extraction. */\nexport function defaultActivityConfig(): ActivityConfig {\n return {\n enabled: false,\n timezone: \"UTC\",\n syncDays: 1,\n autoSyncIntervalMinutes: 15,\n sources: [],\n extractionMode: \"off\",\n sourceTrust: 0.6,\n autoApproveTrust: 0.8,\n reviewTrust: 0.5,\n minConfidence: 0.7,\n minImportance: \"normal\",\n maxMemoriesPerDay: 0,\n timeline: {\n enabled: false,\n analysis: parseTimelineAnalysisConfig(undefined),\n journal: { enabled: false, source: \"memoryDir\", extractionMode: \"off\" },\n qa: { enabled: false, maxRangeDays: 31 },\n vault: parseTimelineVaultConfig(undefined),\n },\n };\n}\n\nfunction asRecord(value: unknown, name: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${name} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction optionalString(value: unknown, name: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length === 0) throw new TypeError(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction parseUnitInterval(value: unknown, key: string, fallback: number): number {\n if (value === undefined) return fallback;\n const parsed = coerceNumber(value);\n if (parsed === undefined || !Number.isFinite(parsed) || parsed < 0 || parsed > 1) {\n throw new RangeError(`activity.${key} must be a number in [0, 1]`);\n }\n return parsed;\n}\n\n/**\n * Parse, protocol-check, and confine an activity source base URL to a local\n * loopback host. Shared with ActivityHttpSourceClient so config-load and client\n * construction reject the exact same shapes with the same prefixed message. The\n * bearer token travels in an Authorization header, so a non-loopback baseUrl\n * would exfiltrate it; the subsystem contract is local capture daemons only.\n */\nexport function validateActivityBaseUrl(baseUrl: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(baseUrl);\n } catch {\n throw new RangeError(`activity source baseUrl must be a valid URL: ${baseUrl}`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new RangeError(\"activity source baseUrl must use HTTP or HTTPS\");\n }\n // URL keeps IPv6 hosts bracketed (e.g. \"[::1]\"); normalize before the lookup.\n const host = parsed.hostname.replace(/^\\[|\\]$/g, \"\");\n if (LOOPBACK_HOSTS[host] !== true && !/^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host)) {\n throw new RangeError(`activity source baseUrl must target a loopback host (got ${parsed.hostname})`);\n }\n return parsed;\n}\n\nfunction parseSource(value: unknown): ActivitySourceConfig {\n const raw = asRecord(value, \"activity source\");\n const machineLabel = optionalString(raw.machineLabel, \"activity source machineLabel\");\n const baseUrl = optionalString(raw.baseUrl, \"activity source baseUrl\");\n if (machineLabel === undefined || baseUrl === undefined) {\n throw new TypeError(\"activity source requires machineLabel and baseUrl\");\n }\n // Reject whitespace-only labels here so config-load fails loudly rather than\n // parsing clean and then failing on the first sync (the client and pipeline\n // both reject a blank label via trim()).\n if (machineLabel.trim().length === 0) {\n throw new RangeError(\"activity source machineLabel must not be blank\");\n }\n validateActivityBaseUrl(baseUrl);\n const token = optionalString(raw.token, \"activity source token\");\n return { machineLabel, baseUrl, ...(token === undefined ? {} : { token }) };\n}\n\n/**\n * Parse the unified `activity.*` block. `enabled` gates source ingestion (and\n * requires at least one source); `extractionMode` independently gates durable\n * trust-gated memory extraction (default `off`, i.e. search-only).\n */\nexport function parseActivityConfig(raw: unknown): ActivityConfig {\n const defaults = defaultActivityConfig();\n if (raw === undefined || raw === null) {\n return { ...defaults };\n }\n const config = asRecord(raw, \"activity\");\n const enabledValue = coerceBooleanLike(config.enabled, \"activity.enabled\");\n if (config.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.enabled must be a boolean\");\n }\n const timezone = optionalString(config.timezone, \"activity.timezone\") ?? \"UTC\";\n // Validate the IANA zone at parse so a typo fails before any daemon is\n // contacted; otherwise activityDayWindow() throws mid-sync after snapshot\n // pages may already be persisted, and every retry replays the same window.\n assertValidTimezone(timezone);\n const syncDaysValue = coerceNumber(config.syncDays, \"activity.syncDays\");\n if (config.syncDays !== undefined && syncDaysValue === undefined) {\n throw new TypeError(\"activity.syncDays must be a finite number\");\n }\n const syncDays = syncDaysValue ?? 1;\n if (!Number.isInteger(syncDays) || syncDays < 1 || syncDays > 90) {\n throw new RangeError(\"activity.syncDays must be an integer from 1 to 90\");\n }\n const intervalValue = coerceNumber(config.autoSyncIntervalMinutes, \"activity.autoSyncIntervalMinutes\");\n if (config.autoSyncIntervalMinutes !== undefined && intervalValue === undefined) {\n throw new TypeError(\"activity.autoSyncIntervalMinutes must be a finite number\");\n }\n const autoSyncIntervalMinutes = intervalValue ?? 15;\n if (!Number.isInteger(autoSyncIntervalMinutes) || autoSyncIntervalMinutes < 1 || autoSyncIntervalMinutes > 1440) {\n throw new RangeError(\"activity.autoSyncIntervalMinutes must be an integer from 1 to 1440\");\n }\n if (config.sources !== undefined && !Array.isArray(config.sources)) {\n throw new TypeError(\"activity.sources must be an array\");\n }\n const sources = (config.sources ?? []).map(parseSource);\n // Cursors and row dedup are keyed on machineLabel alone; two sources sharing\n // a label would share a cursor and dedup namespace, silently skipping or\n // conflating snapshots. Reject the collision at parse.\n const labels = new Set<string>();\n for (const source of sources) {\n if (labels.has(source.machineLabel)) {\n throw new RangeError(`activity source machineLabel must be unique: ${source.machineLabel}`);\n }\n labels.add(source.machineLabel);\n }\n const enabled = enabledValue ?? false;\n if (enabled && sources.length === 0) throw new RangeError(\"activity.enabled requires at least one source\");\n\n // Extraction gate (independent of `enabled` ingestion). Default `off`.\n // Default only for a missing key; an explicit null/non-string is a malformed\n // enum and must fail rather than silently disabling extraction.\n const extractionMode = config.extractionMode === undefined ? defaults.extractionMode : config.extractionMode;\n if (typeof extractionMode !== \"string\" || !EXTRACTION_MODES.includes(extractionMode as ActivityExtractionMode)) {\n throw new RangeError(`activity.extractionMode must be one of: ${EXTRACTION_MODES.join(\", \")}`);\n }\n const minImportance = config.minImportance === undefined ? defaults.minImportance : config.minImportance;\n if (typeof minImportance !== \"string\" || !IMPORTANCE_LEVELS.includes(minImportance as ImportanceLevel)) {\n throw new RangeError(`activity.minImportance must be one of: ${IMPORTANCE_LEVELS.join(\", \")}`);\n }\n // Default only for a missing key; an explicit null/unparseable value must fail\n // rather than silently uncapping (parity with the enum/unit-interval fields).\n const rawMaxMemoriesPerDay =\n config.maxMemoriesPerDay === undefined ? defaults.maxMemoriesPerDay : config.maxMemoriesPerDay;\n const maxMemoriesPerDay = coerceNumber(rawMaxMemoriesPerDay);\n if (maxMemoriesPerDay === undefined || !Number.isInteger(maxMemoriesPerDay) || maxMemoriesPerDay < 0) {\n throw new RangeError(\"activity.maxMemoriesPerDay must be a non-negative integer\");\n }\n const autoApproveTrust = parseUnitInterval(config.autoApproveTrust, \"autoApproveTrust\", defaults.autoApproveTrust);\n const reviewTrust = parseUnitInterval(config.reviewTrust, \"reviewTrust\", defaults.reviewTrust);\n if (reviewTrust >= autoApproveTrust) {\n throw new RangeError(\n `activity.reviewTrust (${reviewTrust}) must be below autoApproveTrust (${autoApproveTrust})`,\n );\n }\n return {\n enabled,\n timezone,\n syncDays,\n autoSyncIntervalMinutes,\n sources,\n extractionMode: extractionMode as ActivityExtractionMode,\n sourceTrust: parseUnitInterval(config.sourceTrust, \"sourceTrust\", defaults.sourceTrust),\n autoApproveTrust,\n reviewTrust,\n minConfidence: parseUnitInterval(config.minConfidence, \"minConfidence\", defaults.minConfidence),\n minImportance: minImportance as ImportanceLevel,\n maxMemoriesPerDay,\n timeline: parseTimelineConfig(config.timeline),\n };\n}\n\n/**\n * Parse the `activity.timeline.*` block. `enabled` is the master gate for\n * timeline-card derivation (issue #2049); default false. A non-object block\n * is malformed and must fail rather than silently disabling the layer.\n */\nfunction parseTimelineConfig(raw: unknown): ActivityTimelineConfig {\n if (raw === undefined) {\n return {\n enabled: false,\n analysis: parseTimelineAnalysisConfig(undefined),\n journal: { enabled: false, source: \"memoryDir\", extractionMode: \"off\" },\n qa: parseTimelineQaConfig(undefined),\n vault: parseTimelineVaultConfig(undefined),\n };\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline must be an object\");\n }\n const timeline = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(timeline.enabled, \"activity.timeline.enabled\");\n if (timeline.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.enabled must be a boolean\");\n }\n const journal = parseTimelineJournalConfig(timeline.journal);\n let vault = parseTimelineVaultConfig(timeline.vault);\n const journalRaw = timeline.journal;\n const headingRaw =\n typeof journalRaw === \"object\" && journalRaw !== null && !Array.isArray(journalRaw)\n ? (journalRaw as Record<string, unknown>).heading\n : undefined;\n if (headingRaw !== undefined) {\n const aliased = applyLegacyJournalHeading({\n journalSection: vault.readback.journalSection,\n heading: headingRaw,\n });\n process.emitWarning(\n aliased.ignoredLegacyHeading\n ? 'activity.timeline.journal.heading is deprecated and ignored because activity.timeline.vault.readback.journalSection is set; use vault.readback.journalSection.'\n : 'activity.timeline.journal.heading is deprecated; use activity.timeline.vault.readback.journalSection.',\n { type: \"DeprecationWarning\", code: \"REMNIC_DEP_JOURNAL_HEADING\" },\n );\n if (aliased.usedLegacyHeading) {\n vault = { ...vault, readback: { ...vault.readback, journalSection: aliased.journalSection } };\n }\n }\n if (journal.source === \"vault\") {\n // Parse-time prerequisite gate (issue #1987): the error names EVERY\n // missing prerequisite, never just the first (§1/§39).\n const prereq = checkVaultJournalPrerequisites({\n vaultEnabled: vault.enabled,\n dailyNotePath: vault.dailyNotePath,\n journalSection: vault.readback.journalSection,\n });\n if (!prereq.ok) {\n throw new RangeError(\n `activity.timeline.journal.source \"vault\" requires ${prereq.message}`,\n );\n }\n }\n return {\n enabled: enabledValue ?? false,\n analysis: parseTimelineAnalysisConfig(timeline.analysis),\n journal,\n qa: parseTimelineQaConfig(timeline.qa),\n vault,\n };\n}\n\n/**\n * Parse the `activity.timeline.analysis.*` block (issue #2050). Independent\n * gate, default off: disabled means zero provider calls and zero analysis\n * artifacts. Enabling requires an explicit provider and model; every invalid\n * value is rejected at parse time — never silently defaulted or fallen back.\n */\nfunction parseTimelineAnalysisConfig(raw: unknown): ActivityTimelineAnalysisConfig {\n if (raw === undefined) return { enabled: false };\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.analysis must be an object\");\n }\n const analysis = raw as Record<string, unknown>;\n const enabled = requireBool(analysis.enabled, \"activity.timeline.analysis.enabled\", false);\n const provider = optionalNonEmptyString(analysis.provider, \"activity.timeline.analysis.provider\")?.trim();\n const model = optionalNonEmptyString(analysis.model, \"activity.timeline.analysis.model\")?.trim();\n for (const [key, value] of [\n [\"provider\", provider],\n [\"model\", model],\n ] as const) {\n if (value === undefined) continue;\n if (key === \"provider\" && value.includes(\"/\")) {\n throw new RangeError(\n \"activity.timeline.analysis.provider must be a single provider segment (no '/')\",\n );\n }\n if (!isAnalysisIdentifier(value)) {\n throw new RangeError(\n `activity.timeline.analysis.${key} must be an identifier (letters, digits, and ._:-/ only)`,\n );\n }\n if (value.length > ANALYSIS_METADATA_MAX_FIELD_LENGTH) {\n throw new RangeError(\n `activity.timeline.analysis.${key} must be at most ${ANALYSIS_METADATA_MAX_FIELD_LENGTH} characters`,\n );\n }\n }\n if (enabled && (provider === undefined || model === undefined)) {\n throw new RangeError(\n \"activity.timeline.analysis.provider and model are required when analysis is enabled\",\n );\n }\n const timeoutMsValue = coerceNumber(analysis.timeoutMs, \"activity.timeline.analysis.timeoutMs\");\n if (analysis.timeoutMs !== undefined && timeoutMsValue === undefined) {\n throw new TypeError(\"activity.timeline.analysis.timeoutMs must be a finite number\");\n }\n const timeoutMs = timeoutMsValue ?? TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs > 120_000) {\n throw new RangeError(\"activity.timeline.analysis.timeoutMs must be an integer from 1000 to 120000\");\n }\n if (analysis.preferences !== undefined) {\n if (!Array.isArray(analysis.preferences)) {\n throw new TypeError(\"activity.timeline.analysis.preferences must be an array of strings\");\n }\n if (analysis.preferences.length > 16) {\n throw new RangeError(\"activity.timeline.analysis.preferences supports at most 16 entries\");\n }\n for (const entry of analysis.preferences) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new TypeError(\"activity.timeline.analysis.preferences entries must be non-empty strings\");\n }\n if (entry.length > 200) {\n throw new RangeError(\"activity.timeline.analysis.preferences entries must be at most 200 characters\");\n }\n }\n }\n const preferences = analysis.preferences as string[] | undefined;\n return {\n enabled,\n ...(provider === undefined ? {} : { provider }),\n ...(model === undefined ? {} : { model }),\n ...(analysis.timeoutMs !== undefined || timeoutMsValue !== undefined ? { timeoutMs } : {}),\n ...(preferences === undefined ? {} : { preferences }),\n };\n}\n\n/**\n * Parse the `activity.timeline.vault.*` block (issue #1985). Default off.\n * Invalid values are rejected at parse time naming the missing or invalid\n * prerequisite — never silently defaulted.\n */\nexport function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultConfig {\n if (raw === undefined) return defaultVaultConfig();\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault must be an object\");\n }\n const vault = raw as Record<string, unknown>;\n const enabled = requireBool(vault.enabled, \"activity.timeline.vault.enabled\", false);\n const createMissingNotes = requireBool(vault.createMissingNotes, \"activity.timeline.vault.createMissingNotes\", false);\n const autoPublish = requireBool(vault.autoPublish, \"activity.timeline.vault.autoPublish\", true);\n const vaultPath = optionalNonEmptyString(vault.vaultPath, \"activity.timeline.vault.vaultPath\") ?? \"\";\n const dailyNotePath =\n optionalNonEmptyString(vault.dailyNotePath, \"activity.timeline.vault.dailyNotePath\") ?? \"{yyyy}-{MM}-{dd}.md\";\n const weeklyNotePath = optionalNonEmptyString(vault.weeklyNotePath, \"activity.timeline.vault.weeklyNotePath\") ?? \"\";\n const noteTemplate = optionalNonEmptyString(vault.noteTemplate, \"activity.timeline.vault.noteTemplate\") ?? \"\";\n const insertUnderHeading =\n optionalNonEmptyString(vault.insertUnderHeading, \"activity.timeline.vault.insertUnderHeading\") ?? \"\";\n // The configured insertion heading is matched against parsed note\n // headings, so a blank, padded, or multi-line value can never match\n // (issue #2917). Reuse the journal work's canonical heading validator —\n // no second parser — and require the trimmed form like publish sections.\n if (insertUnderHeading.length > 0) {\n const heading = normalizeJournalHeading(insertUnderHeading);\n if (!heading.ok || heading.heading !== insertUnderHeading) {\n throw new RangeError(\n \"activity.timeline.vault.insertUnderHeading must be a non-empty trimmed single-line heading\",\n );\n }\n if (!headingSurvivesRoundTrip(insertUnderHeading)) {\n throw new RangeError(\n \"activity.timeline.vault.insertUnderHeading must survive a heading render-and-parse round trip\",\n );\n }\n }\n\n if (typeof vault.sectionStrategy !== \"undefined\" && typeof vault.sectionStrategy !== \"string\") {\n throw new TypeError(\"activity.timeline.vault.sectionStrategy must be a string\");\n }\n const sectionStrategy = (vault.sectionStrategy as string | undefined) ?? \"markers\";\n if (sectionStrategy !== \"markers\" && sectionStrategy !== \"heading\") {\n throw new RangeError('activity.timeline.vault.sectionStrategy must be one of \"markers\", \"heading\"');\n }\n\n // The documented `vaultPath` contract: absolute on the host platform, or\n // `~` / `~`-rooted for `expandTildePath`. Everything else — `.`, `vault`,\n // `../notes`, whitespace — is relative and would resolve against whatever\n // directory the daemon or CLI happened to launch from, so an enabled vault\n // rejects it at parse time.\n const tildeRooted = vaultPath === \"~\" || vaultPath.startsWith(\"~/\") || vaultPath.startsWith(\"~\\\\\");\n if (enabled && (vaultPath.trim().length === 0 || (!tildeRooted && !path.isAbsolute(vaultPath)))) {\n throw new RangeError(\n \"activity.timeline.vault.vaultPath must be an absolute or `~`-rooted path when activity.timeline.vault.enabled is true; \" +\n `a relative path resolves against the process working directory (got ${JSON.stringify(vaultPath)})`,\n );\n }\n try {\n validateVaultNoteTemplate(dailyNotePath);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.dailyNotePath: ${(err as Error).message}`);\n }\n if (weeklyNotePath.length > 0) {\n try {\n validateVaultNoteTemplate(weeklyNotePath);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.weeklyNotePath: ${(err as Error).message}`);\n }\n }\n if (createMissingNotes) {\n if (noteTemplate.length === 0) {\n throw new RangeError(\n \"activity.timeline.vault.noteTemplate must name a vault-relative template file when activity.timeline.vault.createMissingNotes is true\",\n );\n }\n try {\n validateVaultNoteTemplate(noteTemplate);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.noteTemplate: ${(err as Error).message}`);\n }\n }\n\n const publish = parseVaultPublishBlock(vault.publish, weeklyNotePath);\n if (sectionStrategy === \"heading\") {\n for (const kind of [\"timeline\", \"standup\", \"weekly\", \"locations\"] as const) {\n if (!headingSurvivesRoundTrip(publish[kind].section)) {\n throw new RangeError(\n `activity.timeline.vault.publish.${kind}.section must survive a heading render-and-parse round trip`,\n );\n }\n }\n }\n const wikilinksRaw = vault.wikilinks;\n const wikilinks =\n wikilinksRaw === undefined\n ? { places: false, placesFolder: \"Places\" }\n : parseVaultWikilinks(wikilinksRaw);\n const propertiesRaw = vault.properties;\n const properties: ActivityTimelineVaultConfig[\"properties\"] =\n propertiesRaw === undefined ? { mode: \"off\", prefix: \"remnic_\" } : parseVaultProperties(propertiesRaw);\n const readbackRaw = vault.readback;\n if (readbackRaw !== undefined && (typeof readbackRaw !== \"object\" || readbackRaw === null || Array.isArray(readbackRaw))) {\n throw new TypeError(\"activity.timeline.vault.readback must be an object\");\n }\n const readbackJournalSection = optionalNonEmptyString(\n (readbackRaw as Record<string, unknown> | undefined)?.journalSection,\n \"activity.timeline.vault.readback.journalSection\",\n );\n // Readback matches the section by parsed heading text, so a padded or\n // multi-line journalSection can never match and would silently read back\n // an empty journal (issue #2917). Same canonical validator as the legacy\n // journal.heading alias.\n if (readbackJournalSection !== undefined && readbackJournalSection.length > 0) {\n const heading = normalizeJournalHeading(readbackJournalSection);\n if (!heading.ok || heading.heading !== readbackJournalSection) {\n throw new RangeError(\n \"activity.timeline.vault.readback.journalSection must be a non-empty trimmed single-line heading\",\n );\n }\n }\n const readback = {\n journalSection: readbackJournalSection ?? \"\",\n };\n\n return {\n enabled,\n vaultPath,\n dailyNotePath,\n weeklyNotePath,\n createMissingNotes,\n noteTemplate,\n sectionStrategy,\n publish,\n insertUnderHeading,\n readback,\n wikilinks,\n properties,\n autoPublish,\n };\n}\n\nfunction defaultVaultConfig(): ActivityTimelineVaultConfig {\n return {\n enabled: false,\n vaultPath: \"\",\n dailyNotePath: \"{yyyy}-{MM}-{dd}.md\",\n weeklyNotePath: \"\",\n createMissingNotes: false,\n noteTemplate: \"\",\n sectionStrategy: \"markers\",\n publish: {\n timeline: { enabled: true, target: \"daily\", section: \"Timeline\" },\n standup: { enabled: false, target: \"daily\", section: \"Standup\" },\n weekly: { enabled: false, target: \"weekly\", section: \"Weekly Review\" },\n locations: { enabled: false, target: \"daily\", section: \"Locations\" },\n },\n insertUnderHeading: \"\",\n wikilinks: { places: false, placesFolder: \"Places\" },\n properties: { mode: \"off\", prefix: \"remnic_\" },\n autoPublish: true,\n readback: { journalSection: \"\" },\n };\n}\n\nfunction requireBool(value: unknown, key: string, fallback: boolean): boolean {\n const coerced = coerceBooleanLike(value, key);\n if (value === undefined) return fallback;\n if (coerced === undefined) {\n throw new TypeError(`${key} must be a boolean`);\n }\n return coerced;\n}\n\nfunction optionalNonEmptyString(value: unknown, key: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n throw new TypeError(`${key} must be a string`);\n }\n return value;\n}\n\nfunction parseVaultPublishBlock(\n raw: unknown,\n weeklyNotePath: string,\n): ActivityTimelineVaultConfig[\"publish\"] {\n const defaults = defaultVaultConfig().publish;\n if (raw === undefined) return defaults;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.publish must be an object\");\n }\n const block = raw as Record<string, unknown>;\n // Each kind is read at its literal path so the config-contract extractor\n // can attribute publish.<kind>.<leaf> to real parse sites (§40).\n const publish = {\n timeline: parseVaultTarget(block.timeline, \"timeline\", defaults.timeline, weeklyNotePath),\n standup: parseVaultTarget(block.standup, \"standup\", defaults.standup, weeklyNotePath),\n weekly: parseVaultTarget(block.weekly, \"weekly\", defaults.weekly, weeklyNotePath),\n locations: parseVaultTarget(block.locations, \"locations\", defaults.locations, weeklyNotePath),\n };\n for (const targetFile of [\"daily\", \"weekly\"] as const) {\n const sections = ([\"timeline\", \"standup\", \"weekly\", \"locations\"] as const)\n .filter((kind) => publish[kind].target === targetFile && publish[kind].enabled)\n .map((kind) => publish[kind].section);\n const duplicates = sections.filter((section, index) => sections.indexOf(section) !== index);\n if (duplicates.length > 0) {\n throw new RangeError(\n `activity.timeline.vault.publish section names must be unique per target file; duplicate ${targetFile} section(s): ${[...new Set(duplicates)].join(\", \")}`,\n );\n }\n }\n return publish;\n}\n\nfunction parseVaultTarget(\n raw: unknown,\n kind: string,\n fallback: ActivityTimelineVaultTargetConfig,\n weeklyNotePath: string,\n): ActivityTimelineVaultTargetConfig {\n if (raw === undefined) return fallback;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(`activity.timeline.vault.publish.${kind} must be an object`);\n }\n const entry = raw as Record<string, unknown>;\n const enabled = requireBool(entry.enabled, `activity.timeline.vault.publish.${kind}.enabled`, fallback.enabled);\n const target = entry.target === undefined ? fallback.target : entry.target;\n if (target !== \"daily\" && target !== \"weekly\") {\n throw new RangeError(`activity.timeline.vault.publish.${kind}.target must be one of \"daily\", \"weekly\"`);\n }\n const section = entry.section === undefined ? fallback.section : entry.section;\n if (typeof section !== \"string\" || section.trim().length === 0 || section !== section.trim()) {\n throw new RangeError(`activity.timeline.vault.publish.${kind}.section must be a non-empty trimmed string`);\n }\n // The accepted config domain must equal what the publisher accepts: a name\n // containing `-->` or a line break passes the trimmed-string check above\n // but is rejected downstream by `publishVaultNote`, which would turn an\n // apparently valid config into a runtime failure.\n if (!validateRegionName(section).ok) {\n throw new RangeError(\n `activity.timeline.vault.publish.${kind}.section must not contain a line break or \"-->\"`,\n );\n }\n // The path is required only by an entry that will actually publish to the\n // weekly file; a disabled entry must load the same whether its object is\n // explicit (serialized schema default) or omitted entirely.\n if (enabled && target === \"weekly\" && weeklyNotePath.length === 0) {\n throw new RangeError(\n `activity.timeline.vault.publish.${kind}.target is \"weekly\" but activity.timeline.vault.weeklyNotePath is empty; configure weeklyNotePath first`,\n );\n }\n return { enabled, target, section };\n}\n\nfunction parseVaultWikilinks(raw: unknown): ActivityTimelineVaultConfig[\"wikilinks\"] {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.wikilinks must be an object\");\n }\n const block = raw as Record<string, unknown>;\n const places = requireBool(block.places, \"activity.timeline.vault.wikilinks.places\", false);\n const placesFolder =\n optionalNonEmptyString(block.placesFolder, \"activity.timeline.vault.wikilinks.placesFolder\") ?? \"Places\";\n return { places, placesFolder };\n}\n\nfunction parseVaultProperties(raw: unknown): ActivityTimelineVaultConfig[\"properties\"] {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.properties must be an object\");\n }\n const block = raw as Record<string, unknown>;\n const mode = block.mode === undefined ? \"off\" : block.mode;\n if (mode !== \"off\" && mode !== \"frontmatter\" && mode !== \"dataview-inline\") {\n throw new RangeError(\n 'activity.timeline.vault.properties.mode must be one of \"off\", \"frontmatter\", \"dataview-inline\"',\n );\n }\n const prefix = optionalNonEmptyString(block.prefix, \"activity.timeline.vault.properties.prefix\") ?? \"remnic_\";\n if (prefix.trim().length === 0 || prefix !== prefix.trim()) {\n throw new RangeError(\"activity.timeline.vault.properties.prefix must be non-empty and trimmed\");\n }\n return { mode, prefix };\n}\n\nfunction parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig {\n if (raw === undefined) return { enabled: false, source: \"memoryDir\", extractionMode: \"off\" };\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.journal must be an object\");\n }\n const journal = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(journal.enabled, \"activity.timeline.journal.enabled\");\n if (journal.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.journal.enabled must be a boolean\");\n }\n const source = journal.source === undefined ? \"memoryDir\" : typeof journal.source === \"string\" ? journal.source : \"\";\n const resolved = resolveJournalSource({ source });\n if (!resolved.ok) {\n throw new RangeError('activity.timeline.journal.source must be one of \"memoryDir\", \"vault\"');\n }\n if (resolved.deprecatedAlias === \"file\") {\n process.emitWarning(\n 'activity.timeline.journal.source \"file\" is deprecated; use \"memoryDir\".',\n { type: \"DeprecationWarning\", code: \"REMNIC_DEP_JOURNAL_SOURCE_FILE\" },\n );\n }\n const extractionMode = journal.extractionMode === undefined ? \"off\" : journal.extractionMode;\n if (extractionMode !== \"off\" && extractionMode !== \"review\") {\n throw new RangeError('activity.timeline.journal.extractionMode must be one of \"off\", \"review\"');\n }\n return { enabled: enabledValue ?? false, source: resolved.mode, extractionMode };\n}\n\nfunction parseTimelineQaConfig(raw: unknown): ActivityTimelineQaConfig {\n if (raw === undefined) return { enabled: false, maxRangeDays: 31 };\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.qa must be an object\");\n }\n const qa = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(qa.enabled, \"activity.timeline.qa.enabled\");\n if (qa.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.qa.enabled must be a boolean\");\n }\n const maxRangeDaysValue = coerceNumber(qa.maxRangeDays, \"activity.timeline.qa.maxRangeDays\");\n if (qa.maxRangeDays !== undefined && maxRangeDaysValue === undefined) {\n throw new TypeError(\"activity.timeline.qa.maxRangeDays must be an integer from 1 to 366\");\n }\n const maxRangeDays = maxRangeDaysValue ?? 31;\n if (!Number.isInteger(maxRangeDays) || maxRangeDays < 1 || maxRangeDays > 366) {\n throw new RangeError(\"activity.timeline.qa.maxRangeDays must be an integer from 1 to 366\");\n }\n return { enabled: enabledValue ?? false, maxRangeDays };\n}\n\n","/**\n * Normalize a journal section heading (issue #1987 leftover).\n *\n * Trim. Empty is empty_heading. Newline is invalid_heading.\n */\n\nexport type NormalizeJournalHeadingResult =\n | { ok: true; heading: string }\n | { ok: false; error: \"empty_heading\" | \"invalid_heading\" };\n\nexport function normalizeJournalHeading(value: string): NormalizeJournalHeadingResult {\n const heading = value.trim();\n if (heading.length === 0) return { ok: false, error: \"empty_heading\" };\n if (heading.includes(\"\\n\") || heading.includes(\"\\r\")) {\n return { ok: false, error: \"invalid_heading\" };\n }\n return { ok: true, heading };\n}\n\n/**\n * Legacy `activity.timeline.journal.heading` → `vault.readback.journalSection`.\n * The new key wins when both are present; the legacy key is still validated.\n */\nexport function applyLegacyJournalHeading(input: {\n journalSection: string;\n heading: unknown;\n}): { journalSection: string; usedLegacyHeading: boolean; ignoredLegacyHeading: boolean } {\n if (input.heading === undefined) {\n return { journalSection: input.journalSection, usedLegacyHeading: false, ignoredLegacyHeading: false };\n }\n if (typeof input.heading !== \"string\") {\n throw new TypeError(\"activity.timeline.journal.heading must be a string\");\n }\n const normalized = normalizeJournalHeading(input.heading);\n if (!normalized.ok) {\n throw new RangeError(\n normalized.error === \"empty_heading\"\n ? \"activity.timeline.journal.heading must be a non-empty string\"\n : \"activity.timeline.journal.heading must not contain a newline\",\n );\n }\n if (input.journalSection.trim().length > 0) {\n return {\n journalSection: input.journalSection,\n usedLegacyHeading: false,\n ignoredLegacyHeading: true,\n };\n }\n return {\n journalSection: normalized.heading,\n usedLegacyHeading: true,\n ignoredLegacyHeading: false,\n };\n}\n","/**\n * Resolve journal source mode (issue #1987).\n *\n * Pure. `memoryDir` mode reads `<memoryDir>/journal/<date>.md` (#1984\n * behavior, the default); `vault` mode reads the configured section of\n * the vault daily note. The heading is NOT resolved here — vault\n * prerequisites (vault.enabled, dailyNotePath, readback.journalSection)\n * are checked by journal-vault-prereq.ts at config parse time.\n *\n * Legacy `source: \"file\"` is accepted as an alias of `memoryDir` and\n * flagged so config parse can emit a deprecation warning.\n */\n\nexport type JournalSource = \"memoryDir\" | \"vault\";\n\nconst JOURNAL_SOURCES: readonly JournalSource[] = [\"memoryDir\", \"vault\"];\n\nexport type JournalSourceResult =\n | { ok: true; mode: JournalSource; deprecatedAlias?: \"file\" }\n | { ok: false; error: \"unknown_source\" };\n\nexport function resolveJournalSource(input: { source: string }): JournalSourceResult {\n if (input.source === \"file\") {\n return { ok: true, mode: \"memoryDir\", deprecatedAlias: \"file\" };\n }\n if ((JOURNAL_SOURCES as readonly string[]).includes(input.source)) {\n return { ok: true, mode: input.source as JournalSource };\n }\n return { ok: false, error: \"unknown_source\" };\n}\n"],"mappings":"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","names":["path","hit","path","failureDiag","result","path","path"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-KJTKLXTH.js";
|
|
4
4
|
import {
|
|
5
5
|
StorageManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-MVG3KXON.js";
|
|
7
7
|
import {
|
|
8
8
|
copyExistingFileToBackup,
|
|
9
9
|
writeFileAtomically
|
|
@@ -260,4 +260,4 @@ export {
|
|
|
260
260
|
backupExistingLedger,
|
|
261
261
|
rebuildMemoryLifecycleLedger
|
|
262
262
|
};
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-XM46Y66S.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveDefaultNamespaceRoot
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2SNCQHJZ.js";
|
|
4
4
|
import {
|
|
5
5
|
composeLocationDayBody,
|
|
6
6
|
composeLocationDayMeta,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
} from "./chunk-6P4REYKL.js";
|
|
24
24
|
import {
|
|
25
25
|
StorageManager
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-MVG3KXON.js";
|
|
27
27
|
import {
|
|
28
28
|
resolveNamespaceCapabilities
|
|
29
29
|
} from "./chunk-JUOZ62Y7.js";
|
|
@@ -728,4 +728,4 @@ export {
|
|
|
728
728
|
runLocationBackfill,
|
|
729
729
|
runLocationCliCommand
|
|
730
730
|
};
|
|
731
|
-
//# sourceMappingURL=chunk-
|
|
731
|
+
//# sourceMappingURL=chunk-YRIFXXMI.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
deepRecallRequestSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZX3AYNNV.js";
|
|
4
4
|
import {
|
|
5
5
|
EngramAccessInputError
|
|
6
6
|
} from "./chunk-2Z24E5W2.js";
|
|
@@ -39,4 +39,4 @@ async function respondDeepRecall(req, res, respondJson, readJsonBody, service, s
|
|
|
39
39
|
export {
|
|
40
40
|
respondDeepRecall
|
|
41
41
|
};
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-YTK5MVNF.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./chunk-5JMAGU26.js";
|
|
6
6
|
import {
|
|
7
7
|
runPostConsolidationMaterialize
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J4WGTN2N.js";
|
|
9
9
|
import {
|
|
10
10
|
isSemanticConsolidationLlmOperator
|
|
11
11
|
} from "./chunk-G7D6GZ5J.js";
|
|
@@ -220,4 +220,4 @@ export {
|
|
|
220
220
|
buildExtensionsBlockForConsolidation,
|
|
221
221
|
materializeAfterSemanticConsolidation
|
|
222
222
|
};
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-YTZN2UZO.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
isChangeOrientedQuery,
|
|
6
6
|
stateViewKey
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-NETQXOPY.js";
|
|
8
8
|
|
|
9
9
|
// src/recall-state-view-anchors.ts
|
|
10
10
|
function stateViewPacketActive(stateViewActive, asOfMs) {
|
|
@@ -91,4 +91,4 @@ export {
|
|
|
91
91
|
admitStateViewRecentMemories,
|
|
92
92
|
filterRecentScanMemories
|
|
93
93
|
};
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
94
|
+
//# sourceMappingURL=chunk-Z4GUX2M6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MVG3KXON.js";
|
|
4
4
|
import {
|
|
5
5
|
getCachedRuleMemories,
|
|
6
6
|
setCachedRuleMemories
|
|
@@ -119,4 +119,4 @@ export {
|
|
|
119
119
|
compareVerifiedSemanticRuleResults,
|
|
120
120
|
searchVerifiedSemanticRules
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-ZAEPD4C2.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
gatewayTaskChainOptions
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-THTF2W7M.js";
|
|
4
4
|
|
|
5
5
|
// src/deep-recall-policy-llm.ts
|
|
6
6
|
var DEEP_RECALL_POLICY_SYSTEM_PROMPT = "You are the retrieval policy for a long-term memory system. Given the question, the current working set of retrieved memories, and the frontier of anchor-linked candidates, choose exactly one action: REFINE (rewrite the query), EXPAND (follow named frontier nodes), or STOP. Respond with JSON only.";
|
|
@@ -47,4 +47,4 @@ export {
|
|
|
47
47
|
DEEP_RECALL_POLICY_SYSTEM_PROMPT,
|
|
48
48
|
callDeepRecallPolicyLlm
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
50
|
+
//# sourceMappingURL=chunk-ZRMMXWYI.js.map
|
|
@@ -217,8 +217,11 @@ function categoryAliasCoercion(rawCategory) {
|
|
|
217
217
|
}
|
|
218
218
|
function retainedCategoryAlias(rawInput) {
|
|
219
219
|
if (!rawInput || typeof rawInput !== "object") return void 0;
|
|
220
|
-
const
|
|
221
|
-
|
|
220
|
+
const envelope = rawInput;
|
|
221
|
+
const minted = envelope.rawCategory;
|
|
222
|
+
if (typeof minted === "string" && isMemoryCategoryAlias(minted)) return minted;
|
|
223
|
+
const category = envelope.category;
|
|
224
|
+
return typeof category === "string" && isMemoryCategoryAlias(category) ? category : void 0;
|
|
222
225
|
}
|
|
223
226
|
function reapplyCategoryCoercion(response, categoryCoercion) {
|
|
224
227
|
const restamped = { ...response };
|
|
@@ -555,4 +558,4 @@ export {
|
|
|
555
558
|
actionConfidenceRequestSchema,
|
|
556
559
|
validateRequest
|
|
557
560
|
};
|
|
558
|
-
//# sourceMappingURL=chunk-
|
|
561
|
+
//# sourceMappingURL=chunk-ZX3AYNNV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/access-schema.ts"],"sourcesContent":["// Request/response schema validation for the Remnic HTTP API.\n// Uses zod for runtime validation — returns structured 400 errors with\n// field-level detail so consumers get clear feedback on malformed requests.\n\nimport { z } from \"zod\";\n\nimport type { MemoryCategory } from \"./types.js\";\nimport {\n ACTION_CONFIDENCE_CONTEXT_READINESS,\n ACTION_CONFIDENCE_RISK_CATEGORIES,\n ACTION_CONFIDENCE_RULE_KINDS,\n} from \"./action-confidence.js\";\nimport { isValidCapsuleSince } from \"./transfer/capsule-export.js\";\nimport { validateArchiveRelativePath } from \"./transfer/fs-utils.js\";\nimport { CAPSULE_ID_PATTERN } from \"./transfer/types.js\";\nimport {\n OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,\n OFFLINE_SYNC_MAX_MTIME_MS,\n} from \"./offline-sync.js\";\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationError {\n error: string;\n code: \"validation_error\";\n details: Array<{ field: string; message: string }>;\n}\n\nexport function formatZodError(error: z.ZodError): SchemaValidationError {\n return {\n error: \"request validation failed\",\n code: \"validation_error\",\n details: error.issues.map((issue) => ({\n field: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared fields\n// ---------------------------------------------------------------------------\n\nconst namespaceSchema = z.string().trim().max(256).optional();\nconst sessionKeySchema = z.string().trim().min(1).max(512).optional();\nconst idempotencyKeySchema = z.string().trim().min(1).max(256).optional();\nconst cwdSchema = z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional();\nconst projectTagSchema = z\n .string()\n .trim()\n .min(1, \"projectTag must be non-empty when provided\")\n .max(256)\n .optional();\nconst deadlineMsSchema = z.number().finite().min(0).max(Number.MAX_SAFE_INTEGER).optional();\nconst dryRunSchema = z.boolean().optional();\nconst schemaVersionSchema = z.number().int().optional();\nconst timeZoneSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine((value) => {\n try {\n Intl.DateTimeFormat(undefined, { timeZone: value });\n return true;\n } catch {\n return false;\n }\n }, \"must be a valid IANA timezone\");\n\n// ---------------------------------------------------------------------------\n// Recall\n// ---------------------------------------------------------------------------\n\n/**\n * Coding-agent context (issue #569). Optional payload that connectors may\n * ship with a recall request so the project/branch namespace overlay\n * applies to that recall. All fields are validated per CLAUDE.md #51 —\n * empty-string projectId / rootPath is rejected, not silently accepted.\n */\nexport const codingContextSchema = z\n .object({\n projectId: z.string().trim().min(1, \"codingContext.projectId is required\").max(128),\n branch: z.string().trim().max(256).nullable(),\n rootPath: z.string().trim().min(1, \"codingContext.rootPath is required\").max(1024),\n defaultBranch: z.string().trim().max(256).nullable(),\n })\n .nullable();\n\n/**\n * Recall disclosure depth (issue #677). Mirrors the `RecallDisclosure`\n * type in `types.ts` — keep these in sync. Default-application happens\n * inside `EngramAccessService.recall()`; the schema only accepts/rejects.\n * Invalid values throw a structured 400 instead of silently defaulting,\n * per CLAUDE.md rule 51.\n */\nexport const recallDisclosureSchema = z.enum([\"chunk\", \"section\", \"raw\"]);\n\n/**\n * Tag-match semantics (issue #689). `any` (default when `tags` is provided\n * and `tagMatch` is omitted) admits a result when it carries at least one\n * of the filter tags. `all` requires every filter tag to be present.\n * Schema rejects unknown values up front — never silently defaults\n * (CLAUDE.md rule 51).\n */\nexport const tagMatchSchema = z.enum([\"any\", \"all\"]);\n\nexport const recallRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n topK: z.number().int().min(0).max(200).optional(),\n mode: z.enum([\"auto\", \"no_recall\", \"minimal\", \"full\", \"graph_mode\"]).optional(),\n includeDebug: z.boolean().optional(),\n idempotencyKey: idempotencyKeySchema,\n disclosure: recallDisclosureSchema.optional(),\n codingContext: codingContextSchema.optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: cwdSchema,\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: projectTagSchema,\n /**\n * Historical recall pin (issue #680). ISO 8601 timestamp. The\n * schema only enforces the basic shape; the access service runs\n * `Date.parse` and emits a structured 400 on malformed input\n * (CLAUDE.md rule 51).\n */\n asOf: z.string().trim().min(1, \"asOf must be a non-empty ISO 8601 timestamp\").max(64).optional(),\n /**\n * Free-form recall tag filter (issue #689). When provided, recall results\n * whose frontmatter `tags` do not match the filter are removed before the\n * response is returned. Comparison is case-sensitive exact match.\n */\n tags: z.array(z.string().trim().min(1).max(256)).max(50).optional(),\n /**\n * Match mode for `tags` (issue #689). Defaults to `\"any\"` when `tags` is\n * provided and `tagMatch` is omitted. Ignored when `tags` is absent.\n */\n tagMatch: tagMatchSchema.optional(),\n /**\n * Include graph edges below `graphTraversalConfidenceFloor` for diagnostic\n * recall traversal (issue #681). Defaults to false.\n */\n includeLowConfidence: z.boolean().optional(),\n /**\n * #1952 — per-call opt-in to state-aware recall views for this recall.\n * ORs with the `recallStateViews` config flag; a change-intent query\n * (e.g. \"when did\", \"used to\", \"switched\") is still required for any\n * effect, so this can never perturb ordinary recalls.\n */\n stateView: z.boolean().optional(),\n});\n\nexport const recallExplainRequestSchema = z.object({\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n/**\n * Standalone \"set coding context\" request. Used by the HTTP endpoint\n * `POST /engram/v1/coding-context` and the MCP `remnic.set_coding_context`\n * tool (PR 7). `codingContext: null` clears the attached context.\n */\nexport const setCodingContextRequestSchema = z\n .object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n codingContext: codingContextSchema.optional(),\n /**\n * Project tag shorthand for non-git-based project scoping. When\n * `codingContext` is omitted, this becomes\n * `{ projectId: \"tag:<projectTag>\", branch: null, rootPath: \"tag:<projectTag>\", defaultBranch: null }`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n })\n .superRefine((value, ctx) => {\n if (value.codingContext === undefined && value.projectTag === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"codingContext or projectTag is required\",\n path: [\"codingContext\"],\n });\n }\n });\n\n// ---------------------------------------------------------------------------\n// Observe\n// ---------------------------------------------------------------------------\n\nconst messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().min(1, \"message content must be non-empty\"),\n sourceFormat: z\n .enum([\"openai\", \"anthropic\", \"openclaw\", \"pi\", \"lossless-claw\", \"remnic\"])\n .nullable()\n .optional(),\n rawContent: z.unknown().nullable().optional(),\n parts: z\n .array(\n z.object({\n ordinal: z.number().int().min(0).nullable().optional(),\n kind: z.enum([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n ]),\n payload: z.record(z.string(), z.unknown()),\n toolName: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n filePath: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n }),\n )\n .nullable()\n .optional(),\n});\n\nexport const observeRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n messages: z.array(messageSchema).min(1, \"messages must be a non-empty array\"),\n namespace: namespaceSchema,\n skipExtraction: z.boolean().optional(),\n /**\n * Optional idempotency key for server-side dedup of retried observe POSTs\n * (issue #1649). A retry that reaches the daemon after the first attempt\n * already processed is replayed from cache instead of re-ingested. When the\n * key is reused with a DIFFERENT payload the request is rejected as a\n * conflict (same contract as memory_store/suggestion_submit).\n */\n idempotencyKey: idempotencyKeySchema,\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: cwdSchema,\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: projectTagSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Deep recall (issue #2332)\n// ---------------------------------------------------------------------------\n\nexport const deepRecallRequestSchema = z.object({\n query: z.string().trim().min(1, \"query is required\").max(2000),\n /** Optional policy-step ceiling; validated against the configured maximum in the service. */\n maxSteps: z.union([z.number().int().min(0), z.string()]).optional(),\n namespace: namespaceSchema,\n sessionKey: z.string().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Memory store / suggestion submit\n// ---------------------------------------------------------------------------\n\nconst writeContentSchema = z.string().min(1, \"content is required\").max(50000);\n// ---------------------------------------------------------------------------\n// Category wire contract (issue #2829): truthful input/output modeling.\n// ---------------------------------------------------------------------------\n\n/** Canonical input spellings — exactly the `MemoryCategory` union. */\nconst MEMORY_CATEGORY_CANONICAL_INPUT = [\n \"fact\", \"preference\", \"correction\", \"entity\", \"decision\",\n \"relationship\", \"principle\", \"commitment\", \"moment\", \"skill\", \"rule\", \"procedure\",\n \"reasoning_trace\",\n] as const satisfies readonly MemoryCategory[];\n\n/**\n * Compatibility alias spellings admitted on input. The four project-shaped\n * categories fleet telemetry actually shows do not exist in the taxonomy;\n * they parse to the canonical \"fact\". Exact match only — no trimming, no\n * case folding, so near-misses like `projection` or `Project_State` reject\n * like any other invalid category, with the full valid list in the error.\n */\nconst MEMORY_CATEGORY_ALIAS_INPUT = [\n \"project\",\n \"project_state\",\n \"project-state\",\n \"project_update\",\n] as const;\n\nexport type MemoryCategoryAlias = (typeof MEMORY_CATEGORY_ALIAS_INPUT)[number];\n\nconst MEMORY_CATEGORY_ALIAS_TO_CANONICAL: Readonly<\n Record<MemoryCategoryAlias, Extract<MemoryCategory, \"fact\">>\n> = {\n project: \"fact\",\n project_state: \"fact\",\n \"project-state\": \"fact\",\n project_update: \"fact\",\n};\n\nexport function isMemoryCategoryAlias(value: string): value is MemoryCategoryAlias {\n return Object.prototype.hasOwnProperty.call(MEMORY_CATEGORY_ALIAS_TO_CANONICAL, value);\n}\n\n/** Coercion diagnostic for a write whose input category was a compat alias. */\nexport interface CategoryAliasCoercion {\n from: MemoryCategoryAlias;\n to: \"fact\";\n}\n\n/** Boundary-derived coercion note for a retained raw spelling. */\nexport function categoryAliasCoercion(rawCategory: string | undefined): CategoryAliasCoercion | undefined {\n return rawCategory !== undefined && isMemoryCategoryAlias(rawCategory)\n ? { from: rawCategory, to: \"fact\" }\n : undefined;\n}\n\n/**\n * Recover the retained alias spelling from a pre-parse raw envelope: the\n * `rawCategory` minted by a previous parse of the same schema (the HTTP/MCP\n * validate-then-dispatch double pass), or — for single-parse callers like the\n * CLI store command — the as-yet-untransformed alias still sitting on\n * `category` (issue #2889). A minted `rawCategory` always wins: it names the\n * spelling the transform actually canonicalized.\n */\nexport function retainedCategoryAlias(rawInput: unknown): MemoryCategoryAlias | undefined {\n if (!rawInput || typeof rawInput !== \"object\") return undefined;\n const envelope = rawInput as Record<string, unknown>;\n const minted = envelope.rawCategory;\n if (typeof minted === \"string\" && isMemoryCategoryAlias(minted)) return minted;\n const category = envelope.category;\n return typeof category === \"string\" && isMemoryCategoryAlias(category) ? category : undefined;\n}\n\n/**\n * An idempotent replay returns the FIRST request's stored response, whose\n * coercion note names that request's spelling. Rewrite the note from the\n * CURRENT request's retained spelling so every response identifies what its\n * caller actually sent; the stored idempotent result is reused untouched.\n */\nexport function reapplyCategoryCoercion<T extends object>(\n response: T,\n categoryCoercion: CategoryAliasCoercion | undefined,\n): T & { categoryCoercion?: CategoryAliasCoercion } {\n const restamped: T & { categoryCoercion?: CategoryAliasCoercion } = { ...response };\n if (categoryCoercion !== undefined) {\n restamped.categoryCoercion = categoryCoercion;\n } else {\n delete restamped.categoryCoercion;\n }\n return restamped;\n}\n\nconst categoryWireSchema = z.enum(\n [...MEMORY_CATEGORY_CANONICAL_INPUT, ...MEMORY_CATEGORY_ALIAS_INPUT],\n {\n errorMap: () => ({\n message:\n `category must be one of: ${[...MEMORY_CATEGORY_CANONICAL_INPUT, ...MEMORY_CATEGORY_ALIAS_INPUT].join(\", \")}; ` +\n 'for project state/facts use \"fact\"',\n }),\n },\n);\n\nconst confidenceSchema = z.number().min(0).max(1).optional();\nconst tagsSchema = z.array(z.string().max(256)).max(50).optional();\nconst entityRefSchema = z.string().trim().max(512).optional();\nconst ttlSchema = z.string().trim().max(128).optional();\nconst sourceReasonSchema = z.string().trim().max(2000).optional();\n\nconst memoryStoreRequestShape = z.object({\n schemaVersion: schemaVersionSchema,\n idempotencyKey: idempotencyKeySchema,\n dryRun: dryRunSchema,\n sessionKey: sessionKeySchema,\n content: writeContentSchema,\n category: categoryWireSchema.optional(),\n confidence: confidenceSchema,\n namespace: namespaceSchema,\n tags: tagsSchema,\n entityRef: entityRefSchema,\n ttl: ttlSchema,\n sourceReason: sourceReasonSchema,\n // Git/project context for project-scoped writes (#1434). When no explicit\n // `namespace` is given, these route the write to the same project namespace\n // recall/observe resolve from `cwd`/`projectTag` (issue #569, rule 42). Also\n // lets MCP clients that auto-inject `cwd` (e.g. Pi MCPorter) call write tools.\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n});\n\n/**\n * Parsed memory-store request (issue #2829): the category transform maps\n * compat aliases to the canonical \"fact\" DURING parsing, so the output type\n * stays the finite `MemoryCategory` union — never an alias spelling. The raw\n * spelling travels separately on `rawCategory`, minted only by the transform\n * (zod strips it from client bodies), for the write surface's coercion note\n * and idempotent-replay rebuild.\n */\nexport type MemoryStoreParsedRequest = Omit<z.infer<typeof memoryStoreRequestShape>, \"category\"> & {\n category?: MemoryCategory;\n rawCategory?: MemoryCategoryAlias;\n};\n\nexport const memoryStoreRequestSchema = memoryStoreRequestShape.transform(\n (request): MemoryStoreParsedRequest => {\n if (request.category === undefined || !isMemoryCategoryAlias(request.category)) {\n // Spread so the narrowed canonical category, not the wide wire union,\n // becomes the output type.\n return { ...request, category: request.category };\n }\n return {\n ...request,\n category: MEMORY_CATEGORY_ALIAS_TO_CANONICAL[request.category],\n rawCategory: request.category,\n };\n },\n);\n\nexport const suggestionSubmitRequestSchema = memoryStoreRequestSchema;\n\n// ---------------------------------------------------------------------------\n// Review disposition\n// ---------------------------------------------------------------------------\n\nexport const reviewDispositionRequestSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\"),\n status: z.enum([\n \"active\", \"pending_review\", \"quarantined\", \"rejected\", \"superseded\", \"archived\",\n ]),\n reasonCode: z.string().trim().min(1, \"reasonCode is required\"),\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone promote\n// ---------------------------------------------------------------------------\n\nexport const trustZonePromoteRequestSchema = z.object({\n recordId: z.string().trim().min(1, \"recordId is required\"),\n targetZone: z.enum([\"working\", \"trusted\"], {\n errorMap: () => ({ message: \"targetZone must be 'working' or 'trusted'\" }),\n }),\n promotionReason: z.string().trim().min(1, \"promotionReason is required\"),\n recordedAt: z.string().trim().optional(),\n summary: z.string().trim().max(5000).optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone demo-seed\n// ---------------------------------------------------------------------------\n\nexport const trustZoneDemoSeedRequestSchema = z.object({\n scenario: z.string().trim().max(256).optional(),\n recordedAt: z.string().trim().optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// LCM search\n// ---------------------------------------------------------------------------\n\nexport const lcmSearchRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n sessionPrefix: z.string().trim().min(1).max(512).optional(),\n namespace: namespaceSchema,\n limit: z.number().int().min(1).max(100).optional(),\n});\n\nexport const lcmCompactionFlushRequestSchema = z\n .object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n /**\n * Optional multi-namespace flush used by delegate lifecycle replay. The\n * server handles the whole list as one quota-counted write.\n */\n namespaces: z.array(z.string().trim().max(256)).min(1).max(64).optional(),\n })\n .superRefine((value, ctx) => {\n if (value.namespace !== undefined && value.namespaces !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"namespace and namespaces are mutually exclusive\",\n path: [\"namespaces\"],\n });\n }\n if (\n value.namespaces !== undefined &&\n new Set(value.namespaces).size !== value.namespaces.length\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"namespaces must not contain duplicates\",\n path: [\"namespaces\"],\n });\n }\n });\n\nexport const extractionForceFlushRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n cwd: cwdSchema,\n projectTag: projectTagSchema,\n deadlineMs: deadlineMsSchema,\n});\n\nexport const lcmCompactionRecordRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n namespace: namespaceSchema,\n tokensBefore: z.number().int().min(0, \"tokensBefore must be a non-negative integer\"),\n tokensAfter: z.number().int().min(0, \"tokensAfter must be a non-negative integer\"),\n});\n\n// ---------------------------------------------------------------------------\n// Day summary\n// ---------------------------------------------------------------------------\n\nexport const daySummaryRequestSchema = z.object({\n memories: z.string().max(100000).optional(),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n timeZone: timeZoneSchema.optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Capsule export\n// ---------------------------------------------------------------------------\n\nconst capsuleTopLevelSegmentSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine(\n (value) => !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a top-level directory name without path separators\",\n );\n\nconst capsulePeerIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (value) => value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a plain peer id without path separators\",\n );\n\nconst capsuleIsoSinceSchema = z\n .string()\n .trim()\n .min(1, \"since must be a non-empty ISO 8601 timestamp\")\n .max(128)\n .refine(\n isValidCapsuleSince,\n \"since must be a valid ISO 8601 timestamp with no calendar overflow\",\n );\n\nexport const capsuleExportRequestSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1, \"name is required\")\n .max(64, \"name must be 64 characters or fewer\")\n .regex(\n CAPSULE_ID_PATTERN,\n \"name must be alphanumeric with single dashes (no spaces, no leading/trailing dashes)\",\n ),\n namespace: namespaceSchema,\n since: capsuleIsoSinceSchema.optional(),\n includeKinds: z.array(capsuleTopLevelSegmentSchema).max(50).optional(),\n peerIds: z.array(capsulePeerIdSchema).max(100).optional(),\n includeTranscripts: z.boolean().optional(),\n encrypt: z.boolean().optional(),\n });\n\nexport const capsuleImportRequestSchema = z\n .object({\n archivePath: z.string().trim().min(1, \"archivePath is required\").max(4096),\n namespace: namespaceSchema,\n mode: z.enum([\"skip\", \"overwrite\", \"fork\"]).optional(),\n passphrase: z.string().min(1, \"passphrase must not be empty\").max(4096).optional(),\n });\n\nexport const capsuleListRequestSchema = z\n .object({\n namespace: namespaceSchema,\n sessionKey: sessionKeySchema,\n });\n\n// ---------------------------------------------------------------------------\n// Offline sync\n// ---------------------------------------------------------------------------\n\nfunction isValidOfflineSyncPath(value: string): boolean {\n try {\n validateArchiveRelativePath(value, \"path\");\n return true;\n } catch {\n return false;\n }\n}\n\nconst offlineSyncPathSchema = z\n .string()\n .trim()\n .min(1, \"path must be non-empty\")\n .max(4096)\n .refine(\n isValidOfflineSyncPath,\n \"path must be a POSIX relative path without unsafe segments\",\n );\n\nconst offlineSyncFileStateSchema = z.object({\n path: offlineSyncPathSchema,\n sha256: z.string().regex(/^[a-f0-9]{64}$/i, \"sha256 must be a 64-character hex digest\"),\n bytes: z.number().int().min(0),\n mtimeMs: z.number().finite().min(0).max(OFFLINE_SYNC_MAX_MTIME_MS),\n});\n\nconst offlineSyncBaseCapturedAtSchema = z\n .string()\n .trim()\n .min(1, \"baseCapturedAt must be non-empty when provided\")\n .max(64)\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"baseCapturedAt must be a valid ISO 8601 timestamp\",\n });\n\nexport const offlineSyncSnapshotRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n includeContent: z.boolean().optional(),\n baseCapturedAt: offlineSyncBaseCapturedAtSchema.optional(),\n baseFiles: z\n .array(offlineSyncFileStateSchema)\n .max(300_000, \"baseFiles must contain 300000 or fewer entries\")\n .optional(),\n});\n\nexport const offlineSyncApplyRequestSchema = z\n .object({\n namespace: namespaceSchema,\n changeset: z.unknown(),\n returnCurrentFiles: z.boolean().optional(),\n })\n .refine((value) => value.changeset !== undefined && value.changeset !== null, {\n message: \"changeset is required\",\n path: [\"changeset\"],\n });\n\nexport const offlineSyncFilesRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n paths: z\n .array(offlineSyncPathSchema)\n .max(5000, \"paths must contain 5000 or fewer entries\"),\n});\n\nexport const offlineSyncFileContentRequestSchema = z.object({\n namespace: namespaceSchema,\n includeTranscripts: z.boolean().optional(),\n path: offlineSyncPathSchema,\n offset: z.number().int().min(0).optional(),\n length: z.number().int().min(1).max(OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Action confidence\n// ---------------------------------------------------------------------------\n\nconst nullableOptional = <T extends z.ZodTypeAny>(schema: T) =>\n schema.optional().nullable().transform((value) => value ?? undefined);\n\nconst actionConfidenceRuleSchema = z\n .object({\n kind: z.enum(ACTION_CONFIDENCE_RULE_KINDS),\n description: nullableOptional(z.string().trim().min(1).max(2000)),\n matched: nullableOptional(z.boolean()),\n })\n .strict();\n\nconst actionConfidenceMemorySchema = z\n .object({\n source: nullableOptional(z.string().trim().min(1).max(256)),\n created: nullableOptional(z.string().trim().min(1).max(128)),\n updated: nullableOptional(z.string().trim().min(1).max(128)),\n scope: nullableOptional(z.string().trim().min(1).max(512)),\n userContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n retrievalReason: nullableOptional(z.string().trim().min(1).max(2000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n stale: nullableOptional(z.boolean()),\n corrected: nullableOptional(z.boolean()),\n correctionState: nullableOptional(z.enum([\"none\", \"correction\", \"superseded\", \"disputed\", \"forgotten\"])),\n safeToUse: nullableOptional(z.boolean()),\n safety: nullableOptional(z.enum([\"safe\", \"requires-review\", \"blocked\"])),\n safetyReasons: nullableOptional(z.array(z.string().trim().min(1).max(1000)).max(50)),\n })\n .strict();\n\nexport const actionConfidenceRequestSchema = z\n .object({\n intendedAction: nullableOptional(z.string().trim().min(1).max(1000)),\n confidence: nullableOptional(z.number().min(0).max(1)),\n risk: nullableOptional(z.enum(ACTION_CONFIDENCE_RISK_CATEGORIES)),\n contextReadiness: nullableOptional(z.enum(ACTION_CONFIDENCE_CONTEXT_READINESS)),\n currentContextScopes: nullableOptional(z.array(z.string().trim().min(1).max(128)).max(50)),\n userRules: nullableOptional(z.array(actionConfidenceRuleSchema).max(100)),\n retrievedMemories: nullableOptional(z.array(actionConfidenceMemorySchema).max(200)),\n })\n .strict();\n\n// ---------------------------------------------------------------------------\n// Inferred types\n// ---------------------------------------------------------------------------\n\nexport type RecallRequest = z.infer<typeof recallRequestSchema>;\nexport type RecallExplainRequest = z.infer<typeof recallExplainRequestSchema>;\nexport type SetCodingContextRequest = z.infer<typeof setCodingContextRequestSchema>;\nexport type ObserveRequest = z.infer<typeof observeRequestSchema>;\nexport type MemoryStoreRequest = z.infer<typeof memoryStoreRequestSchema>;\nexport type SuggestionSubmitRequest = z.infer<typeof suggestionSubmitRequestSchema>;\nexport type ReviewDispositionRequest = z.infer<typeof reviewDispositionRequestSchema>;\nexport type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSchema>;\nexport type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;\nexport type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;\nexport type LcmCompactionFlushRequest = z.infer<typeof lcmCompactionFlushRequestSchema>;\nexport type ExtractionForceFlushRequest = z.infer<typeof extractionForceFlushRequestSchema>;\nexport type LcmCompactionRecordRequest = z.infer<typeof lcmCompactionRecordRequestSchema>;\nexport type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;\nexport type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;\nexport type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;\nexport type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;\nexport type OfflineSyncApplyRequest = z.infer<typeof offlineSyncApplyRequestSchema>;\nexport type OfflineSyncSnapshotRequest = z.infer<typeof offlineSyncSnapshotRequestSchema>;\nexport type OfflineSyncFilesRequest = z.infer<typeof offlineSyncFilesRequestSchema>;\nexport type OfflineSyncFileContentRequest = z.infer<typeof offlineSyncFileContentRequestSchema>;\nexport type ActionConfidenceRequest = z.infer<typeof actionConfidenceRequestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type SchemaName =\n | \"recall\"\n | \"recallExplain\"\n | \"setCodingContext\"\n | \"observe\"\n | \"memoryStore\"\n | \"suggestionSubmit\"\n | \"reviewDisposition\"\n | \"trustZonePromote\"\n | \"trustZoneDemoSeed\"\n | \"lcmSearch\"\n | \"lcmCompactionFlush\"\n | \"extractionForceFlush\"\n | \"lcmCompactionRecord\"\n | \"daySummary\"\n | \"capsuleExport\"\n | \"capsuleImport\"\n | \"capsuleList\"\n | \"offlineSyncSnapshot\"\n | \"offlineSyncFiles\"\n | \"offlineSyncFileContent\"\n | \"offlineSyncApply\"\n | \"actionConfidence\";\n\nexport type SchemaTypeFor<N extends SchemaName> =\n N extends \"recall\" ? RecallRequest\n : N extends \"recallExplain\" ? RecallExplainRequest\n : N extends \"setCodingContext\" ? SetCodingContextRequest\n : N extends \"observe\" ? ObserveRequest\n : N extends \"memoryStore\" ? MemoryStoreRequest\n : N extends \"suggestionSubmit\" ? SuggestionSubmitRequest\n : N extends \"reviewDisposition\" ? ReviewDispositionRequest\n : N extends \"trustZonePromote\" ? TrustZonePromoteRequest\n : N extends \"trustZoneDemoSeed\" ? TrustZoneDemoSeedRequest\n : N extends \"lcmSearch\" ? LcmSearchRequest\n : N extends \"lcmCompactionFlush\" ? LcmCompactionFlushRequest\n : N extends \"extractionForceFlush\" ? ExtractionForceFlushRequest\n : N extends \"lcmCompactionRecord\" ? LcmCompactionRecordRequest\n : N extends \"daySummary\" ? DaySummaryRequest\n : N extends \"capsuleExport\" ? CapsuleExportRequest\n : N extends \"capsuleImport\" ? CapsuleImportRequest\n : N extends \"capsuleList\" ? CapsuleListRequest\n : N extends \"offlineSyncSnapshot\" ? OfflineSyncSnapshotRequest\n : N extends \"offlineSyncFiles\" ? OfflineSyncFilesRequest\n : N extends \"offlineSyncFileContent\" ? OfflineSyncFileContentRequest\n : N extends \"offlineSyncApply\" ? OfflineSyncApplyRequest\n : N extends \"actionConfidence\" ? ActionConfidenceRequest\n : never;\n\nconst schemas: Record<SchemaName, z.ZodTypeAny> = {\n recall: recallRequestSchema,\n recallExplain: recallExplainRequestSchema,\n setCodingContext: setCodingContextRequestSchema,\n observe: observeRequestSchema,\n memoryStore: memoryStoreRequestSchema,\n suggestionSubmit: suggestionSubmitRequestSchema,\n reviewDisposition: reviewDispositionRequestSchema,\n trustZonePromote: trustZonePromoteRequestSchema,\n trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,\n lcmSearch: lcmSearchRequestSchema,\n lcmCompactionFlush: lcmCompactionFlushRequestSchema,\n extractionForceFlush: extractionForceFlushRequestSchema,\n lcmCompactionRecord: lcmCompactionRecordRequestSchema,\n daySummary: daySummaryRequestSchema,\n capsuleExport: capsuleExportRequestSchema,\n capsuleImport: capsuleImportRequestSchema,\n capsuleList: capsuleListRequestSchema,\n offlineSyncSnapshot: offlineSyncSnapshotRequestSchema,\n offlineSyncFiles: offlineSyncFilesRequestSchema,\n offlineSyncFileContent: offlineSyncFileContentRequestSchema,\n offlineSyncApply: offlineSyncApplyRequestSchema,\n actionConfidence: actionConfidenceRequestSchema,\n};\n\n/**\n * Validate a request body against the named schema.\n * Returns `{ success: true, data }` on pass or\n * `{ success: false, error }` on failure with field-level detail.\n */\nexport function validateRequest<T = unknown>(\n schemaName: SchemaName,\n body: unknown,\n): { success: true; data: T } | { success: false; error: SchemaValidationError } {\n const schema = schemas[schemaName];\n if (!schema) {\n return {\n success: false,\n error: {\n error: `unknown schema: ${schemaName}`,\n code: \"validation_error\",\n details: [],\n },\n };\n }\n const result = schema.safeParse(stripNullsExceptCodingContext(body));\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: formatZodError(result.error) };\n}\n\nfunction stripNullsExceptCodingContext(data: unknown): unknown {\n if (!data || typeof data !== \"object\" || Array.isArray(data)) return data;\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (value === null && key !== \"codingContext\") continue;\n cleaned[key] = value;\n }\n return cleaned;\n}\n\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
categoryAliasCoercion
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZX3AYNNV.js";
|
|
4
4
|
|
|
5
5
|
// src/access-observe-write-category.ts
|
|
6
6
|
function splitCanonicalWriteRequest(request) {
|
|
@@ -11,4 +11,4 @@ function splitCanonicalWriteRequest(request) {
|
|
|
11
11
|
export {
|
|
12
12
|
splitCanonicalWriteRequest
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=chunk-
|
|
14
|
+
//# sourceMappingURL=chunk-ZZCR2QYL.js.map
|