@remnic/core 9.54.4 → 9.54.6
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 +24 -23
- package/dist/access-admin-ops-surface.js +55 -50
- package/dist/access-authorization-probe.d.ts +25 -22
- package/dist/access-authorization-probe.js +58 -51
- package/dist/access-boundary.d.ts +26 -23
- package/dist/access-boundary.js +59 -52
- package/dist/access-cli.js +115 -107
- 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 +19 -18
- package/dist/access-extraction-force-flush.js +55 -50
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +22 -21
- package/dist/access-http-lifecycle-flush.d.ts +22 -21
- package/dist/access-http-offline-stream.d.ts +19 -18
- package/dist/access-http-query.js +55 -50
- package/dist/access-http.d.ts +55 -36
- package/dist/access-http.js +76 -65
- package/dist/access-identity-continuity-surface.d.ts +9 -9
- package/dist/access-identity-continuity-surface.js +55 -50
- package/dist/access-lcm-surface.d.ts +21 -20
- package/dist/access-lcm-surface.js +55 -50
- package/dist/access-mcp.d.ts +22 -21
- package/dist/access-mcp.js +63 -57
- package/dist/access-memory-search-fanout.d.ts +22 -2
- package/dist/access-memory-search-fanout.js +1 -1
- package/dist/{access-namespace-preflight-C7n4tgWC.d.ts → access-namespace-preflight-CCNn_6NE.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +55 -50
- package/dist/access-observe-write-surface.d.ts +22 -21
- package/dist/access-observe-write-surface.js +55 -50
- package/dist/access-offline-manifest.d.ts +10 -9
- package/dist/access-offline-manifest.js +12 -10
- package/dist/access-operations-batch.js +57 -52
- package/dist/access-operations.d.ts +23 -22
- package/dist/access-operations.js +61 -55
- package/dist/access-recall-concurrency.d.ts +21 -20
- package/dist/access-recall-concurrency.js +55 -50
- package/dist/access-recall-response.d.ts +19 -18
- package/dist/access-recall-response.js +55 -50
- package/dist/access-recall-surface.d.ts +19 -18
- package/dist/access-recall-surface.js +55 -50
- package/dist/access-schema.d.ts +2 -2
- package/dist/access-schema.js +5 -4
- package/dist/{access-service-CXvbxLK-.d.ts → access-service-DkSdXK4S.d.ts} +1314 -83
- package/dist/access-service-helpers.d.ts +22 -21
- package/dist/access-service.d.ts +31 -30
- package/dist/access-service.js +55 -50
- package/dist/access-surface-catalog.d.ts +22 -21
- package/dist/access-surface-catalog.js +209 -2
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +14 -1
- package/dist/active-memory-bridge.js +6 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +4 -2
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/admin-console/public/what-helps-me/app.js +1594 -0
- package/dist/admin-console/public/what-helps-me/index.html +339 -0
- package/dist/admin-console/public/what-helps-me/model.js +685 -0
- package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +9 -9
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +33 -12
- 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 +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-BOOxl-I2.d.ts → catalog-DGFf8mD9.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 +34 -13
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-ZYLC7NFO.js → chunk-26ZXBTYN.js} +4 -4
- package/dist/chunk-26ZXBTYN.js.map +1 -0
- package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
- package/dist/{chunk-3CSX3ETE.js → chunk-2LWQSV6A.js} +23 -11
- package/dist/chunk-2LWQSV6A.js.map +1 -0
- package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
- package/dist/chunk-37DZZFFM.js +502 -0
- package/dist/chunk-37DZZFFM.js.map +1 -0
- package/dist/chunk-3HSRWJTC.js +9 -0
- package/dist/chunk-3HSRWJTC.js.map +1 -0
- package/dist/{chunk-XUAMCLY4.js → chunk-3TIZPSJC.js} +17 -13
- package/dist/chunk-3TIZPSJC.js.map +1 -0
- package/dist/{chunk-PDDTI7IC.js → chunk-43SEBY2M.js} +1 -1
- package/dist/{chunk-HWRD23DW.js → chunk-46SZBVDS.js} +3 -3
- package/dist/{chunk-6HPHEFXT.js → chunk-5FD7JMTX.js} +2 -2
- package/dist/{chunk-7BZOBA5J.js → chunk-5NB726GV.js} +70 -16
- package/dist/chunk-5NB726GV.js.map +1 -0
- package/dist/chunk-62OKGIJA.js +39 -0
- package/dist/chunk-62OKGIJA.js.map +1 -0
- package/dist/{chunk-IBKR2TFR.js → chunk-6CYHUWCO.js} +2 -2
- package/dist/{chunk-YN6ASZUG.js → chunk-6QPI2ITJ.js} +5 -5
- package/dist/{chunk-UU3G6GUP.js → chunk-76JJSXK7.js} +1 -1
- package/dist/chunk-76JJSXK7.js.map +1 -0
- package/dist/{chunk-PX2LSHYM.js → chunk-7BD6O7ZV.js} +189 -4
- package/dist/chunk-7BD6O7ZV.js.map +1 -0
- package/dist/chunk-7TBXNYLO.js +346 -0
- package/dist/chunk-7TBXNYLO.js.map +1 -0
- package/dist/{chunk-NH5IR2WM.js → chunk-BRR5EUTF.js} +6 -2
- package/dist/chunk-BRR5EUTF.js.map +1 -0
- package/dist/{chunk-NIS256NW.js → chunk-CIAI24TQ.js} +3 -3
- package/dist/{chunk-T2JHZWH6.js → chunk-D3LBIUWV.js} +11703 -7573
- package/dist/chunk-D3LBIUWV.js.map +1 -0
- package/dist/{chunk-7FGL6CGA.js → chunk-DVYRD4HY.js} +2 -2
- package/dist/{chunk-G7Z6EENO.js → chunk-EKTP7MNS.js} +4 -4
- package/dist/{chunk-S75M5ZRK.js → chunk-F2JRDPON.js} +16 -1
- package/dist/chunk-F2JRDPON.js.map +1 -0
- package/dist/{chunk-RZ4XGKOJ.js → chunk-FFRTNF3L.js} +8 -8
- package/dist/{chunk-VKXWK44Q.js → chunk-FONWBCVY.js} +3 -3
- package/dist/{chunk-DZD576ZU.js → chunk-FPLM2TKD.js} +2 -2
- package/dist/{chunk-ZPJ4QSGP.js → chunk-FTPONF6B.js} +2 -2
- package/dist/{chunk-LJS7KUPV.js → chunk-FWX7W5PM.js} +2 -2
- package/dist/{chunk-UTRO5UJU.js → chunk-G6DFSS6A.js} +5 -1
- package/dist/chunk-G6DFSS6A.js.map +1 -0
- package/dist/{chunk-6LAPLZOS.js → chunk-GJ776BC2.js} +8 -3
- package/dist/chunk-GJ776BC2.js.map +1 -0
- package/dist/{chunk-G4T7L557.js → chunk-GN3WRFJY.js} +6 -6
- package/dist/{chunk-QT2FRYI4.js → chunk-H7NAZ3UB.js} +2 -2
- package/dist/{chunk-APPFNGX6.js → chunk-HBUFQRIM.js} +2 -2
- package/dist/{chunk-UU7TRFNE.js → chunk-HGJ6NJ4E.js} +2 -2
- package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
- package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
- package/dist/{chunk-UES4BHA2.js → chunk-I3MSGFGD.js} +17 -6
- package/dist/chunk-I3MSGFGD.js.map +1 -0
- package/dist/{chunk-C4ZNGVK3.js → chunk-IKP5OYQQ.js} +2 -2
- package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
- package/dist/{chunk-RDJRFDJY.js → chunk-IQ4NVWEF.js} +2 -2
- package/dist/{chunk-CGVHPCP2.js → chunk-JYG4OLWH.js} +2 -2
- package/dist/{chunk-WOPA3SGI.js → chunk-K26NWEOC.js} +8 -8
- package/dist/{chunk-K4QS7LXU.js → chunk-K2UGPTYY.js} +485 -44
- package/dist/chunk-K2UGPTYY.js.map +1 -0
- package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
- package/dist/chunk-KFBOPMF6.js.map +1 -0
- package/dist/{chunk-G7A5HLUS.js → chunk-KJH6W2I7.js} +2 -2
- package/dist/{chunk-IXEBUYO4.js → chunk-KM55SMLG.js} +11 -2
- package/dist/{chunk-IXEBUYO4.js.map → chunk-KM55SMLG.js.map} +1 -1
- package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
- package/dist/chunk-LC2BDILZ.js +57 -0
- package/dist/chunk-LC2BDILZ.js.map +1 -0
- package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
- package/dist/{chunk-6R4G7N4S.js → chunk-M4YHAODQ.js} +388 -748
- package/dist/chunk-M4YHAODQ.js.map +1 -0
- package/dist/{chunk-3JLPGJ43.js → chunk-MIH3CJPN.js} +5 -5
- package/dist/{chunk-QHFV6VNU.js → chunk-MK5VEWCR.js} +2 -2
- package/dist/chunk-NISZQW72.js +140 -0
- package/dist/chunk-NISZQW72.js.map +1 -0
- package/dist/{chunk-GUKBW4HL.js → chunk-NQMSEB5D.js} +6 -6
- package/dist/{chunk-G2LUMAUF.js → chunk-OCIP6YMD.js} +12 -5
- package/dist/chunk-OCIP6YMD.js.map +1 -0
- package/dist/{chunk-47P3RYZP.js → chunk-PG4QBPVG.js} +21 -11
- package/dist/chunk-PG4QBPVG.js.map +1 -0
- package/dist/{chunk-WRJVB3C2.js → chunk-PO7NXBG2.js} +2 -2
- package/dist/{chunk-QWGE2PUH.js → chunk-PT54WISF.js} +190 -56
- package/dist/chunk-PT54WISF.js.map +1 -0
- package/dist/{chunk-AZM4CCAC.js → chunk-QZLDRQ4I.js} +8 -8
- package/dist/{chunk-THPPCISA.js → chunk-RBII7637.js} +5 -5
- package/dist/{chunk-JDZPNCMA.js → chunk-RUNORG2P.js} +6 -3
- package/dist/chunk-RUNORG2P.js.map +1 -0
- package/dist/{chunk-JV5YUBIZ.js → chunk-RZQ6W2W4.js} +50 -44
- package/dist/chunk-RZQ6W2W4.js.map +1 -0
- package/dist/{chunk-RUMNY5DT.js → chunk-SMNYAMJD.js} +6 -2
- package/dist/chunk-SMNYAMJD.js.map +1 -0
- package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
- package/dist/chunk-TB6CBZ5V.js.map +1 -0
- package/dist/{chunk-VMMQDEN5.js → chunk-TO7ZTWJW.js} +2 -2
- package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
- package/dist/{chunk-HLYR2TQL.js → chunk-UCTS3DDH.js} +2 -2
- package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
- package/dist/{chunk-WM65LU67.js → chunk-UKYS3NU5.js} +2 -2
- package/dist/{chunk-WDBX6VER.js → chunk-UPLZNJKN.js} +5 -5
- package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
- package/dist/chunk-UW5NPZJ2.js.map +1 -0
- package/dist/{chunk-2GFK22OZ.js → chunk-V6ERBR7U.js} +2 -2
- package/dist/{chunk-CYF6WVE7.js → chunk-W5ZKPI34.js} +139 -158
- package/dist/chunk-W5ZKPI34.js.map +1 -0
- package/dist/chunk-XX4HPFFM.js +370 -0
- package/dist/chunk-XX4HPFFM.js.map +1 -0
- package/dist/{chunk-ZMYDYNI4.js → chunk-XZHE2DEN.js} +4 -4
- package/dist/chunk-YXQEKCZM.js +223 -0
- package/dist/chunk-YXQEKCZM.js.map +1 -0
- package/dist/{chunk-GYPQL6XN.js → chunk-Z4N7SVVF.js} +35 -47
- package/dist/chunk-Z4N7SVVF.js.map +1 -0
- package/dist/{chunk-MAXVH44E.js → chunk-Z54EM5YZ.js} +7 -7
- package/dist/{chunk-YGLY6QFV.js → chunk-ZRZVLB7O.js} +2 -2
- package/dist/{chunk-4IIFL7GC.js → chunk-ZUKIUXHQ.js} +10 -10
- package/dist/{cli-DVUFIa5E.d.ts → cli-Bze8S0Qs.d.ts} +5 -5
- package/dist/cli.d.ts +22 -21
- package/dist/cli.js +90 -80
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +33 -12
- 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 +4 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +33 -12
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +32 -12
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/contradiction/index.js +3 -1
- package/dist/contradiction-scan-JDTBXRGW.js +20 -0
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +35 -14
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +25 -24
- package/dist/day-summary.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-XzF76C9n.d.ts → dependency-propagation-delivery-CzEfB31P.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-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +33 -12
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +9 -9
- package/dist/explicit-capture.js +7 -4
- package/dist/external-wiki-access.d.ts +22 -21
- package/dist/external-wiki-access.js +56 -51
- 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 +22 -21
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-faithfulness.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction-judge.js +2 -2
- 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.d.ts +1 -1
- package/dist/extraction.js +35 -19
- package/dist/fallback-llm.d.ts +14 -1
- package/dist/fallback-llm.js +1 -1
- package/dist/{first-start-migration-626C5554.js → first-start-migration-CRZCZAJN.js} +11 -3
- package/dist/first-start-migration-CRZCZAJN.js.map +1 -0
- 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-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/in-flight-reads.d.ts +1 -1
- package/dist/index.d.ts +314 -308
- package/dist/index.js +304 -133
- package/dist/inline-script.d.ts +3 -0
- package/dist/inline-script.js +8 -0
- package/dist/inline-script.js.map +1 -0
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +6 -6
- 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.d.ts +2 -1
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +33 -12
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -12
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +34 -13
- package/dist/{maintenance-BJzNIKBE.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +22 -21
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-mutations.js +2 -2
- package/dist/memory-projection-store.d.ts +6 -2
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-snapshot.d.ts +1 -1
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +24 -23
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +33 -12
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-file-io.d.ts +20 -0
- package/dist/offline-sync-file-io.js +18 -0
- package/dist/offline-sync-file-io.js.map +1 -0
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +5 -5
- package/dist/offline-sync.d.ts +8 -6
- package/dist/offline-sync.js +2 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +26 -25
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +39 -36
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +38 -18
- package/dist/{orchestrator-BiXgBJBQ.d.ts → orchestrator-D85CzDDY.d.ts} +11 -8
- package/dist/orchestrator.d.ts +9 -9
- package/dist/orchestrator.js +117 -109
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-sz_dcuLg.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/public-http-D-SyWNj6.d.ts +25 -0
- package/dist/{purge-533FZLS4.js → purge-GB7PZHT2.js} +2 -2
- package/dist/{qmd-eAWObK4M.d.ts → qmd-dFCHp1r0.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-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-planner-llm.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 +2 -1
- package/dist/reconcile/manifest.d.ts +2 -1
- package/dist/reconcile/manifest.js +6 -5
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/reconcile/plan.js +3 -2
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +5 -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/schemas.d.ts +38 -38
- package/dist/{scope-profiles-BBQsXuyj.d.ts → scope-profiles-DICK7GtN.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 +6 -6
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/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-HD8RkzVA.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +34 -13
- package/dist/semantic-rule-promotion.js +33 -12
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +33 -12
- package/dist/{service-DIrtHHEg.d.ts → service-DT-pJyda.d.ts} +660 -660
- 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 +31 -15
- package/dist/{storage-DqCzXi56.d.ts → storage-qOnaJ1Lw.d.ts} +49 -13
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +33 -12
- 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 +518 -0
- package/dist/support-passport/index.js +357 -0
- package/dist/support-passport/index.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 +2 -2
- package/dist/tier-routing.js +7 -1
- package/dist/{tier-stats-2JCZYEF7.js → tier-stats-EXYSKSVN.js} +8 -2
- package/dist/{tier-stats-2JCZYEF7.js.map → tier-stats-EXYSKSVN.js.map} +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/autodetect.js +1 -1
- package/dist/transfer/backup.js +1 -1
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/types.d.ts +36 -36
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-d_j4vC6N.d.ts → types-ed-SvS2t.d.ts} +8 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -2
- package/dist/verified-recall.js +33 -12
- package/dist/write-envelope.d.ts +1 -1
- package/dist/write-rate-limiter.d.ts +11 -5
- package/dist/write-rate-limiter.js +1 -1
- package/package.json +12 -2
- package/scripts/build-with-heap.mjs +11 -1
- package/src/access-authorization-probe.ts +20 -2
- package/src/access-boundary.ts +32 -0
- package/src/access-http.test.ts +1971 -643
- package/src/access-http.ts +81 -74
- package/src/access-mcp.ts +3 -1
- package/src/access-memory-search-fanout.ts +24 -1
- package/src/access-offline-manifest.ts +5 -0
- package/src/access-operations.ts +2 -0
- package/src/access-service-namespace.test.ts +14 -0
- package/src/access-service-observe-scope.test.ts +2 -0
- package/src/access-service-offline-file-content.test.ts +211 -0
- package/src/access-service.ts +628 -884
- package/src/access-surface-catalog.test.ts +40 -10
- package/src/access-surface-catalog.ts +15 -0
- package/src/active-memory-bridge.test.ts +151 -0
- package/src/active-memory-bridge.ts +95 -21
- package/src/briefing.test.ts +38 -0
- package/src/briefing.ts +3 -3
- package/src/cli.ts +6 -1
- package/src/config.ts +18 -9
- package/src/connectors/codex-materialize-runner.ts +2 -0
- package/src/contradiction/contradiction-scan.ts +2 -0
- package/src/contradiction/contradiction.test.ts +42 -0
- package/src/correction/correction-access-wiring.ts +8 -2
- package/src/correction/correction-storage-integration.test.ts +7 -0
- package/src/explicit-capture.test.ts +24 -0
- package/src/explicit-capture.ts +2 -0
- package/src/fallback-llm.test.ts +54 -0
- package/src/fallback-llm.ts +54 -9
- package/src/index.ts +3 -0
- package/src/inline-script.ts +6 -0
- package/src/local-llm-headers-timeout.test.ts +42 -0
- package/src/local-llm.ts +8 -8
- package/src/maintenance/first-start-migration.ts +2 -1
- package/src/maintenance/memory-governance.test.ts +25 -0
- package/src/maintenance/memory-governance.ts +4 -1
- package/src/maintenance/pattern-reinforcement.test.ts +20 -0
- package/src/maintenance/pattern-reinforcement.ts +2 -1
- package/src/maintenance/rebuild-memory-projection.ts +8 -8
- package/src/mcp-read-only-tools.ts +3 -0
- package/src/memory-projection-store.ts +25 -27
- package/src/offline-sync-file-io.ts +68 -0
- package/src/offline-sync.ts +43 -57
- package/src/orchestration/consolidation-run.ts +5 -4
- package/src/orchestration/contradiction-linking-coordinator.ts +7 -0
- package/src/orchestration/contradiction-localization.integration.test.ts +115 -0
- package/src/orchestration/lifecycle-policy-coordinator.ts +2 -1
- package/src/orchestration/qmd-result-resolver.test.ts +215 -14
- package/src/orchestration/qmd-result-resolver.ts +142 -82
- package/src/orchestration/recall-search-pipeline.test.ts +41 -0
- package/src/orchestration/recall-search-pipeline.ts +12 -0
- package/src/orchestration/semantic-consolidation-coordinator.ts +2 -1
- package/src/orchestration/tier-migration-coordinator.ts +23 -56
- package/src/orchestration/workspace-ops.test.ts +37 -0
- package/src/orchestration/workspace-ops.ts +5 -29
- package/src/orchestrator.ts +7 -8
- package/src/relay/mission-access.test.ts +11 -11
- package/src/relay/mission-ui.test.ts +3 -1
- package/src/storage/supersession-audit.ts +7 -1
- package/src/storage/supersession-side-effects.ts +17 -5
- package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
- package/src/storage-contract/failure-semantics.test.ts +102 -0
- package/src/storage.ts +18 -19
- package/src/support-passport/access-http-base.ts +143 -0
- package/src/support-passport/access-http.ts +172 -0
- package/src/support-passport/access-operations.ts +272 -0
- package/src/support-passport/access-service-base.test.ts +193 -0
- package/src/support-passport/access-service-base.ts +176 -0
- package/src/support-passport/access-surface.test.ts +283 -0
- package/src/support-passport/access-surface.ts +286 -0
- package/src/support-passport/card-projection.test.ts +137 -0
- package/src/support-passport/card-projection.ts +348 -0
- package/src/support-passport/card-replacement.ts +126 -0
- package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
- package/src/support-passport/card-service.test.ts +2964 -0
- package/src/support-passport/card-service.ts +1184 -0
- package/src/support-passport/card-state.ts +158 -0
- package/src/support-passport/config-model-routing.test.ts +37 -0
- package/src/support-passport/config.test.ts +34 -0
- package/src/support-passport/config.ts +41 -0
- package/src/support-passport/contracts.test.ts +156 -0
- package/src/support-passport/contracts.ts +149 -0
- package/src/support-passport/errors.ts +30 -0
- package/src/support-passport/generated-batch.test.ts +185 -0
- package/src/support-passport/generated-batch.ts +338 -0
- package/src/support-passport/grant-contracts.ts +183 -0
- package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
- package/src/support-passport/grant-service-cache.test.ts +148 -0
- package/src/support-passport/grant-service-cancellation.test.ts +83 -0
- package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
- package/src/support-passport/grant-service.test.ts +3496 -0
- package/src/support-passport/grant-service.ts +513 -0
- package/src/support-passport/grant-store-commit-hook.test.ts +123 -0
- package/src/support-passport/grant-store-order.test.ts +60 -0
- package/src/support-passport/grant-store-path-safety.test.ts +30 -0
- package/src/support-passport/grant-store-recovery.test.ts +448 -0
- package/src/support-passport/grant-store.ts +906 -0
- package/src/support-passport/index.ts +17 -0
- package/src/support-passport/mcp-tools.test.ts +222 -0
- package/src/support-passport/mcp-tools.ts +187 -0
- package/src/support-passport/model-adapter.test.ts +840 -0
- package/src/support-passport/model-adapter.ts +602 -0
- package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
- package/src/support-passport/model-audit.ts +152 -0
- package/src/support-passport/model-bridge.test.ts +456 -0
- package/src/support-passport/model-bridge.ts +439 -0
- package/src/support-passport/model-contracts.ts +124 -0
- package/src/support-passport/model-service.test.ts +1731 -0
- package/src/support-passport/model-service.ts +399 -0
- package/src/support-passport/offline-sync-guard.ts +230 -0
- package/src/support-passport/owner-http.test.ts +671 -0
- package/src/support-passport/owner-lock.ts +70 -0
- package/src/support-passport/private-file.test.ts +99 -0
- package/src/support-passport/private-file.ts +498 -0
- package/src/support-passport/public-http.test.ts +476 -0
- package/src/support-passport/public-http.ts +601 -0
- package/src/support-passport/ui.test.ts +181 -0
- package/src/tier-routing.ts +28 -17
- package/src/training-export/converter.test.ts +24 -0
- package/src/training-export/converter.ts +2 -0
- package/src/types.ts +8 -1
- package/src/wearables/service.test.ts +13 -0
- package/src/wearables/service.ts +2 -0
- package/src/write-rate-limiter.test.ts +30 -6
- package/src/write-rate-limiter.ts +29 -18
- package/dist/chunk-3CSX3ETE.js.map +0 -1
- package/dist/chunk-47P3RYZP.js.map +0 -1
- package/dist/chunk-6LAPLZOS.js.map +0 -1
- package/dist/chunk-6R4G7N4S.js.map +0 -1
- package/dist/chunk-7BZOBA5J.js.map +0 -1
- package/dist/chunk-C23BYTJV.js.map +0 -1
- package/dist/chunk-CYF6WVE7.js.map +0 -1
- package/dist/chunk-G2LUMAUF.js.map +0 -1
- package/dist/chunk-GYPQL6XN.js.map +0 -1
- package/dist/chunk-JDZPNCMA.js.map +0 -1
- package/dist/chunk-JV5YUBIZ.js.map +0 -1
- package/dist/chunk-K4QS7LXU.js.map +0 -1
- package/dist/chunk-L6CQ7WIW.js.map +0 -1
- package/dist/chunk-MKQBXQKU.js.map +0 -1
- package/dist/chunk-NH5IR2WM.js.map +0 -1
- package/dist/chunk-PX2LSHYM.js.map +0 -1
- package/dist/chunk-QWGE2PUH.js.map +0 -1
- package/dist/chunk-RUMNY5DT.js.map +0 -1
- package/dist/chunk-S75M5ZRK.js.map +0 -1
- package/dist/chunk-T2JHZWH6.js.map +0 -1
- package/dist/chunk-UES4BHA2.js.map +0 -1
- package/dist/chunk-UTRO5UJU.js.map +0 -1
- package/dist/chunk-UU3G6GUP.js.map +0 -1
- package/dist/chunk-XUAMCLY4.js.map +0 -1
- package/dist/chunk-ZYLC7NFO.js.map +0 -1
- package/dist/contradiction-scan-HYLIRMJ2.js +0 -14
- package/dist/first-start-migration-626C5554.js.map +0 -1
- /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
- /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-PDDTI7IC.js.map → chunk-43SEBY2M.js.map} +0 -0
- /package/dist/{chunk-HWRD23DW.js.map → chunk-46SZBVDS.js.map} +0 -0
- /package/dist/{chunk-6HPHEFXT.js.map → chunk-5FD7JMTX.js.map} +0 -0
- /package/dist/{chunk-IBKR2TFR.js.map → chunk-6CYHUWCO.js.map} +0 -0
- /package/dist/{chunk-YN6ASZUG.js.map → chunk-6QPI2ITJ.js.map} +0 -0
- /package/dist/{chunk-NIS256NW.js.map → chunk-CIAI24TQ.js.map} +0 -0
- /package/dist/{chunk-7FGL6CGA.js.map → chunk-DVYRD4HY.js.map} +0 -0
- /package/dist/{chunk-G7Z6EENO.js.map → chunk-EKTP7MNS.js.map} +0 -0
- /package/dist/{chunk-RZ4XGKOJ.js.map → chunk-FFRTNF3L.js.map} +0 -0
- /package/dist/{chunk-VKXWK44Q.js.map → chunk-FONWBCVY.js.map} +0 -0
- /package/dist/{chunk-DZD576ZU.js.map → chunk-FPLM2TKD.js.map} +0 -0
- /package/dist/{chunk-ZPJ4QSGP.js.map → chunk-FTPONF6B.js.map} +0 -0
- /package/dist/{chunk-LJS7KUPV.js.map → chunk-FWX7W5PM.js.map} +0 -0
- /package/dist/{chunk-G4T7L557.js.map → chunk-GN3WRFJY.js.map} +0 -0
- /package/dist/{chunk-QT2FRYI4.js.map → chunk-H7NAZ3UB.js.map} +0 -0
- /package/dist/{chunk-APPFNGX6.js.map → chunk-HBUFQRIM.js.map} +0 -0
- /package/dist/{chunk-UU7TRFNE.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
- /package/dist/{chunk-C4ZNGVK3.js.map → chunk-IKP5OYQQ.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
- /package/dist/{chunk-RDJRFDJY.js.map → chunk-IQ4NVWEF.js.map} +0 -0
- /package/dist/{chunk-CGVHPCP2.js.map → chunk-JYG4OLWH.js.map} +0 -0
- /package/dist/{chunk-WOPA3SGI.js.map → chunk-K26NWEOC.js.map} +0 -0
- /package/dist/{chunk-G7A5HLUS.js.map → chunk-KJH6W2I7.js.map} +0 -0
- /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-3JLPGJ43.js.map → chunk-MIH3CJPN.js.map} +0 -0
- /package/dist/{chunk-QHFV6VNU.js.map → chunk-MK5VEWCR.js.map} +0 -0
- /package/dist/{chunk-GUKBW4HL.js.map → chunk-NQMSEB5D.js.map} +0 -0
- /package/dist/{chunk-WRJVB3C2.js.map → chunk-PO7NXBG2.js.map} +0 -0
- /package/dist/{chunk-AZM4CCAC.js.map → chunk-QZLDRQ4I.js.map} +0 -0
- /package/dist/{chunk-THPPCISA.js.map → chunk-RBII7637.js.map} +0 -0
- /package/dist/{chunk-VMMQDEN5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
- /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
- /package/dist/{chunk-HLYR2TQL.js.map → chunk-UCTS3DDH.js.map} +0 -0
- /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
- /package/dist/{chunk-WM65LU67.js.map → chunk-UKYS3NU5.js.map} +0 -0
- /package/dist/{chunk-WDBX6VER.js.map → chunk-UPLZNJKN.js.map} +0 -0
- /package/dist/{chunk-2GFK22OZ.js.map → chunk-V6ERBR7U.js.map} +0 -0
- /package/dist/{chunk-ZMYDYNI4.js.map → chunk-XZHE2DEN.js.map} +0 -0
- /package/dist/{chunk-MAXVH44E.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{chunk-YGLY6QFV.js.map → chunk-ZRZVLB7O.js.map} +0 -0
- /package/dist/{chunk-4IIFL7GC.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
- /package/dist/{contradiction-scan-HYLIRMJ2.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
- /package/dist/{purge-533FZLS4.js.map → purge-GB7PZHT2.js.map} +0 -0
|
@@ -2,11 +2,14 @@ import {
|
|
|
2
2
|
buildExplicitCaptureDedupKey,
|
|
3
3
|
isTombstoneBlockedCaptureWriteLockBusy,
|
|
4
4
|
normalizeExplicitCaptureContent
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-K2UGPTYY.js";
|
|
6
6
|
import {
|
|
7
7
|
TAG_LIMITS,
|
|
8
8
|
composeMemoryEnvelope
|
|
9
9
|
} from "./chunk-NSVDUN76.js";
|
|
10
|
+
import {
|
|
11
|
+
isSupportPassportPrivateMemory
|
|
12
|
+
} from "./chunk-XX4HPFFM.js";
|
|
10
13
|
import {
|
|
11
14
|
sanitizeMemoryContent
|
|
12
15
|
} from "./chunk-5GKPFL3S.js";
|
|
@@ -371,6 +374,7 @@ async function findDuplicateExplicitCapture(orchestrator, resolvedNamespace, can
|
|
|
371
374
|
const existing = [...hotMemories, ...coldMemories];
|
|
372
375
|
const normalizedCandidate = normalizeExplicitCaptureContent(candidate.content);
|
|
373
376
|
const match = existing.find((memory) => {
|
|
377
|
+
if (isSupportPassportPrivateMemory(memory)) return false;
|
|
374
378
|
const status = memory.frontmatter.status ?? "active";
|
|
375
379
|
if (status !== "active" && (status !== "pending_review" || !memory.frontmatter.blockedBy)) {
|
|
376
380
|
return false;
|
|
@@ -783,4 +787,4 @@ export {
|
|
|
783
787
|
shouldProcessInlineExplicitCapture,
|
|
784
788
|
InlineExplicitCaptureProcessor
|
|
785
789
|
};
|
|
786
|
-
//# sourceMappingURL=chunk-
|
|
790
|
+
//# sourceMappingURL=chunk-SMNYAMJD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/explicit-capture.ts"],"sourcesContent":["import { composeMemoryEnvelope, TAG_LIMITS } from \"./write-envelope.js\";\nimport { resolveNamespaceCapabilities } from \"./capabilities.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport { log } from \"./logger.js\";\nimport { isSafeRouteNamespace } from \"./routing/engine.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport type { CaptureMode, MemoryCategory, MemoryLifecycleEvent, PluginConfig } from \"./types.js\";\nimport {\n buildExplicitCaptureDedupKey,\n isTombstoneBlockedCaptureWriteLockBusy,\n normalizeExplicitCaptureContent,\n} from \"./storage/tombstone-blocked-capture-index.js\";\nimport type { StorageManager } from \"./storage.js\";\nimport { isSupportPassportPrivateMemory } from \"./support-passport/card-projection.js\";\n\nexport type ExplicitCaptureInput = {\n content: string;\n category?: string;\n confidence?: number;\n namespace?: string;\n tags?: string[];\n entityRef?: string;\n sourceConnector?: string;\n ttl?: string;\n sourceReason?: string;\n};\n\nexport type ValidExplicitCapture = {\n content: string;\n category: MemoryCategory;\n confidence: number;\n namespace?: string;\n tags: string[];\n entityRef?: string;\n sourceConnector?: string;\n expiresAt?: string;\n sourceReason?: string;\n /**\n * When true, `namespace` was already resolved AND authorized by the caller\n * (the access service's `resolveCodingScopedWriteNamespace`, which auth-checks\n * the base and derives a session-owned `project-*` overlay). The persist /\n * queue layer then routes to it directly instead of re-validating against the\n * static policy allow-list — which would otherwise reject legitimately-derived\n * dynamic project namespaces (#1434). Callers that do NOT pre-authorize the\n * namespace must leave this unset so the allow-list guard still applies.\n */\n namespacePreResolved?: boolean;\n};\n\nexport type ExplicitCaptureSource = \"memory_store\" | \"memory_capture\" | \"suggestion_submit\" | \"inline\";\ntype ExplicitCaptureValidationMode = \"legacy_tool\" | \"strict_explicit\";\n\n// Bounded body {0,100000} instead of an unbounded lazy *? so scanning for the\n// closing tag cannot backtrack polynomially on unterminated <memory_note>\n// markup in hostile turn text (CodeQL js/polynomial-redos). 100 000 chars far\n// exceeds any real inline note, so matching is behavior-preserving; the outer\n// \\s* groups were also dropped (body absorbs whitespace; captures are trimmed).\nconst INLINE_NOTE_RE = /<memory_note>([\\s\\S]{0,100000}?)<\\/memory_note>/gi;\nconst INLINE_NOTE_MARKUP_RE = /<memory_note>[\\s\\S]{0,100000}?<\\/memory_note>/i;\nconst INLINE_ALLOWED_CATEGORIES = new Set<MemoryCategory>([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n]);\n\nconst SECRET_PATTERNS: RegExp[] = [\n /\\bsk-[A-Za-z0-9]{16,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/i,\n /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/i,\n /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/i,\n];\nconst SECRET_REDACTION_PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [\n { pattern: /\\bsk-[A-Za-z0-9]{16,}\\b/g, replacement: \"[redacted openai key]\" },\n { pattern: /\\bAKIA[0-9A-Z]{16}\\b/g, replacement: \"[redacted aws key]\" },\n { pattern: /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/gi, replacement: \"Bearer [redacted token]\" },\n {\n pattern: /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/gi,\n replacement: \"[redacted credential]\",\n },\n {\n pattern: /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/gi,\n replacement: \"authorization: [redacted credential]\",\n },\n];\nconst EXPLICIT_CAPTURE_REVIEW_TAGS = [\"explicit-capture\", \"queued-review\"];\n\nfunction explicitCaptureActor(source: ExplicitCaptureSource): string {\n switch (source) {\n case \"inline\":\n return \"inline.memory_note\";\n case \"memory_store\":\n return \"tool.memory_store\";\n case \"suggestion_submit\":\n return \"tool.suggestion_submit\";\n default:\n return \"tool.memory_capture\";\n }\n}\n\nfunction asTrimmed(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction redactSecrets(value: string): string {\n let redacted = value;\n for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {\n redacted = redacted.replace(pattern, replacement);\n }\n return redacted;\n}\n\nfunction containsSecretLikeValue(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction assertNoSecretLikeMetadata(field: string, value: string | undefined): void {\n const trimmed = asTrimmed(value);\n if (trimmed && containsSecretLikeValue(trimmed)) {\n throw new Error(`${field} appears to contain a secret or credential`);\n }\n}\n\nfunction assertNoSecretLikeMetadataList(field: string, values: string[] | undefined): void {\n for (const value of values ?? []) {\n assertNoSecretLikeMetadata(field, value);\n }\n}\n\nfunction sanitizeReviewText(value: string | undefined, fallback: string): string {\n const redacted = redactSecrets(asTrimmed(value) ?? fallback);\n const sanitized = sanitizeMemoryContent(redacted);\n const safe = sanitized.text.trim();\n return safe.length > 0 ? safe : fallback;\n}\n\nfunction sanitizeReviewMetadata(value: string | undefined): string | undefined {\n const trimmed = asTrimmed(value);\n if (!trimmed) return undefined;\n return sanitizeReviewText(trimmed, \"[redacted]\");\n}\n\nfunction sanitizeReviewTags(tags: string[] | undefined): string[] {\n return Array.from(\n new Set(\n (tags ?? [])\n .map((tag) => sanitizeReviewMetadata(tag))\n .filter((tag): tag is string => typeof tag === \"string\" && tag.length > 0)\n )\n );\n}\n\nfunction normalizeExplicitCaptureError(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();\n const rendered = String(error).trim();\n return rendered.length > 0 ? rendered : \"explicit capture failed\";\n}\n\nfunction isUnsupportedExplicitCaptureNamespaceError(error: unknown): boolean {\n return normalizeExplicitCaptureError(error).startsWith(\"unsupported namespace:\");\n}\n\nfunction resolveExplicitCaptureReviewNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n return resolveExplicitCaptureNamespace(orchestrator, normalized);\n}\n\nfunction resolveExplicitCaptureNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n if (!resolveNamespaceCapabilities(orchestrator.config).namespaces) {\n if (normalized !== orchestrator.config.defaultNamespace) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n }\n const allowed = new Set(\n [\n orchestrator.config.defaultNamespace,\n orchestrator.config.sharedNamespace,\n ...orchestrator.config.namespacePolicies.map((policy) => policy.name),\n ]\n .map((value) => value.trim())\n .filter(Boolean)\n );\n if (!allowed.has(normalized)) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n}\n\nfunction parseExplicitCaptureTtl(ttl: string | undefined): string | undefined {\n const raw = asTrimmed(ttl);\n if (!raw) return undefined;\n\n const absoluteMs = Date.parse(raw);\n if (Number.isFinite(absoluteMs)) {\n return new Date(absoluteMs).toISOString();\n }\n\n const relative = raw.match(/^(\\d+)\\s*([mhdw])$/i);\n if (!relative) {\n throw new Error(\"ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w\");\n }\n\n const amount = Number.parseInt(relative[1] ?? \"\", 10);\n const unit = (relative[2] ?? \"\").toLowerCase();\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\"ttl duration must be a positive integer\");\n }\n\n const multiplier =\n unit === \"m\" ? 60_000 : unit === \"h\" ? 60 * 60_000 : unit === \"d\" ? 24 * 60 * 60_000 : 7 * 24 * 60 * 60_000;\n return new Date(Date.now() + amount * multiplier).toISOString();\n}\n\nfunction parseInlineConfidence(value: string): number {\n const trimmed = value.trim();\n if (!/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(trimmed)) {\n return Number.NaN;\n }\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nfunction parseInlineNote(block: string): ExplicitCaptureInput {\n const lines = block.replace(/\\r/g, \"\").split(\"\\n\");\n const note: Partial<ExplicitCaptureInput> = {};\n let idx = 0;\n\n while (idx < lines.length) {\n const rawLine = lines[idx] ?? \"\";\n const line = rawLine.trim();\n idx += 1;\n if (line.length === 0) continue;\n const colonIdx = line.indexOf(\":\");\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n\n if (key === \"content\" && value === \"|\") {\n const contentLines: string[] = [];\n while (idx < lines.length) {\n const next = lines[idx] ?? \"\";\n if (next.startsWith(\" \") || next.startsWith(\"\\t\")) {\n contentLines.push(next.replace(/^( |\\t)/, \"\"));\n idx += 1;\n continue;\n }\n if (next.trim().length === 0) {\n contentLines.push(\"\");\n idx += 1;\n continue;\n }\n break;\n }\n note.content = contentLines.join(\"\\n\").trim();\n continue;\n }\n\n switch (key) {\n case \"content\":\n note.content = value;\n break;\n case \"category\":\n note.category = value;\n break;\n case \"confidence\":\n note.confidence = parseInlineConfidence(value);\n break;\n case \"namespace\":\n note.namespace = value;\n break;\n case \"tags\":\n note.tags = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n break;\n case \"entityRef\":\n note.entityRef = value;\n break;\n case \"ttl\":\n note.ttl = value;\n break;\n case \"sourceReason\":\n note.sourceReason = value;\n break;\n default:\n break;\n }\n }\n\n return { content: \"\", ...note };\n}\n\nfunction parseInlineExplicitCaptureCandidates(text: string): ExplicitCaptureInput[] {\n const notes: ExplicitCaptureInput[] = [];\n for (const match of text.matchAll(INLINE_NOTE_RE)) {\n notes.push(parseInlineNote(match[1] ?? \"\"));\n }\n return notes;\n}\n\nexport function parseInlineExplicitCaptureNotes(text: string): ExplicitCaptureInput[] {\n return parseInlineExplicitCaptureCandidates(text).filter((note) => asTrimmed(note.content));\n}\n\nexport function hasInlineExplicitCaptureMarkup(text: string): boolean {\n return INLINE_NOTE_MARKUP_RE.test(text);\n}\n\nexport function stripInlineExplicitCaptureNotes(text: string): string {\n return text.replace(INLINE_NOTE_RE, \"\").trim();\n}\n\nexport function validateExplicitCaptureInput(\n input: ExplicitCaptureInput,\n mode: ExplicitCaptureValidationMode = \"strict_explicit\"\n): ValidExplicitCapture {\n const content = asTrimmed(input.content);\n if (!content) throw new Error(\"content is required\");\n if (mode === \"strict_explicit\") {\n if (content.length < 10) throw new Error(\"content must be at least 10 characters\");\n if (content.length > 4000) throw new Error(\"content must be 4000 characters or fewer\");\n }\n if (/<memory_note>/i.test(content) || /<\\/memory_note>/i.test(content)) {\n throw new Error(\"nested memory_note blocks are not allowed\");\n }\n\n const category = (asTrimmed(input.category) ?? \"fact\") as MemoryCategory;\n if (!INLINE_ALLOWED_CATEGORIES.has(category)) {\n throw new Error(`unsupported category: ${input.category ?? category}`);\n }\n\n const sanitized = sanitizeMemoryContent(content);\n if (!sanitized.clean) {\n throw new Error(\"content failed memory sanitization\");\n }\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(content)) {\n throw new Error(\"content appears to contain a secret or credential\");\n }\n }\n assertNoSecretLikeMetadata(\"sourceReason\", input.sourceReason);\n assertNoSecretLikeMetadata(\"entityRef\", input.entityRef);\n assertNoSecretLikeMetadata(\"ttl\", input.ttl);\n assertNoSecretLikeMetadataList(\"tags\", input.tags);\n\n if (input.confidence !== undefined && !Number.isFinite(input.confidence)) {\n throw new Error(\"confidence must be a finite number\");\n }\n const confidence = input.confidence === undefined ? 0.95 : Number(input.confidence);\n if (confidence < 0 || confidence > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n const requestedNamespace = asTrimmed(input.namespace);\n if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {\n throw new Error(`unsafe namespace: ${requestedNamespace}`);\n }\n const expiresAt = parseExplicitCaptureTtl(input.ttl);\n\n // #2014 review round: enforce the composer's tag contract HERE so a capture\n // that passes validation can never fail later at strict compose time\n // (validated-then-thrown was a broken contract). Same limits as TAG_LIMITS.\n const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));\n if (dedupedTags.length > TAG_LIMITS.maxTags) {\n throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);\n }\n for (const tag of dedupedTags) {\n if (tag.length > TAG_LIMITS.maxTagLength) {\n throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}…`);\n }\n }\n\n return {\n content,\n category,\n confidence,\n namespace: asTrimmed(input.namespace),\n tags: dedupedTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n // Trimmed like the other optional metadata (#2017 review round): a\n // whitespace-only connector previously passed validation and then blew\n // up at strict compose time - validated input must always compose.\n sourceConnector: asTrimmed(input.sourceConnector),\n expiresAt,\n };\n}\n\nasync function findDuplicateExplicitCapture(\n orchestrator: Orchestrator,\n resolvedNamespace: string | undefined,\n candidate: ValidExplicitCapture,\n storageOverride?: StorageManager\n): Promise<{ id: string; tombstoneBlocked: boolean } | null> {\n const storage = storageOverride ?? (await orchestrator.getStorage(resolvedNamespace));\n // Tombstone-blocked rows are absent from the active fact hash index. An\n // authoritative miss can therefore skip the corpus scan only after the\n // targeted blocked-row index reports a miss and remains authoritative.\n let authoritativeFactHashMiss = false;\n if (candidate.category === \"fact\" && typeof storage.hasFactContentHash === \"function\") {\n try {\n const hasHash = await storage.hasFactContentHash(candidate.content);\n if (!hasHash) {\n const authoritative =\n typeof storage.isFactContentHashAuthoritative === \"function\"\n ? await storage.isFactContentHashAuthoritative()\n : false;\n authoritativeFactHashMiss = authoritative;\n }\n } catch (err) {\n // Fail open: hash indexes are only an optimization, so fall back to the\n // full corpus scan when either index cannot answer.\n void err;\n }\n }\n if (authoritativeFactHashMiss) {\n const checkBlockedIndex = storage.checkTombstoneBlockedExplicitCapture;\n if (typeof checkBlockedIndex === \"function\") {\n try {\n const result = await checkBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!result.has && result.authoritative) return null;\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n } else {\n const hasBlockedIndex = storage.hasTombstoneBlockedExplicitCapture;\n if (typeof hasBlockedIndex === \"function\") {\n try {\n const hasBlocked = await hasBlockedIndex.call(\n storage,\n candidate.content,\n candidate.category,\n candidate.sourceConnector\n );\n if (!hasBlocked) {\n const isIndexAuthoritative =\n typeof storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative === \"function\"\n ? await storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative()\n : false;\n if (isIndexAuthoritative) return null;\n }\n } catch (err) {\n // Fail open: an unavailable targeted index must not hide a durable\n // pending-review duplicate.\n void err;\n }\n }\n }\n }\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n const existing = [...hotMemories, ...coldMemories];\n const normalizedCandidate = normalizeExplicitCaptureContent(candidate.content);\n const match = existing.find((memory) => {\n if (isSupportPassportPrivateMemory(memory)) return false;\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"active\" && (status !== \"pending_review\" || !memory.frontmatter.blockedBy)) {\n return false;\n }\n if (memory.frontmatter.category !== candidate.category) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalizedCandidate) return false;\n // Connector-aware dedup: same content from different connectors is NOT\n // a duplicate. Operator (undefined) and connector-tagged memories are\n // always distinct. Normalize empty strings to undefined.\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = candidate.sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match\n ? {\n id: match.frontmatter.id,\n tombstoneBlocked: match.frontmatter.status === \"pending_review\" && Boolean(match.frontmatter.blockedBy),\n }\n : null;\n}\nasync function persistExplicitCaptureUnlocked(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource,\n resolvedNamespace: string | undefined,\n storage: StorageManager\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const duplicate = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate, storage);\n if (duplicate) {\n return duplicate.tombstoneBlocked\n ? { id: duplicate.id, duplicateOf: duplicate.id, tombstoneBlocked: true }\n : { id: duplicate.id, duplicateOf: duplicate.id };\n }\n\n // #1645 (review thread yG-): surface the tombstone block so callers\n // (memory_store tool, access-service HTTP/MCP) can report the capture as\n // queued for review instead of a successfully stored active memory.\n // Sealed-envelope write (issue #1989 PR2).\n const captureEnvelope = composeMemoryEnvelope(\n {\n content: candidate.content,\n category: candidate.category,\n confidence: candidate.confidence,\n tags: candidate.tags,\n ...(candidate.entityRef ? { entityRef: candidate.entityRef } : {}),\n ...(candidate.expiresAt ? { ttl: candidate.expiresAt } : {}),\n ...(candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {}),\n ...(candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline\" : \"explicit\" }\n );\n const { id, duplicateOf, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);\n if (duplicateOf) return { id, duplicateOf, tombstoneBlocked };\n // #1522: catalog touch handled at the storage chokepoint — the StorageManager's\n // post-write hook records the namespace touch automatically.\n\n const created = new Date().toISOString();\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: tombstoneBlocked ? \"explicit_capture_queued\" : \"explicit_capture_accepted\",\n timestamp: created,\n actor: explicitCaptureActor(source),\n reasonCode: candidate.sourceReason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n\n return { id, duplicateOf, tombstoneBlocked };\n}\n\nexport async function persistExplicitCapture(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource\n): Promise<{ id: string; duplicateOf?: string; tombstoneBlocked?: boolean }> {\n const resolvedNamespace = candidate.namespacePreResolved\n ? asTrimmed(candidate.namespace)\n : resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);\n const storage = await orchestrator.getStorage(resolvedNamespace);\n const persist = () => persistExplicitCaptureUnlocked(orchestrator, candidate, source, resolvedNamespace, storage);\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await persist();\n const lockIdentity = buildExplicitCaptureDedupKey(candidate.content, candidate.category, candidate.sourceConnector);\n return await storage.withTombstoneBlockedCaptureWriteLock(persist, lockIdentity);\n}\n\nfunction buildExplicitCaptureReviewContent(input: ExplicitCaptureInput, reason: string): string {\n const requestedContent = asTrimmed(input.content);\n const safeContent = sanitizeReviewText(requestedContent, \"[empty explicit capture]\");\n const safeCategory = sanitizeReviewMetadata(input.category);\n const safeNamespace = sanitizeReviewMetadata(input.namespace);\n const safeEntityRef = sanitizeReviewMetadata(input.entityRef);\n const safeTtl = sanitizeReviewMetadata(input.ttl);\n const safeSourceReason = sanitizeReviewMetadata(input.sourceReason);\n const safeTags = sanitizeReviewTags(input.tags);\n const lines = [\"Explicit capture queued for review.\", \"\", `Reason: ${reason}`, \"\", \"Submitted content:\", safeContent];\n const metadata = [\n safeCategory ? `Requested category: ${safeCategory}` : undefined,\n safeNamespace ? `Requested namespace: ${safeNamespace}` : undefined,\n safeEntityRef ? `Requested entityRef: ${safeEntityRef}` : undefined,\n safeTtl ? `Requested ttl: ${safeTtl}` : undefined,\n safeSourceReason ? `Requested sourceReason: ${safeSourceReason}` : undefined,\n safeTags.length > 0 ? `Requested tags: ${safeTags.join(\", \")}` : undefined,\n ].filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n if (metadata.length > 0) {\n lines.push(\"\", ...metadata);\n }\n return lines.join(\"\\n\");\n}\n\nfunction explicitCaptureReviewNamespaces(\n orchestrator: Orchestrator,\n queueNamespace: string | undefined\n): Array<string | undefined> {\n const config = orchestrator.config;\n return [asTrimmed(queueNamespace) ?? asTrimmed(config?.defaultNamespace)];\n}\n\nasync function findQueuedExplicitCaptureDuplicate(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n content: string,\n sourceConnector?: string\n): Promise<string | null> {\n const storages = Array.from(\n new Set(\n await Promise.all(\n explicitCaptureReviewNamespaces(orchestrator, namespace).map((reviewNamespace) =>\n orchestrator.getStorage(reviewNamespace)\n )\n )\n )\n );\n const memorySets = await Promise.all(\n storages.map(async (storage) => {\n const hotMemories = await storage.readAllMemories();\n const coldMemories = typeof storage.readAllColdMemories === \"function\" ? await storage.readAllColdMemories() : [];\n return [...hotMemories, ...coldMemories];\n })\n );\n const existing = memorySets.flat();\n const normalized = normalizeExplicitCaptureContent(content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"pending_review\") return false;\n if (!(memory.frontmatter.tags ?? []).includes(\"queued-review\")) return false;\n if (normalizeExplicitCaptureContent(memory.content) !== normalized) return false;\n const existingConnector = memory.frontmatter.sourceConnector?.trim() || undefined;\n const newConnector = sourceConnector?.trim() || undefined;\n if (existingConnector !== newConnector) return false;\n return true;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport type ExplicitCaptureReviewQueueOptions = {\n /** A server-authorized namespace resolved from the authenticated session. */\n resolvedNamespace?: string;\n};\n\nexport async function queueExplicitCaptureForReview(\n orchestrator: Orchestrator,\n input: ExplicitCaptureInput,\n source: ExplicitCaptureSource,\n error: unknown,\n options: ExplicitCaptureReviewQueueOptions = {}\n): Promise<{ id: string; duplicateOf?: string }> {\n const reason = sanitizeReviewText(normalizeExplicitCaptureError(error), \"explicit capture failed\");\n const requestedNamespace = asTrimmed(input.namespace);\n const resolvedNamespace = asTrimmed(options.resolvedNamespace);\n // A caller-pre-authorized namespace (e.g. a session-owned project overlay\n // from the access service) routes directly; otherwise apply the static\n // policy allow-list guard (#1434).\n const queueNamespace =\n resolvedNamespace ??\n ((input as { namespacePreResolved?: boolean }).namespacePreResolved\n ? requestedNamespace\n : resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace));\n const content = buildExplicitCaptureReviewContent(input, reason);\n const requestedCategory = asTrimmed(input.category);\n const reviewCategory =\n requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory as MemoryCategory)\n ? (requestedCategory as MemoryCategory)\n : \"fact\";\n const requestedTags = sanitizeReviewTags(input.tags);\n const storage = await orchestrator.getStorage(queueNamespace);\n const lockIdentity = buildExplicitCaptureDedupKey(content, reviewCategory, input.sourceConnector);\n const queue = async (): Promise<{ id: string; duplicateOf?: string }> => {\n const duplicateOf = await findQueuedExplicitCaptureDuplicate(\n orchestrator,\n queueNamespace,\n content,\n input.sourceConnector\n );\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const reviewEnvelope = composeMemoryEnvelope(\n {\n content,\n category: reviewCategory,\n confidence: 0.2,\n tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),\n ...(sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {}),\n ...(input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}),\n },\n { source: source === \"inline\" ? \"explicit-inline-review\" : \"explicit-review\" },\n // The review queue is the FALLBACK for a capture that already failed\n // primary validation — it must never be un-queueable. The tag list is\n // machine-assembled (requested tags + the two fixed review tags), so 49+\n // requested tags would push past the 50-tag limit and strict compose\n // would throw, losing the capture (#2014 review round). Salvage clamps\n // instead; the fixed review tags sort first in the assembly above, so\n // they always survive the clamp.\n { salvage: true }\n );\n const { id } = await storage.writeSealedMemory(reviewEnvelope);\n try {\n const created = await storage.getMemoryById(id);\n if (created) {\n await storage.writeMemoryFrontmatter(\n created,\n {\n status: \"pending_review\",\n updated: new Date().toISOString(),\n },\n {\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n }\n );\n }\n } finally {\n // Record the catalog write touch (issue #1499, round 5/6 codex P2; NIhUg).\n // A queued review capture writes memory to the namespace's root (the DEFAULT\n // root when undefined), so its `lastWriteAt` must reflect the write once\n // `writeMemory` returns an id. If the later pending-review frontmatter update\n // fails, the memory file is still durable and must not disappear from\n // writtenSince/maintenance scheduling. Guarded optional hook (rule #33).\n // #1522: catalog touch handled at the storage chokepoint.\n }\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"explicit_capture_queued\",\n timestamp: new Date().toISOString(),\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n return { id };\n };\n if (typeof storage.withTombstoneBlockedCaptureWriteLock !== \"function\") return await queue();\n return await storage.withTombstoneBlockedCaptureWriteLock(queue, lockIdentity);\n}\n\nexport function shouldSkipImplicitExtraction(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode === \"explicit\";\n}\n\nexport function shouldProcessInlineExplicitCapture(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode !== \"implicit\";\n}\n\nexport interface InlineExplicitCaptureProcessRequest {\n content: string;\n captureMode: CaptureMode;\n dedupeKeys?: readonly string[];\n namespace?: string;\n namespacePreResolved?: boolean;\n reviewNamespace?: string;\n reviewNamespacePreResolved?: boolean;\n sourceConnector?: string;\n}\n\nexport interface InlineExplicitCaptureProcessResult {\n content: string;\n processed: number;\n accepted: number;\n queued: number;\n duplicates: number;\n failed: number;\n}\n\nexport interface InlineExplicitCaptureProcessorOptions {\n sourceConnector?: string;\n maxDedupeKeys?: number;\n}\n\nconst DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT = 1024;\n\nexport class InlineExplicitCaptureProcessor {\n private readonly observedKeys = new Set<string>();\n private readonly observedKeyOrder: string[] = [];\n private readonly maxDedupeKeys: number;\n private readonly processingTails = new Map<string, Promise<void>>();\n\n constructor(\n private readonly orchestrator: Orchestrator,\n private readonly options: InlineExplicitCaptureProcessorOptions = {}\n ) {\n const requestedLimit = options.maxDedupeKeys ?? DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n this.maxDedupeKeys =\n Number.isFinite(requestedLimit) && requestedLimit > 0\n ? Math.max(1, Math.floor(requestedLimit))\n : DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;\n }\n\n private enqueue<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const previous = this.processingTails.get(key) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.processingTails.set(key, current);\n return previous.then(operation).finally(() => {\n if (this.processingTails.get(key) === current) this.processingTails.delete(key);\n release();\n });\n }\n\n private buildDedupeKeys(\n dedupeKeys: readonly string[] | undefined,\n input: ExplicitCaptureInput,\n namespacePreResolved: boolean,\n fallbackReviewNamespace?: string\n ): { replayKeys: string[]; validationFailureKey: string } {\n let fallbackNamespace: string | undefined;\n let effectiveNamespace = asTrimmed(input.namespace);\n if (!namespacePreResolved) {\n try {\n effectiveNamespace = resolveExplicitCaptureNamespace(this.orchestrator, effectiveNamespace);\n } catch {\n fallbackNamespace = asTrimmed(fallbackReviewNamespace) ?? this.orchestrator.config.defaultNamespace;\n effectiveNamespace = fallbackNamespace;\n }\n }\n const requestedNamespace = asTrimmed(input.namespace);\n const namespaceScope =\n fallbackNamespace === undefined\n ? effectiveNamespace ?? this.orchestrator.config.defaultNamespace\n : `${fallbackNamespace}\\u0000requested:${requestedNamespace ?? \"\"}`;\n const sourceConnectorScope = asTrimmed(input.sourceConnector) ?? \"\";\n const deliveryKeys = Array.from(\n new Set((dedupeKeys ?? []).map((key) => asTrimmed(key)).filter((key): key is string => key !== undefined))\n ).sort();\n const noteHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: normalizeExplicitCaptureContent(input.content),\n category: asTrimmed(input.category) ?? \"fact\",\n })\n )\n .digest(\"hex\");\n const validationTags = Array.from(\n new Set((input.tags ?? []).map((tag) => asTrimmed(tag)).filter((tag): tag is string => tag !== undefined))\n ).sort();\n const validationHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n content: asTrimmed(input.content) ?? \"\",\n category: asTrimmed(input.category) ?? \"fact\",\n confidence:\n input.confidence === undefined\n ? \"default\"\n : Number.isFinite(input.confidence)\n ? input.confidence\n : \"invalid\",\n namespace: asTrimmed(input.namespace),\n tags: validationTags,\n entityRef: asTrimmed(input.entityRef),\n sourceReason: asTrimmed(input.sourceReason),\n ttl: asTrimmed(input.ttl),\n deliveryKeys,\n })\n )\n .digest(\"hex\");\n const identityPrefix = `${namespaceScope}\\u0000${sourceConnectorScope}\\u0000`;\n const fallbackKey = `${identityPrefix}fallback:inline-memory-note:${noteHash}`;\n return {\n replayKeys:\n deliveryKeys.length > 0\n ? deliveryKeys.map((key) => `${identityPrefix}${key}:inline-memory-note:${noteHash}`)\n : [fallbackKey],\n validationFailureKey: `${identityPrefix}validation:inline-memory-note:${validationHash}`,\n };\n }\n\n private isNamespacePolicyAuthorized(namespace: string | undefined): boolean {\n try {\n resolveExplicitCaptureNamespace(this.orchestrator, namespace);\n return true;\n } catch {\n return false;\n }\n }\n\n private resolveReviewFallbackNamespace(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput\n ): string | undefined {\n if (request.namespacePreResolved === true || this.isNamespacePolicyAuthorized(input.namespace)) return undefined;\n return request.reviewNamespacePreResolved === true\n ? asTrimmed(request.reviewNamespace)\n : this.orchestrator.config.defaultNamespace;\n }\n\n\n private remember(keys: readonly string[]): void {\n for (const key of keys) {\n if (this.observedKeys.has(key)) continue;\n this.observedKeys.add(key);\n this.observedKeyOrder.push(key);\n }\n while (this.observedKeyOrder.length > this.maxDedupeKeys) {\n const expired = this.observedKeyOrder.shift();\n if (expired) this.observedKeys.delete(expired);\n }\n }\n\n private async processNote(\n request: InlineExplicitCaptureProcessRequest,\n input: ExplicitCaptureInput,\n replayKeys: readonly string[],\n validationFailureKey: string\n ): Promise<Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\">> {\n const serializationKey = replayKeys.at(-1) ?? validationFailureKey;\n return this.enqueue(serializationKey, async () => {\n if (replayKeys.some((key) => this.observedKeys.has(key)) || this.observedKeys.has(validationFailureKey)) {\n return { processed: 0, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n\n const classifyPersisted = (\n persisted: Awaited<ReturnType<typeof persistExplicitCapture>>\n ): Pick<InlineExplicitCaptureProcessResult, \"processed\" | \"accepted\" | \"queued\" | \"duplicates\" | \"failed\"> => {\n this.remember(replayKeys);\n if (persisted.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n if (persisted.tombstoneBlocked) {\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note\");\n return { processed: 1, accepted: 1, queued: 0, duplicates: 0, failed: 0 };\n };\n const persistCandidate = async (candidate: ValidExplicitCapture) =>\n classifyPersisted(await persistExplicitCapture(this.orchestrator, candidate, \"inline\"));\n\n let validationSucceeded = false;\n let candidate: ValidExplicitCapture | undefined;\n try {\n candidate = validateExplicitCaptureInput(input);\n if (request.namespacePreResolved === true) candidate.namespacePreResolved = true;\n validationSucceeded = true;\n return await persistCandidate(candidate);\n } catch (error) {\n let captureError: unknown = error;\n if (validationSucceeded && candidate && isTombstoneBlockedCaptureWriteLockBusy(error)) {\n try {\n return await persistCandidate(candidate);\n } catch (retryError) {\n if (isTombstoneBlockedCaptureWriteLockBusy(retryError)) {\n log.warn(\n `explicit inline capture deferred after tombstone write lock contention: ${normalizeExplicitCaptureError(retryError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n captureError = retryError;\n }\n }\n if (validationSucceeded && !isUnsupportedExplicitCaptureNamespaceError(captureError)) {\n log.warn(`explicit inline capture persistence failed: ${normalizeExplicitCaptureError(captureError)}`);\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n\n const queueInput = request.namespacePreResolved === true ? { ...input, namespacePreResolved: true } : input;\n const reviewNamespace = this.resolveReviewFallbackNamespace(request, input);\n try {\n const review = await queueExplicitCaptureForReview(\n this.orchestrator,\n queueInput,\n \"inline\",\n captureError,\n reviewNamespace ? { resolvedNamespace: reviewNamespace } : undefined\n );\n this.remember(validationSucceeded ? replayKeys : [validationFailureKey]);\n if (review.duplicateOf) {\n return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };\n }\n this.orchestrator.requestQmdMaintenanceForTool(\"inline.memory_note.review\");\n return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };\n } catch (queueError) {\n log.warn(\n `explicit inline capture rejected: ${normalizeExplicitCaptureError(captureError)}; review queue fallback failed: ${normalizeExplicitCaptureError(queueError)}`\n );\n return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };\n }\n }\n });\n }\n\n async process(request: InlineExplicitCaptureProcessRequest): Promise<InlineExplicitCaptureProcessResult> {\n if (!shouldProcessInlineExplicitCapture({ captureMode: request.captureMode })) {\n return { content: request.content, processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 0 };\n }\n if (request.namespacePreResolved === true && !asTrimmed(request.namespace)) {\n throw new Error(\"namespacePreResolved requires a resolved namespace\");\n }\n if (request.reviewNamespacePreResolved === true && !asTrimmed(request.reviewNamespace)) {\n throw new Error(\"reviewNamespacePreResolved requires a resolved namespace\");\n }\n\n const notes = parseInlineExplicitCaptureCandidates(request.content);\n const content = hasInlineExplicitCaptureMarkup(request.content)\n ? stripInlineExplicitCaptureNotes(request.content)\n : request.content;\n const sourceConnector = asTrimmed(request.sourceConnector) ?? asTrimmed(this.options.sourceConnector);\n let processed = 0;\n let accepted = 0;\n let queued = 0;\n let duplicates = 0;\n let failed = 0;\n\n for (const note of notes) {\n const input: ExplicitCaptureInput = {\n ...note,\n ...(request.namespace !== undefined ? { namespace: request.namespace } : {}),\n ...(sourceConnector ? { sourceConnector } : {}),\n };\n const { replayKeys, validationFailureKey } = this.buildDedupeKeys(\n request.dedupeKeys,\n input,\n request.namespacePreResolved === true,\n this.resolveReviewFallbackNamespace(request, input)\n );\n const result = await this.processNote(request, input, replayKeys, validationFailureKey);\n processed += result.processed;\n accepted += result.accepted;\n queued += result.queued;\n duplicates += result.duplicates;\n failed += result.failed;\n }\n\n return { content, processed, accepted, queued, duplicates, failed };\n }\n}\n"],"mappings":"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","names":["candidate"]}
|
|
@@ -16,6 +16,7 @@ var WriteRateLimiter = class {
|
|
|
16
16
|
// One rolling window per principal. Empty buckets are pruned so the map does
|
|
17
17
|
// not grow without bound.
|
|
18
18
|
buckets = /* @__PURE__ */ new Map();
|
|
19
|
+
inFlight = /* @__PURE__ */ new Map();
|
|
19
20
|
lastLogAt = 0;
|
|
20
21
|
suppressed = 0;
|
|
21
22
|
constructor(maxRequests, windowMs) {
|
|
@@ -37,15 +38,19 @@ var WriteRateLimiter = class {
|
|
|
37
38
|
if (slots.length === 0) this.buckets.delete(key);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
/**
|
|
41
|
+
/** Committed slots for a principal (test/introspection). */
|
|
41
42
|
slotsFor(principal) {
|
|
42
43
|
return this.buckets.get(this.key(principal)) ?? [];
|
|
43
44
|
}
|
|
45
|
+
inFlightFor(principal) {
|
|
46
|
+
return this.inFlight.get(this.key(principal)) ?? 0;
|
|
47
|
+
}
|
|
44
48
|
/** Total live reservations across all principals (test/introspection). */
|
|
45
49
|
totalSlots() {
|
|
46
50
|
this.sweep(Date.now());
|
|
47
51
|
let total = 0;
|
|
48
52
|
for (const slots of this.buckets.values()) total += slots.length;
|
|
53
|
+
for (const count of this.inFlight.values()) total += count;
|
|
49
54
|
return total;
|
|
50
55
|
}
|
|
51
56
|
/** True if a write may proceed for the principal. Logs (sampled) when not. */
|
|
@@ -53,7 +58,7 @@ var WriteRateLimiter = class {
|
|
|
53
58
|
this.sweep(Date.now());
|
|
54
59
|
const key = this.key(principal);
|
|
55
60
|
const slots = this.buckets.get(key);
|
|
56
|
-
if (slots
|
|
61
|
+
if ((slots?.length ?? 0) + (this.inFlight.get(key) ?? 0) >= this.maxRequests) {
|
|
57
62
|
this.logRejected(key);
|
|
58
63
|
return false;
|
|
59
64
|
}
|
|
@@ -63,29 +68,31 @@ var WriteRateLimiter = class {
|
|
|
63
68
|
record(principal) {
|
|
64
69
|
this.sweep(Date.now());
|
|
65
70
|
const key = this.key(principal);
|
|
66
|
-
|
|
71
|
+
let slots = this.buckets.get(key);
|
|
72
|
+
if (!slots) {
|
|
73
|
+
slots = [];
|
|
74
|
+
this.buckets.set(key, slots);
|
|
75
|
+
}
|
|
67
76
|
slots.push({ recordedAt: Date.now() });
|
|
68
77
|
}
|
|
69
78
|
/**
|
|
70
|
-
* Reserve a slot for an in-flight write.
|
|
71
|
-
*
|
|
79
|
+
* Reserve a slot for an in-flight write. Commit starts the rolling window
|
|
80
|
+
* when persistence finishes. Release restores capacity after a failed write.
|
|
72
81
|
*/
|
|
73
82
|
reserve(principal) {
|
|
74
83
|
if (!this.hasCapacity(principal)) return null;
|
|
75
84
|
const key = this.key(principal);
|
|
76
|
-
|
|
77
|
-
const slot = { recordedAt: Date.now() };
|
|
78
|
-
slots.push(slot);
|
|
85
|
+
this.inFlight.set(key, (this.inFlight.get(key) ?? 0) + 1);
|
|
79
86
|
let active = true;
|
|
80
|
-
|
|
87
|
+
const finish = (committed) => {
|
|
81
88
|
if (!active) return;
|
|
82
89
|
active = false;
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
if (current.length === 0) this.buckets.delete(key);
|
|
90
|
+
const count = this.inFlight.get(key) ?? 0;
|
|
91
|
+
if (count <= 1) this.inFlight.delete(key);
|
|
92
|
+
else this.inFlight.set(key, count - 1);
|
|
93
|
+
if (committed) this.record(principal);
|
|
88
94
|
};
|
|
95
|
+
return { commit: () => finish(true), release: () => finish(false) };
|
|
89
96
|
}
|
|
90
97
|
logRejected(principal) {
|
|
91
98
|
const now = Date.now();
|
|
@@ -104,4 +111,4 @@ var WriteRateLimiter = class {
|
|
|
104
111
|
export {
|
|
105
112
|
WriteRateLimiter
|
|
106
113
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
114
|
+
//# sourceMappingURL=chunk-TB6CBZ5V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/write-rate-limiter.ts"],"sourcesContent":["/**\n * Per-principal write rate limiter for the access HTTP surface\n * (issues #1937 / #2029).\n *\n * Extracted from access-http.ts so the limiter is a cohesive unit. Each\n * principal (authenticated caller identity) gets its own rolling-window\n * bucket, so one chatty connector cannot starve writes for the others;\n * requests with no resolved principal share a single global bucket.\n *\n * Deliberately transport-agnostic: it never throws `HttpError` — callers\n * translate a refusal into their own 429. It logs a sampled warning when it\n * refuses a write, so a sustained limit condition is diagnosable server-side\n * (previously the refusal was a bare throw with no trace).\n */\n\nimport { log } from \"./logger.js\";\n\n// Defaults; overridable per instance via the constructor (config/env feed these\n// through the server's `writeRateLimit*` settings).\nconst DEFAULT_WINDOW_MS = 60_000;\nconst DEFAULT_MAX_REQUESTS = 30;\n// At most one rejection warning per this interval, carrying a rejected-count,\n// so a storm is visible without flooding the log.\nconst LOG_INTERVAL_MS = 10_000;\n// Bucket key for requests with no resolved principal.\nconst GLOBAL_BUCKET = \"\";\n\ntype Slot = { readonly recordedAt: number };\n\nexport interface WriteRateLimitReservation {\n commit(): void;\n release(): void;\n}\n\nfunction sanitizePositiveInteger(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 1 ? value : fallback;\n}\n\nexport class WriteRateLimiter {\n readonly maxRequests: number;\n readonly windowMs: number;\n // One rolling window per principal. Empty buckets are pruned so the map does\n // not grow without bound.\n private readonly buckets = new Map<string, Slot[]>();\n private readonly inFlight = new Map<string, number>();\n private lastLogAt = 0;\n private suppressed = 0;\n\n constructor(maxRequests?: number, windowMs?: number) {\n this.maxRequests = sanitizePositiveInteger(maxRequests, DEFAULT_MAX_REQUESTS);\n this.windowMs = sanitizePositiveInteger(windowMs, DEFAULT_WINDOW_MS);\n }\n\n private key(principal?: string): string {\n return principal?.trim() ? principal.trim() : GLOBAL_BUCKET;\n }\n\n private prune(slots: Slot[], now: number): void {\n while (slots.length > 0 && now - (slots[0]?.recordedAt ?? 0) >= this.windowMs) {\n slots.shift();\n }\n }\n\n /** Prune every bucket to the current window; drop buckets that go empty. */\n private sweep(now: number): void {\n for (const [key, slots] of this.buckets) {\n this.prune(slots, now);\n if (slots.length === 0) this.buckets.delete(key);\n }\n }\n\n /** Committed slots for a principal (test/introspection). */\n slotsFor(principal?: string): ReadonlyArray<Slot> {\n return this.buckets.get(this.key(principal)) ?? [];\n }\n\n inFlightFor(principal?: string): number {\n return this.inFlight.get(this.key(principal)) ?? 0;\n }\n\n /** Total live reservations across all principals (test/introspection). */\n totalSlots(): number {\n this.sweep(Date.now());\n let total = 0;\n for (const slots of this.buckets.values()) total += slots.length;\n for (const count of this.inFlight.values()) total += count;\n return total;\n }\n\n /** True if a write may proceed for the principal. Logs (sampled) when not. */\n hasCapacity(principal?: string): boolean {\n this.sweep(Date.now());\n const key = this.key(principal);\n const slots = this.buckets.get(key);\n if ((slots?.length ?? 0) + (this.inFlight.get(key) ?? 0) >= this.maxRequests) {\n this.logRejected(key);\n return false;\n }\n return true;\n }\n\n /** Record a committed write against the principal's rolling window. */\n record(principal?: string): void {\n this.sweep(Date.now());\n const key = this.key(principal);\n let slots = this.buckets.get(key);\n if (!slots) {\n slots = [];\n this.buckets.set(key, slots);\n }\n slots.push({ recordedAt: Date.now() });\n }\n\n /**\n * Reserve a slot for an in-flight write. Commit starts the rolling window\n * when persistence finishes. Release restores capacity after a failed write.\n */\n reserve(principal?: string): WriteRateLimitReservation | null {\n if (!this.hasCapacity(principal)) return null;\n const key = this.key(principal);\n this.inFlight.set(key, (this.inFlight.get(key) ?? 0) + 1);\n let active = true;\n const finish = (committed: boolean) => {\n if (!active) return;\n active = false;\n const count = this.inFlight.get(key) ?? 0;\n if (count <= 1) this.inFlight.delete(key);\n else this.inFlight.set(key, count - 1);\n if (committed) this.record(principal);\n };\n return { commit: () => finish(true), release: () => finish(false) };\n }\n\n private logRejected(principal: string): void {\n const now = Date.now();\n this.suppressed += 1;\n if (now - this.lastLogAt < LOG_INTERVAL_MS) return;\n const rejected = this.suppressed;\n this.suppressed = 0;\n this.lastLogAt = now;\n const who = principal === GLOBAL_BUCKET ? \"(no principal)\" : principal;\n log.warn(\n `write_rate_limited: rejected ${rejected} write(s) for principal ${who}; per-principal limit is ${this.maxRequests} per ${this.windowMs}ms. Raise server.writeRateLimitMaxRequests (or REMNIC_WRITE_RATE_LIMIT_MAX_REQUESTS) if sustained.`\n );\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSearchBackend
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QZLDRQ4I.js";
|
|
4
4
|
import {
|
|
5
5
|
namespaceIdentityToken,
|
|
6
6
|
normalizeNamespaceIdentity
|
|
@@ -470,4 +470,4 @@ export {
|
|
|
470
470
|
NamespaceSearchRouter,
|
|
471
471
|
normalizeQmdResultPath
|
|
472
472
|
};
|
|
473
|
-
//# sourceMappingURL=chunk-
|
|
473
|
+
//# sourceMappingURL=chunk-TO7ZTWJW.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-QDW3E4RD.js";
|
|
4
4
|
import {
|
|
5
5
|
gatewayTaskChainOptions
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UW5NPZJ2.js";
|
|
7
7
|
import {
|
|
8
8
|
extractJsonCandidates
|
|
9
9
|
} from "./chunk-RGMVMVMF.js";
|
|
@@ -486,4 +486,4 @@ export {
|
|
|
486
486
|
createVerdictCache,
|
|
487
487
|
createDeferCountMap
|
|
488
488
|
};
|
|
489
|
-
//# sourceMappingURL=chunk-
|
|
489
|
+
//# sourceMappingURL=chunk-TWTUGCTY.js.map
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-2AD5SXO4.js";
|
|
14
14
|
import {
|
|
15
15
|
ExtractionDeadlineError
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XZHE2DEN.js";
|
|
17
17
|
import {
|
|
18
18
|
resolvePrincipal
|
|
19
19
|
} from "./chunk-3GD2HFR6.js";
|
|
@@ -792,4 +792,4 @@ var SmartBuffer = class {
|
|
|
792
792
|
export {
|
|
793
793
|
SmartBuffer
|
|
794
794
|
};
|
|
795
|
-
//# sourceMappingURL=chunk-
|
|
795
|
+
//# sourceMappingURL=chunk-UCTS3DDH.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-AAD2ZS6P.js";
|
|
5
5
|
import {
|
|
6
6
|
gatewayTaskChainOptions
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UW5NPZJ2.js";
|
|
8
8
|
import {
|
|
9
9
|
extractJsonCandidates
|
|
10
10
|
} from "./chunk-RGMVMVMF.js";
|
|
@@ -685,4 +685,4 @@ export {
|
|
|
685
685
|
serializeFaithfulnessFields,
|
|
686
686
|
parseFaithfulnessField
|
|
687
687
|
};
|
|
688
|
-
//# sourceMappingURL=chunk-
|
|
688
|
+
//# sourceMappingURL=chunk-UG6VXIOK.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./chunk-JLNBQWZ2.js";
|
|
6
6
|
import {
|
|
7
7
|
runPostConsolidationMaterialize
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BRR5EUTF.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-UKYS3NU5.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M4YHAODQ.js";
|
|
4
4
|
import {
|
|
5
5
|
keyring_exports,
|
|
6
6
|
secureStoreDir
|
|
7
7
|
} from "./chunk-BJMBJZ2Y.js";
|
|
8
|
+
import {
|
|
9
|
+
MutationSerializer
|
|
10
|
+
} from "./chunk-FFAZ2XFU.js";
|
|
8
11
|
import {
|
|
9
12
|
namespaceIdentityToken,
|
|
10
13
|
normalizeNamespaceIdentity
|
|
11
14
|
} from "./chunk-EGGE52UU.js";
|
|
12
|
-
import {
|
|
13
|
-
MutationSerializer
|
|
14
|
-
} from "./chunk-FFAZ2XFU.js";
|
|
15
15
|
import {
|
|
16
16
|
isSafeRouteNamespace
|
|
17
17
|
} from "./chunk-U3PN77QT.js";
|
|
@@ -388,4 +388,4 @@ export {
|
|
|
388
388
|
resolveNamespaceStorageRoot,
|
|
389
389
|
NamespaceStorageRouter
|
|
390
390
|
};
|
|
391
|
-
//# sourceMappingURL=chunk-
|
|
391
|
+
//# sourceMappingURL=chunk-UPLZNJKN.js.map
|
|
@@ -87,12 +87,18 @@ var FallbackLlmClient = class {
|
|
|
87
87
|
* When agentId is provided, uses that agent persona's model chain instead of defaults.
|
|
88
88
|
*/
|
|
89
89
|
async chatCompletion(messages, options = {}) {
|
|
90
|
-
const models = this.getModelChain(
|
|
90
|
+
const models = this.getModelChain(
|
|
91
|
+
options.agentId,
|
|
92
|
+
options.model,
|
|
93
|
+
options.modelChain,
|
|
94
|
+
options.includeDefaultModelFallback
|
|
95
|
+
);
|
|
91
96
|
if (models.length === 0) {
|
|
92
97
|
log.warn("fallback LLM: no models configured in gateway");
|
|
93
98
|
return null;
|
|
94
99
|
}
|
|
95
100
|
const runChain = async (runOptions) => {
|
|
101
|
+
let lastRejectedResponse = null;
|
|
96
102
|
for (let i = 0; i < models.length; i++) {
|
|
97
103
|
if (runOptions.signal?.aborted) {
|
|
98
104
|
throw abortReason(runOptions.signal);
|
|
@@ -102,25 +108,31 @@ var FallbackLlmClient = class {
|
|
|
102
108
|
try {
|
|
103
109
|
const result = await this.tryModel(model, messages, runOptions);
|
|
104
110
|
if (result) {
|
|
105
|
-
|
|
106
|
-
log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
111
|
+
const response = {
|
|
109
112
|
content: result.content,
|
|
110
113
|
modelUsed: model.modelString,
|
|
111
114
|
usage: result.usage
|
|
112
115
|
};
|
|
116
|
+
if (runOptions.acceptResponse && !runOptions.acceptResponse(response)) {
|
|
117
|
+
lastRejectedResponse = response;
|
|
118
|
+
log.debug(`fallback LLM: ${model.modelString} returned rejected output, trying next...`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (isFallback) {
|
|
122
|
+
log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
|
|
123
|
+
}
|
|
124
|
+
return response;
|
|
113
125
|
}
|
|
114
126
|
} catch (err) {
|
|
115
127
|
if (runOptions.signal?.aborted) {
|
|
116
128
|
throw abortReason(runOptions.signal);
|
|
117
129
|
}
|
|
118
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
130
|
+
const errorMsg = runOptions.redactProviderErrors ? "provider error details redacted" : err instanceof Error ? err.message : String(err);
|
|
119
131
|
log.debug(`fallback LLM: ${model.modelString} failed (${errorMsg}), trying next...`);
|
|
120
132
|
}
|
|
121
133
|
}
|
|
122
134
|
log.warn(`fallback LLM: all ${models.length} models in chain failed`);
|
|
123
|
-
return
|
|
135
|
+
return lastRejectedResponse;
|
|
124
136
|
};
|
|
125
137
|
if (typeof options.timeoutMs === "number") {
|
|
126
138
|
if (options.timeoutMs <= 0) {
|
|
@@ -182,7 +194,12 @@ var FallbackLlmClient = class {
|
|
|
182
194
|
return { result: null, failureReason: "http_error" };
|
|
183
195
|
}
|
|
184
196
|
if (!response?.content) {
|
|
185
|
-
const hasModels = this.getModelChain(
|
|
197
|
+
const hasModels = this.getModelChain(
|
|
198
|
+
options.agentId,
|
|
199
|
+
options.model,
|
|
200
|
+
options.modelChain,
|
|
201
|
+
options.includeDefaultModelFallback
|
|
202
|
+
).length > 0;
|
|
186
203
|
return { result: null, failureReason: hasModels ? "http_error" : "no_models" };
|
|
187
204
|
}
|
|
188
205
|
try {
|
|
@@ -209,7 +226,7 @@ var FallbackLlmClient = class {
|
|
|
209
226
|
* matching entry in agents.list[] and uses that persona's model chain.
|
|
210
227
|
* Falls back to agents.defaults.model if agentId is not found or not provided.
|
|
211
228
|
*/
|
|
212
|
-
getModelChain(agentId, modelOverride, modelChainOverride) {
|
|
229
|
+
getModelChain(agentId, modelOverride, modelChainOverride, includeDefaultModelFallback = true) {
|
|
213
230
|
const chain = [];
|
|
214
231
|
const providers = this.gatewayConfig?.models?.providers ?? {};
|
|
215
232
|
let modelConfig;
|
|
@@ -256,7 +273,7 @@ var FallbackLlmClient = class {
|
|
|
256
273
|
chain.push(modelRef);
|
|
257
274
|
}
|
|
258
275
|
}
|
|
259
|
-
if (modelChainOverride?.primary && modelStrings.length > 0) {
|
|
276
|
+
if (includeDefaultModelFallback && modelChainOverride?.primary && modelStrings.length > 0) {
|
|
260
277
|
const defaults = this.gatewayConfig?.agents?.defaults?.model;
|
|
261
278
|
const defaultStrings = [
|
|
262
279
|
...typeof defaults?.primary === "string" ? [defaults.primary] : [],
|
|
@@ -584,7 +601,18 @@ var FallbackLlmClient = class {
|
|
|
584
601
|
max_output_tokens: Math.max(0, Math.floor(options.maxTokens ?? 4096)),
|
|
585
602
|
...buildChatCompletionTemperature(modelId, options.temperature ?? 0.3, {
|
|
586
603
|
assumeOpenAI: shouldAssumeOpenAiChatCompletions(config.baseUrl)
|
|
587
|
-
})
|
|
604
|
+
}),
|
|
605
|
+
...options.store === void 0 ? {} : { store: options.store },
|
|
606
|
+
...options.responsesJsonSchema ? {
|
|
607
|
+
text: {
|
|
608
|
+
format: {
|
|
609
|
+
type: "json_schema",
|
|
610
|
+
name: options.responsesJsonSchema.name,
|
|
611
|
+
strict: true,
|
|
612
|
+
schema: options.responsesJsonSchema.schema
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
} : {}
|
|
588
616
|
};
|
|
589
617
|
if (instructions.length > 0) {
|
|
590
618
|
body.instructions = instructions;
|
|
@@ -708,4 +736,4 @@ export {
|
|
|
708
736
|
fallbackLlmRuntimeContextFromConfig,
|
|
709
737
|
FallbackLlmClient
|
|
710
738
|
};
|
|
711
|
-
//# sourceMappingURL=chunk-
|
|
739
|
+
//# sourceMappingURL=chunk-UW5NPZJ2.js.map
|