@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
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SupportPassportError,
|
|
3
|
+
getOperation
|
|
4
|
+
} from "./chunk-D3LBIUWV.js";
|
|
5
|
+
import {
|
|
6
|
+
abortError,
|
|
7
|
+
isAbortError
|
|
8
|
+
} from "./chunk-BTTPKDIL.js";
|
|
9
|
+
|
|
10
|
+
// src/support-passport/public-http.ts
|
|
11
|
+
import { createHash } from "crypto";
|
|
12
|
+
import { isIP } from "net";
|
|
13
|
+
var PUBLIC_RATE_LIMIT_MAX_KEYS = 2e4;
|
|
14
|
+
var PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK = 8;
|
|
15
|
+
var PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL = 256;
|
|
16
|
+
var PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK = 8;
|
|
17
|
+
var PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL = 256;
|
|
18
|
+
var SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES = [
|
|
19
|
+
{
|
|
20
|
+
method: "GET",
|
|
21
|
+
pathname: "/engram/v1/support-passport/public/grants/:id",
|
|
22
|
+
operation: "support_passport_grant_read"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
method: "POST",
|
|
26
|
+
pathname: "/engram/v1/support-passport/public/grants/:id/ask",
|
|
27
|
+
operation: "support_passport_grant_ask"
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
var UnreadSupportPassportRequestError = class extends Error {
|
|
31
|
+
constructor(response) {
|
|
32
|
+
super(response.message);
|
|
33
|
+
this.response = response;
|
|
34
|
+
this.name = "UnreadSupportPassportRequestError";
|
|
35
|
+
}
|
|
36
|
+
response;
|
|
37
|
+
};
|
|
38
|
+
var FixedWindowLimiter = class {
|
|
39
|
+
constructor(limit, windowMs, now) {
|
|
40
|
+
this.limit = limit;
|
|
41
|
+
this.windowMs = windowMs;
|
|
42
|
+
this.now = now;
|
|
43
|
+
}
|
|
44
|
+
limit;
|
|
45
|
+
windowMs;
|
|
46
|
+
now;
|
|
47
|
+
entries = /* @__PURE__ */ new Map();
|
|
48
|
+
consume(key) {
|
|
49
|
+
const reservation = this.reserve(key);
|
|
50
|
+
if (!reservation) return false;
|
|
51
|
+
reservation.commit();
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
reserve(key) {
|
|
55
|
+
const now = this.now();
|
|
56
|
+
let entry = this.entries.get(key);
|
|
57
|
+
if (!entry || entry.resetAt <= now) {
|
|
58
|
+
if (!entry && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {
|
|
59
|
+
this.prune(now);
|
|
60
|
+
if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return void 0;
|
|
61
|
+
}
|
|
62
|
+
entry = { count: 0, resetAt: now + this.windowMs };
|
|
63
|
+
this.entries.set(key, entry);
|
|
64
|
+
}
|
|
65
|
+
if (entry.count >= this.limit) return void 0;
|
|
66
|
+
entry.count += 1;
|
|
67
|
+
let active = true;
|
|
68
|
+
return {
|
|
69
|
+
commit: () => {
|
|
70
|
+
active = false;
|
|
71
|
+
},
|
|
72
|
+
release: () => {
|
|
73
|
+
if (!active) return;
|
|
74
|
+
active = false;
|
|
75
|
+
if (this.entries.get(key) !== entry) return;
|
|
76
|
+
entry.count -= 1;
|
|
77
|
+
if (entry.count === 0) this.entries.delete(key);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
allows(key) {
|
|
82
|
+
const now = this.now();
|
|
83
|
+
const current = this.entries.get(key);
|
|
84
|
+
if (current && current.resetAt > now) return current.count < this.limit;
|
|
85
|
+
if (!current && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {
|
|
86
|
+
this.prune(now);
|
|
87
|
+
if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
prune(now) {
|
|
92
|
+
for (const [key, entry] of this.entries) {
|
|
93
|
+
if (entry.resetAt <= now) this.entries.delete(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var InFlightLimiter = class {
|
|
98
|
+
constructor(perKeyLimit, totalLimit) {
|
|
99
|
+
this.perKeyLimit = perKeyLimit;
|
|
100
|
+
this.totalLimit = totalLimit;
|
|
101
|
+
}
|
|
102
|
+
perKeyLimit;
|
|
103
|
+
totalLimit;
|
|
104
|
+
counts = /* @__PURE__ */ new Map();
|
|
105
|
+
total = 0;
|
|
106
|
+
reserve(key) {
|
|
107
|
+
const current = this.counts.get(key) ?? 0;
|
|
108
|
+
if (current >= this.perKeyLimit || this.total >= this.totalLimit) return void 0;
|
|
109
|
+
this.counts.set(key, current + 1);
|
|
110
|
+
this.total += 1;
|
|
111
|
+
let active = true;
|
|
112
|
+
return () => {
|
|
113
|
+
if (!active) return;
|
|
114
|
+
active = false;
|
|
115
|
+
const count = this.counts.get(key) ?? 0;
|
|
116
|
+
if (count <= 1) this.counts.delete(key);
|
|
117
|
+
else this.counts.set(key, count - 1);
|
|
118
|
+
this.total -= 1;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
function createRateLimits(now) {
|
|
123
|
+
return {
|
|
124
|
+
authentications: new InFlightLimiter(PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL),
|
|
125
|
+
modelCalls: new InFlightLimiter(PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL),
|
|
126
|
+
grantReads: new FixedWindowLimiter(60, 6e4, now),
|
|
127
|
+
networkReads: new FixedWindowLimiter(60, 6e4, now),
|
|
128
|
+
networkReadFailures: new FixedWindowLimiter(60, 6e4, now),
|
|
129
|
+
grantQuestions: new FixedWindowLimiter(20, 10 * 6e4, now),
|
|
130
|
+
networkQuestions: new FixedWindowLimiter(20, 10 * 6e4, now),
|
|
131
|
+
networkQuestionFailures: new FixedWindowLimiter(20, 10 * 6e4, now)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function rateLimited() {
|
|
135
|
+
return new SupportPassportError("rate_limited", "Too many helper requests.", 429);
|
|
136
|
+
}
|
|
137
|
+
async function runPublicOperation(service, name, input, signal) {
|
|
138
|
+
const operation = getOperation(name);
|
|
139
|
+
if (!operation) throw new Error(`access-boundary: operation not registered: ${name}`);
|
|
140
|
+
const output = await operation.run(input, {
|
|
141
|
+
service,
|
|
142
|
+
...signal ? { abortSignal: signal } : {}
|
|
143
|
+
});
|
|
144
|
+
return output.result;
|
|
145
|
+
}
|
|
146
|
+
function reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId) {
|
|
147
|
+
const network = networkLimiter.reserve(networkKey);
|
|
148
|
+
if (!network) throw rateLimited();
|
|
149
|
+
const grant = grantLimiter.reserve(grantId);
|
|
150
|
+
if (!grant) {
|
|
151
|
+
network.release();
|
|
152
|
+
throw rateLimited();
|
|
153
|
+
}
|
|
154
|
+
let active = true;
|
|
155
|
+
return {
|
|
156
|
+
commit: () => {
|
|
157
|
+
if (!active) return;
|
|
158
|
+
active = false;
|
|
159
|
+
network.commit();
|
|
160
|
+
grant.commit();
|
|
161
|
+
},
|
|
162
|
+
release: () => {
|
|
163
|
+
if (!active) return;
|
|
164
|
+
active = false;
|
|
165
|
+
grant.release();
|
|
166
|
+
network.release();
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async function readGrantUnderAuthenticationReservation(service, grantId, secret, networkKey, networkLimiter, grantLimiter, failureLimiter) {
|
|
171
|
+
if (!failureLimiter.allows(networkKey)) throw rateLimited();
|
|
172
|
+
const limits = reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId);
|
|
173
|
+
let guide;
|
|
174
|
+
try {
|
|
175
|
+
guide = await runPublicOperation(service, "support_passport_grant_read", { grantId, secret });
|
|
176
|
+
} catch (error) {
|
|
177
|
+
if (error instanceof SupportPassportError) {
|
|
178
|
+
if (error.code === "grant_not_found") {
|
|
179
|
+
limits.release();
|
|
180
|
+
if (!failureLimiter.consume(networkKey)) throw rateLimited();
|
|
181
|
+
} else {
|
|
182
|
+
limits.commit();
|
|
183
|
+
}
|
|
184
|
+
} else {
|
|
185
|
+
limits.release();
|
|
186
|
+
}
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
limits.commit();
|
|
190
|
+
return guide;
|
|
191
|
+
}
|
|
192
|
+
async function readGrantWithRateLimits(service, grantId, secret, networkKey, networkLimiter, grantLimiter, failureLimiter, authenticationLimiter) {
|
|
193
|
+
const releaseAuthentication = authenticationLimiter.reserve(networkKey);
|
|
194
|
+
if (!releaseAuthentication) throw rateLimited();
|
|
195
|
+
try {
|
|
196
|
+
return await readGrantUnderAuthenticationReservation(
|
|
197
|
+
service,
|
|
198
|
+
grantId,
|
|
199
|
+
secret,
|
|
200
|
+
networkKey,
|
|
201
|
+
networkLimiter,
|
|
202
|
+
grantLimiter,
|
|
203
|
+
failureLimiter
|
|
204
|
+
);
|
|
205
|
+
} finally {
|
|
206
|
+
releaseAuthentication();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function normalizeSupportPassportNetworkAddress(value) {
|
|
210
|
+
if (!value) return void 0;
|
|
211
|
+
const address = value.trim().toLowerCase();
|
|
212
|
+
const family = isIP(address);
|
|
213
|
+
if (family === 0) return void 0;
|
|
214
|
+
if (family === 4) return address;
|
|
215
|
+
const canonical = new URL(`http://[${address}]/`).hostname.slice(1, -1);
|
|
216
|
+
const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(canonical);
|
|
217
|
+
if (!mapped) return canonical;
|
|
218
|
+
const high = Number.parseInt(mapped[1] ?? "", 16);
|
|
219
|
+
const low = Number.parseInt(mapped[2] ?? "", 16);
|
|
220
|
+
return `${high >>> 8}.${high & 255}.${low >>> 8}.${low & 255}`;
|
|
221
|
+
}
|
|
222
|
+
function requestNetworkAddress(req, trustedProxyAddresses) {
|
|
223
|
+
const directAddress = normalizeSupportPassportNetworkAddress(req.socket.remoteAddress) ?? "unknown";
|
|
224
|
+
if (!trustedProxyAddresses.has(directAddress)) return directAddress;
|
|
225
|
+
const forwarded = req.headers["x-forwarded-for"];
|
|
226
|
+
if (typeof forwarded !== "string") return directAddress;
|
|
227
|
+
const rawAddresses = forwarded.split(",");
|
|
228
|
+
if (rawAddresses.length < 1 || rawAddresses.length > 32) return directAddress;
|
|
229
|
+
const addresses = rawAddresses.map((address) => normalizeSupportPassportNetworkAddress(address));
|
|
230
|
+
if (addresses.some((address) => address === void 0)) return directAddress;
|
|
231
|
+
for (let index = addresses.length - 1; index >= 0; index -= 1) {
|
|
232
|
+
const address = addresses[index];
|
|
233
|
+
if (address && !trustedProxyAddresses.has(address)) return address;
|
|
234
|
+
}
|
|
235
|
+
return addresses[0] ?? directAddress;
|
|
236
|
+
}
|
|
237
|
+
function networkDigest(req, trustedProxyAddresses) {
|
|
238
|
+
return createHash("sha256").update(requestNetworkAddress(req, trustedProxyAddresses)).digest("hex");
|
|
239
|
+
}
|
|
240
|
+
function parseSecret(req) {
|
|
241
|
+
const raw = req.headers.authorization;
|
|
242
|
+
if (typeof raw !== "string") return void 0;
|
|
243
|
+
const match = /^(\S+)[ \t]+(\S+)$/.exec(raw);
|
|
244
|
+
if (!match || match[1]?.toLowerCase() !== "supportpassport") return void 0;
|
|
245
|
+
const secret = match[2] ?? "";
|
|
246
|
+
if (!/^[A-Za-z0-9_-]{32,256}$/.test(secret)) return void 0;
|
|
247
|
+
return secret;
|
|
248
|
+
}
|
|
249
|
+
function requestDeclaresBody(req) {
|
|
250
|
+
const contentLength = req.headers["content-length"];
|
|
251
|
+
const transferEncoding = req.headers["transfer-encoding"];
|
|
252
|
+
return transferEncoding !== void 0 || contentLength !== void 0 && contentLength !== "0";
|
|
253
|
+
}
|
|
254
|
+
function respondJson(res, status, payload) {
|
|
255
|
+
const body = JSON.stringify(payload);
|
|
256
|
+
res.statusCode = status;
|
|
257
|
+
res.setHeader("cache-control", "private, no-store");
|
|
258
|
+
res.setHeader("vary", "Authorization");
|
|
259
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
260
|
+
res.setHeader("content-length", String(Buffer.byteLength(body)));
|
|
261
|
+
res.end(body);
|
|
262
|
+
}
|
|
263
|
+
function respondJsonAndCloseUnreadRequest(req, res, status, payload) {
|
|
264
|
+
res.shouldKeepAlive = false;
|
|
265
|
+
res.setHeader("connection", "close");
|
|
266
|
+
res.once("finish", () => req.destroy());
|
|
267
|
+
respondJson(res, status, payload);
|
|
268
|
+
}
|
|
269
|
+
function respondBeforeReadingBody(req, res, status, payload) {
|
|
270
|
+
if (requestDeclaresBody(req)) {
|
|
271
|
+
respondJsonAndCloseUnreadRequest(req, res, status, payload);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
respondJson(res, status, payload);
|
|
275
|
+
}
|
|
276
|
+
async function readQuestionBody(req, signal) {
|
|
277
|
+
const content = await new Promise((resolve, reject) => {
|
|
278
|
+
const chunks = [];
|
|
279
|
+
let bytes = 0;
|
|
280
|
+
let settled = false;
|
|
281
|
+
const cleanup = () => {
|
|
282
|
+
req.off("data", onData);
|
|
283
|
+
req.off("end", onEnd);
|
|
284
|
+
req.off("error", onError);
|
|
285
|
+
req.off("aborted", onAborted);
|
|
286
|
+
signal.removeEventListener("abort", onSignalAbort);
|
|
287
|
+
};
|
|
288
|
+
const fail = (error) => {
|
|
289
|
+
if (settled) return;
|
|
290
|
+
settled = true;
|
|
291
|
+
cleanup();
|
|
292
|
+
reject(error);
|
|
293
|
+
};
|
|
294
|
+
const helperLeft = () => isAbortError(signal.reason) ? signal.reason : abortError("The helper left.");
|
|
295
|
+
const onData = (chunk) => {
|
|
296
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
297
|
+
bytes += buffer.length;
|
|
298
|
+
if (bytes > 4096) {
|
|
299
|
+
req.pause();
|
|
300
|
+
fail(
|
|
301
|
+
new UnreadSupportPassportRequestError(
|
|
302
|
+
new SupportPassportError("invalid_input", "The helper question is invalid.", 400)
|
|
303
|
+
)
|
|
304
|
+
);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
chunks.push(buffer);
|
|
308
|
+
};
|
|
309
|
+
const onEnd = () => {
|
|
310
|
+
if (settled) return;
|
|
311
|
+
settled = true;
|
|
312
|
+
cleanup();
|
|
313
|
+
resolve(Buffer.concat(chunks, bytes));
|
|
314
|
+
};
|
|
315
|
+
const onError = (error) => fail(signal.aborted || req.aborted ? helperLeft() : error);
|
|
316
|
+
const onAborted = () => fail(helperLeft());
|
|
317
|
+
const onSignalAbort = () => fail(helperLeft());
|
|
318
|
+
req.on("data", onData);
|
|
319
|
+
req.once("end", onEnd);
|
|
320
|
+
req.once("error", onError);
|
|
321
|
+
req.once("aborted", onAborted);
|
|
322
|
+
signal.addEventListener("abort", onSignalAbort, { once: true });
|
|
323
|
+
if (signal.aborted) onSignalAbort();
|
|
324
|
+
});
|
|
325
|
+
let parsed;
|
|
326
|
+
try {
|
|
327
|
+
parsed = JSON.parse(content.toString("utf8"));
|
|
328
|
+
} catch {
|
|
329
|
+
throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
|
|
330
|
+
}
|
|
331
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
332
|
+
throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
|
|
333
|
+
}
|
|
334
|
+
const body = parsed;
|
|
335
|
+
if (Object.keys(body).length !== 1 || typeof body.question !== "string") {
|
|
336
|
+
throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
|
|
337
|
+
}
|
|
338
|
+
const question = body.question.trim();
|
|
339
|
+
if (question.length < 1 || question.length > 500) {
|
|
340
|
+
throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
|
|
341
|
+
}
|
|
342
|
+
return question;
|
|
343
|
+
}
|
|
344
|
+
function requestSignal(req, res) {
|
|
345
|
+
const controller = new AbortController();
|
|
346
|
+
const abort = () => {
|
|
347
|
+
if (!res.writableFinished && !controller.signal.aborted) controller.abort(abortError("The helper left."));
|
|
348
|
+
};
|
|
349
|
+
req.once("aborted", abort);
|
|
350
|
+
res.once("close", abort);
|
|
351
|
+
return {
|
|
352
|
+
signal: controller.signal,
|
|
353
|
+
cleanup: () => {
|
|
354
|
+
req.off("aborted", abort);
|
|
355
|
+
res.off("close", abort);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
function decodeGrantId(raw) {
|
|
360
|
+
try {
|
|
361
|
+
const value = decodeURIComponent(raw);
|
|
362
|
+
return /^[A-Za-z0-9_-]{1,128}$/.test(value) ? value.toLowerCase() : void 0;
|
|
363
|
+
} catch {
|
|
364
|
+
return void 0;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function buildSupportPassportPublicRequestHandler(service, options = {}) {
|
|
368
|
+
const rateLimits = createRateLimits(options.now ?? Date.now);
|
|
369
|
+
const trustedProxyAddresses = new Set(
|
|
370
|
+
(options.trustedProxyAddresses ?? []).map((address) => normalizeSupportPassportNetworkAddress(address)).filter((address) => address !== void 0)
|
|
371
|
+
);
|
|
372
|
+
return async (req, res) => {
|
|
373
|
+
let parsed;
|
|
374
|
+
try {
|
|
375
|
+
parsed = new URL(req.url ?? "/", "http://placeholder");
|
|
376
|
+
} catch {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const readMatch = /^\/engram\/v1\/support-passport\/public\/grants\/([^/]+)$/.exec(parsed.pathname);
|
|
380
|
+
const askMatch = /^\/engram\/v1\/support-passport\/public\/grants\/([^/]+)\/ask$/.exec(parsed.pathname);
|
|
381
|
+
const ownedRead = req.method === "GET" && readMatch;
|
|
382
|
+
const ownedQuestion = req.method === "POST" && askMatch;
|
|
383
|
+
if (!ownedRead && !ownedQuestion) return false;
|
|
384
|
+
res.setHeader("cache-control", "private, no-store");
|
|
385
|
+
res.setHeader("vary", "Authorization");
|
|
386
|
+
const grantId = decodeGrantId((ownedRead ? readMatch?.[1] : askMatch?.[1]) ?? "");
|
|
387
|
+
const secret = parseSecret(req);
|
|
388
|
+
if (parsed.search.length > 0) {
|
|
389
|
+
respondBeforeReadingBody(req, res, 400, {
|
|
390
|
+
error: "The share link request is invalid.",
|
|
391
|
+
code: "invalid_input"
|
|
392
|
+
});
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
if (ownedRead && requestDeclaresBody(req)) {
|
|
396
|
+
respondJsonAndCloseUnreadRequest(req, res, 400, {
|
|
397
|
+
error: "The share link request is invalid.",
|
|
398
|
+
code: "invalid_input"
|
|
399
|
+
});
|
|
400
|
+
return true;
|
|
401
|
+
}
|
|
402
|
+
if (!grantId || !secret) {
|
|
403
|
+
respondBeforeReadingBody(req, res, 404, {
|
|
404
|
+
error: "The share link was not found.",
|
|
405
|
+
code: "grant_not_found"
|
|
406
|
+
});
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
const lifecycle = requestSignal(req, res);
|
|
410
|
+
try {
|
|
411
|
+
const digest = networkDigest(req, trustedProxyAddresses);
|
|
412
|
+
if (ownedRead) {
|
|
413
|
+
const guide = await readGrantWithRateLimits(
|
|
414
|
+
service,
|
|
415
|
+
grantId,
|
|
416
|
+
secret,
|
|
417
|
+
digest,
|
|
418
|
+
rateLimits.networkReads,
|
|
419
|
+
rateLimits.grantReads,
|
|
420
|
+
rateLimits.networkReadFailures,
|
|
421
|
+
rateLimits.authentications
|
|
422
|
+
);
|
|
423
|
+
respondJson(res, 200, guide);
|
|
424
|
+
} else {
|
|
425
|
+
let releaseAuthentication = rateLimits.authentications.reserve(digest);
|
|
426
|
+
if (!releaseAuthentication) throw new UnreadSupportPassportRequestError(rateLimited());
|
|
427
|
+
try {
|
|
428
|
+
let question;
|
|
429
|
+
const bodyFailure = rateLimits.networkQuestionFailures.reserve(digest);
|
|
430
|
+
if (!bodyFailure) throw new UnreadSupportPassportRequestError(rateLimited());
|
|
431
|
+
try {
|
|
432
|
+
question = await readQuestionBody(req, lifecycle.signal);
|
|
433
|
+
bodyFailure.release();
|
|
434
|
+
} catch (error) {
|
|
435
|
+
const supportError = error instanceof UnreadSupportPassportRequestError ? error.response : error;
|
|
436
|
+
if (supportError instanceof SupportPassportError && supportError.code === "invalid_input") {
|
|
437
|
+
bodyFailure.commit();
|
|
438
|
+
} else {
|
|
439
|
+
bodyFailure.release();
|
|
440
|
+
}
|
|
441
|
+
throw error;
|
|
442
|
+
}
|
|
443
|
+
const releaseModelCall = rateLimits.modelCalls.reserve(digest);
|
|
444
|
+
if (!releaseModelCall) throw rateLimited();
|
|
445
|
+
try {
|
|
446
|
+
await readGrantUnderAuthenticationReservation(
|
|
447
|
+
service,
|
|
448
|
+
grantId,
|
|
449
|
+
secret,
|
|
450
|
+
digest,
|
|
451
|
+
rateLimits.networkQuestions,
|
|
452
|
+
rateLimits.grantQuestions,
|
|
453
|
+
rateLimits.networkQuestionFailures
|
|
454
|
+
);
|
|
455
|
+
releaseAuthentication();
|
|
456
|
+
releaseAuthentication = void 0;
|
|
457
|
+
const answer = await runPublicOperation(
|
|
458
|
+
service,
|
|
459
|
+
"support_passport_grant_ask",
|
|
460
|
+
{ grantId, secret, question },
|
|
461
|
+
lifecycle.signal
|
|
462
|
+
);
|
|
463
|
+
respondJson(res, 200, answer);
|
|
464
|
+
} finally {
|
|
465
|
+
releaseModelCall();
|
|
466
|
+
}
|
|
467
|
+
} finally {
|
|
468
|
+
releaseAuthentication?.();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
} catch (error) {
|
|
472
|
+
if (error instanceof UnreadSupportPassportRequestError) {
|
|
473
|
+
respondJsonAndCloseUnreadRequest(req, res, error.response.status, {
|
|
474
|
+
error: error.response.message,
|
|
475
|
+
code: error.response.code
|
|
476
|
+
});
|
|
477
|
+
return true;
|
|
478
|
+
}
|
|
479
|
+
if (!(error instanceof SupportPassportError)) throw error;
|
|
480
|
+
respondJson(res, error.status, { error: error.message, code: error.code });
|
|
481
|
+
} finally {
|
|
482
|
+
lifecycle.cleanup();
|
|
483
|
+
}
|
|
484
|
+
return true;
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
function composeSupportPassportExternalRequestHandlers(...handlers) {
|
|
488
|
+
return async (req, res, ctx) => {
|
|
489
|
+
for (const handler of handlers) {
|
|
490
|
+
if (handler && await handler(req, res, ctx)) return true;
|
|
491
|
+
}
|
|
492
|
+
return false;
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export {
|
|
497
|
+
SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES,
|
|
498
|
+
normalizeSupportPassportNetworkAddress,
|
|
499
|
+
buildSupportPassportPublicRequestHandler,
|
|
500
|
+
composeSupportPassportExternalRequestHandlers
|
|
501
|
+
};
|
|
502
|
+
//# sourceMappingURL=chunk-37DZZFFM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/support-passport/public-http.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { isIP } from \"node:net\";\n\nimport { abortError, isAbortError } from \"../abort-error.js\";\nimport { type OperationName, getOperation } from \"../access-boundary.js\";\nimport type { EngramAccessService } from \"../access-service.js\";\nimport { SupportPassportError } from \"./errors.js\";\n\nconst PUBLIC_RATE_LIMIT_MAX_KEYS = 20_000;\nconst PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK = 8;\nconst PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL = 256;\nconst PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK = 8;\nconst PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL = 256;\n\nexport const SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES = [\n {\n method: \"GET\",\n pathname: \"/engram/v1/support-passport/public/grants/:id\",\n operation: \"support_passport_grant_read\",\n },\n {\n method: \"POST\",\n pathname: \"/engram/v1/support-passport/public/grants/:id/ask\",\n operation: \"support_passport_grant_ask\",\n },\n] as const satisfies ReadonlyArray<{ method: string; pathname: string; operation: OperationName }>;\n\nexport type SupportPassportExternalRequestHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n ctx: {\n authorized: boolean;\n tokenAuthorized: boolean;\n }\n) => Promise<boolean>;\n\ninterface WindowEntry {\n count: number;\n resetAt: number;\n}\n\ninterface WindowReservation {\n commit(): void;\n release(): void;\n}\n\nclass UnreadSupportPassportRequestError extends Error {\n constructor(readonly response: SupportPassportError) {\n super(response.message);\n this.name = \"UnreadSupportPassportRequestError\";\n }\n}\n\nclass FixedWindowLimiter {\n private readonly entries = new Map<string, WindowEntry>();\n\n constructor(\n private readonly limit: number,\n private readonly windowMs: number,\n private readonly now: () => number\n ) {}\n\n consume(key: string): boolean {\n const reservation = this.reserve(key);\n if (!reservation) return false;\n reservation.commit();\n return true;\n }\n\n reserve(key: string): WindowReservation | undefined {\n const now = this.now();\n let entry = this.entries.get(key);\n if (!entry || entry.resetAt <= now) {\n if (!entry && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {\n this.prune(now);\n if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return undefined;\n }\n entry = { count: 0, resetAt: now + this.windowMs };\n this.entries.set(key, entry);\n }\n if (entry.count >= this.limit) return undefined;\n entry.count += 1;\n let active = true;\n return {\n commit: () => {\n active = false;\n },\n release: () => {\n if (!active) return;\n active = false;\n if (this.entries.get(key) !== entry) return;\n entry.count -= 1;\n if (entry.count === 0) this.entries.delete(key);\n },\n };\n }\n\n allows(key: string): boolean {\n const now = this.now();\n const current = this.entries.get(key);\n if (current && current.resetAt > now) return current.count < this.limit;\n if (!current && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {\n this.prune(now);\n if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return false;\n }\n return true;\n }\n\n private prune(now: number): void {\n for (const [key, entry] of this.entries) {\n if (entry.resetAt <= now) this.entries.delete(key);\n }\n }\n}\n\nclass InFlightLimiter {\n private readonly counts = new Map<string, number>();\n private total = 0;\n\n constructor(\n private readonly perKeyLimit: number,\n private readonly totalLimit: number\n ) {}\n\n reserve(key: string): (() => void) | undefined {\n const current = this.counts.get(key) ?? 0;\n if (current >= this.perKeyLimit || this.total >= this.totalLimit) return undefined;\n this.counts.set(key, current + 1);\n this.total += 1;\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const count = this.counts.get(key) ?? 0;\n if (count <= 1) this.counts.delete(key);\n else this.counts.set(key, count - 1);\n this.total -= 1;\n };\n }\n}\n\ninterface PublicRateLimits {\n authentications: InFlightLimiter;\n modelCalls: InFlightLimiter;\n grantReads: FixedWindowLimiter;\n networkReads: FixedWindowLimiter;\n networkReadFailures: FixedWindowLimiter;\n grantQuestions: FixedWindowLimiter;\n networkQuestions: FixedWindowLimiter;\n networkQuestionFailures: FixedWindowLimiter;\n}\n\nexport interface SupportPassportPublicHandlerOptions {\n now?: () => number;\n trustedProxyAddresses?: readonly string[];\n}\n\nfunction createRateLimits(now: () => number): PublicRateLimits {\n return {\n authentications: new InFlightLimiter(PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL),\n modelCalls: new InFlightLimiter(PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL),\n grantReads: new FixedWindowLimiter(60, 60_000, now),\n networkReads: new FixedWindowLimiter(60, 60_000, now),\n networkReadFailures: new FixedWindowLimiter(60, 60_000, now),\n grantQuestions: new FixedWindowLimiter(20, 10 * 60_000, now),\n networkQuestions: new FixedWindowLimiter(20, 10 * 60_000, now),\n networkQuestionFailures: new FixedWindowLimiter(20, 10 * 60_000, now),\n };\n}\n\nfunction rateLimited(): SupportPassportError {\n return new SupportPassportError(\"rate_limited\", \"Too many helper requests.\", 429);\n}\n\nasync function runPublicOperation(\n service: EngramAccessService,\n name: \"support_passport_grant_read\" | \"support_passport_grant_ask\",\n input: Record<string, unknown>,\n signal?: AbortSignal\n): Promise<unknown> {\n const operation = getOperation(name);\n if (!operation) throw new Error(`access-boundary: operation not registered: ${name}`);\n const output = (await operation.run(input, {\n service,\n ...(signal ? { abortSignal: signal } : {}),\n })) as { result: unknown };\n return output.result;\n}\n\nfunction reserveAuthenticatedLimits(\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n networkKey: string,\n grantId: string\n): WindowReservation {\n const network = networkLimiter.reserve(networkKey);\n if (!network) throw rateLimited();\n const grant = grantLimiter.reserve(grantId);\n if (!grant) {\n network.release();\n throw rateLimited();\n }\n let active = true;\n return {\n commit: () => {\n if (!active) return;\n active = false;\n network.commit();\n grant.commit();\n },\n release: () => {\n if (!active) return;\n active = false;\n grant.release();\n network.release();\n },\n };\n}\n\nasync function readGrantUnderAuthenticationReservation(\n service: EngramAccessService,\n grantId: string,\n secret: string,\n networkKey: string,\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n failureLimiter: FixedWindowLimiter\n) {\n if (!failureLimiter.allows(networkKey)) throw rateLimited();\n const limits = reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId);\n let guide: Awaited<ReturnType<EngramAccessService[\"supportPassportReadGrant\"]>>;\n try {\n guide = (await runPublicOperation(service, \"support_passport_grant_read\", { grantId, secret })) as Awaited<\n ReturnType<EngramAccessService[\"supportPassportReadGrant\"]>\n >;\n } catch (error) {\n if (error instanceof SupportPassportError) {\n if (error.code === \"grant_not_found\") {\n limits.release();\n if (!failureLimiter.consume(networkKey)) throw rateLimited();\n } else {\n limits.commit();\n }\n } else {\n limits.release();\n }\n throw error;\n }\n limits.commit();\n return guide;\n}\n\nasync function readGrantWithRateLimits(\n service: EngramAccessService,\n grantId: string,\n secret: string,\n networkKey: string,\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n failureLimiter: FixedWindowLimiter,\n authenticationLimiter: InFlightLimiter\n) {\n const releaseAuthentication = authenticationLimiter.reserve(networkKey);\n if (!releaseAuthentication) throw rateLimited();\n try {\n return await readGrantUnderAuthenticationReservation(\n service,\n grantId,\n secret,\n networkKey,\n networkLimiter,\n grantLimiter,\n failureLimiter\n );\n } finally {\n releaseAuthentication();\n }\n}\n\nexport function normalizeSupportPassportNetworkAddress(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const address = value.trim().toLowerCase();\n const family = isIP(address);\n if (family === 0) return undefined;\n if (family === 4) return address;\n const canonical = new URL(`http://[${address}]/`).hostname.slice(1, -1);\n const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(canonical);\n if (!mapped) return canonical;\n const high = Number.parseInt(mapped[1] ?? \"\", 16);\n const low = Number.parseInt(mapped[2] ?? \"\", 16);\n return `${high >>> 8}.${high & 0xff}.${low >>> 8}.${low & 0xff}`;\n}\n\nfunction requestNetworkAddress(req: IncomingMessage, trustedProxyAddresses: ReadonlySet<string>): string {\n const directAddress = normalizeSupportPassportNetworkAddress(req.socket.remoteAddress) ?? \"unknown\";\n if (!trustedProxyAddresses.has(directAddress)) return directAddress;\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded !== \"string\") return directAddress;\n const rawAddresses = forwarded.split(\",\");\n if (rawAddresses.length < 1 || rawAddresses.length > 32) return directAddress;\n const addresses = rawAddresses.map((address) => normalizeSupportPassportNetworkAddress(address));\n if (addresses.some((address) => address === undefined)) return directAddress;\n for (let index = addresses.length - 1; index >= 0; index -= 1) {\n const address = addresses[index];\n if (address && !trustedProxyAddresses.has(address)) return address;\n }\n return addresses[0] ?? directAddress;\n}\n\nfunction networkDigest(req: IncomingMessage, trustedProxyAddresses: ReadonlySet<string>): string {\n return createHash(\"sha256\")\n .update(requestNetworkAddress(req, trustedProxyAddresses))\n .digest(\"hex\");\n}\n\nfunction parseSecret(req: IncomingMessage): string | undefined {\n const raw = req.headers.authorization;\n if (typeof raw !== \"string\") return undefined;\n const match = /^(\\S+)[ \\t]+(\\S+)$/.exec(raw);\n if (!match || match[1]?.toLowerCase() !== \"supportpassport\") return undefined;\n const secret = match[2] ?? \"\";\n if (!/^[A-Za-z0-9_-]{32,256}$/.test(secret)) return undefined;\n return secret;\n}\n\nfunction requestDeclaresBody(req: IncomingMessage): boolean {\n const contentLength = req.headers[\"content-length\"];\n const transferEncoding = req.headers[\"transfer-encoding\"];\n return transferEncoding !== undefined || (contentLength !== undefined && contentLength !== \"0\");\n}\n\nfunction respondJson(res: ServerResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n res.statusCode = status;\n res.setHeader(\"cache-control\", \"private, no-store\");\n res.setHeader(\"vary\", \"Authorization\");\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n res.end(body);\n}\n\nfunction respondJsonAndCloseUnreadRequest(\n req: IncomingMessage,\n res: ServerResponse,\n status: number,\n payload: unknown\n): void {\n res.shouldKeepAlive = false;\n res.setHeader(\"connection\", \"close\");\n res.once(\"finish\", () => req.destroy());\n respondJson(res, status, payload);\n}\n\nfunction respondBeforeReadingBody(\n req: IncomingMessage,\n res: ServerResponse,\n status: number,\n payload: unknown\n): void {\n if (requestDeclaresBody(req)) {\n respondJsonAndCloseUnreadRequest(req, res, status, payload);\n return;\n }\n respondJson(res, status, payload);\n}\n\nasync function readQuestionBody(req: IncomingMessage, signal: AbortSignal): Promise<string> {\n const content = await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let bytes = 0;\n let settled = false;\n const cleanup = () => {\n req.off(\"data\", onData);\n req.off(\"end\", onEnd);\n req.off(\"error\", onError);\n req.off(\"aborted\", onAborted);\n signal.removeEventListener(\"abort\", onSignalAbort);\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const helperLeft = () =>\n isAbortError(signal.reason) ? signal.reason : abortError(\"The helper left.\");\n const onData = (chunk: Buffer | string) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.length;\n if (bytes > 4_096) {\n req.pause();\n fail(\n new UnreadSupportPassportRequestError(\n new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400)\n )\n );\n return;\n }\n chunks.push(buffer);\n };\n const onEnd = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(Buffer.concat(chunks, bytes));\n };\n const onError = (error: Error) => fail(signal.aborted || req.aborted ? helperLeft() : error);\n const onAborted = () => fail(helperLeft());\n const onSignalAbort = () => fail(helperLeft());\n req.on(\"data\", onData);\n req.once(\"end\", onEnd);\n req.once(\"error\", onError);\n req.once(\"aborted\", onAborted);\n signal.addEventListener(\"abort\", onSignalAbort, { once: true });\n if (signal.aborted) onSignalAbort();\n });\n let parsed: unknown;\n try {\n parsed = JSON.parse(content.toString(\"utf8\"));\n } catch {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n const body = parsed as Record<string, unknown>;\n if (Object.keys(body).length !== 1 || typeof body.question !== \"string\") {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n const question = body.question.trim();\n if (question.length < 1 || question.length > 500) {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n return question;\n}\n\nfunction requestSignal(req: IncomingMessage, res: ServerResponse): { signal: AbortSignal; cleanup(): void } {\n const controller = new AbortController();\n const abort = () => {\n if (!res.writableFinished && !controller.signal.aborted) controller.abort(abortError(\"The helper left.\"));\n };\n req.once(\"aborted\", abort);\n res.once(\"close\", abort);\n return {\n signal: controller.signal,\n cleanup: () => {\n req.off(\"aborted\", abort);\n res.off(\"close\", abort);\n },\n };\n}\n\nfunction decodeGrantId(raw: string): string | undefined {\n try {\n const value = decodeURIComponent(raw);\n return /^[A-Za-z0-9_-]{1,128}$/.test(value) ? value.toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function buildSupportPassportPublicRequestHandler(\n service: EngramAccessService,\n options: SupportPassportPublicHandlerOptions = {}\n): SupportPassportExternalRequestHandler {\n const rateLimits = createRateLimits(options.now ?? Date.now);\n const trustedProxyAddresses = new Set(\n (options.trustedProxyAddresses ?? [])\n .map((address) => normalizeSupportPassportNetworkAddress(address))\n .filter((address): address is string => address !== undefined)\n );\n return async (req, res) => {\n let parsed: URL;\n try {\n parsed = new URL(req.url ?? \"/\", \"http://placeholder\");\n } catch {\n return false;\n }\n const readMatch = /^\\/engram\\/v1\\/support-passport\\/public\\/grants\\/([^/]+)$/.exec(parsed.pathname);\n const askMatch = /^\\/engram\\/v1\\/support-passport\\/public\\/grants\\/([^/]+)\\/ask$/.exec(parsed.pathname);\n const ownedRead = req.method === \"GET\" && readMatch;\n const ownedQuestion = req.method === \"POST\" && askMatch;\n if (!ownedRead && !ownedQuestion) return false;\n\n res.setHeader(\"cache-control\", \"private, no-store\");\n res.setHeader(\"vary\", \"Authorization\");\n const grantId = decodeGrantId((ownedRead ? readMatch?.[1] : askMatch?.[1]) ?? \"\");\n const secret = parseSecret(req);\n if (parsed.search.length > 0) {\n respondBeforeReadingBody(req, res, 400, {\n error: \"The share link request is invalid.\",\n code: \"invalid_input\",\n });\n return true;\n }\n if (ownedRead && requestDeclaresBody(req)) {\n respondJsonAndCloseUnreadRequest(req, res, 400, {\n error: \"The share link request is invalid.\",\n code: \"invalid_input\",\n });\n return true;\n }\n if (!grantId || !secret) {\n respondBeforeReadingBody(req, res, 404, {\n error: \"The share link was not found.\",\n code: \"grant_not_found\",\n });\n return true;\n }\n\n const lifecycle = requestSignal(req, res);\n try {\n const digest = networkDigest(req, trustedProxyAddresses);\n if (ownedRead) {\n const guide = await readGrantWithRateLimits(\n service,\n grantId,\n secret,\n digest,\n rateLimits.networkReads,\n rateLimits.grantReads,\n rateLimits.networkReadFailures,\n rateLimits.authentications\n );\n respondJson(res, 200, guide);\n } else {\n let releaseAuthentication = rateLimits.authentications.reserve(digest);\n if (!releaseAuthentication) throw new UnreadSupportPassportRequestError(rateLimited());\n try {\n let question: string;\n const bodyFailure = rateLimits.networkQuestionFailures.reserve(digest);\n if (!bodyFailure) throw new UnreadSupportPassportRequestError(rateLimited());\n try {\n question = await readQuestionBody(req, lifecycle.signal);\n bodyFailure.release();\n } catch (error) {\n const supportError =\n error instanceof UnreadSupportPassportRequestError ? error.response : error;\n if (supportError instanceof SupportPassportError && supportError.code === \"invalid_input\") {\n bodyFailure.commit();\n } else {\n bodyFailure.release();\n }\n throw error;\n }\n const releaseModelCall = rateLimits.modelCalls.reserve(digest);\n if (!releaseModelCall) throw rateLimited();\n try {\n await readGrantUnderAuthenticationReservation(\n service,\n grantId,\n secret,\n digest,\n rateLimits.networkQuestions,\n rateLimits.grantQuestions,\n rateLimits.networkQuestionFailures\n );\n releaseAuthentication();\n releaseAuthentication = undefined;\n const answer = await runPublicOperation(\n service,\n \"support_passport_grant_ask\",\n { grantId, secret, question },\n lifecycle.signal\n );\n respondJson(res, 200, answer);\n } finally {\n releaseModelCall();\n }\n } finally {\n releaseAuthentication?.();\n }\n }\n } catch (error) {\n if (error instanceof UnreadSupportPassportRequestError) {\n respondJsonAndCloseUnreadRequest(req, res, error.response.status, {\n error: error.response.message,\n code: error.response.code,\n });\n return true;\n }\n if (!(error instanceof SupportPassportError)) throw error;\n respondJson(res, error.status, { error: error.message, code: error.code });\n } finally {\n lifecycle.cleanup();\n }\n return true;\n };\n}\n\nexport function composeSupportPassportExternalRequestHandlers(\n ...handlers: Array<SupportPassportExternalRequestHandler | undefined>\n): SupportPassportExternalRequestHandler {\n return async (req, res, ctx) => {\n for (const handler of handlers) {\n if (handler && (await handler(req, res, ctx))) return true;\n }\n return false;\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/inline-script.ts
|
|
2
|
+
function serializeInlineScriptValue(value) {
|
|
3
|
+
return JSON.stringify(value).replaceAll("<", "\\u003c").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
serializeInlineScriptValue
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=chunk-3HSRWJTC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/inline-script.ts"],"sourcesContent":["export function serializeInlineScriptValue(value: string): string {\n return JSON.stringify(value)\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"\\u2028\", \"\\\\u2028\")\n .replaceAll(\"\\u2029\", \"\\\\u2029\");\n}\n"],"mappings":";AAAO,SAAS,2BAA2B,OAAuB;AAChE,SAAO,KAAK,UAAU,KAAK,EACxB,WAAW,KAAK,SAAS,EACzB,WAAW,UAAU,SAAS,EAC9B,WAAW,UAAU,SAAS;AACnC;","names":[]}
|
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
listMemoryGovernanceRuns,
|
|
9
9
|
readMemoryGovernanceRunArtifact
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GJ776BC2.js";
|
|
11
11
|
import {
|
|
12
12
|
StorageManager
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-M4YHAODQ.js";
|
|
14
14
|
import {
|
|
15
15
|
normalizeProjectionPreview,
|
|
16
16
|
normalizeProjectionTags
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
} from "./chunk-RL6NEVXT.js";
|
|
48
48
|
import {
|
|
49
49
|
isSupportPassportPrivateMemory
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-XX4HPFFM.js";
|
|
51
51
|
import {
|
|
52
52
|
log
|
|
53
53
|
} from "./chunk-3WCASNQZ.js";
|
|
@@ -1005,4 +1005,4 @@ export {
|
|
|
1005
1005
|
verifyMemoryProjection,
|
|
1006
1006
|
repairMemoryProjection
|
|
1007
1007
|
};
|
|
1008
|
-
//# sourceMappingURL=chunk-
|
|
1008
|
+
//# sourceMappingURL=chunk-3TIZPSJC.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-KJTKLXTH.js";
|
|
4
4
|
import {
|
|
5
5
|
StorageManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-M4YHAODQ.js";
|
|
7
7
|
import {
|
|
8
8
|
copyExistingFileToBackup,
|
|
9
9
|
writeFileAtomically
|
|
@@ -260,4 +260,4 @@ export {
|
|
|
260
260
|
backupExistingLedger,
|
|
261
261
|
rebuildMemoryLifecycleLedger
|
|
262
262
|
};
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-46SZBVDS.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-B7RWBZXW.js";
|
|
4
4
|
import {
|
|
5
5
|
StorageManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-M4YHAODQ.js";
|
|
7
7
|
import {
|
|
8
8
|
getCachedEpisodeMap,
|
|
9
9
|
setCachedEpisodeMap
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
compareVerifiedEpisodeResults,
|
|
110
110
|
searchVerifiedEpisodes
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=chunk-
|
|
112
|
+
//# sourceMappingURL=chunk-5FD7JMTX.js.map
|