@remnic/core 9.69.43 → 9.69.45
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 +14 -14
- package/dist/access-admin-ops-surface.js +24 -24
- package/dist/access-authorization-probe.d.ts +14 -14
- package/dist/access-authorization-probe.js +25 -25
- package/dist/access-boundary.d.ts +14 -14
- package/dist/access-boundary.js +24 -24
- package/dist/access-cli.js +71 -69
- 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 +14 -14
- package/dist/access-extraction-force-flush.js +24 -24
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +14 -14
- package/dist/access-http-briefing.js +25 -25
- package/dist/access-http-lcm-compaction.d.ts +14 -14
- package/dist/access-http-lifecycle-flush.d.ts +14 -14
- package/dist/access-http-offline-stream.d.ts +14 -14
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +26 -26
- package/dist/access-http.d.ts +15 -15
- package/dist/access-http.js +40 -40
- package/dist/access-identity-continuity-surface.d.ts +11 -11
- package/dist/access-identity-continuity-surface.js +24 -24
- package/dist/access-lcm-surface.d.ts +14 -14
- package/dist/access-lcm-surface.js +24 -24
- package/dist/access-mcp-shared-context-tools.d.ts +14 -14
- package/dist/access-mcp.d.ts +14 -14
- package/dist/access-mcp.js +32 -32
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-CE-RrXKu.d.ts → access-namespace-preflight-DDnsN22V.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +24 -24
- package/dist/access-observe-transcript.d.ts +11 -11
- package/dist/access-observe-write-category.d.ts +4 -3
- package/dist/access-observe-write-category.js +2 -2
- package/dist/access-observe-write-surface.d.ts +14 -14
- package/dist/access-observe-write-surface.js +24 -24
- package/dist/access-offline-manifest.d.ts +11 -11
- package/dist/access-offline-manifest.js +3 -3
- package/dist/access-operations-batch.js +25 -25
- package/dist/access-operations.d.ts +14 -14
- package/dist/access-operations.js +31 -31
- package/dist/access-recall-concurrency.d.ts +14 -14
- package/dist/access-recall-concurrency.js +24 -24
- package/dist/access-recall-response.d.ts +14 -14
- package/dist/access-recall-response.js +24 -24
- package/dist/access-recall-surface.d.ts +14 -14
- package/dist/access-recall-surface.js +24 -24
- package/dist/access-schema.d.ts +9 -2
- package/dist/access-schema.js +3 -1
- package/dist/{access-service-DxTTTg9O.d.ts → access-service-CDteK_Gt.d.ts} +9 -9
- package/dist/access-service-helpers.d.ts +14 -14
- package/dist/access-service.d.ts +14 -14
- package/dist/access-service.js +24 -24
- package/dist/access-surface-catalog.d.ts +14 -14
- package/dist/access-surface-catalog.js +26 -26
- package/dist/access-wearables-meetings-surface.d.ts +4 -4
- 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 +2 -2
- 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-QZD4RD6H.js → auto-sync-DG5KEOF5.js} +5 -5
- 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 +11 -11
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +6 -6
- 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 +3 -3
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-Ya3DDn_T.d.ts → catalog-Dl2hYqpS.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 +7 -7
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-BZDK5EOD.js → chunk-2LRO73MN.js} +2 -2
- package/dist/chunk-2WMXZYMS.js +25 -0
- package/dist/chunk-2WMXZYMS.js.map +1 -0
- package/dist/{chunk-JDL5BYYF.js → chunk-46A4RGBC.js} +2 -2
- package/dist/{chunk-6EGIQEKC.js → chunk-4HTQ76O4.js} +2 -2
- package/dist/{chunk-7L54ARML.js → chunk-4XTSKGLX.js} +2 -2
- package/dist/{chunk-KOM36ILJ.js → chunk-5TKHJ5RW.js} +13 -13
- package/dist/{chunk-IB7FDRRC.js → chunk-5XTILJRI.js} +2 -2
- package/dist/{chunk-J2MGTGKC.js → chunk-5ZXGH2ZL.js} +20 -3
- package/dist/chunk-5ZXGH2ZL.js.map +1 -0
- package/dist/{chunk-VJXMFBVR.js → chunk-6II55MXS.js} +2 -2
- package/dist/{chunk-LT4H7SL5.js → chunk-7LKXP4QG.js} +19 -19
- package/dist/{chunk-PF7LQ22G.js → chunk-A2YN3FR4.js} +3 -3
- package/dist/chunk-AAQA6ZUP.js +41 -0
- package/dist/chunk-AAQA6ZUP.js.map +1 -0
- package/dist/{chunk-RJ7Z7YXK.js → chunk-AG6PANBG.js} +14 -20
- package/dist/chunk-AG6PANBG.js.map +1 -0
- package/dist/{chunk-KDLOKVX7.js → chunk-AOMUIF3R.js} +2 -2
- package/dist/{chunk-2YIUUXNK.js → chunk-B55FYF6F.js} +2 -2
- package/dist/{chunk-2HDLDBJW.js → chunk-BOWAP64Q.js} +2 -2
- package/dist/{chunk-PPDZSJXB.js → chunk-C3MCMFNV.js} +2 -2
- package/dist/{chunk-DABSYX7V.js → chunk-D3DJYGU2.js} +3 -3
- package/dist/{chunk-F2FJTOV6.js → chunk-DO6R3LIE.js} +2 -2
- package/dist/{chunk-LD22AAJI.js → chunk-DSHSQGSN.js} +2 -2
- package/dist/{chunk-3254BYQV.js → chunk-E5VOKZQV.js} +1 -1
- package/dist/{chunk-46FVFU7S.js → chunk-EC5SVM6H.js} +2 -2
- package/dist/{chunk-UHSOPTNB.js → chunk-EP6BA7VV.js} +50 -15
- package/dist/chunk-EP6BA7VV.js.map +1 -0
- package/dist/{chunk-BPXJINHW.js → chunk-EUP4AXIW.js} +2 -2
- package/dist/{chunk-KY75VZKG.js → chunk-F6AYWLRN.js} +2 -2
- package/dist/{chunk-4AX5OYKC.js → chunk-FDDCZDBI.js} +2 -2
- package/dist/{chunk-VHANUT45.js → chunk-HBGSZ62Z.js} +7 -7
- package/dist/{chunk-M7H56FOQ.js → chunk-HVGCQMTQ.js} +2 -2
- package/dist/{chunk-GMU7MAHS.js → chunk-IAT5WFEU.js} +3 -3
- package/dist/{chunk-R3H2AXO2.js → chunk-IFULZYYQ.js} +2 -2
- package/dist/{chunk-ZYSOT6HD.js → chunk-J3IWHCMF.js} +2 -2
- package/dist/{chunk-QCTXQ2HW.js → chunk-J6NEOCQC.js} +2 -2
- package/dist/{chunk-H2N6SLTR.js → chunk-JIWZVOQM.js} +2 -2
- package/dist/{chunk-LUAQHDUI.js → chunk-JMBTNVMW.js} +2 -2
- package/dist/{chunk-HKQAI6XI.js → chunk-JPNUKKSL.js} +2 -2
- package/dist/{chunk-CRK6F6N3.js → chunk-JUOJGZPV.js} +5 -1
- package/dist/chunk-JUOJGZPV.js.map +1 -0
- package/dist/{chunk-F6PTJLEM.js → chunk-K4KE5MYE.js} +1 -1
- package/dist/{chunk-5AJZ7EUW.js → chunk-K75H7FSO.js} +2 -2
- package/dist/{chunk-JL4TQYM5.js → chunk-L272A5QW.js} +33 -2
- package/dist/{chunk-JL4TQYM5.js.map → chunk-L272A5QW.js.map} +1 -1
- package/dist/{chunk-7F47R4H4.js → chunk-LZAJONO5.js} +2 -2
- package/dist/{chunk-2WFOVXVJ.js → chunk-M7ECD3KN.js} +2 -2
- package/dist/{chunk-KORQWGUA.js → chunk-MDYZCPNQ.js} +2 -2
- package/dist/{chunk-IWHNT35B.js → chunk-N6I257OM.js} +3 -3
- package/dist/{chunk-YR5QT4SR.js → chunk-NAFPHFDM.js} +2 -2
- package/dist/{chunk-D7UUB33A.js → chunk-NGAFYIHQ.js} +2 -2
- package/dist/{chunk-LXMZM7LM.js → chunk-NKDQXDFL.js} +16 -16
- package/dist/{chunk-ZBSP4BSN.js → chunk-NRFUYVW7.js} +2 -2
- package/dist/{chunk-VNQRRUNS.js → chunk-O6ZSWHVR.js} +2 -3
- package/dist/chunk-O6ZSWHVR.js.map +1 -0
- package/dist/{chunk-XOCGC3FJ.js → chunk-OFBJD3V5.js} +2 -2
- package/dist/{chunk-YPB3Y57U.js → chunk-OOBUWMPY.js} +4 -4
- package/dist/{chunk-324HBGS4.js → chunk-OREGA7GY.js} +6 -6
- package/dist/{chunk-4WMGRLTV.js → chunk-Q4MI2KCG.js} +2 -2
- package/dist/{chunk-MOL7JK4F.js → chunk-R4HFCATE.js} +2 -2
- package/dist/{chunk-AKB44K3D.js → chunk-SPN5YFXN.js} +8 -8
- package/dist/{chunk-2PIC6CEN.js → chunk-T2ZNUWUY.js} +2 -2
- package/dist/{chunk-NHFXGNGC.js → chunk-TFS5FAAC.js} +36 -36
- package/dist/{chunk-JDOBQPJY.js → chunk-TNQR7N52.js} +2 -2
- package/dist/{chunk-JWBDHA4F.js → chunk-UJXNBZYJ.js} +4 -4
- package/dist/{chunk-DDGQDNQW.js → chunk-VA5QRTZX.js} +2 -2
- package/dist/{chunk-XIJHRQ4A.js → chunk-W6YDAIVB.js} +2 -2
- package/dist/{chunk-GKKLI23D.js → chunk-WCQ7L54B.js} +2 -2
- package/dist/{chunk-3YQ7VLP3.js → chunk-WMTYEQO5.js} +2 -2
- package/dist/{chunk-VKDXYEA6.js → chunk-WNMVUWI7.js} +2 -2
- package/dist/{chunk-OGAKUA7I.js → chunk-YHSEUZV5.js} +2 -2
- package/dist/{chunk-GR76OKET.js → chunk-YSBYNCCN.js} +2 -2
- package/dist/{chunk-QUBPZQED.js → chunk-Z5YNVWRD.js} +2 -2
- package/dist/{chunk-UCLWIMVW.js → chunk-ZLVURGAJ.js} +2 -2
- package/dist/{chunk-M6FKXOYV.js → chunk-ZQ533JDE.js} +2 -2
- package/dist/{chunk-TRTLWUDD.js → chunk-ZTHGFTMW.js} +2 -2
- package/dist/{cli-BfCl5kWD.d.ts → cli-CZDhIcxu.d.ts} +5 -5
- package/dist/cli.d.ts +16 -16
- package/dist/cli.js +53 -53
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +5 -5
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +6 -6
- 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 +2 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +6 -6
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +6 -6
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +4 -4
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +8 -8
- 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 +8 -8
- 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 +14 -14
- package/dist/deep-recall-http-glue.js +2 -2
- package/dist/deep-recall-mcp-tools.d.ts +14 -14
- package/dist/deep-recall-policy-llm.d.ts +2 -2
- 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-CggS9BFT.d.ts → dependency-propagation-delivery-BXaUoVUf.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 +6 -6
- 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 +11 -11
- package/dist/external-wiki-access.d.ts +14 -14
- package/dist/external-wiki-access.js +25 -25
- 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 +14 -14
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +2 -2
- package/dist/extraction-faithfulness.js +3 -3
- package/dist/extraction-judge-telemetry.d.ts +2 -2
- package/dist/extraction-judge-training.d.ts +2 -2
- package/dist/extraction-judge.d.ts +2 -2
- 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-span-wire.d.ts +23 -4
- package/dist/extraction-span-wire.js +7 -8
- package/dist/extraction-span-wire.js.map +1 -1
- package/dist/extraction.d.ts +2 -2
- package/dist/extraction.js +13 -11
- package/dist/fallback-llm-codex-subscription.d.ts +1 -1
- package/dist/fallback-llm-codex-subscription.js +1 -1
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/fallback-llm.js +2 -2
- package/dist/{generic-recall-paths-CoXPSnCw.d.ts → generic-recall-paths-BkVVEoeO.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-fdw_oK5a.d.ts → index-TBPe6NvB.d.ts} +3 -3
- package/dist/index.d.ts +28 -28
- package/dist/index.js +73 -69
- 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/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-3-jtw52a.d.ts → local-llm-DdrhmecM.d.ts} +1 -1
- package/dist/local-llm-config.js +1 -1
- package/dist/local-llm-helpers.d.ts +2 -2
- package/dist/local-llm.d.ts +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +5 -5
- package/dist/location/index.js +8 -8
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +6 -6
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +7 -7
- package/dist/{maintenance-DgeeH0a1.d.ts → maintenance-B813YFWJ.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +14 -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 +14 -14
- package/dist/memory-subject.d.ts +14 -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 +7 -7
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +6 -6
- 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 +9 -9
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +16 -16
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +14 -14
- package/dist/{orchestrator-VXWKdatm.d.ts → orchestrator-BCvQavIS.d.ts} +10 -10
- package/dist/orchestrator.d.ts +11 -11
- package/dist/orchestrator.js +71 -69
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CwXZBKR5.d.ts → pipeline-4lqKJZ_0.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-B55s59aR.d.ts → public-http-NH72a6aa.d.ts} +1 -1
- package/dist/{qmd-DOLTPIQg.d.ts → qmd-DnoWaXKb.d.ts} +1 -1
- 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/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-memory-map.d.ts +1 -1
- package/dist/recall-navigate-access.d.ts +1 -1
- package/dist/recall-navigate-disclosure.d.ts +1 -1
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-navigation-http-glue.d.ts +14 -14
- package/dist/recall-navigation-mcp-tools.d.ts +14 -14
- package/dist/recall-navigation-operations.js +25 -25
- package/dist/recall-navigation-renderer.d.ts +1 -1
- package/dist/recall-navigation.d.ts +1 -1
- package/dist/recall-navigation.js +24 -24
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-planner-llm.js +2 -2
- package/dist/recall-state-view-admission.d.ts +2 -2
- package/dist/recall-state-view-admission.js +3 -3
- package/dist/recall-state-view-anchors.d.ts +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-renderer.d.ts +1 -1
- package/dist/recall-xray.d.ts +1 -1
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/manifest.js +2 -2
- 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 +3 -3
- 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-C564-hrv.d.ts → scope-profiles-crazXegZ.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-g6x-ShY8.d.ts → semantic-consolidation-B09JI9WM.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +7 -7
- package/dist/semantic-rule-promotion.js +6 -6
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/{service-CaCOk0rd.d.ts → service-Echc5Xso.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 +9 -9
- package/dist/source-attribution.d.ts +7 -4
- package/dist/source-attribution.js +1 -1
- package/dist/standup/build.js +6 -6
- package/dist/{storage-C9nsZX5Q.d.ts → storage-ClkHCQSE.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +5 -5
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +3 -3
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +17 -17
- package/dist/support-passport/index.js +27 -27
- package/dist/{tagging-BA4RFdH3.d.ts → tagging-ksktJ60G.d.ts} +2 -2
- 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 +6 -6
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-Sps-lg5I.d.ts → types-nmhnJpxx.d.ts} +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +6 -6
- package/dist/who-knows-cli.d.ts +14 -14
- package/dist/who-knows-cli.js +7 -7
- package/dist/who-knows.d.ts +14 -14
- package/dist/who-knows.js +6 -6
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-category-alias.test.ts +57 -0
- package/src/access-observe-write-category.ts +20 -1
- package/src/access-schema.ts +10 -0
- package/src/background-generation.test.ts +77 -0
- package/src/extraction-span-wire.test.ts +17 -1
- package/src/extraction-span-wire.ts +46 -3
- package/src/extraction.ts +2 -11
- package/src/local-llm-config.test.ts +21 -0
- package/src/local-llm-config.ts +1 -2
- package/src/providers/codex-subscription.test.ts +109 -3
- package/src/providers/codex-subscription.ts +57 -17
- package/src/source-attribution.test.ts +27 -0
- package/src/source-attribution.ts +41 -5
- package/src/summarizer.ts +18 -0
- package/dist/chunk-CRK6F6N3.js.map +0 -1
- package/dist/chunk-J2MGTGKC.js.map +0 -1
- package/dist/chunk-RJ7Z7YXK.js.map +0 -1
- package/dist/chunk-UHSOPTNB.js.map +0 -1
- package/dist/chunk-VNQRRUNS.js.map +0 -1
- package/dist/chunk-YTV6J4T6.js +0 -14
- package/dist/chunk-YTV6J4T6.js.map +0 -1
- /package/dist/{auto-sync-QZD4RD6H.js.map → auto-sync-DG5KEOF5.js.map} +0 -0
- /package/dist/{chunk-BZDK5EOD.js.map → chunk-2LRO73MN.js.map} +0 -0
- /package/dist/{chunk-JDL5BYYF.js.map → chunk-46A4RGBC.js.map} +0 -0
- /package/dist/{chunk-6EGIQEKC.js.map → chunk-4HTQ76O4.js.map} +0 -0
- /package/dist/{chunk-7L54ARML.js.map → chunk-4XTSKGLX.js.map} +0 -0
- /package/dist/{chunk-KOM36ILJ.js.map → chunk-5TKHJ5RW.js.map} +0 -0
- /package/dist/{chunk-IB7FDRRC.js.map → chunk-5XTILJRI.js.map} +0 -0
- /package/dist/{chunk-VJXMFBVR.js.map → chunk-6II55MXS.js.map} +0 -0
- /package/dist/{chunk-LT4H7SL5.js.map → chunk-7LKXP4QG.js.map} +0 -0
- /package/dist/{chunk-PF7LQ22G.js.map → chunk-A2YN3FR4.js.map} +0 -0
- /package/dist/{chunk-KDLOKVX7.js.map → chunk-AOMUIF3R.js.map} +0 -0
- /package/dist/{chunk-2YIUUXNK.js.map → chunk-B55FYF6F.js.map} +0 -0
- /package/dist/{chunk-2HDLDBJW.js.map → chunk-BOWAP64Q.js.map} +0 -0
- /package/dist/{chunk-PPDZSJXB.js.map → chunk-C3MCMFNV.js.map} +0 -0
- /package/dist/{chunk-DABSYX7V.js.map → chunk-D3DJYGU2.js.map} +0 -0
- /package/dist/{chunk-F2FJTOV6.js.map → chunk-DO6R3LIE.js.map} +0 -0
- /package/dist/{chunk-LD22AAJI.js.map → chunk-DSHSQGSN.js.map} +0 -0
- /package/dist/{chunk-3254BYQV.js.map → chunk-E5VOKZQV.js.map} +0 -0
- /package/dist/{chunk-46FVFU7S.js.map → chunk-EC5SVM6H.js.map} +0 -0
- /package/dist/{chunk-BPXJINHW.js.map → chunk-EUP4AXIW.js.map} +0 -0
- /package/dist/{chunk-KY75VZKG.js.map → chunk-F6AYWLRN.js.map} +0 -0
- /package/dist/{chunk-4AX5OYKC.js.map → chunk-FDDCZDBI.js.map} +0 -0
- /package/dist/{chunk-VHANUT45.js.map → chunk-HBGSZ62Z.js.map} +0 -0
- /package/dist/{chunk-M7H56FOQ.js.map → chunk-HVGCQMTQ.js.map} +0 -0
- /package/dist/{chunk-GMU7MAHS.js.map → chunk-IAT5WFEU.js.map} +0 -0
- /package/dist/{chunk-R3H2AXO2.js.map → chunk-IFULZYYQ.js.map} +0 -0
- /package/dist/{chunk-ZYSOT6HD.js.map → chunk-J3IWHCMF.js.map} +0 -0
- /package/dist/{chunk-QCTXQ2HW.js.map → chunk-J6NEOCQC.js.map} +0 -0
- /package/dist/{chunk-H2N6SLTR.js.map → chunk-JIWZVOQM.js.map} +0 -0
- /package/dist/{chunk-LUAQHDUI.js.map → chunk-JMBTNVMW.js.map} +0 -0
- /package/dist/{chunk-HKQAI6XI.js.map → chunk-JPNUKKSL.js.map} +0 -0
- /package/dist/{chunk-F6PTJLEM.js.map → chunk-K4KE5MYE.js.map} +0 -0
- /package/dist/{chunk-5AJZ7EUW.js.map → chunk-K75H7FSO.js.map} +0 -0
- /package/dist/{chunk-7F47R4H4.js.map → chunk-LZAJONO5.js.map} +0 -0
- /package/dist/{chunk-2WFOVXVJ.js.map → chunk-M7ECD3KN.js.map} +0 -0
- /package/dist/{chunk-KORQWGUA.js.map → chunk-MDYZCPNQ.js.map} +0 -0
- /package/dist/{chunk-IWHNT35B.js.map → chunk-N6I257OM.js.map} +0 -0
- /package/dist/{chunk-YR5QT4SR.js.map → chunk-NAFPHFDM.js.map} +0 -0
- /package/dist/{chunk-D7UUB33A.js.map → chunk-NGAFYIHQ.js.map} +0 -0
- /package/dist/{chunk-LXMZM7LM.js.map → chunk-NKDQXDFL.js.map} +0 -0
- /package/dist/{chunk-ZBSP4BSN.js.map → chunk-NRFUYVW7.js.map} +0 -0
- /package/dist/{chunk-XOCGC3FJ.js.map → chunk-OFBJD3V5.js.map} +0 -0
- /package/dist/{chunk-YPB3Y57U.js.map → chunk-OOBUWMPY.js.map} +0 -0
- /package/dist/{chunk-324HBGS4.js.map → chunk-OREGA7GY.js.map} +0 -0
- /package/dist/{chunk-4WMGRLTV.js.map → chunk-Q4MI2KCG.js.map} +0 -0
- /package/dist/{chunk-MOL7JK4F.js.map → chunk-R4HFCATE.js.map} +0 -0
- /package/dist/{chunk-AKB44K3D.js.map → chunk-SPN5YFXN.js.map} +0 -0
- /package/dist/{chunk-2PIC6CEN.js.map → chunk-T2ZNUWUY.js.map} +0 -0
- /package/dist/{chunk-NHFXGNGC.js.map → chunk-TFS5FAAC.js.map} +0 -0
- /package/dist/{chunk-JDOBQPJY.js.map → chunk-TNQR7N52.js.map} +0 -0
- /package/dist/{chunk-JWBDHA4F.js.map → chunk-UJXNBZYJ.js.map} +0 -0
- /package/dist/{chunk-DDGQDNQW.js.map → chunk-VA5QRTZX.js.map} +0 -0
- /package/dist/{chunk-XIJHRQ4A.js.map → chunk-W6YDAIVB.js.map} +0 -0
- /package/dist/{chunk-GKKLI23D.js.map → chunk-WCQ7L54B.js.map} +0 -0
- /package/dist/{chunk-3YQ7VLP3.js.map → chunk-WMTYEQO5.js.map} +0 -0
- /package/dist/{chunk-VKDXYEA6.js.map → chunk-WNMVUWI7.js.map} +0 -0
- /package/dist/{chunk-OGAKUA7I.js.map → chunk-YHSEUZV5.js.map} +0 -0
- /package/dist/{chunk-GR76OKET.js.map → chunk-YSBYNCCN.js.map} +0 -0
- /package/dist/{chunk-QUBPZQED.js.map → chunk-Z5YNVWRD.js.map} +0 -0
- /package/dist/{chunk-UCLWIMVW.js.map → chunk-ZLVURGAJ.js.map} +0 -0
- /package/dist/{chunk-M6FKXOYV.js.map → chunk-ZQ533JDE.js.map} +0 -0
- /package/dist/{chunk-TRTLWUDD.js.map → chunk-ZTHGFTMW.js.map} +0 -0
package/src/local-llm-config.ts
CHANGED
|
@@ -56,8 +56,7 @@ function parseLocalLlmMaxContext(value: unknown): number | undefined {
|
|
|
56
56
|
function copyStringRecord(value: unknown): Record<string, string> | undefined {
|
|
57
57
|
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
58
58
|
const headers: Record<string, string> = {};
|
|
59
|
-
for (const key of Object.
|
|
60
|
-
const headerValue = Reflect.get(value, key);
|
|
59
|
+
for (const [key, headerValue] of Object.entries(value)) {
|
|
61
60
|
if (typeof headerValue === "string") headers[key] = headerValue;
|
|
62
61
|
}
|
|
63
62
|
return headers;
|
|
@@ -452,10 +452,10 @@ test("request deadline starts before login and login consumes the same budget",
|
|
|
452
452
|
options: { timeoutMs },
|
|
453
453
|
});
|
|
454
454
|
|
|
455
|
-
//
|
|
456
|
-
// exec only gets what login left: 5s - 2s.
|
|
455
|
+
// The shared login subprocess uses the 10s ceiling; this caller still
|
|
456
|
+
// spends its 5s budget and exec only gets what login left: 5s - 2s.
|
|
457
457
|
await call(5_000);
|
|
458
|
-
assert.deepEqual(loginTimeouts, [
|
|
458
|
+
assert.deepEqual(loginTimeouts, [10_000]);
|
|
459
459
|
assert.equal(execCalls.length, 1);
|
|
460
460
|
assert.equal(execCalls[0]?.timeoutMs, 3_000);
|
|
461
461
|
|
|
@@ -731,6 +731,112 @@ test("shared login check: each caller times out on its own budget, without cance
|
|
|
731
731
|
assert.equal(loginCalls, 1);
|
|
732
732
|
});
|
|
733
733
|
|
|
734
|
+
test("shared login check does not inherit the first waiter's shorter deadline", async () => {
|
|
735
|
+
__codexSubscriptionTestHooks.resetLoginStatusCache();
|
|
736
|
+
const loginTimeouts: number[] = [];
|
|
737
|
+
const loginPending = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
|
|
738
|
+
const runner = createCodexSubscriptionRunner({
|
|
739
|
+
env: { HOME: "/home/alice", PATH: "/usr/bin:/bin" },
|
|
740
|
+
now: () => 0,
|
|
741
|
+
runLoginStatus: (_executable, _env, timeoutMs) => {
|
|
742
|
+
loginTimeouts.push(timeoutMs);
|
|
743
|
+
return loginPending.promise;
|
|
744
|
+
},
|
|
745
|
+
runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
|
|
746
|
+
});
|
|
747
|
+
const call = (timeoutMs: number) =>
|
|
748
|
+
runner({
|
|
749
|
+
config: { executable: "codex-fake" },
|
|
750
|
+
modelId: "gpt-5.6-luna",
|
|
751
|
+
messages: [{ role: "user", content: "hi" }],
|
|
752
|
+
options: { timeoutMs },
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
const short = call(120);
|
|
756
|
+
await flushLoop();
|
|
757
|
+
assert.deepEqual(loginTimeouts, [10_000], "shared check uses the login-status ceiling, not the first waiter's 120ms");
|
|
758
|
+
|
|
759
|
+
const long = call(10_000);
|
|
760
|
+
await flushLoop();
|
|
761
|
+
assert.equal(loginTimeouts.length, 1, "the longer waiter must reuse the in-flight check");
|
|
762
|
+
|
|
763
|
+
const startedAt = Date.now();
|
|
764
|
+
await assert.rejects(short, (error: unknown) => {
|
|
765
|
+
assert.ok(error instanceof CodexSubscriptionTimeoutError);
|
|
766
|
+
assert.equal(error.name, "TimeoutError");
|
|
767
|
+
return true;
|
|
768
|
+
});
|
|
769
|
+
assert.ok(Date.now() - startedAt < 5_000, "short waiter must not wait for the 10s ceiling");
|
|
770
|
+
|
|
771
|
+
loginPending.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
|
|
772
|
+
assert.equal((await long).content, "ok");
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
test("in-flight login checks are scoped to the owning runner", async () => {
|
|
776
|
+
__codexSubscriptionTestHooks.resetLoginStatusCache();
|
|
777
|
+
let loginCallsA = 0;
|
|
778
|
+
let loginCallsB = 0;
|
|
779
|
+
const pendingA = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
|
|
780
|
+
const pendingB = Promise.withResolvers<{ status: number | null; stdout: string; stderr: string }>();
|
|
781
|
+
const env = { HOME: "/home/alice", PATH: "/usr/bin:/bin" };
|
|
782
|
+
const makeRunner = (
|
|
783
|
+
bump: () => void,
|
|
784
|
+
pending: Promise<{ status: number | null; stdout: string; stderr: string }>,
|
|
785
|
+
) =>
|
|
786
|
+
createCodexSubscriptionRunner({
|
|
787
|
+
env,
|
|
788
|
+
now: () => 0,
|
|
789
|
+
runLoginStatus: () => {
|
|
790
|
+
bump();
|
|
791
|
+
return pending;
|
|
792
|
+
},
|
|
793
|
+
runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
|
|
794
|
+
});
|
|
795
|
+
const runnerA = makeRunner(() => {
|
|
796
|
+
loginCallsA++;
|
|
797
|
+
}, pendingA.promise);
|
|
798
|
+
const runnerB = makeRunner(() => {
|
|
799
|
+
loginCallsB++;
|
|
800
|
+
}, pendingB.promise);
|
|
801
|
+
const call = (target: typeof runnerA, signal?: AbortSignal) =>
|
|
802
|
+
target({
|
|
803
|
+
config: { executable: "codex-fake" },
|
|
804
|
+
modelId: "gpt-5.6-luna",
|
|
805
|
+
messages: [{ role: "user", content: "hi" }],
|
|
806
|
+
options: { timeoutMs: 60_000, ...(signal ? { signal } : {}) },
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
const abortA = new AbortController();
|
|
810
|
+
const first = call(runnerA, abortA.signal);
|
|
811
|
+
await flushLoop();
|
|
812
|
+
assert.equal(loginCallsA, 1);
|
|
813
|
+
|
|
814
|
+
const second = call(runnerB);
|
|
815
|
+
await flushLoop();
|
|
816
|
+
assert.equal(loginCallsB, 1, "unrelated runner must not share the in-flight login");
|
|
817
|
+
assert.equal(loginCallsA, 1);
|
|
818
|
+
|
|
819
|
+
abortA.abort(new Error("A cancelled"));
|
|
820
|
+
await assert.rejects(first, (error: unknown) => error instanceof Error && error.message === "A cancelled");
|
|
821
|
+
|
|
822
|
+
pendingB.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
|
|
823
|
+
assert.equal((await second).content, "ok");
|
|
824
|
+
assert.equal(loginCallsB, 1);
|
|
825
|
+
|
|
826
|
+
let loginCallsC = 0;
|
|
827
|
+
const runnerC = createCodexSubscriptionRunner({
|
|
828
|
+
env,
|
|
829
|
+
now: () => 0,
|
|
830
|
+
runLoginStatus: () => {
|
|
831
|
+
loginCallsC++;
|
|
832
|
+
return Promise.resolve({ status: 0, stdout: "Logged in using ChatGPT\n", stderr: "" });
|
|
833
|
+
},
|
|
834
|
+
runCodexExec: async () => ({ status: 0, stdout: "", stderr: "", outputText: "ok" }),
|
|
835
|
+
});
|
|
836
|
+
assert.equal((await call(runnerC)).content, "ok");
|
|
837
|
+
assert.equal(loginCallsC, 0, "settled login success remains reusable across runners");
|
|
838
|
+
});
|
|
839
|
+
|
|
734
840
|
test("caller abort reaches the cold login check: no spawn when pre-aborted, wait aborts in flight", async () => {
|
|
735
841
|
__codexSubscriptionTestHooks.resetLoginStatusCache();
|
|
736
842
|
const loginSignals: (AbortSignal | undefined)[] = [];
|
|
@@ -177,7 +177,7 @@ export interface CodexSubscriptionRunnerDeps {
|
|
|
177
177
|
/** Runs `codex exec`. Default: isolated subprocess via launchProcess. */
|
|
178
178
|
runCodexExec?: (request: CodexSubscriptionExecRequest) => Promise<CodexSubscriptionExecResult>;
|
|
179
179
|
/** Runs `codex login status`. Default: isolated subprocess. Receives the
|
|
180
|
-
* login-status
|
|
180
|
+
* shared login-status ceiling (not any one caller's deadline) and the
|
|
181
181
|
* shared-check abort signal (fires when the last waiter leaves). */
|
|
182
182
|
runLoginStatus?: (
|
|
183
183
|
executable: string,
|
|
@@ -210,6 +210,7 @@ interface LoginStatusCacheEntry {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
const loginStatusCache = new Map<string, LoginStatusCacheEntry>();
|
|
213
|
+
const inFlightLoginByRunner = new WeakMap<CodexCliFallbackRunner, Map<string, LoginStatusCacheEntry>>();
|
|
213
214
|
const childrenByRunner = new WeakMap<CodexCliFallbackRunner, Set<number>>();
|
|
214
215
|
const runnerByOwner = new WeakMap<object, CodexCliFallbackRunner>();
|
|
215
216
|
const shutdownByRunner = new WeakMap<CodexCliFallbackRunner, AbortController>();
|
|
@@ -239,6 +240,7 @@ export function createCodexSubscriptionRunner(deps: CodexSubscriptionRunnerDeps
|
|
|
239
240
|
{ ...request, options: { ...request.options, signal } },
|
|
240
241
|
runnerDeps,
|
|
241
242
|
envSource,
|
|
243
|
+
runner,
|
|
242
244
|
);
|
|
243
245
|
};
|
|
244
246
|
childrenByRunner.set(runner, children);
|
|
@@ -320,7 +322,8 @@ export function beginCodexSubscriptionShutdown(
|
|
|
320
322
|
async function runCodexSubscriptionRequest(
|
|
321
323
|
request: CodexCliFallbackRequest,
|
|
322
324
|
deps: CodexSubscriptionRunnerDeps,
|
|
323
|
-
envSource: NodeJS.ProcessEnv
|
|
325
|
+
envSource: NodeJS.ProcessEnv,
|
|
326
|
+
runner: CodexCliFallbackRunner,
|
|
324
327
|
): Promise<CodexCliFallbackResult> {
|
|
325
328
|
const { config } = request;
|
|
326
329
|
assertNoApiKeyConfig(config);
|
|
@@ -339,7 +342,7 @@ async function runCodexSubscriptionRequest(
|
|
|
339
342
|
throw abortErrorOf(request.options.signal);
|
|
340
343
|
}
|
|
341
344
|
await assertSubscriptionLogin(executable, env, deps, {
|
|
342
|
-
|
|
345
|
+
runner,
|
|
343
346
|
callerTimeoutMs: timeoutMs,
|
|
344
347
|
deadlineStartedAt,
|
|
345
348
|
signal: request.options.signal,
|
|
@@ -460,8 +463,7 @@ function isAllowedEnvKey(key: string): boolean {
|
|
|
460
463
|
}
|
|
461
464
|
|
|
462
465
|
interface LoginCheckContext {
|
|
463
|
-
|
|
464
|
-
loginStatusTimeoutMs: number;
|
|
466
|
+
runner: CodexCliFallbackRunner;
|
|
465
467
|
/** The caller's overall effective deadline (login + exec). */
|
|
466
468
|
callerTimeoutMs: number;
|
|
467
469
|
deadlineStartedAt: number;
|
|
@@ -483,16 +485,32 @@ async function assertSubscriptionLogin(
|
|
|
483
485
|
ctx: LoginCheckContext
|
|
484
486
|
): Promise<void> {
|
|
485
487
|
const now = deps.now ?? Date.now;
|
|
486
|
-
const cacheKey =
|
|
488
|
+
const cacheKey = loginCacheKey(executable, env);
|
|
489
|
+
const inflight = inFlightLoginsFor(ctx.runner).get(cacheKey);
|
|
490
|
+
if (inflight && now() - inflight.at < LOGIN_STATUS_CACHE_TTL_MS) {
|
|
491
|
+
await waitForLoginEntry(inflight, cacheKey, ctx, now);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
487
494
|
const cached = loginStatusCache.get(cacheKey);
|
|
488
495
|
if (cached && now() - cached.at < LOGIN_STATUS_CACHE_TTL_MS) {
|
|
489
496
|
if (!cached.settled || (await authStoreFingerprint(env)) === cached.fingerprint) {
|
|
490
497
|
await waitForLoginEntry(cached, cacheKey, ctx, now);
|
|
491
498
|
return;
|
|
492
499
|
}
|
|
493
|
-
|
|
500
|
+
if (loginStatusCache.get(cacheKey) === cached) {
|
|
501
|
+
loginStatusCache.delete(cacheKey);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const raced = inFlightLoginsFor(ctx.runner).get(cacheKey);
|
|
505
|
+
if (raced && now() - raced.at < LOGIN_STATUS_CACHE_TTL_MS) {
|
|
506
|
+
await waitForLoginEntry(raced, cacheKey, ctx, now);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
const published = loginStatusCache.get(cacheKey);
|
|
510
|
+
if (published && now() - published.at < LOGIN_STATUS_CACHE_TTL_MS) {
|
|
511
|
+
await waitForLoginEntry(published, cacheKey, ctx, now);
|
|
512
|
+
return;
|
|
494
513
|
}
|
|
495
|
-
loginStatusCache.delete(cacheKey);
|
|
496
514
|
if (ctx.signal?.aborted) {
|
|
497
515
|
throw abortErrorOf(ctx.signal);
|
|
498
516
|
}
|
|
@@ -504,19 +522,19 @@ async function assertSubscriptionLogin(
|
|
|
504
522
|
controller: new AbortController(),
|
|
505
523
|
promise: Promise.resolve(undefined),
|
|
506
524
|
};
|
|
507
|
-
entry.promise = runLoginStatusCheck(executable, env, deps,
|
|
525
|
+
entry.promise = runLoginStatusCheck(executable, env, deps, entry);
|
|
508
526
|
entry.promise.then(
|
|
509
527
|
() => {
|
|
510
528
|
entry.settled = true;
|
|
529
|
+
loginStatusCache.set(cacheKey, entry);
|
|
530
|
+
dropInFlightLogin(ctx.runner, cacheKey, entry);
|
|
511
531
|
},
|
|
512
532
|
() => {
|
|
513
533
|
entry.settled = true;
|
|
514
|
-
|
|
515
|
-
loginStatusCache.delete(cacheKey);
|
|
516
|
-
}
|
|
534
|
+
dropInFlightLogin(ctx.runner, cacheKey, entry);
|
|
517
535
|
}
|
|
518
536
|
);
|
|
519
|
-
|
|
537
|
+
inFlightLoginsFor(ctx.runner).set(cacheKey, entry);
|
|
520
538
|
await waitForLoginEntry(entry, cacheKey, ctx, now);
|
|
521
539
|
}
|
|
522
540
|
|
|
@@ -524,16 +542,15 @@ async function runLoginStatusCheck(
|
|
|
524
542
|
executable: string,
|
|
525
543
|
env: NodeJS.ProcessEnv,
|
|
526
544
|
deps: CodexSubscriptionRunnerDeps,
|
|
527
|
-
ctx: LoginCheckContext,
|
|
528
545
|
entry: LoginStatusCacheEntry
|
|
529
546
|
): Promise<void> {
|
|
530
547
|
const runLoginStatus = deps.runLoginStatus!;
|
|
531
|
-
const result = await runLoginStatus(executable, env,
|
|
548
|
+
const result = await runLoginStatus(executable, env, LOGIN_STATUS_TIMEOUT_MS, entry.controller.signal);
|
|
532
549
|
const output = `${result.stdout}\n${result.stderr}`.trim();
|
|
533
550
|
if (TIMEOUT_PATTERN.test(output)) {
|
|
534
551
|
// A login-status subprocess timeout is a deadline expiry, not an auth
|
|
535
552
|
// failure — never report it as "unauthenticated".
|
|
536
|
-
throw new CodexSubscriptionTimeoutError(
|
|
553
|
+
throw new CodexSubscriptionTimeoutError(LOGIN_STATUS_TIMEOUT_MS);
|
|
537
554
|
}
|
|
538
555
|
if (result.status === 0 && LOGIN_OK_PATTERN.test(output)) {
|
|
539
556
|
entry.fingerprint = await authStoreFingerprint(env);
|
|
@@ -602,6 +619,7 @@ async function waitForLoginEntry(
|
|
|
602
619
|
entry.waiters--;
|
|
603
620
|
if (entry.waiters <= 0 && !entry.settled) {
|
|
604
621
|
entry.controller.abort();
|
|
622
|
+
dropInFlightLogin(ctx.runner, cacheKey, entry);
|
|
605
623
|
if (loginStatusCache.get(cacheKey) === entry) {
|
|
606
624
|
loginStatusCache.delete(cacheKey);
|
|
607
625
|
}
|
|
@@ -633,6 +651,28 @@ function resolveCodexAuthHome(env: NodeJS.ProcessEnv): string | undefined {
|
|
|
633
651
|
return profile ? path.join(profile, ".codex") : undefined;
|
|
634
652
|
}
|
|
635
653
|
|
|
654
|
+
function loginCacheKey(executable: string, env: NodeJS.ProcessEnv): string {
|
|
655
|
+
return `${executable}\0${resolveCodexAuthHome(env) ?? ""}`;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
function inFlightLoginsFor(runner: CodexCliFallbackRunner): Map<string, LoginStatusCacheEntry> {
|
|
659
|
+
let map = inFlightLoginByRunner.get(runner);
|
|
660
|
+
if (!map) {
|
|
661
|
+
map = new Map();
|
|
662
|
+
inFlightLoginByRunner.set(runner, map);
|
|
663
|
+
}
|
|
664
|
+
return map;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
function dropInFlightLogin(
|
|
668
|
+
runner: CodexCliFallbackRunner,
|
|
669
|
+
cacheKey: string,
|
|
670
|
+
entry: LoginStatusCacheEntry,
|
|
671
|
+
): void {
|
|
672
|
+
const map = inFlightLoginByRunner.get(runner);
|
|
673
|
+
if (map?.get(cacheKey) === entry) map.delete(cacheKey);
|
|
674
|
+
}
|
|
675
|
+
|
|
636
676
|
/**
|
|
637
677
|
* Args mirror the bench provider: fully sandboxed, ephemeral, no tools/hooks/
|
|
638
678
|
* plugins/memories — extraction must behave as a plain completion endpoint.
|
|
@@ -755,7 +795,7 @@ function execFailureError(
|
|
|
755
795
|
}
|
|
756
796
|
if (AUTH_FAILURE_PATTERN.test(combined)) {
|
|
757
797
|
// Re-check login on the next request; the cached status is now stale.
|
|
758
|
-
loginStatusCache.delete(
|
|
798
|
+
loginStatusCache.delete(loginCacheKey(executable, env));
|
|
759
799
|
return new CodexSubscriptionAuthError(
|
|
760
800
|
"expired_or_revoked",
|
|
761
801
|
"codex-subscription: the Codex CLI rejected the request as unauthenticated " +
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
formatCitation,
|
|
17
17
|
hasCitation,
|
|
18
18
|
hasCitationForTemplate,
|
|
19
|
+
lastRecognizedCitationMarker,
|
|
19
20
|
parseAllCitations,
|
|
20
21
|
parseCitation,
|
|
21
22
|
stripCitation,
|
|
@@ -578,6 +579,32 @@ test("citationTemplatesToRecognize drops undetectable shapes and keeps prior his
|
|
|
578
579
|
]);
|
|
579
580
|
});
|
|
580
581
|
|
|
582
|
+
test("stripCitationForTemplate: literal template strips the exact marker (#2951)", () => {
|
|
583
|
+
const template = "[cited-fixed]";
|
|
584
|
+
const body = "Fact body. [cited-fixed]";
|
|
585
|
+
assert.equal(citationTemplateIsDetectable(template), true);
|
|
586
|
+
assert.equal(hasCitationForTemplate(body, template), true);
|
|
587
|
+
assert.equal(stripCitationForTemplate(body, template), "Fact body.");
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
test("citationTemplatesToRecognize: overlapping custom marker wins over inner default (#2951)", () => {
|
|
591
|
+
const custom = "[Source: agent={agent}, session={sessionId}, ts={ts}; via={agent}]";
|
|
592
|
+
const ctx = {
|
|
593
|
+
agent: "planner",
|
|
594
|
+
session: "agent:planner:main",
|
|
595
|
+
ts: "2026-04-10T14:25:07Z",
|
|
596
|
+
};
|
|
597
|
+
const marker = formatCitation(ctx, custom);
|
|
598
|
+
const body = `The cadence is weekly. ${marker}`;
|
|
599
|
+
const recognized = citationTemplatesToRecognize(custom);
|
|
600
|
+
assert.ok(
|
|
601
|
+
recognized.indexOf(custom) < recognized.indexOf(DEFAULT_CITATION_FORMAT),
|
|
602
|
+
"current overlapping template must be recognized before the inner default",
|
|
603
|
+
);
|
|
604
|
+
assert.equal(lastRecognizedCitationMarker(body, recognized), marker);
|
|
605
|
+
assert.equal(stripRecognizedCitations(body, recognized), "The cadence is weekly.");
|
|
606
|
+
});
|
|
607
|
+
|
|
581
608
|
test("formatCitation: substituted values containing placeholder syntax are not re-interpreted", () => {
|
|
582
609
|
// Regression for PR #401 (low-severity): the previous implementation chained
|
|
583
610
|
// `.replace(/\{agent\}/g, ...)`, `.replace(/\{ts\}/g, ...)` etc. If the agent
|
|
@@ -499,10 +499,10 @@ export function citationTemplateIsDetectable(template: string): boolean {
|
|
|
499
499
|
}
|
|
500
500
|
|
|
501
501
|
/**
|
|
502
|
-
* Templates the merge path may lift, preserve, or strip
|
|
503
|
-
*
|
|
504
|
-
*
|
|
505
|
-
* dropped so we never hash or attach a marker we cannot re-match.
|
|
502
|
+
* Templates the merge path may lift, preserve, or strip. Longest
|
|
503
|
+
* templates first so an overlapping custom marker beats an inner default
|
|
504
|
+
* match; the current template wins equal-length ties. Undetectable
|
|
505
|
+
* shapes are dropped so we never hash or attach a marker we cannot re-match.
|
|
506
506
|
*/
|
|
507
507
|
export function citationTemplatesToRecognize(
|
|
508
508
|
primary: string | undefined,
|
|
@@ -514,9 +514,15 @@ export function citationTemplatesToRecognize(
|
|
|
514
514
|
if (!citationTemplateIsDetectable(template)) return;
|
|
515
515
|
if (!out.includes(template)) out.push(template);
|
|
516
516
|
};
|
|
517
|
-
add(DEFAULT_CITATION_FORMAT);
|
|
518
517
|
add(primary);
|
|
519
518
|
for (const template of extra) add(template);
|
|
519
|
+
add(DEFAULT_CITATION_FORMAT);
|
|
520
|
+
out.sort((a, b) => {
|
|
521
|
+
if (b.length !== a.length) return b.length - a.length;
|
|
522
|
+
if (a === primary && b !== primary) return -1;
|
|
523
|
+
if (b === primary && a !== primary) return 1;
|
|
524
|
+
return 0;
|
|
525
|
+
});
|
|
520
526
|
return out;
|
|
521
527
|
}
|
|
522
528
|
|
|
@@ -708,6 +714,9 @@ export function stripCitation(text: string): string {
|
|
|
708
714
|
* written under the default format can carry the default marker plus a
|
|
709
715
|
* custom marker appended after a config change; returning after the
|
|
710
716
|
* default pass alone left the custom marker inside hash inputs (#2330).
|
|
717
|
+
* - Fully-literal templates (no placeholders) are stripped by exact match
|
|
718
|
+
* of the template text, the same inclusion check `hasCitationForTemplate`
|
|
719
|
+
* uses.
|
|
711
720
|
* - All-placeholder templates (no literal prefix/suffix/separator) cannot
|
|
712
721
|
* produce a reliable matcher. `hasCitationForTemplate` already returns
|
|
713
722
|
* `false` for such templates, so this function never attempts to strip an
|
|
@@ -731,6 +740,13 @@ export function stripCitationForTemplate(
|
|
|
731
740
|
|
|
732
741
|
if (!hasCitationForTemplate(afterDefault, template)) return afterDefault;
|
|
733
742
|
|
|
743
|
+
PLACEHOLDER_REGEX.lastIndex = 0;
|
|
744
|
+
if (!PLACEHOLDER_REGEX.test(template)) {
|
|
745
|
+
PLACEHOLDER_REGEX.lastIndex = 0;
|
|
746
|
+
return stripExactLiteralCitation(afterDefault, template);
|
|
747
|
+
}
|
|
748
|
+
PLACEHOLDER_REGEX.lastIndex = 0;
|
|
749
|
+
|
|
734
750
|
// Build the template matcher. hasCitationForTemplate already returned true,
|
|
735
751
|
// which means templateMatcher produced a non-null result. The null branch
|
|
736
752
|
// here is a defensive fallback only — the default pass already ran.
|
|
@@ -769,6 +785,26 @@ export function stripCitationForTemplate(
|
|
|
769
785
|
return result.trimEnd();
|
|
770
786
|
}
|
|
771
787
|
|
|
788
|
+
function stripExactLiteralCitation(text: string, marker: string): string {
|
|
789
|
+
if (marker.length === 0) return text;
|
|
790
|
+
let result = "";
|
|
791
|
+
let lastIndex = 0;
|
|
792
|
+
let idx = text.indexOf(marker);
|
|
793
|
+
if (idx === -1) return text;
|
|
794
|
+
while (idx !== -1) {
|
|
795
|
+
const before = text.slice(lastIndex, idx).replace(/[ \t]+$/, "");
|
|
796
|
+
result += before;
|
|
797
|
+
lastIndex = idx + marker.length;
|
|
798
|
+
idx = text.indexOf(marker, lastIndex);
|
|
799
|
+
}
|
|
800
|
+
const after = text.slice(lastIndex).replace(/^[ \t]+/, "");
|
|
801
|
+
if (after.length > 0) {
|
|
802
|
+
if (result.length > 0) result += " ";
|
|
803
|
+
result += after;
|
|
804
|
+
}
|
|
805
|
+
return result.trimEnd();
|
|
806
|
+
}
|
|
807
|
+
|
|
772
808
|
function enclosingDelimiterRange(
|
|
773
809
|
text: string,
|
|
774
810
|
start: number,
|
package/src/summarizer.ts
CHANGED
|
@@ -360,6 +360,24 @@ Respond with valid JSON matching this schema:
|
|
|
360
360
|
|
|
361
361
|
const user = `Hour: ${hourIso}\nSession: ${sessionKey}\n\n${statsLine}${toolStatsLine}Conversation:\n${conversation}\n`;
|
|
362
362
|
|
|
363
|
+
if (this.config.backgroundGeneration) {
|
|
364
|
+
try {
|
|
365
|
+
const text = await completeBackgroundGeneration(this.config, [
|
|
366
|
+
{ role: "system", content: sys },
|
|
367
|
+
{ role: "user", content: user },
|
|
368
|
+
]);
|
|
369
|
+
const parsed = parseBackgroundGenerationJson(text, (value) => HourlySummaryExtendedSchema.parse(value));
|
|
370
|
+
if (parsed) {
|
|
371
|
+
log.debug(
|
|
372
|
+
`generated extended hourly summary for ${sessionKey} at ${hourIso} in ${Date.now() - startTime}ms (background)`
|
|
373
|
+
);
|
|
374
|
+
return { ...parsed, _meta: { userTurns, assistantTurns, toolCalls, toolCounts } };
|
|
375
|
+
}
|
|
376
|
+
} catch {
|
|
377
|
+
log.info("extended summary: background generation unavailable, continuing");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
363
381
|
// Try local LLM first if enabled
|
|
364
382
|
if (this.shouldUseLocalLlm) {
|
|
365
383
|
try {
|
|
@@ -1 +0,0 @@
|
|
|
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 includeLocation: z.boolean().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":[]}
|