@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
|
@@ -2,7 +2,11 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
|
|
4
4
|
import type { StorageManager } from "../index.js";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
type HeldFileLockController,
|
|
7
|
+
serializeMutations,
|
|
8
|
+
withHeldFileLock,
|
|
9
|
+
} from "../utils/serialize-mutations.js";
|
|
6
10
|
import { SupportPassportError } from "./errors.js";
|
|
7
11
|
|
|
8
12
|
const CARD_MUTATION_LOCK_STALE_MS = 60_000;
|
|
@@ -18,7 +22,7 @@ export function computeSupportPassportOwnerLockKey(namespace: string, principal:
|
|
|
18
22
|
|
|
19
23
|
export function supportPassportOwnerLockPath(
|
|
20
24
|
storage: StorageManager,
|
|
21
|
-
scope: SupportPassportOwnerLockScope
|
|
25
|
+
scope: SupportPassportOwnerLockScope,
|
|
22
26
|
): string {
|
|
23
27
|
const ownerLockKey = scope.ownerKey ?? computeSupportPassportOwnerLockKey(scope.namespace, scope.principal);
|
|
24
28
|
if (!/^[a-f0-9]{64}$/.test(ownerLockKey)) {
|
|
@@ -30,24 +34,37 @@ export function supportPassportOwnerLockPath(
|
|
|
30
34
|
export async function withSupportPassportOwnerLock<T>(
|
|
31
35
|
storage: StorageManager,
|
|
32
36
|
scope: SupportPassportOwnerLockScope,
|
|
33
|
-
task: (lock: HeldFileLockController) => Promise<T
|
|
37
|
+
task: (lock: HeldFileLockController) => Promise<T>,
|
|
34
38
|
): Promise<T> {
|
|
35
39
|
const lockPath = supportPassportOwnerLockPath(storage, scope);
|
|
36
40
|
return await serializeMutations(lockPath, () =>
|
|
37
41
|
withHeldFileLock(
|
|
38
42
|
lockPath,
|
|
39
|
-
{
|
|
43
|
+
{
|
|
44
|
+
staleMs: CARD_MUTATION_LOCK_STALE_MS,
|
|
45
|
+
maxWaitMs: CARD_MUTATION_LOCK_MAX_WAIT_MS,
|
|
46
|
+
},
|
|
40
47
|
async (acquired, lock) => {
|
|
41
48
|
if (!acquired) {
|
|
42
|
-
throw new SupportPassportError(
|
|
49
|
+
throw new SupportPassportError(
|
|
50
|
+
"storage_conflict",
|
|
51
|
+
"The support passport is busy. Try again.",
|
|
52
|
+
409,
|
|
53
|
+
);
|
|
43
54
|
}
|
|
44
55
|
return await task(lock);
|
|
45
|
-
}
|
|
46
|
-
)
|
|
56
|
+
},
|
|
57
|
+
),
|
|
47
58
|
);
|
|
48
59
|
}
|
|
49
60
|
|
|
50
|
-
export async function requireSupportPassportOwnerLock(
|
|
61
|
+
export async function requireSupportPassportOwnerLock(
|
|
62
|
+
lock: HeldFileLockController,
|
|
63
|
+
): Promise<void> {
|
|
51
64
|
if (await lock.refresh()) return;
|
|
52
|
-
throw new SupportPassportError(
|
|
65
|
+
throw new SupportPassportError(
|
|
66
|
+
"storage_conflict",
|
|
67
|
+
"The support passport changed during the request.",
|
|
68
|
+
409,
|
|
69
|
+
);
|
|
53
70
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdir, mkdtemp, open, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
appendPrivateFileNoFollow,
|
|
9
|
+
ensurePrivateDirectoryNoFollow,
|
|
10
|
+
supportsSupportPassportPrivateFiles,
|
|
11
|
+
writePrivateFileAtomicallyNoFollow,
|
|
12
|
+
} from "./private-file.js";
|
|
13
|
+
|
|
14
|
+
test("private support passport files publish their platform gate", () => {
|
|
15
|
+
assert.equal(supportsSupportPassportPrivateFiles("linux"), true);
|
|
16
|
+
assert.equal(supportsSupportPassportPrivateFiles("darwin"), true);
|
|
17
|
+
assert.equal(supportsSupportPassportPrivateFiles("freebsd"), true);
|
|
18
|
+
assert.equal(supportsSupportPassportPrivateFiles("openbsd"), true);
|
|
19
|
+
assert.equal(supportsSupportPassportPrivateFiles("win32"), false);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("private append cannot escape its pinned directory", async (context) => {
|
|
23
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-private-append-"));
|
|
24
|
+
context.after(async () => await rm(root, { recursive: true, force: true }));
|
|
25
|
+
const privateDirectory = path.join(root, "private");
|
|
26
|
+
const outsidePath = path.join(root, "outside.jsonl");
|
|
27
|
+
await mkdir(privateDirectory);
|
|
28
|
+
|
|
29
|
+
await assert.rejects(appendPrivateFileNoFollow(privateDirectory, outsidePath, "private\n", "private path escaped"));
|
|
30
|
+
await assert.rejects(readFile(outsidePath, "utf8"), { code: "ENOENT" });
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("private append fails before mutation when descriptor pinning is unavailable", async (context) => {
|
|
34
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-private-append-win32-"));
|
|
35
|
+
context.after(async () => await rm(root, { recursive: true, force: true }));
|
|
36
|
+
const privateDirectory = path.join(root, "private");
|
|
37
|
+
const auditPath = path.join(privateDirectory, "audit.jsonl");
|
|
38
|
+
await assert.rejects(
|
|
39
|
+
ensurePrivateDirectoryNoFollow(root, privateDirectory, "private path escaped", undefined, true, "win32"),
|
|
40
|
+
/private path escaped/
|
|
41
|
+
);
|
|
42
|
+
await assert.rejects(readFile(auditPath, "utf8"), { code: "ENOENT" });
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("private append rejects a renamed target after opening it", async (context) => {
|
|
46
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-private-append-rename-"));
|
|
47
|
+
context.after(async () => await rm(root, { recursive: true, force: true }));
|
|
48
|
+
const privateDirectory = path.join(root, "private");
|
|
49
|
+
const auditPath = path.join(privateDirectory, "audit.jsonl");
|
|
50
|
+
const movedPath = path.join(privateDirectory, "moved.jsonl");
|
|
51
|
+
await mkdir(privateDirectory);
|
|
52
|
+
await writeFile(auditPath, "before\n", { mode: 0o600 });
|
|
53
|
+
|
|
54
|
+
await assert.rejects(
|
|
55
|
+
appendPrivateFileNoFollow(
|
|
56
|
+
privateDirectory,
|
|
57
|
+
auditPath,
|
|
58
|
+
"after\n",
|
|
59
|
+
"audit target changed",
|
|
60
|
+
privateDirectory,
|
|
61
|
+
process.platform,
|
|
62
|
+
async (filePath, flags, mode) => {
|
|
63
|
+
const handle = await open(filePath, flags, mode);
|
|
64
|
+
await rename(auditPath, movedPath);
|
|
65
|
+
return handle;
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/audit target changed/
|
|
69
|
+
);
|
|
70
|
+
assert.equal(await readFile(movedPath, "utf8"), "before\n");
|
|
71
|
+
await assert.rejects(readFile(auditPath, "utf8"), { code: "ENOENT" });
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("private atomic writes reject a final pathname replaced after directory sync", async (context) => {
|
|
75
|
+
const root = await mkdtemp(path.join(os.tmpdir(), "remnic-private-atomic-rename-"));
|
|
76
|
+
context.after(async () => await rm(root, { recursive: true, force: true }));
|
|
77
|
+
const privateDirectory = path.join(root, "private");
|
|
78
|
+
const markerPath = path.join(privateDirectory, "marker.json");
|
|
79
|
+
const movedPath = path.join(privateDirectory, "moved.json");
|
|
80
|
+
await mkdir(privateDirectory);
|
|
81
|
+
|
|
82
|
+
await assert.rejects(
|
|
83
|
+
writePrivateFileAtomicallyNoFollow(
|
|
84
|
+
privateDirectory,
|
|
85
|
+
markerPath,
|
|
86
|
+
"committed\n",
|
|
87
|
+
"marker target changed",
|
|
88
|
+
privateDirectory,
|
|
89
|
+
process.platform,
|
|
90
|
+
async () => {
|
|
91
|
+
await rename(markerPath, movedPath);
|
|
92
|
+
await writeFile(markerPath, "replaced\n", { mode: 0o600 });
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/marker target changed/
|
|
96
|
+
);
|
|
97
|
+
assert.equal(await readFile(movedPath, "utf8"), "committed\n");
|
|
98
|
+
assert.equal(await readFile(markerPath, "utf8"), "replaced\n");
|
|
99
|
+
});
|
|
@@ -6,6 +6,8 @@ import path from "node:path";
|
|
|
6
6
|
const UNSUPPORTED_DIRECTORY_SYNC_ERRORS = new Set(["EINVAL", "ENOSYS", "ENOTSUP", "EOPNOTSUPP"]);
|
|
7
7
|
const NON_WRITABLE_ANCESTOR_SYNC_ERRORS = new Set(["EROFS", "EPERM", "EACCES"]);
|
|
8
8
|
|
|
9
|
+
type PrivateFileOpener = (filePath: string, flags: number, mode: number) => Promise<FileHandle>;
|
|
10
|
+
|
|
9
11
|
function assertStableDirectory(before: Stats, opened: Stats, after: Stats, errorMessage: string): void {
|
|
10
12
|
if (
|
|
11
13
|
before.isSymbolicLink() ||
|
|
@@ -37,6 +39,14 @@ function assertStableRegularFile(before: Stats, opened: Stats, after: Stats, err
|
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
41
|
|
|
42
|
+
async function lstatPrivateTarget(filePath: string, errorMessage: string): Promise<Stats> {
|
|
43
|
+
try {
|
|
44
|
+
return await lstat(filePath);
|
|
45
|
+
} catch {
|
|
46
|
+
throw new Error(errorMessage);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
40
50
|
function openFlags(...flags: Array<number | undefined>): number {
|
|
41
51
|
let combined = 0;
|
|
42
52
|
for (const flag of flags) combined |= typeof flag === "number" ? flag : 0;
|
|
@@ -62,7 +72,7 @@ async function openDirectoryNoFollow(
|
|
|
62
72
|
if (before.isSymbolicLink() || !before.isDirectory()) throw new Error(errorMessage);
|
|
63
73
|
const handle = await open(
|
|
64
74
|
directory,
|
|
65
|
-
openFlags(fsConstants.O_RDONLY, fsConstants.O_DIRECTORY, fsConstants.O_NOFOLLOW)
|
|
75
|
+
openFlags(fsConstants.O_RDONLY, fsConstants.O_DIRECTORY, fsConstants.O_NOFOLLOW)
|
|
66
76
|
);
|
|
67
77
|
try {
|
|
68
78
|
const opened = await handle.stat();
|
|
@@ -103,6 +113,12 @@ export async function resolvePrivateDirectoryPath(
|
|
|
103
113
|
return pinnedPath;
|
|
104
114
|
}
|
|
105
115
|
|
|
116
|
+
export function supportsSupportPassportPrivateFiles(
|
|
117
|
+
platform: NodeJS.Platform = process.platform
|
|
118
|
+
): boolean {
|
|
119
|
+
return platform === "linux" || platform === "darwin" || platform === "freebsd" || platform === "openbsd";
|
|
120
|
+
}
|
|
121
|
+
|
|
106
122
|
export function requirePrivateFileDescriptorRoot(platform: NodeJS.Platform, errorMessage: string): string {
|
|
107
123
|
if (platform === "linux") return "/proc/self/fd";
|
|
108
124
|
if (platform === "darwin" || platform === "freebsd" || platform === "openbsd") return "/dev/fd";
|
|
@@ -113,7 +129,7 @@ async function openStableDirectoryFromRoot(
|
|
|
113
129
|
trustedRoot: string,
|
|
114
130
|
directory: string,
|
|
115
131
|
errorMessage: string,
|
|
116
|
-
platform: NodeJS.Platform = process.platform
|
|
132
|
+
platform: NodeJS.Platform = process.platform
|
|
117
133
|
): Promise<{
|
|
118
134
|
before: Stats;
|
|
119
135
|
opened: Stats;
|
|
@@ -149,7 +165,7 @@ async function openStableDirectoryFromRoot(
|
|
|
149
165
|
current.handle,
|
|
150
166
|
current.opened,
|
|
151
167
|
errorMessage,
|
|
152
|
-
platform
|
|
168
|
+
platform
|
|
153
169
|
),
|
|
154
170
|
};
|
|
155
171
|
} catch (error) {
|
|
@@ -164,7 +180,7 @@ export async function ensurePrivateDirectoryNoFollow(
|
|
|
164
180
|
errorMessage: string,
|
|
165
181
|
syncVerifiedParent: (handle: FileHandle) => Promise<void> = syncDirectoryHandle,
|
|
166
182
|
hardenExistingChildren = true,
|
|
167
|
-
platform: NodeJS.Platform = process.platform
|
|
183
|
+
platform: NodeJS.Platform = process.platform
|
|
168
184
|
): Promise<void> {
|
|
169
185
|
const root = path.resolve(trustedRoot);
|
|
170
186
|
const target = path.resolve(directory);
|
|
@@ -207,7 +223,7 @@ export async function ensurePrivateDirectoryTreeNoFollow(
|
|
|
207
223
|
directory: string,
|
|
208
224
|
errorMessage: string,
|
|
209
225
|
syncVerifiedParent: (handle: FileHandle) => Promise<void> = syncDirectoryHandle,
|
|
210
|
-
platform: NodeJS.Platform = process.platform
|
|
226
|
+
platform: NodeJS.Platform = process.platform
|
|
211
227
|
): Promise<void> {
|
|
212
228
|
const target = path.resolve(directory);
|
|
213
229
|
const filesystemRoot = path.parse(target).root;
|
|
@@ -233,7 +249,7 @@ export async function ensurePrivateDirectoryTreeNoFollow(
|
|
|
233
249
|
}
|
|
234
250
|
},
|
|
235
251
|
false,
|
|
236
|
-
platform
|
|
252
|
+
platform
|
|
237
253
|
);
|
|
238
254
|
}
|
|
239
255
|
|
|
@@ -242,7 +258,7 @@ export async function withPrivateDirectoryNoFollow<T>(
|
|
|
242
258
|
directory: string,
|
|
243
259
|
errorMessage: string,
|
|
244
260
|
task: (pinnedDirectory: string) => Promise<T>,
|
|
245
|
-
platform: NodeJS.Platform = process.platform
|
|
261
|
+
platform: NodeJS.Platform = process.platform
|
|
246
262
|
): Promise<T> {
|
|
247
263
|
let directoryHandles: FileHandle[] = [];
|
|
248
264
|
try {
|
|
@@ -261,7 +277,7 @@ export async function readPrivateFileNoFollow(
|
|
|
261
277
|
filePath: string,
|
|
262
278
|
errorMessage: string,
|
|
263
279
|
trustedRoot = directory,
|
|
264
|
-
platform: NodeJS.Platform = process.platform
|
|
280
|
+
platform: NodeJS.Platform = process.platform
|
|
265
281
|
): Promise<string> {
|
|
266
282
|
if (path.dirname(filePath) !== path.resolve(directory)) throw new Error(errorMessage);
|
|
267
283
|
const targetName = path.basename(filePath);
|
|
@@ -290,6 +306,111 @@ export async function readPrivateFileNoFollow(
|
|
|
290
306
|
}
|
|
291
307
|
}
|
|
292
308
|
|
|
309
|
+
export async function appendPrivateFileNoFollow(
|
|
310
|
+
directory: string,
|
|
311
|
+
filePath: string,
|
|
312
|
+
content: string,
|
|
313
|
+
errorMessage: string,
|
|
314
|
+
trustedRoot = directory,
|
|
315
|
+
platform: NodeJS.Platform = process.platform,
|
|
316
|
+
openFile: PrivateFileOpener = open
|
|
317
|
+
): Promise<void> {
|
|
318
|
+
if (path.dirname(filePath) !== path.resolve(directory)) throw new Error(errorMessage);
|
|
319
|
+
const targetName = path.basename(filePath);
|
|
320
|
+
let directoryHandles: FileHandle[] = [];
|
|
321
|
+
try {
|
|
322
|
+
const stableDirectory = await openStableDirectoryFromRoot(trustedRoot, directory, errorMessage, platform);
|
|
323
|
+
directoryHandles = stableDirectory.handles;
|
|
324
|
+
await appendPrivateFileAtPinnedDirectory(
|
|
325
|
+
stableDirectory.pinnedDirectory,
|
|
326
|
+
targetName,
|
|
327
|
+
content,
|
|
328
|
+
errorMessage,
|
|
329
|
+
stableDirectory.handle,
|
|
330
|
+
openFile
|
|
331
|
+
);
|
|
332
|
+
assertStableDirectory(stableDirectory.before, stableDirectory.opened, await lstat(directory), errorMessage);
|
|
333
|
+
} finally {
|
|
334
|
+
await closeDirectoryHandles(directoryHandles);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
async function appendPrivateFileAtPinnedDirectory(
|
|
339
|
+
pinnedDirectory: string,
|
|
340
|
+
targetName: string,
|
|
341
|
+
content: string,
|
|
342
|
+
errorMessage: string,
|
|
343
|
+
directoryHandle: FileHandle | undefined,
|
|
344
|
+
openFile: PrivateFileOpener
|
|
345
|
+
): Promise<void> {
|
|
346
|
+
if (
|
|
347
|
+
targetName.length === 0 ||
|
|
348
|
+
targetName === "." ||
|
|
349
|
+
targetName === ".." ||
|
|
350
|
+
path.basename(targetName) !== targetName
|
|
351
|
+
) {
|
|
352
|
+
throw new Error(errorMessage);
|
|
353
|
+
}
|
|
354
|
+
const targetPath = path.join(pinnedDirectory, targetName);
|
|
355
|
+
let fileHandle: FileHandle | undefined;
|
|
356
|
+
try {
|
|
357
|
+
try {
|
|
358
|
+
fileHandle = await openFile(
|
|
359
|
+
targetPath,
|
|
360
|
+
openFlags(fsConstants.O_WRONLY, fsConstants.O_APPEND, fsConstants.O_CREAT, fsConstants.O_NOFOLLOW),
|
|
361
|
+
0o600
|
|
362
|
+
);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
if ((error as NodeJS.ErrnoException).code === "ELOOP") throw new Error(errorMessage);
|
|
365
|
+
throw error;
|
|
366
|
+
}
|
|
367
|
+
const targetMetadata = await lstatPrivateTarget(targetPath, errorMessage);
|
|
368
|
+
assertStableRegularFile(
|
|
369
|
+
targetMetadata,
|
|
370
|
+
await fileHandle.stat(),
|
|
371
|
+
await lstatPrivateTarget(targetPath, errorMessage),
|
|
372
|
+
errorMessage
|
|
373
|
+
);
|
|
374
|
+
await fileHandle.chmod(0o600);
|
|
375
|
+
await fileHandle.appendFile(content, "utf8");
|
|
376
|
+
await fileHandle.sync();
|
|
377
|
+
assertStableRegularFile(
|
|
378
|
+
targetMetadata,
|
|
379
|
+
await fileHandle.stat(),
|
|
380
|
+
await lstatPrivateTarget(targetPath, errorMessage),
|
|
381
|
+
errorMessage
|
|
382
|
+
);
|
|
383
|
+
if (directoryHandle) await syncDirectoryHandle(directoryHandle);
|
|
384
|
+
} finally {
|
|
385
|
+
await fileHandle?.close().catch(() => undefined);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
export async function appendPrivateFileInPinnedDirectory(
|
|
390
|
+
pinnedDirectory: string,
|
|
391
|
+
fileName: string,
|
|
392
|
+
content: string,
|
|
393
|
+
errorMessage: string,
|
|
394
|
+
platform: NodeJS.Platform = process.platform
|
|
395
|
+
): Promise<void> {
|
|
396
|
+
const descriptorRoot = requirePrivateFileDescriptorRoot(platform, errorMessage);
|
|
397
|
+
const resolvedDirectory = path.resolve(pinnedDirectory);
|
|
398
|
+
const descriptor = path.relative(descriptorRoot, resolvedDirectory);
|
|
399
|
+
if (!/^\d+$/.test(descriptor)) throw new Error(errorMessage);
|
|
400
|
+
const before = await stat(resolvedDirectory);
|
|
401
|
+
if (!before.isDirectory()) throw new Error(errorMessage);
|
|
402
|
+
let directoryHandle: FileHandle | undefined;
|
|
403
|
+
try {
|
|
404
|
+
directoryHandle = await open(resolvedDirectory, openFlags(fsConstants.O_RDONLY, fsConstants.O_DIRECTORY));
|
|
405
|
+
const opened = await directoryHandle.stat();
|
|
406
|
+
assertStableDirectory(before, opened, await stat(resolvedDirectory), errorMessage);
|
|
407
|
+
await appendPrivateFileAtPinnedDirectory(resolvedDirectory, fileName, content, errorMessage, directoryHandle, open);
|
|
408
|
+
assertStableDirectory(before, opened, await stat(resolvedDirectory), errorMessage);
|
|
409
|
+
} finally {
|
|
410
|
+
await directoryHandle?.close().catch(() => undefined);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
293
414
|
export async function writePrivateFileAtomicallyNoFollow(
|
|
294
415
|
directory: string,
|
|
295
416
|
filePath: string,
|
|
@@ -297,6 +418,7 @@ export async function writePrivateFileAtomicallyNoFollow(
|
|
|
297
418
|
errorMessage: string,
|
|
298
419
|
trustedRoot = directory,
|
|
299
420
|
platform: NodeJS.Platform = process.platform,
|
|
421
|
+
syncVerifiedDirectory: (handle: FileHandle) => Promise<void> = syncDirectoryHandle
|
|
300
422
|
): Promise<void> {
|
|
301
423
|
if (path.dirname(filePath) !== path.resolve(directory)) throw new Error(errorMessage);
|
|
302
424
|
const targetName = path.basename(filePath);
|
|
@@ -327,12 +449,17 @@ export async function writePrivateFileAtomicallyNoFollow(
|
|
|
327
449
|
await fileHandle.chmod(0o600);
|
|
328
450
|
await fileHandle.writeFile(content, "utf8");
|
|
329
451
|
await fileHandle.sync();
|
|
330
|
-
await fileHandle.close();
|
|
331
|
-
fileHandle = undefined;
|
|
332
452
|
assertStableDirectory(stableDirectory.before, stableDirectory.opened, await lstat(directory), errorMessage);
|
|
333
453
|
await rename(tempPath, targetPath);
|
|
334
454
|
assertStableDirectory(stableDirectory.before, stableDirectory.opened, await lstat(directory), errorMessage);
|
|
335
|
-
if (stableDirectory.handle) await
|
|
455
|
+
if (stableDirectory.handle) await syncVerifiedDirectory(stableDirectory.handle);
|
|
456
|
+
const committedMetadata = await lstatPrivateTarget(targetPath, errorMessage);
|
|
457
|
+
assertStableRegularFile(
|
|
458
|
+
committedMetadata,
|
|
459
|
+
await fileHandle.stat(),
|
|
460
|
+
await lstatPrivateTarget(targetPath, errorMessage),
|
|
461
|
+
errorMessage
|
|
462
|
+
);
|
|
336
463
|
} finally {
|
|
337
464
|
await fileHandle?.close().catch(() => undefined);
|
|
338
465
|
if (tempPath) await rm(tempPath, { force: true }).catch(() => undefined);
|
|
@@ -345,7 +472,7 @@ export async function removePrivateFilesNoFollow(
|
|
|
345
472
|
fileNames: string[],
|
|
346
473
|
errorMessage: string,
|
|
347
474
|
trustedRoot = directory,
|
|
348
|
-
platform: NodeJS.Platform = process.platform
|
|
475
|
+
platform: NodeJS.Platform = process.platform
|
|
349
476
|
): Promise<void> {
|
|
350
477
|
if (
|
|
351
478
|
fileNames.some(
|