@remnic/core 9.15.0 → 9.15.2
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 +10 -7
- package/dist/access-admin-ops-surface.js +21 -21
- package/dist/access-boundary.d.ts +10 -7
- package/dist/access-boundary.js +21 -22
- package/dist/access-cli.js +73 -75
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +8 -7
- package/dist/access-http.js +27 -28
- package/dist/access-identity-continuity-surface.d.ts +6 -6
- package/dist/access-identity-continuity-surface.js +21 -21
- package/dist/access-lcm-surface.d.ts +10 -7
- package/dist/access-lcm-surface.js +21 -21
- package/dist/access-mcp.d.ts +10 -7
- package/dist/access-mcp.js +26 -27
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/access-namespace-preflight-B9e5GnyZ.d.ts +146 -0
- package/dist/access-namespace-preflight.d.ts +8 -0
- package/dist/access-namespace-preflight.js +158 -0
- package/dist/access-observe-write-surface.d.ts +10 -7
- package/dist/access-observe-write-surface.js +21 -21
- package/dist/access-operations-batch.js +23 -24
- package/dist/access-operations.d.ts +11 -8
- package/dist/access-operations.js +25 -26
- package/dist/access-recall-concurrency.d.ts +10 -7
- package/dist/access-recall-concurrency.js +21 -21
- package/dist/access-recall-response.d.ts +10 -7
- package/dist/access-recall-response.js +21 -21
- package/dist/access-recall-surface.d.ts +10 -7
- package/dist/access-recall-surface.js +21 -21
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-DbZ1G3zV.d.ts → access-service-DgmJd_A-.d.ts} +10 -118
- package/dist/access-service.d.ts +10 -7
- package/dist/access-service.js +21 -21
- package/dist/access-surface-catalog.d.ts +10 -7
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +2 -2
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +6 -6
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +6 -6
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
- package/dist/{catalog-BWqHb5HT.d.ts → catalog-g_dfT6oL.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +7 -7
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-YQQYS2K4.js → chunk-42DJZZUB.js} +2 -2
- package/dist/{chunk-YUQOAKPX.js → chunk-47WFEKT7.js} +5 -5
- package/dist/{chunk-YO3ZB3PJ.js → chunk-4E5H4FPC.js} +30 -15
- package/dist/chunk-4E5H4FPC.js.map +1 -0
- package/dist/{chunk-226RNKRU.js → chunk-5HFIHWOF.js} +37 -37
- package/dist/{chunk-A56B2AJR.js → chunk-5MDE5MIC.js} +3 -3
- package/dist/{chunk-W2OST2HH.js → chunk-6EJL2O3G.js} +2 -2
- package/dist/{chunk-ALSGMEJR.js → chunk-7CPOZH6Y.js} +5 -5
- package/dist/{chunk-MMGGVZ4Q.js → chunk-7VZWZVYG.js} +40 -18
- package/dist/{chunk-MMGGVZ4Q.js.map → chunk-7VZWZVYG.js.map} +1 -1
- package/dist/{chunk-WSHJAY5M.js → chunk-B57BIBXI.js} +2 -2
- package/dist/{chunk-KN6UGAQB.js → chunk-B6NCHYAK.js} +7 -2
- package/dist/chunk-B6NCHYAK.js.map +1 -0
- package/dist/{chunk-AS6UOOXF.js → chunk-BNH2VVWP.js} +2 -2
- package/dist/{chunk-6KIQT7RG.js → chunk-BZ52BJ6C.js} +2 -2
- package/dist/chunk-BZ52BJ6C.js.map +1 -0
- package/dist/{chunk-5RZHHANR.js → chunk-CXFVZ3PK.js} +54 -54
- package/dist/{chunk-SK7AMF2J.js → chunk-DETNBTZS.js} +3 -3
- package/dist/{chunk-TY6NBWV4.js → chunk-EEUZQQRJ.js} +2 -2
- package/dist/{chunk-YVKF3HEW.js → chunk-FJ5IQ3SI.js} +1 -1
- package/dist/chunk-FJ5IQ3SI.js.map +1 -0
- package/dist/{chunk-HLG7VAZP.js → chunk-GQOKO77V.js} +2 -2
- package/dist/{chunk-CAZ2SHEP.js → chunk-H4MDUPER.js} +2 -2
- package/dist/{chunk-TC5HBIIT.js → chunk-HBYQAOED.js} +2 -2
- package/dist/{chunk-YSDVEPV2.js → chunk-IRX5UCGN.js} +10 -10
- package/dist/{chunk-3HYWNJDA.js → chunk-JN4N2TMQ.js} +423 -45
- package/dist/chunk-JN4N2TMQ.js.map +1 -0
- package/dist/{chunk-IQFS4AU7.js → chunk-JTW4TGPV.js} +2 -2
- package/dist/{chunk-I4NJ2CDY.js → chunk-KLXG4BBO.js} +4 -6
- package/dist/{chunk-I4NJ2CDY.js.map → chunk-KLXG4BBO.js.map} +1 -1
- package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
- package/dist/{chunk-PYHOAXTI.js → chunk-LRGSLV7M.js} +4 -4
- package/dist/{chunk-Y6XODVJ4.js → chunk-NAY25BGS.js} +9 -9
- package/dist/{chunk-7HZMTXXB.js → chunk-O7ACJAHR.js} +18 -11
- package/dist/{chunk-7HZMTXXB.js.map → chunk-O7ACJAHR.js.map} +1 -1
- package/dist/{chunk-QJAQNXWI.js → chunk-ONHRRJZM.js} +6 -6
- package/dist/{chunk-O4K3DWK2.js → chunk-OOGGUXAG.js} +2 -2
- package/dist/{chunk-CQ6WP3PA.js → chunk-P53HGVJS.js} +5 -5
- package/dist/{chunk-U3ZAVRP3.js → chunk-PXJEL55X.js} +2 -2
- package/dist/{chunk-DF552QUN.js → chunk-QCLQ4BGA.js} +5 -5
- package/dist/{chunk-IAHNKI2E.js → chunk-QDNE35FU.js} +2 -2
- package/dist/{chunk-XMAD32BW.js → chunk-RRS5CDB6.js} +2 -2
- package/dist/{chunk-3QAH2S33.js → chunk-SYCVU556.js} +3 -3
- package/dist/{chunk-QZGN4773.js → chunk-T4EAQPQQ.js} +3 -3
- package/dist/{chunk-7G7DVA2C.js → chunk-T4OTDMX4.js} +2 -2
- package/dist/{chunk-XRNU7OEQ.js → chunk-U6QWUFSM.js} +3 -3
- package/dist/{chunk-UDIJMITR.js → chunk-UJIBXOJA.js} +23 -23
- package/dist/chunk-UJIBXOJA.js.map +1 -0
- package/dist/{chunk-CQMEM5CC.js → chunk-WIKOHCQZ.js} +2 -2
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-3332THSR.js → chunk-XJT6LNLY.js} +4 -4
- package/dist/{chunk-AVPXXV6J.js → chunk-XKGPIWGI.js} +4 -4
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-46OH3OVK.js → chunk-YXTSUIXC.js} +5 -1
- package/dist/chunk-YXTSUIXC.js.map +1 -0
- package/dist/{cli-5tNLVTvJ.d.ts → cli-BXCd2cgK.d.ts} +5 -5
- package/dist/cli.d.ts +12 -9
- package/dist/cli.js +51 -52
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +6 -6
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +6 -6
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +6 -6
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/contradiction/index.js +4 -4
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.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 +6 -6
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +6 -6
- package/dist/extraction-faithfulness.d.ts +1 -1
- 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.d.ts +3 -2
- package/dist/extraction.js +6 -4
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +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 +16 -15
- package/dist/index.js +84 -86
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +3 -3
- 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 +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +6 -6
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -6
- package/dist/maintenance/rebuild-memory-projection.js +7 -7
- package/dist/mcp-memory-inspector-app.d.ts +10 -7
- 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-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 +12 -12
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +5 -5
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +6 -6
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +4 -4
- package/dist/operator-toolkit.d.ts +2 -2
- package/dist/operator-toolkit.js +18 -18
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +3 -3
- package/dist/orchestration/maintenance.js +10 -10
- package/dist/{orchestrator-CQJ8U7En.d.ts → orchestrator-BHfWtvEJ.d.ts} +5 -5
- package/dist/orchestrator.d.ts +6 -6
- package/dist/orchestrator.js +74 -75
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-Cn-kvYeV.d.ts → pipeline-CBYcnmDC.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/{qmd-oh9VXz1d.d.ts → qmd-BIq-jrV4.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/qmd.js +4 -4
- 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-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/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/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +3 -3
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/{scope-profiles-EpJG7yKP.d.ts → scope-profiles-DDno-uvy.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 +4 -4
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +6 -6
- 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-DILZEQq3.d.ts → semantic-consolidation-7RIJFDwY.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +7 -7
- package/dist/semantic-rule-promotion.js +6 -6
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/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/{storage-NIyKYD8g.d.ts → storage-DkphZiOJ.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +5 -5
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +2 -2
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/import-sqlite.js +2 -2
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-D_fG2ix8.d.ts → types-2q_MRFcM.d.ts} +6 -0
- 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 +6 -6
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-http.test.ts +91 -0
- package/src/access-http.ts +13 -14
- package/src/access-namespace-preflight.test.ts +111 -0
- package/src/access-namespace-preflight.ts +111 -0
- package/src/access-operations-batch.ts +25 -2
- package/src/access-service-observe-scope.test.ts +81 -0
- package/src/access-service.ts +64 -78
- package/src/config.test.ts +7 -0
- package/src/config.ts +6 -0
- package/src/extraction-thinking.test.ts +44 -0
- package/src/extraction.ts +12 -0
- package/src/local-llm-thinking.test.ts +13 -1
- package/src/local-llm.ts +2 -1
- package/src/orchestration/qmd-result-resolver.test.ts +103 -0
- package/src/orchestration/qmd-result-resolver.ts +11 -0
- package/src/scopes/scope-plan.ts +66 -0
- package/src/types.ts +6 -0
- package/dist/chunk-3HYWNJDA.js.map +0 -1
- package/dist/chunk-46OH3OVK.js.map +0 -1
- package/dist/chunk-6KIQT7RG.js.map +0 -1
- package/dist/chunk-KF5EUVKQ.js +0 -289
- package/dist/chunk-KF5EUVKQ.js.map +0 -1
- package/dist/chunk-KN6UGAQB.js.map +0 -1
- package/dist/chunk-UDIJMITR.js.map +0 -1
- package/dist/chunk-YO3ZB3PJ.js.map +0 -1
- package/dist/chunk-YVKF3HEW.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-namespace-preflight.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-YQQYS2K4.js.map → chunk-42DJZZUB.js.map} +0 -0
- /package/dist/{chunk-YUQOAKPX.js.map → chunk-47WFEKT7.js.map} +0 -0
- /package/dist/{chunk-226RNKRU.js.map → chunk-5HFIHWOF.js.map} +0 -0
- /package/dist/{chunk-A56B2AJR.js.map → chunk-5MDE5MIC.js.map} +0 -0
- /package/dist/{chunk-W2OST2HH.js.map → chunk-6EJL2O3G.js.map} +0 -0
- /package/dist/{chunk-ALSGMEJR.js.map → chunk-7CPOZH6Y.js.map} +0 -0
- /package/dist/{chunk-WSHJAY5M.js.map → chunk-B57BIBXI.js.map} +0 -0
- /package/dist/{chunk-AS6UOOXF.js.map → chunk-BNH2VVWP.js.map} +0 -0
- /package/dist/{chunk-5RZHHANR.js.map → chunk-CXFVZ3PK.js.map} +0 -0
- /package/dist/{chunk-SK7AMF2J.js.map → chunk-DETNBTZS.js.map} +0 -0
- /package/dist/{chunk-TY6NBWV4.js.map → chunk-EEUZQQRJ.js.map} +0 -0
- /package/dist/{chunk-HLG7VAZP.js.map → chunk-GQOKO77V.js.map} +0 -0
- /package/dist/{chunk-CAZ2SHEP.js.map → chunk-H4MDUPER.js.map} +0 -0
- /package/dist/{chunk-TC5HBIIT.js.map → chunk-HBYQAOED.js.map} +0 -0
- /package/dist/{chunk-YSDVEPV2.js.map → chunk-IRX5UCGN.js.map} +0 -0
- /package/dist/{chunk-IQFS4AU7.js.map → chunk-JTW4TGPV.js.map} +0 -0
- /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-PYHOAXTI.js.map → chunk-LRGSLV7M.js.map} +0 -0
- /package/dist/{chunk-Y6XODVJ4.js.map → chunk-NAY25BGS.js.map} +0 -0
- /package/dist/{chunk-QJAQNXWI.js.map → chunk-ONHRRJZM.js.map} +0 -0
- /package/dist/{chunk-O4K3DWK2.js.map → chunk-OOGGUXAG.js.map} +0 -0
- /package/dist/{chunk-CQ6WP3PA.js.map → chunk-P53HGVJS.js.map} +0 -0
- /package/dist/{chunk-U3ZAVRP3.js.map → chunk-PXJEL55X.js.map} +0 -0
- /package/dist/{chunk-DF552QUN.js.map → chunk-QCLQ4BGA.js.map} +0 -0
- /package/dist/{chunk-IAHNKI2E.js.map → chunk-QDNE35FU.js.map} +0 -0
- /package/dist/{chunk-XMAD32BW.js.map → chunk-RRS5CDB6.js.map} +0 -0
- /package/dist/{chunk-3QAH2S33.js.map → chunk-SYCVU556.js.map} +0 -0
- /package/dist/{chunk-QZGN4773.js.map → chunk-T4EAQPQQ.js.map} +0 -0
- /package/dist/{chunk-7G7DVA2C.js.map → chunk-T4OTDMX4.js.map} +0 -0
- /package/dist/{chunk-XRNU7OEQ.js.map → chunk-U6QWUFSM.js.map} +0 -0
- /package/dist/{chunk-CQMEM5CC.js.map → chunk-WIKOHCQZ.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-3332THSR.js.map → chunk-XJT6LNLY.js.map} +0 -0
- /package/dist/{chunk-AVPXXV6J.js.map → chunk-XKGPIWGI.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
|
@@ -1990,6 +1990,12 @@ interface PluginConfig extends BoundedJsonlStateConfig {
|
|
|
1990
1990
|
* `chat_template_kwargs`, so this is the only think-off dialect it honors.
|
|
1991
1991
|
* Issue #1996. */
|
|
1992
1992
|
localLlmReasoningEffort: string;
|
|
1993
|
+
/**
|
|
1994
|
+
* Maximum transcript length that re-enables thinking for local extraction.
|
|
1995
|
+
* Set to `0` to keep thinking suppressed for every extraction. Default:
|
|
1996
|
+
* `3000`. Consolidation is unaffected.
|
|
1997
|
+
*/
|
|
1998
|
+
localLlmThinkingThresholdChars: number;
|
|
1993
1999
|
/** Master gate. When false, restores pre-change behavior (extractor called on every triggered observe; no gate). */
|
|
1994
2000
|
extractionRetryEnabled: boolean;
|
|
1995
2001
|
/** Per-fingerprint exponential backoff schedule (ms), indexed by attempt number. */
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { aB as AccessTrackingEntry, A as ActiveRecallChatType, f as ActiveRecallModelFallbackPolicy, d as ActiveRecallPromptStyle, c as ActiveRecallQueryMode, e as ActiveRecallThinking, a6 as AgentAccessAuthToken, bj as AgentAccessHttpConfig, bk as AgentDefaultsConfig, bl as AgentPersona, q as AgentPersonaModelConfig, bm as BehaviorLoopAdjustment, v as BehaviorLoopPolicyState, bn as BehaviorSignalDirection, $ as BehaviorSignalEvent, bo as BehaviorSignalType, aQ as BootstrapOptions, aR as BootstrapResult, k as BriefingActiveThread, bp as BriefingCalendarSourceError, aY as BriefingConfig, i as BriefingFocus, h as BriefingFollowup, aZ as BriefingOpenCommitment, m as BriefingRecentEntity, l as BriefingResult, B as BriefingSections, a_ as BriefingWindow, bq as BufferEntryState, aw as BufferState, a0 as BufferSurpriseEvent, n as BufferTurn, j as CalendarEvent, C as CalendarSource, br as CaptureMode, bs as ChatConfig, p as Checkpoint, bt as CodexCliReasoningEffort, bu as CodexCompactionFlushMode, b1 as CodexCompatConfig, bv as CodexConnectorConfig, aD as CodingContext, bw as CodingGraphLspConfig, aU as CodingKnowledgeConfig, aT as CodingModeConfig, bx as CompressionGuidelineActivationState, a8 as CompressionGuidelineOptimizerActionSummary, a7 as CompressionGuidelineOptimizerEventCounts, a9 as CompressionGuidelineOptimizerRuleUpdate, by as CompressionGuidelineOptimizerSourceWindow, ac as CompressionGuidelineOptimizerState, bz as ConfidenceTier, bA as ConsolidationAction, bB as ConsolidationItem, aS as ConsolidationObservation, K as ConsolidationResult, bC as ContradictionScanConfig, W as ConversationThread, bD as CronConversationRecallMode, bE as CronRecallMode, b2 as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, bF as DreamingConfig, bG as DreamingNarrativePromptStyle, bH as DreamsDeepSleepConfig, bI as DreamsLightSleepConfig, D as DreamsPhase, bJ as DreamsPhaseStatus, bK as DreamsPhasesConfig, bL as DreamsRemConfig, a as DreamsRunResult, aE as DreamsStatusResult, bM as EngramTraceEvent, aA as EntityActivityEntry, E as EntityFile, ad as EntityMention, az as EntityRelationship, ae as EntitySchemaDefinition, af as EntitySchemaSectionDefinition, ag as EntityStructuredSection, au as EntityTimelineEntry, b3 as ExtractedFact, bN as ExtractedProcedureStep, bO as ExtractedQuestion, bP as ExtractedReasoningTrace, bQ as ExtractedReasoningTraceStep, bR as ExtractedRelationship, O as ExtractionFailureClass, bS as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, ay as FileHygieneConfig, G as GatewayConfig, bT as GitHubLiveConnectorConfig, bU as GmailLiveConnectorConfig, bV as GoogleDriveLiveConnectorConfig, bW as HeartbeatConfig, bX as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, _ as ImportanceLevel, ah as ImportanceScore, X as LifecycleState, L as LiveConnectorsConfig, bY as LlmTraceCallback, bZ as LlmTraceEvent, aj as MemoryActionEligibilityContext, b6 as MemoryActionEligibilitySource, ab as MemoryActionEvent, b_ as MemoryActionOutcome, b$ as MemoryActionPolicyDecision, ak as MemoryActionPolicyResult, c0 as MemoryActionStatus, aa as MemoryActionType, w as MemoryCategory, M as MemoryFile, o as MemoryFrontmatter, ai as MemoryIntent, z as MemoryLifecycleEvent, al as MemoryLifecycleEventType, am as MemoryLifecycleStateSummary, av as MemoryLink, c1 as MemoryLinkType, b7 as MemoryObservation, c2 as MemoryOsPresetName, y as MemoryProjectionCurrentState, b8 as MemoryScope, x as MemoryStatus, aC as MemorySummary, ax as MetaState, c3 as ModelApi, c4 as ModelDefinitionConfig, c5 as ModelProviderAuthMode, an as ModelProviderConfig, c6 as NamespacePolicy, ao as NativeKnowledgeConfig, c7 as NativeKnowledgeFolderRuleConfig, c8 as NativeKnowledgeObsidianVaultConfig, c9 as NativeKnowledgeOpenClawWorkspaceConfig, ca as NotionLiveConnectorConfig, P as PluginConfig, Z as PolicyClass, cb as PrincipalFromSessionKeyMode, cc as PrincipalRule, cd as ProceduralConfig, ap as ProvenanceConfig, U as ProvenanceSource, at as QmdSearchExplain, Q as QmdSearchResult, ce as QuestionEntry, b9 as RECALL_DISCLOSURE_LEVELS, cf as ReasoningEffort, b as RecallDisclosure, cg as RecallPipelineConfig, R as RecallPlanMode, aP as RecallSectionConfig, g as RecallTierExplain, ch as RecallTraceEvent, ci as RelevanceFeedback, aq as RetrievalTier, cj as SPECULATIVE_TTL_DAYS, ck as ScopeProfileAutoPromoteConfig, s as ScopeProfileConfig, t as ScopeProfileLayerId, u as ScopeProfilePromotionTarget, cl as ScopeProfileTeamProjectConfig, cm as ScopeTeamConfig, cn as ScoredEntity, a5 as SecretRef, co as SemanticChunkingConfigShape, S as SessionObserverBandConfig, cp as SignalLevel, ar as SignalScanResult, cq as SlotBehaviorConfig, cr as SlotMismatchMode, r as SourceConnectorProvenance, as as TopicScore, T as TranscriptEntry, cs as TriggerMode, V as TrustWeights, Y as VerificationState, ct as confidenceTier, bg as isRecallDisclosure } from './types-
|
|
1
|
+
export { aB as AccessTrackingEntry, A as ActiveRecallChatType, f as ActiveRecallModelFallbackPolicy, d as ActiveRecallPromptStyle, c as ActiveRecallQueryMode, e as ActiveRecallThinking, a6 as AgentAccessAuthToken, bj as AgentAccessHttpConfig, bk as AgentDefaultsConfig, bl as AgentPersona, q as AgentPersonaModelConfig, bm as BehaviorLoopAdjustment, v as BehaviorLoopPolicyState, bn as BehaviorSignalDirection, $ as BehaviorSignalEvent, bo as BehaviorSignalType, aQ as BootstrapOptions, aR as BootstrapResult, k as BriefingActiveThread, bp as BriefingCalendarSourceError, aY as BriefingConfig, i as BriefingFocus, h as BriefingFollowup, aZ as BriefingOpenCommitment, m as BriefingRecentEntity, l as BriefingResult, B as BriefingSections, a_ as BriefingWindow, bq as BufferEntryState, aw as BufferState, a0 as BufferSurpriseEvent, n as BufferTurn, j as CalendarEvent, C as CalendarSource, br as CaptureMode, bs as ChatConfig, p as Checkpoint, bt as CodexCliReasoningEffort, bu as CodexCompactionFlushMode, b1 as CodexCompatConfig, bv as CodexConnectorConfig, aD as CodingContext, bw as CodingGraphLspConfig, aU as CodingKnowledgeConfig, aT as CodingModeConfig, bx as CompressionGuidelineActivationState, a8 as CompressionGuidelineOptimizerActionSummary, a7 as CompressionGuidelineOptimizerEventCounts, a9 as CompressionGuidelineOptimizerRuleUpdate, by as CompressionGuidelineOptimizerSourceWindow, ac as CompressionGuidelineOptimizerState, bz as ConfidenceTier, bA as ConsolidationAction, bB as ConsolidationItem, aS as ConsolidationObservation, K as ConsolidationResult, bC as ContradictionScanConfig, W as ConversationThread, bD as CronConversationRecallMode, bE as CronRecallMode, b2 as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, bF as DreamingConfig, bG as DreamingNarrativePromptStyle, bH as DreamsDeepSleepConfig, bI as DreamsLightSleepConfig, D as DreamsPhase, bJ as DreamsPhaseStatus, bK as DreamsPhasesConfig, bL as DreamsRemConfig, a as DreamsRunResult, aE as DreamsStatusResult, bM as EngramTraceEvent, aA as EntityActivityEntry, E as EntityFile, ad as EntityMention, az as EntityRelationship, ae as EntitySchemaDefinition, af as EntitySchemaSectionDefinition, ag as EntityStructuredSection, au as EntityTimelineEntry, b3 as ExtractedFact, bN as ExtractedProcedureStep, bO as ExtractedQuestion, bP as ExtractedReasoningTrace, bQ as ExtractedReasoningTraceStep, bR as ExtractedRelationship, O as ExtractionFailureClass, bS as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, ay as FileHygieneConfig, G as GatewayConfig, bT as GitHubLiveConnectorConfig, bU as GmailLiveConnectorConfig, bV as GoogleDriveLiveConnectorConfig, bW as HeartbeatConfig, bX as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, _ as ImportanceLevel, ah as ImportanceScore, X as LifecycleState, L as LiveConnectorsConfig, bY as LlmTraceCallback, bZ as LlmTraceEvent, aj as MemoryActionEligibilityContext, b6 as MemoryActionEligibilitySource, ab as MemoryActionEvent, b_ as MemoryActionOutcome, b$ as MemoryActionPolicyDecision, ak as MemoryActionPolicyResult, c0 as MemoryActionStatus, aa as MemoryActionType, w as MemoryCategory, M as MemoryFile, o as MemoryFrontmatter, ai as MemoryIntent, z as MemoryLifecycleEvent, al as MemoryLifecycleEventType, am as MemoryLifecycleStateSummary, av as MemoryLink, c1 as MemoryLinkType, b7 as MemoryObservation, c2 as MemoryOsPresetName, y as MemoryProjectionCurrentState, b8 as MemoryScope, x as MemoryStatus, aC as MemorySummary, ax as MetaState, c3 as ModelApi, c4 as ModelDefinitionConfig, c5 as ModelProviderAuthMode, an as ModelProviderConfig, c6 as NamespacePolicy, ao as NativeKnowledgeConfig, c7 as NativeKnowledgeFolderRuleConfig, c8 as NativeKnowledgeObsidianVaultConfig, c9 as NativeKnowledgeOpenClawWorkspaceConfig, ca as NotionLiveConnectorConfig, P as PluginConfig, Z as PolicyClass, cb as PrincipalFromSessionKeyMode, cc as PrincipalRule, cd as ProceduralConfig, ap as ProvenanceConfig, U as ProvenanceSource, at as QmdSearchExplain, Q as QmdSearchResult, ce as QuestionEntry, b9 as RECALL_DISCLOSURE_LEVELS, cf as ReasoningEffort, b as RecallDisclosure, cg as RecallPipelineConfig, R as RecallPlanMode, aP as RecallSectionConfig, g as RecallTierExplain, ch as RecallTraceEvent, ci as RelevanceFeedback, aq as RetrievalTier, cj as SPECULATIVE_TTL_DAYS, ck as ScopeProfileAutoPromoteConfig, s as ScopeProfileConfig, t as ScopeProfileLayerId, u as ScopeProfilePromotionTarget, cl as ScopeProfileTeamProjectConfig, cm as ScopeTeamConfig, cn as ScoredEntity, a5 as SecretRef, co as SemanticChunkingConfigShape, S as SessionObserverBandConfig, cp as SignalLevel, ar as SignalScanResult, cq as SlotBehaviorConfig, cr as SlotMismatchMode, r as SourceConnectorProvenance, as as TopicScore, T as TranscriptEntry, cs as TriggerMode, V as TrustWeights, Y as VerificationState, ct as confidenceTier, bg as isRecallDisclosure } from './types-2q_MRFcM.js';
|
|
2
2
|
import './message-parts/index.js';
|
|
3
3
|
import './bounded-jsonl-state.js';
|
|
4
4
|
export { ContinuityImprovementLoop, ContinuityIncidentCloseInput, ContinuityIncidentOpenInput, ContinuityIncidentRecord, ContinuityIncidentState, ContinuityLoopCadence, ContinuityLoopReviewInput, ContinuityLoopStatus, ContinuityLoopUpsertInput } from './types-continuity.js';
|
package/dist/types.js
CHANGED
package/dist/verified-recall.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
compareVerifiedEpisodeResults,
|
|
3
3
|
searchVerifiedEpisodes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6EJL2O3G.js";
|
|
5
5
|
import "./chunk-B7RWBZXW.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-O7ACJAHR.js";
|
|
7
7
|
import "./chunk-B3ABVQ36.js";
|
|
8
8
|
import "./chunk-2QMKMVHH.js";
|
|
9
9
|
import "./chunk-DEBHXHJR.js";
|
|
@@ -11,15 +11,15 @@ import "./chunk-DNHVPZOD.js";
|
|
|
11
11
|
import "./chunk-6CIAGZ6X.js";
|
|
12
12
|
import "./chunk-J6A3CX5N.js";
|
|
13
13
|
import "./chunk-V57NLO5P.js";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-FJ5IQ3SI.js";
|
|
15
|
+
import "./chunk-XKGPIWGI.js";
|
|
16
16
|
import "./chunk-EGGE52UU.js";
|
|
17
17
|
import "./chunk-GCASGYIO.js";
|
|
18
18
|
import "./chunk-WL5EBRDH.js";
|
|
19
|
+
import "./chunk-ILGC6JH6.js";
|
|
19
20
|
import "./chunk-SCU65EZI.js";
|
|
20
21
|
import "./chunk-347WD2LE.js";
|
|
21
22
|
import "./chunk-RL6NEVXT.js";
|
|
22
|
-
import "./chunk-ILGC6JH6.js";
|
|
23
23
|
import "./chunk-DM2T26WE.js";
|
|
24
24
|
import "./chunk-LDXUBPMO.js";
|
|
25
25
|
import "./chunk-CGASUJVP.js";
|
|
@@ -41,8 +41,8 @@ import "./chunk-45GF7Y3V.js";
|
|
|
41
41
|
import "./chunk-RGMVMVMF.js";
|
|
42
42
|
import "./chunk-N7RWREIQ.js";
|
|
43
43
|
import "./chunk-5I4M26Q7.js";
|
|
44
|
-
import "./chunk-5GKPFL3S.js";
|
|
45
44
|
import "./chunk-4DJQYKMN.js";
|
|
45
|
+
import "./chunk-5GKPFL3S.js";
|
|
46
46
|
import "./chunk-PQVCH2AE.js";
|
|
47
47
|
import "./chunk-EYIEWJNI.js";
|
|
48
48
|
import "./chunk-JUC24CTX.js";
|
package/dist/write-envelope.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/core",
|
|
3
|
-
"version": "9.15.
|
|
3
|
+
"version": "9.15.2",
|
|
4
4
|
"description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -3045,7 +3045,7 @@
|
|
|
3045
3045
|
"core"
|
|
3046
3046
|
],
|
|
3047
3047
|
"peerDependencies": {
|
|
3048
|
-
"@remnic/coding-graph": "^9.15.
|
|
3048
|
+
"@remnic/coding-graph": "^9.15.2"
|
|
3049
3049
|
},
|
|
3050
3050
|
"peerDependenciesMeta": {
|
|
3051
3051
|
"@remnic/coding-graph": {
|
package/src/access-http.test.ts
CHANGED
|
@@ -2727,6 +2727,10 @@ test("HTTP namespace/writable preflight returns the structured writability resul
|
|
|
2727
2727
|
// is a valid 200 answer (read via `ok`), not an HTTP error.
|
|
2728
2728
|
const service = {
|
|
2729
2729
|
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-test", defaultNamespace: "default" }),
|
|
2730
|
+
namespaceWritablePreflight: async ({ namespace }: { namespace?: string }) =>
|
|
2731
|
+
namespace && namespace !== "default"
|
|
2732
|
+
? { ok: false as const, reason: "not_writable" as const, namespace }
|
|
2733
|
+
: { ok: true as const, namespace: "default" },
|
|
2730
2734
|
} as unknown as EngramAccessService;
|
|
2731
2735
|
const server = new EngramAccessHttpServer({
|
|
2732
2736
|
service,
|
|
@@ -2757,9 +2761,90 @@ test("HTTP namespace/writable preflight returns the structured writability resul
|
|
|
2757
2761
|
}
|
|
2758
2762
|
});
|
|
2759
2763
|
|
|
2764
|
+
test("HTTP namespace/writable forwards project context to the scoped write preflight", async () => {
|
|
2765
|
+
let received:
|
|
2766
|
+
| {
|
|
2767
|
+
namespace?: string;
|
|
2768
|
+
sessionKey?: string;
|
|
2769
|
+
projectTag?: string;
|
|
2770
|
+
cwd?: string;
|
|
2771
|
+
}
|
|
2772
|
+
| undefined;
|
|
2773
|
+
const service = {
|
|
2774
|
+
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-context", defaultNamespace: "default" }),
|
|
2775
|
+
namespaceWritablePreflight: async (request: {
|
|
2776
|
+
namespace?: string;
|
|
2777
|
+
sessionKey?: string;
|
|
2778
|
+
projectTag?: string;
|
|
2779
|
+
cwd?: string;
|
|
2780
|
+
}) => {
|
|
2781
|
+
received = request;
|
|
2782
|
+
return { ok: true as const, namespace: "derived-project-namespace" };
|
|
2783
|
+
},
|
|
2784
|
+
} as unknown as EngramAccessService;
|
|
2785
|
+
const server = new EngramAccessHttpServer({
|
|
2786
|
+
service,
|
|
2787
|
+
port: 0,
|
|
2788
|
+
authToken: "test-token",
|
|
2789
|
+
adminConsoleEnabled: false,
|
|
2790
|
+
});
|
|
2791
|
+
|
|
2792
|
+
const status = await server.start();
|
|
2793
|
+
try {
|
|
2794
|
+
const response = await fetch(
|
|
2795
|
+
`http://127.0.0.1:${status.port}/engram/v1/namespace/writable?session=s-1&projectTag=Acme%2FWebshop&cwd=%2Ftmp%2Frepo`,
|
|
2796
|
+
{ headers: { authorization: "Bearer test-token" } },
|
|
2797
|
+
);
|
|
2798
|
+
assert.deepEqual(await response.json(), { ok: true, namespace: "derived-project-namespace" });
|
|
2799
|
+
assert.deepEqual(received, {
|
|
2800
|
+
namespace: undefined,
|
|
2801
|
+
sessionKey: "s-1",
|
|
2802
|
+
authenticatedPrincipal: undefined,
|
|
2803
|
+
projectTag: "Acme/Webshop",
|
|
2804
|
+
cwd: "/tmp/repo",
|
|
2805
|
+
});
|
|
2806
|
+
} finally {
|
|
2807
|
+
await server.stop();
|
|
2808
|
+
}
|
|
2809
|
+
});
|
|
2810
|
+
|
|
2811
|
+
test("HTTP namespace/writable checks token scope against the effective scoped namespace", async () => {
|
|
2812
|
+
const service = {
|
|
2813
|
+
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-effective", defaultNamespace: "default" }),
|
|
2814
|
+
namespaceWritablePreflight: async () => ({
|
|
2815
|
+
ok: true as const,
|
|
2816
|
+
namespace: "principal-project-derived",
|
|
2817
|
+
}),
|
|
2818
|
+
} as unknown as EngramAccessService;
|
|
2819
|
+
const server = new EngramAccessHttpServer({
|
|
2820
|
+
service,
|
|
2821
|
+
port: 0,
|
|
2822
|
+
authTokenEntriesGetter: () => [
|
|
2823
|
+
{ token: "default-only", capabilities: { version: 1, ops: ["observe"], namespaces: ["default"] } },
|
|
2824
|
+
],
|
|
2825
|
+
adminConsoleEnabled: false,
|
|
2826
|
+
});
|
|
2827
|
+
|
|
2828
|
+
const status = await server.start();
|
|
2829
|
+
try {
|
|
2830
|
+
const response = await fetch(
|
|
2831
|
+
`http://127.0.0.1:${status.port}/engram/v1/namespace/writable?session=s-1&projectTag=Acme%2FWebshop`,
|
|
2832
|
+
{ headers: { authorization: "Bearer default-only" } },
|
|
2833
|
+
);
|
|
2834
|
+
assert.deepEqual(await response.json(), {
|
|
2835
|
+
ok: false,
|
|
2836
|
+
reason: "not_writable",
|
|
2837
|
+
namespace: "principal-project-derived",
|
|
2838
|
+
});
|
|
2839
|
+
} finally {
|
|
2840
|
+
await server.stop();
|
|
2841
|
+
}
|
|
2842
|
+
});
|
|
2843
|
+
|
|
2760
2844
|
test("HTTP namespace/writable preflight admits write-scoped tokens and rejects read-only ops", async () => {
|
|
2761
2845
|
const service = {
|
|
2762
2846
|
configRef: parseConfig({ memoryDir: "/tmp/remnic-http-preflight-ops-test", defaultNamespace: "default" }),
|
|
2847
|
+
namespaceWritablePreflight: async () => ({ ok: true as const, namespace: "default" }),
|
|
2763
2848
|
} as unknown as EngramAccessService;
|
|
2764
2849
|
const server = new EngramAccessHttpServer({
|
|
2765
2850
|
service,
|
|
@@ -2800,6 +2885,12 @@ test("HTTP namespace/writable preflight admits write-scoped tokens and rejects r
|
|
|
2800
2885
|
assert.equal(await okOf(diag), false);
|
|
2801
2886
|
// A read-only token cannot write, so it has nothing to preflight → 403.
|
|
2802
2887
|
assert.equal((await request("read-only")).status, 403);
|
|
2888
|
+
const invalidOp = await request("write-scoped", "memory_stroe");
|
|
2889
|
+
assert.equal(invalidOp.status, 400);
|
|
2890
|
+
assert.match(
|
|
2891
|
+
JSON.stringify(await invalidOp.json()),
|
|
2892
|
+
/unsupported namespace preflight operation: memory_stroe/,
|
|
2893
|
+
);
|
|
2803
2894
|
} finally {
|
|
2804
2895
|
await server.stop();
|
|
2805
2896
|
}
|
package/src/access-http.ts
CHANGED
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
import { expandTildePath } from "./utils/path.js";
|
|
38
38
|
import { projectTagProjectId } from "./coding/coding-namespace.js";
|
|
39
39
|
import { getOperation, type OperationName } from "./access-boundary.js";
|
|
40
|
-
import {
|
|
40
|
+
import { resolveQueryNamespaceWritablePreflight } from "./access-namespace-preflight.js";
|
|
41
41
|
import {
|
|
42
42
|
assertOperationAllowed,
|
|
43
43
|
capabilityAllowsOp,
|
|
@@ -1467,20 +1467,19 @@ export class EngramAccessHttpServer {
|
|
|
1467
1467
|
return;
|
|
1468
1468
|
}
|
|
1469
1469
|
|
|
1470
|
-
// Namespace-writability preflight (issue #1888 part 3): would the client's
|
|
1471
|
-
// enabled write (`?op=observe|memory_store`, default observe) to the
|
|
1472
|
-
// requested namespace by THIS token succeed? Out-of-allow-list → 200
|
|
1473
|
-
// {ok:false}; any allowedByOps token may run it (HTTP + batch admit alike).
|
|
1474
1470
|
if (req.method === "GET" && pathname === "/engram/v1/namespace/writable") {
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1471
|
+
if (!getOperation("namespace_writable")) throw new Error("namespace_writable operation is not registered");
|
|
1472
|
+
this.respondJson(
|
|
1473
|
+
res,
|
|
1474
|
+
200,
|
|
1475
|
+
await resolveQueryNamespaceWritablePreflight(
|
|
1476
|
+
tokenCapabilityStore.getStore(),
|
|
1477
|
+
parsed.searchParams,
|
|
1478
|
+
this.resolveRequestPrincipal(req),
|
|
1479
|
+
this.service.configRef.defaultNamespace,
|
|
1480
|
+
(request) => this.service.namespaceWritablePreflight(request),
|
|
1481
|
+
),
|
|
1482
|
+
);
|
|
1484
1483
|
return;
|
|
1485
1484
|
}
|
|
1486
1485
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import "./access-operations.js";
|
|
5
|
+
import { getOperation } from "./access-boundary.js";
|
|
6
|
+
import { tokenCapabilityStore, type TokenCapabilities } from "./access-token-capabilities.js";
|
|
7
|
+
import {
|
|
8
|
+
assertNamespacePreflightPermitted,
|
|
9
|
+
resolveAuthorizedNamespaceWritablePreflight,
|
|
10
|
+
resolveQueryNamespaceWritablePreflight,
|
|
11
|
+
type EngramAccessNamespaceWritableRequest,
|
|
12
|
+
} from "./access-namespace-preflight.js";
|
|
13
|
+
import type { EngramAccessService } from "./access-service.js";
|
|
14
|
+
|
|
15
|
+
test("namespace_writable forwards coding context through the batch boundary", async () => {
|
|
16
|
+
let received: EngramAccessNamespaceWritableRequest | undefined;
|
|
17
|
+
const service = {
|
|
18
|
+
configRef: { defaultNamespace: "default" },
|
|
19
|
+
namespaceWritablePreflight: async (request: EngramAccessNamespaceWritableRequest) => {
|
|
20
|
+
received = request;
|
|
21
|
+
return { ok: true as const, namespace: "principal-project" };
|
|
22
|
+
},
|
|
23
|
+
} as unknown as EngramAccessService;
|
|
24
|
+
const operation = getOperation("namespace_writable");
|
|
25
|
+
assert.ok(operation);
|
|
26
|
+
|
|
27
|
+
const caps: TokenCapabilities = { version: 1, ops: ["observe"] };
|
|
28
|
+
const output = await tokenCapabilityStore.run(caps, () =>
|
|
29
|
+
operation.run(
|
|
30
|
+
{
|
|
31
|
+
sessionKey: "session-1",
|
|
32
|
+
cwd: "/workspace/project",
|
|
33
|
+
projectTag: "project-tag",
|
|
34
|
+
},
|
|
35
|
+
{ service, authenticatedPrincipal: "principal" },
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
assert.deepEqual(output, { result: { ok: true, namespace: "principal-project" } });
|
|
40
|
+
assert.deepEqual(received, {
|
|
41
|
+
sessionKey: "session-1",
|
|
42
|
+
authenticatedPrincipal: "principal",
|
|
43
|
+
cwd: "/workspace/project",
|
|
44
|
+
projectTag: "project-tag",
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("namespace_writable rejects unsupported write operations", async () => {
|
|
49
|
+
const operation = getOperation("namespace_writable");
|
|
50
|
+
assert.ok(operation);
|
|
51
|
+
const service = {
|
|
52
|
+
configRef: { defaultNamespace: "default" },
|
|
53
|
+
namespaceWritablePreflight: async () => ({ ok: true as const, namespace: "default" }),
|
|
54
|
+
} as unknown as EngramAccessService;
|
|
55
|
+
|
|
56
|
+
await assert.rejects(
|
|
57
|
+
() =>
|
|
58
|
+
tokenCapabilityStore.run({ version: 1, ops: ["observe"] }, () =>
|
|
59
|
+
operation.run({ op: "memory_stroe" }, { service }),
|
|
60
|
+
),
|
|
61
|
+
/unsupported namespace preflight operation: memory_stroe/,
|
|
62
|
+
);
|
|
63
|
+
assert.throws(
|
|
64
|
+
() =>
|
|
65
|
+
resolveQueryNamespaceWritablePreflight(
|
|
66
|
+
{ version: 1, ops: ["observe"] },
|
|
67
|
+
new URLSearchParams({ op: "memory_stroe" }),
|
|
68
|
+
undefined,
|
|
69
|
+
"default",
|
|
70
|
+
async () => ({ ok: true, namespace: "default" }),
|
|
71
|
+
),
|
|
72
|
+
/unsupported namespace preflight operation: memory_stroe/,
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("namespace_writable rejects unavailable preflight and denied write scope", async () => {
|
|
77
|
+
assert.throws(
|
|
78
|
+
() => assertNamespacePreflightPermitted({ version: 1, ops: ["memory_get"] }),
|
|
79
|
+
/token is not permitted to run the namespace preflight/,
|
|
80
|
+
);
|
|
81
|
+
assert.deepEqual(
|
|
82
|
+
await resolveAuthorizedNamespaceWritablePreflight(
|
|
83
|
+
{ version: 1, ops: ["observe"] },
|
|
84
|
+
{ namespace: "default" },
|
|
85
|
+
"default",
|
|
86
|
+
"memory_store",
|
|
87
|
+
async () => ({ ok: true, namespace: "default" }),
|
|
88
|
+
),
|
|
89
|
+
{ ok: false, reason: "not_writable", namespace: "default" },
|
|
90
|
+
);
|
|
91
|
+
assert.deepEqual(
|
|
92
|
+
await resolveAuthorizedNamespaceWritablePreflight(
|
|
93
|
+
{ version: 1, ops: ["observe"], namespaces: ["team-a"] },
|
|
94
|
+
{},
|
|
95
|
+
"default",
|
|
96
|
+
"observe",
|
|
97
|
+
async () => ({ ok: true, namespace: "default" }),
|
|
98
|
+
),
|
|
99
|
+
{ ok: false, reason: "not_writable", namespace: "default" },
|
|
100
|
+
);
|
|
101
|
+
assert.deepEqual(
|
|
102
|
+
await resolveAuthorizedNamespaceWritablePreflight(
|
|
103
|
+
{ version: 1, ops: ["observe"], namespaces: ["team-a"] },
|
|
104
|
+
{ namespace: "outside-scope" },
|
|
105
|
+
"default",
|
|
106
|
+
"observe",
|
|
107
|
+
async () => ({ ok: false, reason: "unsupported", namespace: "outside-scope" }),
|
|
108
|
+
),
|
|
109
|
+
{ ok: false, reason: "not_writable", namespace: "outside-scope" },
|
|
110
|
+
);
|
|
111
|
+
});
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { getOperation } from "./access-boundary.js";
|
|
2
|
+
import { capabilityAllowsOp, isNamespaceAllowed, type TokenCapabilities } from "./access-token-capabilities.js";
|
|
3
|
+
import { EngramAccessForbiddenError, EngramAccessInputError, NamespaceNotWritableError } from "./access-errors.js";
|
|
4
|
+
import type { WritableNamespaceResult } from "./scopes/scope-plan.js";
|
|
5
|
+
|
|
6
|
+
export interface EngramAccessNamespaceWritableRequest {
|
|
7
|
+
namespace?: string;
|
|
8
|
+
sessionKey?: string;
|
|
9
|
+
authenticatedPrincipal?: string;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
projectTag?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function namespaceWritableRequest(
|
|
15
|
+
params: URLSearchParams,
|
|
16
|
+
authenticatedPrincipal?: string,
|
|
17
|
+
): EngramAccessNamespaceWritableRequest {
|
|
18
|
+
const namespace = params.get("namespace") || undefined;
|
|
19
|
+
return {
|
|
20
|
+
namespace,
|
|
21
|
+
sessionKey: params.get("session") || undefined,
|
|
22
|
+
authenticatedPrincipal,
|
|
23
|
+
cwd: params.get("cwd") || undefined,
|
|
24
|
+
projectTag: params.get("projectTag") || undefined,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function parseNamespacePreflightWriteOp(
|
|
29
|
+
value: string | undefined,
|
|
30
|
+
): "observe" | "memory_store" {
|
|
31
|
+
if (value === undefined || value === "observe") return "observe";
|
|
32
|
+
if (value === "memory_store") return "memory_store";
|
|
33
|
+
throw new EngramAccessInputError(`unsupported namespace preflight operation: ${value}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function assertNamespacePreflightPermitted(
|
|
37
|
+
caps: TokenCapabilities | undefined | null,
|
|
38
|
+
): void {
|
|
39
|
+
const allowedOps = getOperation("namespace_writable")?.spec.allowedByOps ?? [];
|
|
40
|
+
if (!allowedOps.some((op) => capabilityAllowsOp(caps, op))) {
|
|
41
|
+
throw new EngramAccessForbiddenError("token is not permitted to run the namespace preflight");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type NamespaceWritableResolver = (
|
|
46
|
+
request: EngramAccessNamespaceWritableRequest,
|
|
47
|
+
) => Promise<string>;
|
|
48
|
+
export type NamespaceWritablePreflightResolver = (
|
|
49
|
+
request: EngramAccessNamespaceWritableRequest,
|
|
50
|
+
) => Promise<WritableNamespaceResult>;
|
|
51
|
+
|
|
52
|
+
export async function resolveNamespaceWritablePreflight(
|
|
53
|
+
request: EngramAccessNamespaceWritableRequest,
|
|
54
|
+
resolveWritable: NamespaceWritableResolver,
|
|
55
|
+
): Promise<WritableNamespaceResult> {
|
|
56
|
+
try {
|
|
57
|
+
return { ok: true, namespace: await resolveWritable(request) };
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (error instanceof NamespaceNotWritableError) {
|
|
60
|
+
return { ok: false, reason: "not_writable", namespace: error.attemptedNamespace };
|
|
61
|
+
}
|
|
62
|
+
if (error instanceof EngramAccessInputError) {
|
|
63
|
+
return {
|
|
64
|
+
ok: false,
|
|
65
|
+
reason: "unsupported",
|
|
66
|
+
namespace: request.namespace?.trim() ?? "",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export async function resolveAuthorizedNamespaceWritablePreflight(
|
|
74
|
+
caps: TokenCapabilities | undefined | null,
|
|
75
|
+
request: EngramAccessNamespaceWritableRequest,
|
|
76
|
+
defaultNamespace: string,
|
|
77
|
+
writeOp: "observe" | "memory_store",
|
|
78
|
+
resolvePreflight: NamespaceWritablePreflightResolver,
|
|
79
|
+
): Promise<WritableNamespaceResult> {
|
|
80
|
+
if (!capabilityAllowsOp(caps, writeOp)) {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
reason: "not_writable",
|
|
84
|
+
namespace: request.namespace?.trim() || defaultNamespace,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const result = await resolvePreflight(request);
|
|
89
|
+
if (!isNamespaceAllowed(caps, result.namespace, defaultNamespace)) {
|
|
90
|
+
|
|
91
|
+
return { ok: false, reason: "not_writable", namespace: result.namespace };
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function resolveQueryNamespaceWritablePreflight(
|
|
97
|
+
caps: TokenCapabilities | undefined | null,
|
|
98
|
+
params: URLSearchParams,
|
|
99
|
+
authenticatedPrincipal: string | undefined,
|
|
100
|
+
defaultNamespace: string,
|
|
101
|
+
resolvePreflight: NamespaceWritablePreflightResolver,
|
|
102
|
+
): Promise<WritableNamespaceResult> {
|
|
103
|
+
assertNamespacePreflightPermitted(caps);
|
|
104
|
+
return resolveAuthorizedNamespaceWritablePreflight(
|
|
105
|
+
caps,
|
|
106
|
+
namespaceWritableRequest(params, authenticatedPrincipal),
|
|
107
|
+
defaultNamespace,
|
|
108
|
+
parseNamespacePreflightWriteOp(params.get("op") ?? undefined),
|
|
109
|
+
resolvePreflight,
|
|
110
|
+
);
|
|
111
|
+
}
|
|
@@ -18,7 +18,11 @@ import { EngramAccessForbiddenError } from "./access-errors.js";
|
|
|
18
18
|
import { EngramAccessInputError, type EngramAccessService } from "./access-service.js";
|
|
19
19
|
import { enforceNamespaceAllowList, tokenCapabilityStore } from "./access-token-capabilities.js";
|
|
20
20
|
import { projectTagProjectId } from "./coding/coding-namespace.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
parseNamespacePreflightWriteOp,
|
|
23
|
+
resolveAuthorizedNamespaceWritablePreflight,
|
|
24
|
+
type EngramAccessNamespaceWritableRequest,
|
|
25
|
+
} from "./access-namespace-preflight.js";
|
|
22
26
|
import { expandTildePath } from "./utils/path.js";
|
|
23
27
|
import { resolvePrincipal } from "./namespaces/principal.js";
|
|
24
28
|
import { getRecallTimingStatus, isRecallTimingsOperator } from "./recall-timings.js";
|
|
@@ -114,7 +118,26 @@ defineOperation({ name: "recall_xray", description: "X-ray recall.", schema: str
|
|
|
114
118
|
return { result: await ctx.service.recallXray({ query: defStr(input.query, ""), sessionKey: optStr(input.sessionKey), namespace: optStr(input.namespace), budget, authenticatedPrincipal: ctx.authenticatedPrincipal, ...(dr && dr !== "" ? { disclosure: dr as RecallDisclosure } : {}), ...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}) }) };
|
|
115
119
|
},
|
|
116
120
|
});
|
|
117
|
-
defineOperation({ name: "namespace_writable", description: "Read-only preflight: is a namespace writable for the caller's principal?", allowedByOps: ["namespace_writable", "observe", "memory_store"], schema: strictSchema({ namespace: S.str, sessionKey: S.str, op: S.str
|
|
121
|
+
defineOperation({ name: "namespace_writable", description: "Read-only preflight: is a namespace writable for the caller's principal?", allowedByOps: ["namespace_writable", "observe", "memory_store"], schema: strictSchema({ namespace: S.str, sessionKey: S.str, op: S.str, cwd: S.str, projectTag: S.str }), handler: async (input, ctx) => {
|
|
122
|
+
const writeOp = parseNamespacePreflightWriteOp(optStr(input.op));
|
|
123
|
+
const namespace = optStr(input.namespace);
|
|
124
|
+
const request: EngramAccessNamespaceWritableRequest = {
|
|
125
|
+
sessionKey: optStr(input.sessionKey),
|
|
126
|
+
authenticatedPrincipal: ctx.authenticatedPrincipal,
|
|
127
|
+
cwd: optStr(input.cwd),
|
|
128
|
+
projectTag: optStr(input.projectTag),
|
|
129
|
+
...(namespace ? { namespace } : {}),
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
result: await resolveAuthorizedNamespaceWritablePreflight(
|
|
133
|
+
tokenCapabilityStore.getStore(),
|
|
134
|
+
request,
|
|
135
|
+
ctx.service.configRef.defaultNamespace,
|
|
136
|
+
writeOp,
|
|
137
|
+
(preflightRequest) => ctx.service.namespaceWritablePreflight(preflightRequest),
|
|
138
|
+
),
|
|
139
|
+
};
|
|
140
|
+
} });
|
|
118
141
|
|
|
119
142
|
// === WEARABLES ===
|
|
120
143
|
defineOperation({ name: "wearables_status", description: "Wearables status.", schema: strictSchema({}), handler: async (_i, ctx) => ({ result: await ctx.service.wearablesStatus() }) });
|
|
@@ -33,6 +33,8 @@ import { join } from "node:path";
|
|
|
33
33
|
import test from "node:test";
|
|
34
34
|
|
|
35
35
|
import { EngramAccessService } from "./access-service.js";
|
|
36
|
+
import { tokenCapabilityStore } from "./access-token-capabilities.js";
|
|
37
|
+
import { resolveAuthorizedNamespaceWritablePreflight } from "./access-namespace-preflight.js";
|
|
36
38
|
import { Orchestrator } from "./orchestrator.js";
|
|
37
39
|
import type { StorageManager } from "./storage.js";
|
|
38
40
|
import type { EngramAccessObserveRequest } from "./access-service.js";
|
|
@@ -604,6 +606,85 @@ test("#1505 (cursor hAp) scopeDebug.baseNamespace reports the principal self bas
|
|
|
604
606
|
);
|
|
605
607
|
});
|
|
606
608
|
|
|
609
|
+
test("#2080 preflight resolves an implicit project scope through the observe write resolver", async () => {
|
|
610
|
+
const probe = makeObserveProbe({
|
|
611
|
+
...withSelfPolicyPrefix("pi-geek"),
|
|
612
|
+
namespacePolicies: [
|
|
613
|
+
{ name: "default", readPrincipals: ["admin"], writePrincipals: ["admin"] },
|
|
614
|
+
{ name: "pi-geek", readPrincipals: ["pi-geek"], writePrincipals: ["pi-geek"] },
|
|
615
|
+
],
|
|
616
|
+
});
|
|
617
|
+
const service = new EngramAccessService(probe.orch);
|
|
618
|
+
const expected = combineNamespaces(
|
|
619
|
+
"pi-geek",
|
|
620
|
+
projectNamespaceName(projectTagProjectId("Acme/Webshop")),
|
|
621
|
+
);
|
|
622
|
+
|
|
623
|
+
const result = await (
|
|
624
|
+
service as unknown as {
|
|
625
|
+
namespaceWritablePreflight: (request: {
|
|
626
|
+
sessionKey: string;
|
|
627
|
+
authenticatedPrincipal: string;
|
|
628
|
+
projectTag: string;
|
|
629
|
+
}) => Promise<{ ok: boolean; namespace: string }>;
|
|
630
|
+
}
|
|
631
|
+
).namespaceWritablePreflight({
|
|
632
|
+
sessionKey: "pi-geek:abc123",
|
|
633
|
+
authenticatedPrincipal: "pi-geek",
|
|
634
|
+
projectTag: "Acme/Webshop",
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
assert.deepEqual(result, { ok: true, namespace: expected });
|
|
638
|
+
await assert.rejects(
|
|
639
|
+
() =>
|
|
640
|
+
tokenCapabilityStore.run({ version: 1, namespaces: ["default"] }, () =>
|
|
641
|
+
(
|
|
642
|
+
service as unknown as {
|
|
643
|
+
resolveCodingScopedWriteNamespace: (request: {
|
|
644
|
+
sessionKey: string;
|
|
645
|
+
authenticatedPrincipal: string;
|
|
646
|
+
projectTag: string;
|
|
647
|
+
}) => Promise<string>;
|
|
648
|
+
}
|
|
649
|
+
).resolveCodingScopedWriteNamespace({
|
|
650
|
+
sessionKey: "pi-geek:abc123",
|
|
651
|
+
authenticatedPrincipal: "pi-geek",
|
|
652
|
+
projectTag: "Acme/Webshop",
|
|
653
|
+
}),
|
|
654
|
+
),
|
|
655
|
+
/not permitted/,
|
|
656
|
+
);
|
|
657
|
+
const deniedPreflight = await tokenCapabilityStore.run(
|
|
658
|
+
{ version: 1, ops: ["observe"], namespaces: ["default"] },
|
|
659
|
+
() =>
|
|
660
|
+
resolveAuthorizedNamespaceWritablePreflight(
|
|
661
|
+
tokenCapabilityStore.getStore(),
|
|
662
|
+
{
|
|
663
|
+
sessionKey: "pi-geek:abc123",
|
|
664
|
+
authenticatedPrincipal: "pi-geek",
|
|
665
|
+
projectTag: "Acme/Webshop",
|
|
666
|
+
},
|
|
667
|
+
"default",
|
|
668
|
+
"observe",
|
|
669
|
+
(request) => service.namespaceWritablePreflight(request),
|
|
670
|
+
),
|
|
671
|
+
);
|
|
672
|
+
assert.deepEqual(deniedPreflight, { ok: false, reason: "not_writable", namespace: expected });
|
|
673
|
+
await assert.rejects(
|
|
674
|
+
() =>
|
|
675
|
+
tokenCapabilityStore.run({ version: 1, namespaces: ["default"] }, () =>
|
|
676
|
+
service.observe(
|
|
677
|
+
observeRequest({
|
|
678
|
+
sessionKey: "pi-geek:abc123",
|
|
679
|
+
authenticatedPrincipal: "pi-geek",
|
|
680
|
+
projectTag: "Acme/Webshop",
|
|
681
|
+
}),
|
|
682
|
+
),
|
|
683
|
+
),
|
|
684
|
+
/not permitted/,
|
|
685
|
+
);
|
|
686
|
+
});
|
|
687
|
+
|
|
607
688
|
test("#1495 the scope plan's writeNamespace matches resolveCodingScopedWriteNamespace (memory_store / suggestion_submit parity, rule 39)", async () => {
|
|
608
689
|
// Regression guard: observe's effective scope MUST be identical to what the
|
|
609
690
|
// explicit-write tools (memory_store / suggestion_submit) resolve via
|