@remnic/core 9.54.5 → 9.54.7
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 -24
- package/dist/access-admin-ops-surface.js +32 -29
- package/dist/access-authorization-probe.d.ts +25 -23
- package/dist/access-authorization-probe.js +35 -30
- package/dist/access-boundary.d.ts +26 -24
- package/dist/access-boundary.js +36 -31
- package/dist/access-cli.js +86 -80
- 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 -19
- package/dist/access-extraction-force-flush.js +32 -29
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +22 -22
- package/dist/access-http-lifecycle-flush.d.ts +22 -22
- package/dist/access-http-offline-stream.d.ts +18 -18
- package/dist/access-http-query.js +32 -29
- package/dist/access-http.d.ts +55 -37
- package/dist/access-http.js +52 -43
- package/dist/access-identity-continuity-surface.d.ts +9 -9
- package/dist/access-identity-continuity-surface.js +32 -29
- package/dist/access-lcm-surface.d.ts +21 -21
- package/dist/access-lcm-surface.js +32 -29
- package/dist/access-mcp.d.ts +22 -22
- package/dist/access-mcp.js +40 -36
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-BdHlGd_T.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 +32 -29
- package/dist/access-observe-write-surface.d.ts +22 -22
- package/dist/access-observe-write-surface.js +32 -29
- package/dist/access-offline-manifest.d.ts +9 -9
- package/dist/access-offline-manifest.js +2 -2
- package/dist/access-operations-batch.js +34 -31
- package/dist/access-operations.d.ts +23 -23
- package/dist/access-operations.js +38 -34
- package/dist/access-recall-concurrency.d.ts +21 -21
- package/dist/access-recall-concurrency.js +32 -29
- package/dist/access-recall-response.d.ts +19 -19
- package/dist/access-recall-response.js +32 -29
- package/dist/access-recall-surface.d.ts +19 -19
- package/dist/access-recall-surface.js +32 -29
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-DL7X9hrg.d.ts → access-service-DK82xdNi.d.ts} +1314 -83
- package/dist/access-service-helpers.d.ts +22 -22
- package/dist/access-service.d.ts +31 -31
- package/dist/access-service.js +32 -29
- package/dist/access-surface-catalog.d.ts +22 -22
- 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 +6 -5
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +2 -1
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- 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 +14 -14
- 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 +2 -2
- 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-B90is4d8.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 +15 -15
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-CSY44OKU.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-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
- 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-TKFGFDPJ.js → chunk-3TIZPSJC.js} +4 -4
- package/dist/{chunk-B4T3FQMT.js → chunk-43SEBY2M.js} +1 -1
- package/dist/{chunk-LVKYLMSM.js → chunk-46SZBVDS.js} +2 -2
- package/dist/{chunk-YKZLOPTC.js → chunk-5FD7JMTX.js} +2 -2
- package/dist/{chunk-2PNXOQ4P.js → chunk-5NB726GV.js} +3 -7
- 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-WM5LD6AT.js → chunk-6CYHUWCO.js} +2 -2
- package/dist/{chunk-BIF4SHMD.js → chunk-76JJSXK7.js} +1 -1
- package/dist/chunk-76JJSXK7.js.map +1 -0
- package/dist/{chunk-3SXLD5T3.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-YR65W7BV.js → chunk-BRR5EUTF.js} +3 -3
- package/dist/{chunk-JKW663ZN.js → chunk-CIAI24TQ.js} +2 -2
- package/dist/{chunk-3WGI7F4V.js → chunk-D3LBIUWV.js} +9219 -5233
- package/dist/chunk-D3LBIUWV.js.map +1 -0
- package/dist/{chunk-YDWPYDML.js → chunk-EKTP7MNS.js} +4 -4
- package/dist/{chunk-6LEIWWAF.js → chunk-F2JRDPON.js} +2 -2
- package/dist/{chunk-VYQ4URQB.js → chunk-FFRTNF3L.js} +2 -2
- package/dist/{chunk-TY6MKIWP.js → chunk-FONWBCVY.js} +3 -3
- package/dist/{chunk-XSV2YDCJ.js → chunk-FPLM2TKD.js} +2 -2
- package/dist/{chunk-VTU5IEKY.js → chunk-FTPONF6B.js} +2 -2
- package/dist/{chunk-6PZGKGAO.js → chunk-FWX7W5PM.js} +2 -2
- package/dist/{chunk-QPW3PAIH.js → chunk-G6DFSS6A.js} +2 -2
- package/dist/{chunk-2DD6ZHOM.js → chunk-GJ776BC2.js} +3 -3
- package/dist/{chunk-XKAR4RF6.js → chunk-GN3WRFJY.js} +6 -6
- package/dist/{chunk-RG426DJO.js → chunk-H7NAZ3UB.js} +2 -2
- package/dist/{chunk-BSXGTDVJ.js → chunk-HBUFQRIM.js} +2 -2
- package/dist/{chunk-FFEBSFVT.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-QTO6BMQZ.js → chunk-I3MSGFGD.js} +17 -6
- package/dist/chunk-I3MSGFGD.js.map +1 -0
- package/dist/{chunk-5JKUSBMX.js → chunk-IKP5OYQQ.js} +2 -2
- package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
- package/dist/{chunk-DBY26JJJ.js → chunk-IQ4NVWEF.js} +2 -2
- package/dist/{chunk-7Q7JWLQ4.js → chunk-JYG4OLWH.js} +2 -2
- package/dist/{chunk-3OTSVCPK.js → chunk-K26NWEOC.js} +4 -4
- package/dist/{chunk-WZWZRZ2V.js → chunk-K2UGPTYY.js} +484 -43
- 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-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
- package/dist/{chunk-7RZJWZ46.js → chunk-LEPOP46W.js} +5 -5
- package/dist/{chunk-QQXWFDRD.js → chunk-M4YHAODQ.js} +270 -684
- package/dist/chunk-M4YHAODQ.js.map +1 -0
- package/dist/{chunk-NGT35IGQ.js → chunk-MIH3CJPN.js} +3 -3
- package/dist/{chunk-QPAQSG3F.js → chunk-MK5VEWCR.js} +2 -2
- package/dist/chunk-NISZQW72.js +140 -0
- package/dist/chunk-NISZQW72.js.map +1 -0
- package/dist/{chunk-L7RTUEDG.js → chunk-OCIP6YMD.js} +2 -2
- package/dist/{chunk-2INWPC6E.js → chunk-PG4QBPVG.js} +20 -10
- package/dist/chunk-PG4QBPVG.js.map +1 -0
- package/dist/{chunk-DDA55IVB.js → chunk-PT54WISF.js} +189 -55
- package/dist/chunk-PT54WISF.js.map +1 -0
- package/dist/{chunk-UWJNKGBA.js → chunk-QZLDRQ4I.js} +5 -5
- package/dist/{chunk-UYOXFFEY.js → chunk-RUNORG2P.js} +3 -3
- package/dist/{chunk-LC3FD4BV.js → chunk-RZQ6W2W4.js} +39 -39
- package/dist/{chunk-MRGJZ75M.js → chunk-SMNYAMJD.js} +3 -3
- package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
- package/dist/chunk-TB6CBZ5V.js.map +1 -0
- package/dist/{chunk-DN2IDKI5.js → chunk-TO7ZTWJW.js} +2 -2
- package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
- package/dist/{chunk-CUTFSLSD.js → chunk-UCTS3DDH.js} +2 -2
- package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
- package/dist/{chunk-QOQQMVR2.js → chunk-UKYS3NU5.js} +2 -2
- package/dist/{chunk-VZRFGJCH.js → chunk-UPLZNJKN.js} +2 -2
- package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
- package/dist/chunk-UW5NPZJ2.js.map +1 -0
- package/dist/{chunk-DOOWFDWN.js → chunk-V6ERBR7U.js} +2 -2
- package/dist/{chunk-7HG7MGAP.js → chunk-W5ZKPI34.js} +462 -2673
- package/dist/chunk-W5ZKPI34.js.map +1 -0
- package/dist/{chunk-HNDIND7P.js → chunk-XX4HPFFM.js} +54 -15
- package/dist/chunk-XX4HPFFM.js.map +1 -0
- package/dist/{chunk-N7CXQ5TA.js → chunk-XZHE2DEN.js} +1 -1
- package/dist/chunk-YXQEKCZM.js +223 -0
- package/dist/chunk-YXQEKCZM.js.map +1 -0
- package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
- package/dist/{chunk-F2Y6I74C.js → chunk-ZRZVLB7O.js} +2 -2
- package/dist/{chunk-CLKBV3Z3.js → chunk-ZUKIUXHQ.js} +9 -9
- package/dist/{cli-jfuZXixq.d.ts → cli-BPDUXnAl.d.ts} +5 -5
- package/dist/cli.d.ts +22 -22
- package/dist/cli.js +66 -58
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +14 -14
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +14 -14
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +14 -14
- 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 +2 -2
- package/dist/{contradiction-scan-KCADHXPE.js → contradiction-scan-JDTBXRGW.js} +3 -3
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +16 -16
- 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 +16 -16
- 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-CTDuAVJc.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 +14 -14
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +9 -9
- package/dist/explicit-capture.js +4 -3
- package/dist/external-wiki-access.d.ts +22 -22
- package/dist/external-wiki-access.js +33 -30
- 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 -22
- 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 +20 -20
- package/dist/fallback-llm.d.ts +14 -1
- package/dist/fallback-llm.js +1 -1
- package/dist/{first-start-migration-LMMZFLKK.js → first-start-migration-CRZCZAJN.js} +5 -5
- 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 +30 -747
- package/dist/index.js +203 -118
- 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 +2 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +2 -2
- 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 +14 -14
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +15 -15
- package/dist/{maintenance-heMZSq7G.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +22 -22
- 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-store.d.ts +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 +15 -15
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +6 -6
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +14 -14
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +17 -17
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +23 -22
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +19 -19
- package/dist/{orchestrator-BQQPsSjs.d.ts → orchestrator-D85CzDDY.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -9
- package/dist/orchestrator.js +86 -80
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-DFfmsnGk.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-D3GBeII4.d.ts +25 -0
- package/dist/{qmd-BF5bcVRs.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 +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +3 -2
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/{scope-profiles-CbUOsE_E.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 +5 -5
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +9 -9
- 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-DAB3xdKM.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +15 -15
- package/dist/semantic-rule-promotion.js +14 -14
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +14 -14
- package/dist/{service-DGKg2O6r.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 +16 -16
- package/dist/{storage-CC1jKcWg.d.ts → storage-qOnaJ1Lw.d.ts} +4 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +13 -13
- 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 +1 -1
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-JDN6HRNT.js → tier-stats-EXYSKSVN.js} +3 -3
- 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 +24 -24
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-BnQza1y8.d.ts → types-ed-SvS2t.d.ts} +7 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +14 -14
- 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 +1940 -643
- package/src/access-http.ts +81 -74
- package/src/access-mcp.ts +3 -1
- package/src/access-operations.ts +2 -0
- package/src/access-service.ts +612 -845
- package/src/access-surface-catalog.test.ts +40 -10
- package/src/access-surface-catalog.ts +15 -0
- package/src/active-memory-bridge.ts +17 -19
- package/src/config.ts +18 -9
- package/src/fallback-llm.test.ts +54 -0
- package/src/fallback-llm.ts +54 -9
- 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/mcp-read-only-tools.ts +3 -0
- package/src/relay/mission-access.test.ts +11 -11
- package/src/relay/mission-ui.test.ts +3 -1
- package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
- package/src/storage-contract/failure-semantics.test.ts +102 -0
- 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 +8 -0
- package/src/support-passport/card-projection.ts +77 -16
- 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 +533 -31
- package/src/support-passport/card-service.ts +506 -364
- 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 +15 -2
- package/src/support-passport/contracts.ts +13 -0
- package/src/support-passport/errors.ts +6 -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 +45 -1
- package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
- package/src/support-passport/grant-service-cache.test.ts +2 -2
- package/src/support-passport/grant-service-cancellation.test.ts +2 -0
- package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
- package/src/support-passport/grant-service.test.ts +853 -239
- package/src/support-passport/grant-service.ts +206 -57
- package/src/support-passport/grant-store.ts +7 -3
- package/src/support-passport/index.ts +10 -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/owner-http.test.ts +671 -0
- package/src/support-passport/owner-lock.ts +26 -9
- package/src/support-passport/private-file.test.ts +99 -0
- package/src/support-passport/private-file.ts +139 -12
- 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/types.ts +7 -0
- package/src/write-rate-limiter.test.ts +30 -6
- package/src/write-rate-limiter.ts +29 -18
- package/dist/chunk-2INWPC6E.js.map +0 -1
- package/dist/chunk-2PNXOQ4P.js.map +0 -1
- package/dist/chunk-3SXLD5T3.js.map +0 -1
- package/dist/chunk-3WGI7F4V.js.map +0 -1
- package/dist/chunk-7HG7MGAP.js.map +0 -1
- package/dist/chunk-BIF4SHMD.js.map +0 -1
- package/dist/chunk-C23BYTJV.js.map +0 -1
- package/dist/chunk-CSY44OKU.js.map +0 -1
- package/dist/chunk-DDA55IVB.js.map +0 -1
- package/dist/chunk-HNDIND7P.js.map +0 -1
- package/dist/chunk-L6CQ7WIW.js.map +0 -1
- package/dist/chunk-MKQBXQKU.js.map +0 -1
- package/dist/chunk-QQXWFDRD.js.map +0 -1
- package/dist/chunk-QTO6BMQZ.js.map +0 -1
- package/dist/chunk-WZWZRZ2V.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-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-TKFGFDPJ.js.map → chunk-3TIZPSJC.js.map} +0 -0
- /package/dist/{chunk-B4T3FQMT.js.map → chunk-43SEBY2M.js.map} +0 -0
- /package/dist/{chunk-LVKYLMSM.js.map → chunk-46SZBVDS.js.map} +0 -0
- /package/dist/{chunk-YKZLOPTC.js.map → chunk-5FD7JMTX.js.map} +0 -0
- /package/dist/{chunk-WM5LD6AT.js.map → chunk-6CYHUWCO.js.map} +0 -0
- /package/dist/{chunk-YR65W7BV.js.map → chunk-BRR5EUTF.js.map} +0 -0
- /package/dist/{chunk-JKW663ZN.js.map → chunk-CIAI24TQ.js.map} +0 -0
- /package/dist/{chunk-YDWPYDML.js.map → chunk-EKTP7MNS.js.map} +0 -0
- /package/dist/{chunk-6LEIWWAF.js.map → chunk-F2JRDPON.js.map} +0 -0
- /package/dist/{chunk-VYQ4URQB.js.map → chunk-FFRTNF3L.js.map} +0 -0
- /package/dist/{chunk-TY6MKIWP.js.map → chunk-FONWBCVY.js.map} +0 -0
- /package/dist/{chunk-XSV2YDCJ.js.map → chunk-FPLM2TKD.js.map} +0 -0
- /package/dist/{chunk-VTU5IEKY.js.map → chunk-FTPONF6B.js.map} +0 -0
- /package/dist/{chunk-6PZGKGAO.js.map → chunk-FWX7W5PM.js.map} +0 -0
- /package/dist/{chunk-QPW3PAIH.js.map → chunk-G6DFSS6A.js.map} +0 -0
- /package/dist/{chunk-2DD6ZHOM.js.map → chunk-GJ776BC2.js.map} +0 -0
- /package/dist/{chunk-XKAR4RF6.js.map → chunk-GN3WRFJY.js.map} +0 -0
- /package/dist/{chunk-RG426DJO.js.map → chunk-H7NAZ3UB.js.map} +0 -0
- /package/dist/{chunk-BSXGTDVJ.js.map → chunk-HBUFQRIM.js.map} +0 -0
- /package/dist/{chunk-FFEBSFVT.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
- /package/dist/{chunk-5JKUSBMX.js.map → chunk-IKP5OYQQ.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
- /package/dist/{chunk-DBY26JJJ.js.map → chunk-IQ4NVWEF.js.map} +0 -0
- /package/dist/{chunk-7Q7JWLQ4.js.map → chunk-JYG4OLWH.js.map} +0 -0
- /package/dist/{chunk-3OTSVCPK.js.map → chunk-K26NWEOC.js.map} +0 -0
- /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
- /package/dist/{chunk-7RZJWZ46.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-NGT35IGQ.js.map → chunk-MIH3CJPN.js.map} +0 -0
- /package/dist/{chunk-QPAQSG3F.js.map → chunk-MK5VEWCR.js.map} +0 -0
- /package/dist/{chunk-L7RTUEDG.js.map → chunk-OCIP6YMD.js.map} +0 -0
- /package/dist/{chunk-UWJNKGBA.js.map → chunk-QZLDRQ4I.js.map} +0 -0
- /package/dist/{chunk-UYOXFFEY.js.map → chunk-RUNORG2P.js.map} +0 -0
- /package/dist/{chunk-LC3FD4BV.js.map → chunk-RZQ6W2W4.js.map} +0 -0
- /package/dist/{chunk-MRGJZ75M.js.map → chunk-SMNYAMJD.js.map} +0 -0
- /package/dist/{chunk-DN2IDKI5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
- /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
- /package/dist/{chunk-CUTFSLSD.js.map → chunk-UCTS3DDH.js.map} +0 -0
- /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
- /package/dist/{chunk-QOQQMVR2.js.map → chunk-UKYS3NU5.js.map} +0 -0
- /package/dist/{chunk-VZRFGJCH.js.map → chunk-UPLZNJKN.js.map} +0 -0
- /package/dist/{chunk-DOOWFDWN.js.map → chunk-V6ERBR7U.js.map} +0 -0
- /package/dist/{chunk-N7CXQ5TA.js.map → chunk-XZHE2DEN.js.map} +0 -0
- /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
- /package/dist/{chunk-F2Y6I74C.js.map → chunk-ZRZVLB7O.js.map} +0 -0
- /package/dist/{chunk-CLKBV3Z3.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
- /package/dist/{contradiction-scan-KCADHXPE.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
- /package/dist/{first-start-migration-LMMZFLKK.js.map → first-start-migration-CRZCZAJN.js.map} +0 -0
- /package/dist/{tier-stats-JDN6HRNT.js.map → tier-stats-EXYSKSVN.js.map} +0 -0
|
@@ -36,6 +36,8 @@ import {
|
|
|
36
36
|
type HttpRouteEntry,
|
|
37
37
|
type McpToolEntry,
|
|
38
38
|
} from "./access-surface-catalog.js";
|
|
39
|
+
import { SUPPORT_PASSPORT_OWNER_HTTP_ROUTES } from "./support-passport/access-http.js";
|
|
40
|
+
import { SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES } from "./support-passport/public-http.js";
|
|
39
41
|
|
|
40
42
|
// #1668: all remaining MCP tools migrated through the strict-schema boundary
|
|
41
43
|
// (recall, capsule, continuity, work, shared-context, peer, dreams, etc.).
|
|
@@ -62,7 +64,7 @@ function shortToolName(advertised: string): string {
|
|
|
62
64
|
|
|
63
65
|
/** Spin up a server with emitLegacyTools=true and read the deduped short names. */
|
|
64
66
|
async function liveMcpToolShortNames(): Promise<ReadonlySet<string>> {
|
|
65
|
-
const stub = { briefingEnabled: true } as unknown as EngramAccessService;
|
|
67
|
+
const stub = { briefingEnabled: true, supportPassportEnabled: true } as unknown as EngramAccessService;
|
|
66
68
|
const server = new EngramMcpServer(stub, { emitLegacyTools: true, codingDecisionVisible: true, architectureCardVisible: true, codegraphVisible: true, sessionDeltaVisible: true, chatVisible: true });
|
|
67
69
|
const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
|
|
68
70
|
const result = (response as { result?: { tools?: Array<{ name: string }> } }).result;
|
|
@@ -142,22 +144,35 @@ function formatViolations(violations: readonly CoverageViolation[]): string {
|
|
|
142
144
|
* catalog row is not a false migration — the surface code must also wire
|
|
143
145
|
* the dispatch.
|
|
144
146
|
*/
|
|
145
|
-
function
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
);
|
|
147
|
+
function extractMcpOperationMap(
|
|
148
|
+
sourceUrl: URL,
|
|
149
|
+
constantName: string,
|
|
150
|
+
): Map<string, string> {
|
|
151
|
+
const source = readFileSync(sourceUrl, "utf-8");
|
|
150
152
|
const blockMatch = source.match(
|
|
151
|
-
|
|
153
|
+
new RegExp(`(?:export\\s+)?const\\s+${constantName}[^=]*=\\s*\\{([\\s\\S]*?)\\}\\s*(?:as const)?;`),
|
|
152
154
|
);
|
|
153
|
-
|
|
155
|
+
assert.ok(blockMatch, `could not find ${constantName} in ${sourceUrl.pathname}`);
|
|
154
156
|
const map = new Map<string, string>();
|
|
155
|
-
for (const m of
|
|
157
|
+
for (const m of blockMatch[1]!.matchAll(/"engram\.(\w+)"\s*:\s*"(\w+)"/g)) {
|
|
156
158
|
map.set(m[1]!, m[2]!);
|
|
157
159
|
}
|
|
158
160
|
return map;
|
|
159
161
|
}
|
|
160
162
|
|
|
163
|
+
function extractMcpDispatchMap(): Map<string, string> {
|
|
164
|
+
return new Map([
|
|
165
|
+
...extractMcpOperationMap(
|
|
166
|
+
new URL("./access-mcp.ts", import.meta.url),
|
|
167
|
+
"MCP_MIGRATED_OPERATIONS",
|
|
168
|
+
),
|
|
169
|
+
...extractMcpOperationMap(
|
|
170
|
+
new URL("./support-passport/mcp-tools.ts", import.meta.url),
|
|
171
|
+
"SUPPORT_PASSPORT_MCP_MIGRATED_OPERATIONS",
|
|
172
|
+
),
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
175
|
+
|
|
161
176
|
/**
|
|
162
177
|
* Normalize a regex route body (e.g. `\/engram\/v1\/peers\/([^/]+)`) to the
|
|
163
178
|
* catalog pathname form (`/engram/v1/peers/:id`).
|
|
@@ -302,6 +317,21 @@ function extractHttpRouteDispatchMap(): Map<string, Set<string>> {
|
|
|
302
317
|
}
|
|
303
318
|
}
|
|
304
319
|
}
|
|
320
|
+
for (const [sourcePath, routes] of [
|
|
321
|
+
["./support-passport/access-http.ts", SUPPORT_PASSPORT_OWNER_HTTP_ROUTES],
|
|
322
|
+
["./support-passport/public-http.ts", SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES],
|
|
323
|
+
] as const) {
|
|
324
|
+
const routeSource = readFileSync(new URL(sourcePath, import.meta.url), "utf-8");
|
|
325
|
+
for (const route of routes) {
|
|
326
|
+
const dynamicCardMutation =
|
|
327
|
+
route.operation.startsWith("support_passport_card_") &&
|
|
328
|
+
routeSource.includes("operation = `support_passport_card_${cardMatch[2]}`");
|
|
329
|
+
const publicDispatch = new RegExp(`runPublicOperation\\(\\s*service,\\s*"${route.operation}"`).test(routeSource);
|
|
330
|
+
if (routeSource.includes(`operation = "${route.operation}"`) || dynamicCardMutation || publicDispatch) {
|
|
331
|
+
routeOps.set(`${route.method} ${route.pathname}`, new Set([route.operation]));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
305
335
|
return routeOps;
|
|
306
336
|
}
|
|
307
337
|
|
|
@@ -824,4 +854,4 @@ test("memory_get operation resolves through the boundary without hooks (read par
|
|
|
824
854
|
{ service },
|
|
825
855
|
)) as { result: { found: boolean } };
|
|
826
856
|
assert.equal(output.result.found, false);
|
|
827
|
-
});
|
|
857
|
+
});
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import type { OperationName } from "./access-boundary.js";
|
|
25
|
+
import { SUPPORT_PASSPORT_OWNER_HTTP_ROUTES } from "./support-passport/access-http.js";
|
|
26
|
+
import { SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES } from "./support-passport/public-http.js";
|
|
25
27
|
|
|
26
28
|
/**
|
|
27
29
|
* One row per MCP tool, keyed by the canonical SHORT name (no `engram.`/
|
|
@@ -162,6 +164,17 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
|
|
|
162
164
|
{ tool: "console_state", operation: "console_state" },
|
|
163
165
|
{ tool: "dreams_status", operation: "dreams_status" },
|
|
164
166
|
{ tool: "dreams_run", operation: "dreams_run" },
|
|
167
|
+
{ tool: "support_passport_memory_preview", operation: "support_passport_memory_preview" },
|
|
168
|
+
{ tool: "support_passport_cards_list", operation: "support_passport_cards_list" },
|
|
169
|
+
{ tool: "support_passport_draft_create", operation: "support_passport_draft_create" },
|
|
170
|
+
{ tool: "support_passport_drafts_generate", operation: "support_passport_drafts_generate" },
|
|
171
|
+
{ tool: "support_passport_card_replace", operation: "support_passport_card_replace" },
|
|
172
|
+
{ tool: "support_passport_card_approve", operation: "support_passport_card_approve" },
|
|
173
|
+
{ tool: "support_passport_card_reject", operation: "support_passport_card_reject" },
|
|
174
|
+
{ tool: "support_passport_card_withdraw", operation: "support_passport_card_withdraw" },
|
|
175
|
+
{ tool: "support_passport_grant_create", operation: "support_passport_grant_create" },
|
|
176
|
+
{ tool: "support_passport_grants_list", operation: "support_passport_grants_list" },
|
|
177
|
+
{ tool: "support_passport_grant_revoke", operation: "support_passport_grant_revoke" },
|
|
165
178
|
];
|
|
166
179
|
|
|
167
180
|
// Each route below corresponds 1:1 to a service-invoking route branch in
|
|
@@ -260,6 +273,8 @@ export const HTTP_ROUTES: readonly HttpRouteEntry[] = [
|
|
|
260
273
|
{ method: "GET", pathname: "/engram/v1/graph/events", operation: "graph_events" },
|
|
261
274
|
{ method: "POST", pathname: "/engram/v1/chat/message", operation: "chat_message" },
|
|
262
275
|
{ method: "GET", pathname: "/engram/v1/chat/events/:id", operation: "chat_events" },
|
|
276
|
+
...SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
|
|
277
|
+
...SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES,
|
|
263
278
|
];
|
|
264
279
|
|
|
265
280
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { resolveNamespaceCapabilities } from "./capabilities.js";
|
|
2
2
|
import { canReadNamespace, defaultNamespaceForPrincipal, resolvePrincipal } from "./namespaces/principal.js";
|
|
3
|
-
import type { MemoryFile, PluginConfig, QmdSearchResult } from "./types.js";
|
|
4
|
-
import { collapseWhitespace, truncateCodePointSafe } from "./whitespace.js";
|
|
5
3
|
import { isHandleToken } from "./recall-handles.js";
|
|
6
4
|
import { isSupportPassportPrivateMemory } from "./support-passport/card-projection.js";
|
|
5
|
+
import type { MemoryFile, PluginConfig, QmdSearchResult } from "./types.js";
|
|
6
|
+
import { collapseWhitespace, truncateCodePointSafe } from "./whitespace.js";
|
|
7
7
|
|
|
8
8
|
export interface ActiveMemoryMetadata {
|
|
9
9
|
type?: "fact" | "preference";
|
|
@@ -39,14 +39,16 @@ export interface ActiveMemoryRecallParams {
|
|
|
39
39
|
snippetMaxChars?: number;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
interface ActiveMemoryStorage {
|
|
43
|
+
readMemoryByPath?: (path: string) => Promise<MemoryFile | null>;
|
|
44
|
+
getMemoryById?: (id: string) => Promise<MemoryFile | null>;
|
|
45
|
+
}
|
|
46
|
+
|
|
42
47
|
interface ActiveMemoryScopedOrchestrator {
|
|
43
48
|
config?: PluginConfig;
|
|
44
49
|
resolvePrincipal?: (sessionKey?: string) => string | undefined;
|
|
45
50
|
resolveSelfNamespace?: (sessionKey?: string) => string;
|
|
46
|
-
getStorageForNamespace?: (namespace: string) => Promise<
|
|
47
|
-
readMemoryByPath?: (path: string) => Promise<MemoryFile | null>;
|
|
48
|
-
getMemoryById?: (id: string) => Promise<MemoryFile | null>;
|
|
49
|
-
}>;
|
|
51
|
+
getStorageForNamespace?: (namespace: string) => Promise<ActiveMemoryStorage>;
|
|
50
52
|
filterPrivateSearchResults?: (
|
|
51
53
|
results: QmdSearchResult[],
|
|
52
54
|
namespaces?: readonly string[],
|
|
@@ -71,13 +73,13 @@ function isArtifactPath(value: string | undefined): boolean {
|
|
|
71
73
|
async function filterVisibleActiveMemoryCandidates(
|
|
72
74
|
orchestrator: ActiveMemoryScopedOrchestrator,
|
|
73
75
|
namespace: string,
|
|
74
|
-
storage:
|
|
76
|
+
storage: ActiveMemoryStorage | undefined,
|
|
75
77
|
candidates: ActiveMemorySearchCandidate[],
|
|
76
78
|
visibilityCache?: Map<string, boolean>,
|
|
77
79
|
): Promise<ActiveMemorySearchCandidate[]> {
|
|
78
80
|
const visible = new Set<ActiveMemorySearchCandidate>();
|
|
79
81
|
const pathCandidates = candidates.filter(
|
|
80
|
-
(candidate) => typeof candidate.path === "string" && !isArtifactPath(candidate.path)
|
|
82
|
+
(candidate) => typeof candidate.path === "string" && !isArtifactPath(candidate.path)
|
|
81
83
|
);
|
|
82
84
|
if (pathCandidates.length > 0 && typeof orchestrator.filterPrivateSearchResults === "function") {
|
|
83
85
|
const qmdCandidates = pathCandidates.map((candidate): QmdSearchResult => ({
|
|
@@ -100,14 +102,14 @@ async function filterVisibleActiveMemoryCandidates(
|
|
|
100
102
|
}
|
|
101
103
|
|
|
102
104
|
const idCandidates = candidates.filter(
|
|
103
|
-
(candidate) => candidate.path === undefined && typeof candidate.id === "string"
|
|
105
|
+
(candidate) => candidate.path === undefined && typeof candidate.id === "string"
|
|
104
106
|
);
|
|
105
107
|
if (storage) {
|
|
106
108
|
const idVisibility = await Promise.all(
|
|
107
109
|
idCandidates.map(async (candidate) => {
|
|
108
110
|
const memory = await storage.getMemoryById?.(candidate.id!);
|
|
109
111
|
return memory !== null && memory !== undefined && !isSupportPassportPrivateMemory(memory);
|
|
110
|
-
})
|
|
112
|
+
})
|
|
111
113
|
);
|
|
112
114
|
idCandidates.forEach((candidate, index) => {
|
|
113
115
|
if (idVisibility[index]) visible.add(candidate);
|
|
@@ -139,7 +141,7 @@ function pickMetadata(value: Record<string, unknown> | undefined): ActiveMemoryM
|
|
|
139
141
|
function resolveActiveMemoryNamespace(
|
|
140
142
|
orchestrator: ActiveMemoryScopedOrchestrator,
|
|
141
143
|
sessionKey: string | undefined,
|
|
142
|
-
requestedNamespace: string | undefined
|
|
144
|
+
requestedNamespace: string | undefined
|
|
143
145
|
): string {
|
|
144
146
|
const explicitNamespace =
|
|
145
147
|
typeof requestedNamespace === "string" && requestedNamespace.trim().length > 0
|
|
@@ -195,7 +197,7 @@ export async function recallForActiveMemory(
|
|
|
195
197
|
mode?: string;
|
|
196
198
|
}) => Promise<ActiveMemorySearchCandidate[]>;
|
|
197
199
|
},
|
|
198
|
-
params: ActiveMemoryRecallParams
|
|
200
|
+
params: ActiveMemoryRecallParams
|
|
199
201
|
): Promise<ActiveMemorySearchOutput> {
|
|
200
202
|
const limit = clampLimit(params.limit);
|
|
201
203
|
const snippetMaxChars =
|
|
@@ -205,7 +207,7 @@ export async function recallForActiveMemory(
|
|
|
205
207
|
const namespace = resolveActiveMemoryNamespace(
|
|
206
208
|
orchestrator,
|
|
207
209
|
params.sessionKey,
|
|
208
|
-
typeof params.filters?.namespace === "string" ? params.filters.namespace : undefined
|
|
210
|
+
typeof params.filters?.namespace === "string" ? params.filters.namespace : undefined
|
|
209
211
|
);
|
|
210
212
|
|
|
211
213
|
const storage = await orchestrator.getStorageForNamespace?.(namespace);
|
|
@@ -277,13 +279,9 @@ export async function getMemoryForActiveMemory(
|
|
|
277
279
|
options: {
|
|
278
280
|
namespace?: string;
|
|
279
281
|
sessionKey?: string;
|
|
280
|
-
} = {}
|
|
282
|
+
} = {}
|
|
281
283
|
): Promise<ActiveMemoryGetOutput> {
|
|
282
|
-
const namespace = resolveActiveMemoryNamespace(
|
|
283
|
-
orchestrator,
|
|
284
|
-
options.sessionKey,
|
|
285
|
-
options.namespace,
|
|
286
|
-
);
|
|
284
|
+
const namespace = resolveActiveMemoryNamespace(orchestrator, options.sessionKey, options.namespace);
|
|
287
285
|
|
|
288
286
|
const storage =
|
|
289
287
|
typeof orchestrator.getStorageForNamespace === "function"
|
package/src/config.ts
CHANGED
|
@@ -66,6 +66,7 @@ import { parseProvenanceConfig } from "./provenance.js";
|
|
|
66
66
|
import { parseBoundedJsonlStateConfig } from "./bounded-jsonl-state.js";
|
|
67
67
|
import { parseCodingKnowledgeConfig } from "./coding/coding-knowledge-config.js";
|
|
68
68
|
import { parseChatConfig } from "./chat/chat-config.js";
|
|
69
|
+
import { parseSupportPassportConfig } from "./support-passport/config.js";
|
|
69
70
|
import { parseCorrectionIntentConfig, parseFaithfulnessGateConfig } from "./faithfulness-config.js";
|
|
70
71
|
import { parseOfflineSyncExcludes } from "./offline-sync.js";
|
|
71
72
|
import { parseExternalWikiRoots } from "./external-wiki-config.js";
|
|
@@ -469,23 +470,27 @@ export function resolveEnvVars(value: string): string {
|
|
|
469
470
|
}
|
|
470
471
|
|
|
471
472
|
function normalizeOpenaiBaseUrl(value: string | undefined, source: "config" | "env"): string | undefined {
|
|
472
|
-
if (
|
|
473
|
+
if (value === undefined) return undefined;
|
|
473
474
|
const trimmed = value.trim();
|
|
474
|
-
if (trimmed.length === 0)
|
|
475
|
+
if (trimmed.length === 0) {
|
|
476
|
+
throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must be an absolute HTTP or HTTPS URL`);
|
|
477
|
+
}
|
|
475
478
|
|
|
476
479
|
let parsed: URL;
|
|
477
480
|
try {
|
|
478
481
|
parsed = new URL(trimmed);
|
|
479
482
|
} catch {
|
|
480
|
-
|
|
481
|
-
return undefined;
|
|
483
|
+
throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must be an absolute HTTP or HTTPS URL`);
|
|
482
484
|
}
|
|
483
485
|
|
|
484
486
|
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
485
|
-
|
|
486
|
-
|
|
487
|
+
throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must use HTTP or HTTPS`);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (parsed.username || parsed.password || parsed.search || parsed.hash) {
|
|
491
|
+
throw new Error(
|
|
492
|
+
`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must not include credentials, query parameters, or fragments`,
|
|
487
493
|
);
|
|
488
|
-
return undefined;
|
|
489
494
|
}
|
|
490
495
|
|
|
491
496
|
if (parsed.protocol === "http:") {
|
|
@@ -1461,9 +1466,12 @@ export function parseConfig(
|
|
|
1461
1466
|
};
|
|
1462
1467
|
|
|
1463
1468
|
let baseUrl: string | undefined;
|
|
1464
|
-
if (
|
|
1469
|
+
if (cfg.openaiBaseUrl !== undefined && typeof cfg.openaiBaseUrl !== "string") {
|
|
1470
|
+
throw new Error("openaiBaseUrl must be a string");
|
|
1471
|
+
}
|
|
1472
|
+
if (cfg.openaiBaseUrl !== undefined) {
|
|
1465
1473
|
baseUrl = normalizeOpenaiBaseUrl(resolveEnvVars(cfg.openaiBaseUrl), "config");
|
|
1466
|
-
} else {
|
|
1474
|
+
} else if (apiKey !== undefined) {
|
|
1467
1475
|
baseUrl = normalizeOpenaiBaseUrl(readEnvVar("OPENAI_BASE_URL"), "env");
|
|
1468
1476
|
}
|
|
1469
1477
|
|
|
@@ -2325,6 +2333,7 @@ export function parseConfig(
|
|
|
2325
2333
|
codexCompat,
|
|
2326
2334
|
codingKnowledge: parseCodingKnowledgeConfig(cfg.codingKnowledge),
|
|
2327
2335
|
chat: parseChatConfig(cfg.chat),
|
|
2336
|
+
supportPassport: parseSupportPassportConfig(cfg.supportPassport),
|
|
2328
2337
|
hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true
|
|
2329
2338
|
daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true
|
|
2330
2339
|
hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,
|
package/src/fallback-llm.test.ts
CHANGED
|
@@ -4,6 +4,7 @@ import test from "node:test";
|
|
|
4
4
|
|
|
5
5
|
import { FallbackLlmClient, gatewayTaskChainOptions } from "./fallback-llm.js";
|
|
6
6
|
import { __codexCliFallbackTestHooks } from "./cli-fallback.js";
|
|
7
|
+
import { initLogger, resetLogger } from "./logger.js";
|
|
7
8
|
import { clearModelsJsonCache, __setModelsJsonForTest } from "./models-json.js";
|
|
8
9
|
import {
|
|
9
10
|
__setGatewayRuntimeAuthForModelForTest,
|
|
@@ -1654,6 +1655,59 @@ test("fallback llm does NOT append default for a primary-less override that fall
|
|
|
1654
1655
|
}
|
|
1655
1656
|
});
|
|
1656
1657
|
|
|
1658
|
+
test("fallback llm redacts provider error bodies for sensitive calls", { concurrency: false }, async () => {
|
|
1659
|
+
clearModelsJsonCache();
|
|
1660
|
+
clearSecretCache();
|
|
1661
|
+
const privateMarker = "private-support-note-must-not-log";
|
|
1662
|
+
const lines: string[] = [];
|
|
1663
|
+
initLogger(
|
|
1664
|
+
{
|
|
1665
|
+
info: (message) => lines.push(message),
|
|
1666
|
+
warn: (message) => lines.push(message),
|
|
1667
|
+
error: (message) => lines.push(message),
|
|
1668
|
+
debug: (message) => lines.push(message),
|
|
1669
|
+
},
|
|
1670
|
+
true,
|
|
1671
|
+
{ timestamps: false },
|
|
1672
|
+
);
|
|
1673
|
+
const llm = new FallbackLlmClient({
|
|
1674
|
+
agents: { defaults: { model: { primary: "private-provider/test-model" } } },
|
|
1675
|
+
models: {
|
|
1676
|
+
providers: {
|
|
1677
|
+
"private-provider": {
|
|
1678
|
+
baseUrl: "https://private-provider.example/v1",
|
|
1679
|
+
api: "openai-completions",
|
|
1680
|
+
apiKey: "test-key",
|
|
1681
|
+
models: [],
|
|
1682
|
+
},
|
|
1683
|
+
},
|
|
1684
|
+
},
|
|
1685
|
+
});
|
|
1686
|
+
const originalFetch = globalThis.fetch;
|
|
1687
|
+
globalThis.fetch = (async () =>
|
|
1688
|
+
new Response(JSON.stringify({ error: { message: privateMarker } }), {
|
|
1689
|
+
status: 400,
|
|
1690
|
+
headers: { "content-type": "application/json" },
|
|
1691
|
+
})) as typeof fetch;
|
|
1692
|
+
|
|
1693
|
+
try {
|
|
1694
|
+
assert.equal(
|
|
1695
|
+
await llm.chatCompletion(
|
|
1696
|
+
[{ role: "user", content: privateMarker }],
|
|
1697
|
+
{ redactProviderErrors: true },
|
|
1698
|
+
),
|
|
1699
|
+
null,
|
|
1700
|
+
);
|
|
1701
|
+
assert.equal(lines.join("\n").includes(privateMarker), false);
|
|
1702
|
+
assert.match(lines.join("\n"), /provider error details redacted/);
|
|
1703
|
+
} finally {
|
|
1704
|
+
globalThis.fetch = originalFetch;
|
|
1705
|
+
resetLogger();
|
|
1706
|
+
clearModelsJsonCache();
|
|
1707
|
+
clearSecretCache();
|
|
1708
|
+
}
|
|
1709
|
+
});
|
|
1710
|
+
|
|
1657
1711
|
function disableGatewaySecretResolverForTest(): void {
|
|
1658
1712
|
__setGatewayResolverForTest(async () => null);
|
|
1659
1713
|
}
|
package/src/fallback-llm.ts
CHANGED
|
@@ -23,12 +23,22 @@ export interface FallbackLlmOptions {
|
|
|
23
23
|
maxTokens?: number;
|
|
24
24
|
timeoutMs?: number;
|
|
25
25
|
signal?: AbortSignal;
|
|
26
|
+
/** Set the Responses API storage policy. Other transports ignore this value. */
|
|
27
|
+
store?: boolean;
|
|
28
|
+
/** Request strict JSON output when a route uses the Responses API. */
|
|
29
|
+
responsesJsonSchema?: { name: string; schema: Record<string, unknown> };
|
|
30
|
+
/** Hide provider error details that could echo private request content. */
|
|
31
|
+
redactProviderErrors?: boolean;
|
|
26
32
|
/** Explicit "provider/model" override to try before the configured chain. */
|
|
27
33
|
model?: string;
|
|
28
34
|
/** Explicit model chain override to use instead of the configured agent/default chain. */
|
|
29
35
|
modelChain?: AgentPersonaModelConfig;
|
|
36
|
+
/** Append the gateway default chain after an explicit model chain. */
|
|
37
|
+
includeDefaultModelFallback?: boolean;
|
|
30
38
|
/** Override which agent persona's model chain to use (by ID from agents.list[]). */
|
|
31
39
|
agentId?: string;
|
|
40
|
+
/** Reject a transport-successful response and continue through the configured model chain. */
|
|
41
|
+
acceptResponse?: (response: FallbackLlmResponse) => boolean;
|
|
32
42
|
}
|
|
33
43
|
|
|
34
44
|
export interface FallbackLlmAvailabilityOptions {
|
|
@@ -177,7 +187,12 @@ export class FallbackLlmClient {
|
|
|
177
187
|
messages: Array<{ role: "system" | "user" | "assistant"; content: string }>,
|
|
178
188
|
options: FallbackLlmOptions = {},
|
|
179
189
|
): Promise<FallbackLlmResponse | null> {
|
|
180
|
-
const models = this.getModelChain(
|
|
190
|
+
const models = this.getModelChain(
|
|
191
|
+
options.agentId,
|
|
192
|
+
options.model,
|
|
193
|
+
options.modelChain,
|
|
194
|
+
options.includeDefaultModelFallback,
|
|
195
|
+
);
|
|
181
196
|
if (models.length === 0) {
|
|
182
197
|
log.warn("fallback LLM: no models configured in gateway");
|
|
183
198
|
return null;
|
|
@@ -186,6 +201,7 @@ export class FallbackLlmClient {
|
|
|
186
201
|
const runChain = async (
|
|
187
202
|
runOptions: FallbackLlmOptions,
|
|
188
203
|
): Promise<FallbackLlmResponse | null> => {
|
|
204
|
+
let lastRejectedResponse: FallbackLlmResponse | null = null;
|
|
189
205
|
// Try each model in the chain
|
|
190
206
|
for (let i = 0; i < models.length; i++) {
|
|
191
207
|
if (runOptions.signal?.aborted) {
|
|
@@ -197,27 +213,37 @@ export class FallbackLlmClient {
|
|
|
197
213
|
try {
|
|
198
214
|
const result = await this.tryModel(model, messages, runOptions);
|
|
199
215
|
if (result) {
|
|
200
|
-
|
|
201
|
-
log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
216
|
+
const response = {
|
|
204
217
|
content: result.content,
|
|
205
218
|
modelUsed: model.modelString,
|
|
206
219
|
usage: result.usage,
|
|
207
220
|
};
|
|
221
|
+
if (runOptions.acceptResponse && !runOptions.acceptResponse(response)) {
|
|
222
|
+
lastRejectedResponse = response;
|
|
223
|
+
log.debug(`fallback LLM: ${model.modelString} returned rejected output, trying next...`);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (isFallback) {
|
|
227
|
+
log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
|
|
228
|
+
}
|
|
229
|
+
return response;
|
|
208
230
|
}
|
|
209
231
|
} catch (err) {
|
|
210
232
|
if (runOptions.signal?.aborted) {
|
|
211
233
|
throw abortReason(runOptions.signal);
|
|
212
234
|
}
|
|
213
|
-
const errorMsg =
|
|
235
|
+
const errorMsg = runOptions.redactProviderErrors
|
|
236
|
+
? "provider error details redacted"
|
|
237
|
+
: err instanceof Error
|
|
238
|
+
? err.message
|
|
239
|
+
: String(err);
|
|
214
240
|
log.debug(`fallback LLM: ${model.modelString} failed (${errorMsg}), trying next...`);
|
|
215
241
|
// Continue to next model in chain
|
|
216
242
|
}
|
|
217
243
|
}
|
|
218
244
|
|
|
219
245
|
log.warn(`fallback LLM: all ${models.length} models in chain failed`);
|
|
220
|
-
return
|
|
246
|
+
return lastRejectedResponse;
|
|
221
247
|
};
|
|
222
248
|
|
|
223
249
|
if (typeof options.timeoutMs === "number") {
|
|
@@ -301,7 +327,12 @@ export class FallbackLlmClient {
|
|
|
301
327
|
// Disambiguate via the resolved model chain so the retry layer can pick
|
|
302
328
|
// the right failure class.
|
|
303
329
|
const hasModels =
|
|
304
|
-
this.getModelChain(
|
|
330
|
+
this.getModelChain(
|
|
331
|
+
options.agentId,
|
|
332
|
+
options.model,
|
|
333
|
+
options.modelChain,
|
|
334
|
+
options.includeDefaultModelFallback,
|
|
335
|
+
).length > 0;
|
|
305
336
|
return { result: null, failureReason: hasModels ? "http_error" : "no_models" };
|
|
306
337
|
}
|
|
307
338
|
|
|
@@ -335,6 +366,7 @@ export class FallbackLlmClient {
|
|
|
335
366
|
agentId?: string,
|
|
336
367
|
modelOverride?: string,
|
|
337
368
|
modelChainOverride?: AgentPersonaModelConfig,
|
|
369
|
+
includeDefaultModelFallback = true,
|
|
338
370
|
): ModelRef[] {
|
|
339
371
|
const chain: ModelRef[] = [];
|
|
340
372
|
const providers = this.gatewayConfig?.models?.providers ?? {};
|
|
@@ -402,7 +434,7 @@ export class FallbackLlmClient {
|
|
|
402
434
|
// the SAME activation condition chain resolution uses above — so a
|
|
403
435
|
// primary-less override (e.g. {}) that falls through to a persona/default
|
|
404
436
|
// chain does NOT get the default appended (gotcha #39). Issue #1365 / PR #1370.
|
|
405
|
-
if (modelChainOverride?.primary && modelStrings.length > 0) {
|
|
437
|
+
if (includeDefaultModelFallback && modelChainOverride?.primary && modelStrings.length > 0) {
|
|
406
438
|
// Append the FULL gateway default chain (primary + fallbacks), not just
|
|
407
439
|
// the primary — if the default primary is also unreachable, a listed
|
|
408
440
|
// default fallback may still succeed (cursor review #1425).
|
|
@@ -858,6 +890,19 @@ export class FallbackLlmClient {
|
|
|
858
890
|
...buildChatCompletionTemperature(modelId, options.temperature ?? 0.3, {
|
|
859
891
|
assumeOpenAI: shouldAssumeOpenAiChatCompletions(config.baseUrl),
|
|
860
892
|
}),
|
|
893
|
+
...(options.store === undefined ? {} : { store: options.store }),
|
|
894
|
+
...(options.responsesJsonSchema
|
|
895
|
+
? {
|
|
896
|
+
text: {
|
|
897
|
+
format: {
|
|
898
|
+
type: "json_schema",
|
|
899
|
+
name: options.responsesJsonSchema.name,
|
|
900
|
+
strict: true,
|
|
901
|
+
schema: options.responsesJsonSchema.schema,
|
|
902
|
+
},
|
|
903
|
+
},
|
|
904
|
+
}
|
|
905
|
+
: {}),
|
|
861
906
|
};
|
|
862
907
|
if (instructions.length > 0) {
|
|
863
908
|
body.instructions = instructions;
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
import { LocalLlmClient } from "./local-llm.js";
|
|
15
15
|
import { ChatTransport } from "./local-llm-transport.js";
|
|
16
|
+
import { initLogger, resetLogger } from "./logger.js";
|
|
16
17
|
import type { PluginConfig } from "./types.js";
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -511,3 +512,44 @@ test("availability probes stop after the caller aborts", async () => {
|
|
|
511
512
|
await new Promise<void>((resolve) => server.close(() => resolve()));
|
|
512
513
|
}
|
|
513
514
|
});
|
|
515
|
+
|
|
516
|
+
test("sensitive local requests do not log provider error bodies", { concurrency: false }, async () => {
|
|
517
|
+
const original = globalThis.fetch;
|
|
518
|
+
const privateMarker = "private-local-support-note-must-not-log";
|
|
519
|
+
const privateStatusText = "private-provider-status-must-not-log";
|
|
520
|
+
const lines: string[] = [];
|
|
521
|
+
initLogger(
|
|
522
|
+
{
|
|
523
|
+
info: (message) => lines.push(message),
|
|
524
|
+
warn: (message) => lines.push(message),
|
|
525
|
+
error: (message) => lines.push(message),
|
|
526
|
+
debug: (message) => lines.push(message),
|
|
527
|
+
},
|
|
528
|
+
true,
|
|
529
|
+
{ timestamps: false },
|
|
530
|
+
);
|
|
531
|
+
globalThis.fetch = (async () =>
|
|
532
|
+
new Response(JSON.stringify({ error: { message: privateMarker } }), {
|
|
533
|
+
status: 400,
|
|
534
|
+
statusText: privateStatusText,
|
|
535
|
+
headers: { "content-type": "application/json" },
|
|
536
|
+
})) as typeof fetch;
|
|
537
|
+
const client = new LocalLlmClient(createConfig());
|
|
538
|
+
|
|
539
|
+
try {
|
|
540
|
+
primeClient(client);
|
|
541
|
+
assert.equal(
|
|
542
|
+
await client.chatCompletion(
|
|
543
|
+
[{ role: "user", content: privateMarker }],
|
|
544
|
+
{ redactProviderErrors: true },
|
|
545
|
+
),
|
|
546
|
+
null,
|
|
547
|
+
);
|
|
548
|
+
assert.equal(lines.join("\n").includes(privateMarker), false);
|
|
549
|
+
assert.equal(lines.join("\n").includes(privateStatusText), false);
|
|
550
|
+
} finally {
|
|
551
|
+
globalThis.fetch = original;
|
|
552
|
+
resetLogger();
|
|
553
|
+
await dispatcherOf(client).close();
|
|
554
|
+
}
|
|
555
|
+
});
|
package/src/local-llm.ts
CHANGED
|
@@ -235,8 +235,8 @@ interface LocalLlmChatCompletionOptions {
|
|
|
235
235
|
disableThinking?: boolean;
|
|
236
236
|
priority?: LocalLlmRequestPriority;
|
|
237
237
|
signal?: AbortSignal;
|
|
238
|
+
redactProviderErrors?: boolean;
|
|
238
239
|
}
|
|
239
|
-
|
|
240
240
|
interface LocalLlmQueuedRequest {
|
|
241
241
|
messages: Array<{ role: string; content: string }>;
|
|
242
242
|
options: LocalLlmChatCompletionOptions;
|
|
@@ -917,7 +917,7 @@ export class LocalLlmClient {
|
|
|
917
917
|
enqueuedAtMs: next.enqueuedAtMs,
|
|
918
918
|
});
|
|
919
919
|
} catch (err) {
|
|
920
|
-
log.warn(`local LLM queue drain failed open: ${err instanceof Error ? err.message : String(err)}`);
|
|
920
|
+
log.warn(`local LLM queue drain failed open: ${next.options.redactProviderErrors ? "provider error details redacted" : err instanceof Error ? err.message : String(err)}`);
|
|
921
921
|
}
|
|
922
922
|
next.resolve(result);
|
|
923
923
|
} finally {
|
|
@@ -1071,7 +1071,7 @@ export class LocalLlmClient {
|
|
|
1071
1071
|
break;
|
|
1072
1072
|
}
|
|
1073
1073
|
if (response && !response.ok) {
|
|
1074
|
-
log.debug(`local LLM failed to read ${response.status} response body: ${error.message}`);
|
|
1074
|
+
log.debug(`local LLM failed to read ${response.status} response body: ${options.redactProviderErrors ? "details redacted" : error.message}`);
|
|
1075
1075
|
} else {
|
|
1076
1076
|
response = null;
|
|
1077
1077
|
if (!isAbortError(err)) throw err;
|
|
@@ -1132,10 +1132,10 @@ export class LocalLlmClient {
|
|
|
1132
1132
|
const parsed = JSON.parse(responseBody) as { error?: { message?: string } };
|
|
1133
1133
|
reason = parsed?.error?.message ? ` — ${parsed.error.message}` : "";
|
|
1134
1134
|
} catch {
|
|
1135
|
-
log.debug(`local LLM error body: ${responseBody.slice(0, 500)}`);
|
|
1135
|
+
if (!options.redactProviderErrors) log.debug(`local LLM error body: ${responseBody.slice(0, 500)}`);
|
|
1136
1136
|
}
|
|
1137
1137
|
log.warn(
|
|
1138
|
-
`local LLM request failed: ${response.status} ${response.statusText}${reason} ` +
|
|
1138
|
+
`local LLM request failed: ${response.status}${options.redactProviderErrors ? "" : ` ${response.statusText}${reason}`} ` +
|
|
1139
1139
|
`(op=${operation}, model=${this.config.localLlmModel}, url=${chatUrl}, promptChars=${promptChars}, maxTokens=${requestBody.max_tokens as number})`,
|
|
1140
1140
|
);
|
|
1141
1141
|
const nonRecoverableReason =
|
|
@@ -1187,7 +1187,7 @@ export class LocalLlmClient {
|
|
|
1187
1187
|
const msg = data.choices?.[0]?.message;
|
|
1188
1188
|
const content = msg?.content || msg?.reasoning_content || "";
|
|
1189
1189
|
if (!content) {
|
|
1190
|
-
log.warn(`local LLM returned empty content. choices=${JSON.stringify(data.choices)?.slice(0, 200)}`);
|
|
1190
|
+
log.warn(`local LLM returned empty content.${options.redactProviderErrors ? "" : ` choices=${JSON.stringify(data.choices)?.slice(0, 200)}`}`);
|
|
1191
1191
|
return null;
|
|
1192
1192
|
}
|
|
1193
1193
|
|
|
@@ -1216,11 +1216,11 @@ export class LocalLlmClient {
|
|
|
1216
1216
|
const durationMs = Date.now() - startedAtMs;
|
|
1217
1217
|
if (isAbortError(err)) {
|
|
1218
1218
|
log.warn(
|
|
1219
|
-
`local LLM request aborted: op=${operation} timeoutMs=${options.timeoutMs ?? this.config.localLlmTimeoutMs} model=${this.config.localLlmModel} durationMs=${durationMs} error=${errMsg}`,
|
|
1219
|
+
`local LLM request aborted: op=${operation} timeoutMs=${options.timeoutMs ?? this.config.localLlmTimeoutMs} model=${this.config.localLlmModel} durationMs=${durationMs} error=${options.redactProviderErrors ? "provider error details redacted" : errMsg}`,
|
|
1220
1220
|
);
|
|
1221
1221
|
return null;
|
|
1222
1222
|
}
|
|
1223
|
-
log.warn(`local LLM request error: op=${operation} error=${errMsg}`);
|
|
1223
|
+
log.warn(`local LLM request error: op=${operation} error=${options.redactProviderErrors ? "provider error details redacted" : errMsg}`);
|
|
1224
1224
|
this.isAvailable = false; // Mark as unavailable on non-abort errors
|
|
1225
1225
|
const nonRecoverableReason = extractNonRecoverableBackendReason(errMsg);
|
|
1226
1226
|
if (nonRecoverableReason) {
|
|
@@ -61,4 +61,7 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
|
|
|
61
61
|
codegraph_get_snippet: true,
|
|
62
62
|
codegraph_get_architecture: true,
|
|
63
63
|
codegraph_search_code: true,
|
|
64
|
+
support_passport_memory_preview: true,
|
|
65
|
+
support_passport_cards_list: true,
|
|
66
|
+
support_passport_grants_list: true,
|
|
64
67
|
};
|