@remnic/core 9.21.0 → 9.22.1
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 +32 -12
- package/dist/access-admin-ops-surface.js +44 -43
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +13 -10
- package/dist/access-boundary.js +44 -43
- package/dist/access-cli.js +125 -122
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +16 -9
- package/dist/access-http.js +56 -54
- package/dist/access-identity-continuity-surface.d.ts +9 -7
- package/dist/access-identity-continuity-surface.js +44 -43
- package/dist/access-lcm-surface.d.ts +12 -9
- package/dist/access-lcm-surface.js +44 -43
- package/dist/access-mcp-admin-tools.d.ts +18 -0
- package/dist/access-mcp-admin-tools.js +10 -0
- package/dist/access-mcp-admin-tools.js.map +1 -0
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +22 -10
- package/dist/access-mcp.js +52 -50
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-tmwQgCT6.d.ts → access-namespace-preflight-CmErR03h.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +44 -43
- package/dist/access-observe-write-surface.d.ts +12 -9
- package/dist/access-observe-write-surface.js +44 -43
- package/dist/access-operations-batch.js +46 -45
- package/dist/access-operations.d.ts +16 -13
- package/dist/access-operations.js +48 -47
- package/dist/access-recall-concurrency.d.ts +12 -9
- package/dist/access-recall-concurrency.js +44 -43
- package/dist/access-recall-response.d.ts +12 -9
- package/dist/access-recall-response.js +44 -43
- package/dist/access-recall-surface.d.ts +14 -11
- package/dist/access-recall-surface.js +44 -43
- package/dist/access-schema.d.ts +76 -76
- package/dist/{access-service-BqUii7LY.d.ts → access-service-CKEROeFP.d.ts} +32 -11
- package/dist/access-service.d.ts +13 -10
- package/dist/access-service.js +46 -45
- package/dist/access-surface-catalog.d.ts +12 -9
- package/dist/access-surface-catalog.js +7 -0
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +78 -0
- package/dist/access-wearables-meetings-surface.js +22 -0
- package/dist/access-wearables-meetings-surface.js.map +1 -0
- 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 +7 -7
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-UPTUVE4X.js → auto-sync-5OE5QOZB.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 -7
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +11 -11
- 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/{catalog-iWvWz61I.d.ts → catalog-BFTVo2Ez.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +15 -15
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-Z54EM5YZ.js → chunk-2PHX3I5C.js} +10 -10
- package/dist/{chunk-JFDEYXF7.js → chunk-3NAHZQU3.js} +2 -2
- package/dist/{chunk-MJYYXODM.js → chunk-3UOSVTFR.js} +8 -8
- package/dist/{chunk-HPOY2PHQ.js → chunk-3ZW6ZQO6.js} +6 -6
- package/dist/{chunk-UV72DEZD.js → chunk-4B77XSG5.js} +5 -5
- package/dist/chunk-56BSXSHC.js +158 -0
- package/dist/chunk-56BSXSHC.js.map +1 -0
- package/dist/{chunk-IC2TCZJ2.js → chunk-57QKLRBV.js} +3 -1
- package/dist/chunk-57QKLRBV.js.map +1 -0
- package/dist/{chunk-LMHDFOVV.js → chunk-5CPI2QWG.js} +3 -3
- package/dist/{chunk-3ZUY2VQF.js → chunk-5FZQ74K5.js} +2 -2
- package/dist/{chunk-B7C3TF5H.js → chunk-6TWXQ4E2.js} +5 -5
- package/dist/{chunk-JN3IUA2Q.js → chunk-7I7AYIUQ.js} +3 -3
- package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
- package/dist/{chunk-MONWCSVL.js → chunk-7RAJ3GXO.js} +2 -1
- package/dist/chunk-7RAJ3GXO.js.map +1 -0
- package/dist/{chunk-SQEDDWAM.js → chunk-A2RFKL3V.js} +5 -34
- package/dist/chunk-A2RFKL3V.js.map +1 -0
- package/dist/{chunk-5JQLAQUZ.js → chunk-ATEAL5EI.js} +6 -6
- package/dist/{chunk-4PYLBXX6.js → chunk-AYAROCWD.js} +2 -2
- package/dist/chunk-BLDBT6HZ.js +39 -0
- package/dist/chunk-BLDBT6HZ.js.map +1 -0
- package/dist/{chunk-EXU5IQ3S.js → chunk-CUUY5CC4.js} +6 -6
- package/dist/{chunk-X5QS5C2O.js → chunk-E3ZMFFQZ.js} +2 -2
- package/dist/{chunk-JWMYVQAM.js → chunk-ES5IHQ6M.js} +2 -2
- package/dist/{chunk-HJEEAO4O.js → chunk-G2NSSQES.js} +2 -2
- package/dist/{chunk-QO2KODU6.js → chunk-GD3QOBMB.js} +2 -2
- package/dist/{chunk-62QM5MKY.js → chunk-IIXLB5E7.js} +118 -62
- package/dist/chunk-IIXLB5E7.js.map +1 -0
- package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
- package/dist/{chunk-Q3FWRDCP.js → chunk-JNIJBXVK.js} +2 -2
- package/dist/{chunk-EILX7SQR.js → chunk-JVGUY2AU.js} +27 -16
- package/dist/chunk-JVGUY2AU.js.map +1 -0
- package/dist/{chunk-N7EVMKP6.js → chunk-KNRG6ZGJ.js} +11 -11
- package/dist/{chunk-GEUDRENF.js → chunk-MMTG3SCJ.js} +2 -2
- package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
- package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
- package/dist/{chunk-TCZWBJBO.js → chunk-OUW4PAY4.js} +199 -256
- package/dist/chunk-OUW4PAY4.js.map +1 -0
- package/dist/{chunk-275ENJDK.js → chunk-P2BLHUL2.js} +2 -2
- package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
- package/dist/{chunk-V5TSUGRB.js → chunk-QCKQEBIY.js} +17 -9
- package/dist/chunk-QCKQEBIY.js.map +1 -0
- package/dist/{chunk-EZKKHVFY.js → chunk-QE63OHLB.js} +2 -2
- package/dist/{chunk-ONHRRJZM.js → chunk-QJAQNXWI.js} +6 -6
- package/dist/{chunk-KHRKEELC.js → chunk-ROUL7RZU.js} +395 -69
- package/dist/chunk-ROUL7RZU.js.map +1 -0
- package/dist/{chunk-AT3TDN6O.js → chunk-RT4TSR2C.js} +8953 -8645
- package/dist/chunk-RT4TSR2C.js.map +1 -0
- package/dist/{chunk-6NZ7U4R4.js → chunk-SCOT5DTA.js} +1 -1
- package/dist/chunk-SCOT5DTA.js.map +1 -0
- package/dist/{chunk-LI4ZOFHW.js → chunk-SVZGA2MK.js} +2 -2
- package/dist/chunk-SYOIVK7K.js +63 -0
- package/dist/chunk-SYOIVK7K.js.map +1 -0
- package/dist/{chunk-5RUE3GHQ.js → chunk-TWCOYET2.js} +17 -1
- package/dist/chunk-TWCOYET2.js.map +1 -0
- package/dist/{chunk-5IXPWEQB.js → chunk-WS32QRLO.js} +113 -48
- package/dist/chunk-WS32QRLO.js.map +1 -0
- package/dist/{chunk-53WDAG7X.js → chunk-WWZ35GWW.js} +5 -5
- package/dist/{chunk-4F6AANKS.js → chunk-XWPFZX6S.js} +507 -143
- package/dist/chunk-XWPFZX6S.js.map +1 -0
- package/dist/{chunk-SB4OKS6C.js → chunk-ZN4UZWMT.js} +2 -2
- package/dist/{chunk-7M6APKJL.js → chunk-ZYU7ZFLT.js} +2 -2
- package/dist/{cli-DPEhq0Cp.d.ts → cli-BrwT9YMD.d.ts} +5 -5
- package/dist/cli.d.ts +14 -11
- package/dist/cli.js +86 -84
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +11 -11
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +4 -4
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +11 -11
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +12 -12
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +2 -2
- package/dist/contradiction/index.js +1 -1
- 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/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 +11 -11
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +9 -7
- package/dist/explicit-capture.js +1 -1
- package/dist/extraction-error-classification.d.ts +22 -0
- package/dist/extraction-error-classification.js +11 -0
- package/dist/extraction-error-classification.js.map +1 -0
- 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 -17
- package/dist/extraction.js +5 -3
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{first-start-migration-LEXL3XYL.js → first-start-migration-BKNGOFED.js} +4 -4
- 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 +713 -923
- package/dist/index.js +249 -212
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +13 -13
- 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 +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 +12 -12
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -11
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +13 -13
- package/dist/maintenance-C98njYb8.d.ts +366 -0
- package/dist/mcp-memory-inspector-app.d.ts +12 -9
- 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-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 +19 -19
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +11 -11
- 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 +1 -1
- package/dist/operator-toolkit.d.ts +2 -2
- package/dist/operator-toolkit.js +28 -28
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +6 -223
- package/dist/orchestration/maintenance.js +19 -19
- package/dist/{orchestrator-DB93S48I.d.ts → orchestrator-C9ZVppNh.d.ts} +12 -481
- package/dist/orchestrator.d.ts +10 -8
- package/dist/orchestrator.js +122 -119
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-DmGc-H66.d.ts → pipeline-id_-sqYm.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-cJT0crkF.d.ts → qmd-R6XaQOZK.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/resolution-3K27T4VO.js +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +6 -6
- 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/salvage-envelope.js +1 -1
- package/dist/schemas.d.ts +76 -76
- package/dist/{scope-profiles-KG2nODX7.d.ts → scope-profiles-EhyuAKkd.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +6 -6
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-BaZlg0D8.d.ts → semantic-consolidation-B2xo26UQ.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +13 -13
- package/dist/semantic-rule-promotion.js +11 -11
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +12 -12
- package/dist/service-DgFWlZ-r.d.ts +835 -0
- 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 +9 -9
- package/dist/signal.d.ts +1 -1
- package/dist/{storage-BKhHHnRo.d.ts → storage-XGawwqXE.d.ts} +131 -2
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +10 -10
- package/dist/summarizer.d.ts +1 -1
- 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/import-sqlite.js +2 -2
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-GBQZuT7l.d.ts → types-Bbs0qz6b.d.ts} +2 -3
- 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 +12 -12
- package/dist/write-envelope.d.ts +1 -1
- package/dist/write-envelope.js +1 -1
- package/package.json +2 -2
- package/src/access-admin-ops-surface.ts +47 -0
- package/src/access-boundary.ts +4 -0
- package/src/access-http.test.ts +63 -0
- package/src/access-http.ts +27 -37
- package/src/access-mcp-admin-tools.ts +171 -0
- package/src/access-mcp-output-schemas.ts +16 -0
- package/src/access-mcp.ts +10 -262
- package/src/access-operations-batch.ts +11 -5
- package/src/access-service.ts +59 -46
- package/src/access-surface-catalog.ts +7 -0
- package/src/access-wearables-meetings-surface.ts +139 -0
- package/src/activity/digest.ts +1 -1
- package/src/activity/runner.test.ts +37 -0
- package/src/activity/runner.ts +12 -0
- package/src/activity/scheduler.test.ts +1 -0
- package/src/activity/sync-registration.ts +13 -0
- package/src/cli/meetings-commands.ts +70 -0
- package/src/cli.ts +7 -6
- package/src/extraction-error-classification.ts +52 -0
- package/src/extraction.ts +2 -50
- package/src/mcp-read-only-tools.ts +2 -0
- package/src/meetings/build-memory.test.ts +364 -0
- package/src/meetings/build-scheduler.test.ts +55 -0
- package/src/meetings/build-scheduler.ts +96 -0
- package/src/meetings/day-source.test.ts +275 -0
- package/src/meetings/day-source.ts +352 -0
- package/src/meetings/http-glue.ts +126 -0
- package/src/meetings/index.ts +5 -4
- package/src/meetings/manual-sync-flush.test.ts +72 -0
- package/src/meetings/mcp-tools.ts +65 -0
- package/src/meetings/memory-gen.test.ts +498 -0
- package/src/meetings/memory-gen.ts +549 -0
- package/src/meetings/memory-generator.ts +5 -0
- package/src/meetings/namespace-isolation.test.ts +159 -0
- package/src/meetings/service.test.ts +195 -0
- package/src/meetings/service.ts +157 -0
- package/src/meetings/summary-extractor.test.ts +287 -0
- package/src/meetings/summary-extractor.ts +264 -0
- package/src/orchestration/maintenance.ts +8 -0
- package/src/orchestration/orchestrator-init.ts +6 -1
- package/src/orchestration/workspace-ops.ts +172 -8
- package/src/orchestrator.ts +12 -13
- package/src/storage.ts +21 -0
- package/src/testing/subjects/meetings-namespace-harness.ts +159 -0
- package/src/testing/subjects/meetings-namespace.test.ts +93 -0
- package/src/types.ts +1 -2
- package/src/wearables/cli.ts +2 -1
- package/src/wearables/index.ts +1 -0
- package/src/wearables/mcp-tools.ts +143 -0
- package/src/wearables/registry.test.ts +11 -0
- package/src/wearables/registry.ts +13 -0
- package/src/wearables/service.test.ts +62 -1
- package/src/wearables/service.ts +30 -2
- package/src/wearables/transcript-search-namespace-isolation.test.ts +98 -0
- package/dist/chunk-4F6AANKS.js.map +0 -1
- package/dist/chunk-5IXPWEQB.js.map +0 -1
- package/dist/chunk-5RUE3GHQ.js.map +0 -1
- package/dist/chunk-62QM5MKY.js.map +0 -1
- package/dist/chunk-6NZ7U4R4.js.map +0 -1
- package/dist/chunk-AT3TDN6O.js.map +0 -1
- package/dist/chunk-EILX7SQR.js.map +0 -1
- package/dist/chunk-IC2TCZJ2.js.map +0 -1
- package/dist/chunk-KHRKEELC.js.map +0 -1
- package/dist/chunk-MONWCSVL.js.map +0 -1
- package/dist/chunk-SQEDDWAM.js.map +0 -1
- package/dist/chunk-TCZWBJBO.js.map +0 -1
- package/dist/chunk-V5TSUGRB.js.map +0 -1
- /package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-5OE5QOZB.js.map} +0 -0
- /package/dist/{chunk-Z54EM5YZ.js.map → chunk-2PHX3I5C.js.map} +0 -0
- /package/dist/{chunk-JFDEYXF7.js.map → chunk-3NAHZQU3.js.map} +0 -0
- /package/dist/{chunk-MJYYXODM.js.map → chunk-3UOSVTFR.js.map} +0 -0
- /package/dist/{chunk-HPOY2PHQ.js.map → chunk-3ZW6ZQO6.js.map} +0 -0
- /package/dist/{chunk-UV72DEZD.js.map → chunk-4B77XSG5.js.map} +0 -0
- /package/dist/{chunk-LMHDFOVV.js.map → chunk-5CPI2QWG.js.map} +0 -0
- /package/dist/{chunk-3ZUY2VQF.js.map → chunk-5FZQ74K5.js.map} +0 -0
- /package/dist/{chunk-B7C3TF5H.js.map → chunk-6TWXQ4E2.js.map} +0 -0
- /package/dist/{chunk-JN3IUA2Q.js.map → chunk-7I7AYIUQ.js.map} +0 -0
- /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
- /package/dist/{chunk-5JQLAQUZ.js.map → chunk-ATEAL5EI.js.map} +0 -0
- /package/dist/{chunk-4PYLBXX6.js.map → chunk-AYAROCWD.js.map} +0 -0
- /package/dist/{chunk-EXU5IQ3S.js.map → chunk-CUUY5CC4.js.map} +0 -0
- /package/dist/{chunk-X5QS5C2O.js.map → chunk-E3ZMFFQZ.js.map} +0 -0
- /package/dist/{chunk-JWMYVQAM.js.map → chunk-ES5IHQ6M.js.map} +0 -0
- /package/dist/{chunk-HJEEAO4O.js.map → chunk-G2NSSQES.js.map} +0 -0
- /package/dist/{chunk-QO2KODU6.js.map → chunk-GD3QOBMB.js.map} +0 -0
- /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-Q3FWRDCP.js.map → chunk-JNIJBXVK.js.map} +0 -0
- /package/dist/{chunk-N7EVMKP6.js.map → chunk-KNRG6ZGJ.js.map} +0 -0
- /package/dist/{chunk-GEUDRENF.js.map → chunk-MMTG3SCJ.js.map} +0 -0
- /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
- /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
- /package/dist/{chunk-275ENJDK.js.map → chunk-P2BLHUL2.js.map} +0 -0
- /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
- /package/dist/{chunk-EZKKHVFY.js.map → chunk-QE63OHLB.js.map} +0 -0
- /package/dist/{chunk-ONHRRJZM.js.map → chunk-QJAQNXWI.js.map} +0 -0
- /package/dist/{chunk-LI4ZOFHW.js.map → chunk-SVZGA2MK.js.map} +0 -0
- /package/dist/{chunk-53WDAG7X.js.map → chunk-WWZ35GWW.js.map} +0 -0
- /package/dist/{chunk-SB4OKS6C.js.map → chunk-ZN4UZWMT.js.map} +0 -0
- /package/dist/{chunk-7M6APKJL.js.map → chunk-ZYU7ZFLT.js.map} +0 -0
- /package/dist/{first-start-migration-LEXL3XYL.js.map → first-start-migration-BKNGOFED.js.map} +0 -0
|
@@ -215,6 +215,53 @@ export class AccessAdminOpsSurface {
|
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
/**
|
|
219
|
+
* Operator-triggered bulk drain of the entity synthesis queue (issue #2136).
|
|
220
|
+
* Every automatic call site processes at most 5 entities per event, which a
|
|
221
|
+
* busy deployment's queue inflow outruns; this surface drains a bounded
|
|
222
|
+
* batch on demand. `maxEntities` is clamped to 200 per call so a single
|
|
223
|
+
* request stays bounded; loop until `processed < requested` to drain fully.
|
|
224
|
+
*/
|
|
225
|
+
async entitySynthesisRun(
|
|
226
|
+
request: {
|
|
227
|
+
namespace?: string;
|
|
228
|
+
maxEntities?: number;
|
|
229
|
+
authenticatedPrincipal?: string;
|
|
230
|
+
},
|
|
231
|
+
principal?: string,
|
|
232
|
+
): Promise<{
|
|
233
|
+
namespace: string;
|
|
234
|
+
requested: number;
|
|
235
|
+
processed: number;
|
|
236
|
+
remaining: number;
|
|
237
|
+
}> {
|
|
238
|
+
const resolvedNamespace = this.deps.writableNamespaceFor(
|
|
239
|
+
request.namespace,
|
|
240
|
+
undefined,
|
|
241
|
+
request.authenticatedPrincipal ?? principal,
|
|
242
|
+
);
|
|
243
|
+
let requested = 25;
|
|
244
|
+
if (request.maxEntities !== undefined) {
|
|
245
|
+
if (
|
|
246
|
+
typeof request.maxEntities !== "number"
|
|
247
|
+
|| !Number.isInteger(request.maxEntities)
|
|
248
|
+
|| request.maxEntities < 1
|
|
249
|
+
) {
|
|
250
|
+
throw new Error(
|
|
251
|
+
`Invalid maxEntities: ${String(request.maxEntities)} (expected an integer >= 1)`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
requested = Math.min(200, request.maxEntities);
|
|
255
|
+
}
|
|
256
|
+
const processed = await this.deps.orchestrator.entitySynthesisCoordinator.processQueue(
|
|
257
|
+
resolvedNamespace,
|
|
258
|
+
requested,
|
|
259
|
+
);
|
|
260
|
+
const storage = await this.deps.orchestrator.getStorage(resolvedNamespace);
|
|
261
|
+
const remaining = (await storage.readEntitySynthesisQueue()).length;
|
|
262
|
+
return { namespace: resolvedNamespace, requested, processed, remaining };
|
|
263
|
+
}
|
|
264
|
+
|
|
218
265
|
async conversationIndexUpdate(
|
|
219
266
|
request: {
|
|
220
267
|
sessionKey?: string;
|
package/src/access-boundary.ts
CHANGED
|
@@ -75,6 +75,9 @@ export const OPERATION_NAMES = [
|
|
|
75
75
|
"transcript_day",
|
|
76
76
|
"transcript_search",
|
|
77
77
|
"transcript_memories",
|
|
78
|
+
"meetings_list",
|
|
79
|
+
"meetings_get",
|
|
80
|
+
"meetings_build",
|
|
78
81
|
"action_confidence",
|
|
79
82
|
"chatgpt_memory_inspector",
|
|
80
83
|
"day_summary",
|
|
@@ -82,6 +85,7 @@ export const OPERATION_NAMES = [
|
|
|
82
85
|
"capsule_import",
|
|
83
86
|
"capsule_list",
|
|
84
87
|
"memory_governance_run",
|
|
88
|
+
"entity_synthesis_run",
|
|
85
89
|
"procedure_mining_run",
|
|
86
90
|
"pattern_reinforcement_run",
|
|
87
91
|
"procedural_stats",
|
package/src/access-http.test.ts
CHANGED
|
@@ -2895,3 +2895,66 @@ test("HTTP namespace/writable preflight admits write-scoped tokens and rejects r
|
|
|
2895
2895
|
await server.stop();
|
|
2896
2896
|
}
|
|
2897
2897
|
});
|
|
2898
|
+
|
|
2899
|
+
test("HTTP meetings build enforces the per-principal write rate limit (issue #1937)", async () => {
|
|
2900
|
+
let builds = 0;
|
|
2901
|
+
const service = {
|
|
2902
|
+
meetingsBuild: async (date: string) => {
|
|
2903
|
+
builds += 1;
|
|
2904
|
+
return { enabled: true, date, meetings: [] };
|
|
2905
|
+
},
|
|
2906
|
+
} as unknown as EngramAccessService;
|
|
2907
|
+
const server = new EngramAccessHttpServer({
|
|
2908
|
+
service,
|
|
2909
|
+
port: 0,
|
|
2910
|
+
authToken: "test-token",
|
|
2911
|
+
adminConsoleEnabled: false,
|
|
2912
|
+
writeRateLimitMaxRequests: 1,
|
|
2913
|
+
});
|
|
2914
|
+
const status = await server.start();
|
|
2915
|
+
try {
|
|
2916
|
+
const build = () =>
|
|
2917
|
+
fetch(`http://127.0.0.1:${status.port}/engram/v1/meetings/build`, {
|
|
2918
|
+
method: "POST",
|
|
2919
|
+
headers: { authorization: "Bearer test-token", "content-type": "application/json" },
|
|
2920
|
+
body: JSON.stringify({ date: "2026-03-10" }),
|
|
2921
|
+
});
|
|
2922
|
+
const first = await build();
|
|
2923
|
+
assert.equal(first.status, 200, "the first build is within the write quota");
|
|
2924
|
+
const second = await build();
|
|
2925
|
+
assert.equal(second.status, 429, "the second build exceeds the per-principal write quota");
|
|
2926
|
+
const rateLimited = await second.json() as { code?: string };
|
|
2927
|
+
assert.equal(rateLimited.code, "write_rate_limited");
|
|
2928
|
+
assert.equal(builds, 1, "the rate-limited build never reached the service (no persist/reindex)");
|
|
2929
|
+
} finally {
|
|
2930
|
+
await server.stop();
|
|
2931
|
+
}
|
|
2932
|
+
});
|
|
2933
|
+
|
|
2934
|
+
test("HTTP meetings get returns 400 (not 500) for a malformed percent-encoded id (issue #1900)", async () => {
|
|
2935
|
+
let called = 0;
|
|
2936
|
+
const service = {
|
|
2937
|
+
meetingsGet: async () => {
|
|
2938
|
+
called += 1;
|
|
2939
|
+
return { enabled: true, found: false, id: "x", record: null };
|
|
2940
|
+
},
|
|
2941
|
+
} as unknown as EngramAccessService;
|
|
2942
|
+
const server = new EngramAccessHttpServer({
|
|
2943
|
+
service,
|
|
2944
|
+
port: 0,
|
|
2945
|
+
authToken: "test-token",
|
|
2946
|
+
adminConsoleEnabled: false,
|
|
2947
|
+
});
|
|
2948
|
+
const status = await server.start();
|
|
2949
|
+
try {
|
|
2950
|
+
const response = await fetch(`http://127.0.0.1:${status.port}/engram/v1/meetings/%E0%A4%A`, {
|
|
2951
|
+
headers: { authorization: "Bearer test-token" },
|
|
2952
|
+
});
|
|
2953
|
+
assert.equal(response.status, 400, "a malformed id is a client error, not an internal 500");
|
|
2954
|
+
const errorBody = await response.json() as { code?: string };
|
|
2955
|
+
assert.equal(errorBody.code, "invalid_request");
|
|
2956
|
+
assert.equal(called, 0, "the malformed id never reached the service");
|
|
2957
|
+
} finally {
|
|
2958
|
+
await server.stop();
|
|
2959
|
+
}
|
|
2960
|
+
});
|
package/src/access-http.ts
CHANGED
|
@@ -13,11 +13,12 @@ import { EngramAccessForbiddenError } from "./access-errors.js";
|
|
|
13
13
|
import {
|
|
14
14
|
EngramAccessInputError,
|
|
15
15
|
type EngramAccessService,
|
|
16
|
+
type WearablesMeetingsScope,
|
|
16
17
|
type EngramAccessMemoryResponse,
|
|
17
18
|
type EngramAccessWriteResponse,
|
|
18
19
|
} from "./access-service.js";
|
|
19
20
|
import { CorrectionContractError } from "./correction/correction-contract.js";
|
|
20
|
-
import { WearablesInputError } from "./wearables/errors.js";
|
|
21
|
+
import { WearablesInputError } from "./wearables/errors.js"; import { respondMeetingsList, respondMeetingsGet, respondMeetingsBuild } from "./meetings/http-glue.js";
|
|
21
22
|
import { EngramMcpServer, MCP_SUPPORTED_PROTOCOL_VERSIONS } from "./access-mcp.js";
|
|
22
23
|
import { validateRequest, type SchemaName, type SchemaTypeFor } from "./access-schema.js";
|
|
23
24
|
import {
|
|
@@ -349,9 +350,7 @@ function decodeRelayMissionIdSegment(raw: string): string {
|
|
|
349
350
|
try {
|
|
350
351
|
return decodeURIComponent(raw);
|
|
351
352
|
} catch {
|
|
352
|
-
throw new EngramAccessInputError(
|
|
353
|
-
"missionId path segment is not valid percent-encoded input",
|
|
354
|
-
);
|
|
353
|
+
throw new EngramAccessInputError("missionId path segment is not valid percent-encoded input");
|
|
355
354
|
}
|
|
356
355
|
}
|
|
357
356
|
|
|
@@ -713,6 +712,13 @@ export class EngramAccessHttpServer {
|
|
|
713
712
|
return this.resolveRequestIdentity(req).principal;
|
|
714
713
|
}
|
|
715
714
|
|
|
715
|
+
/** Caller scope for wearables/meetings ops (issue #2123): request principal +
|
|
716
|
+
* gated namespace + optional sessionKey, so reads/writes resolve to the caller
|
|
717
|
+
* namespace instead of the machine default. */
|
|
718
|
+
private wearablesScope(req: IncomingMessage, namespace?: string, sessionKey?: string): WearablesMeetingsScope {
|
|
719
|
+
return { authenticatedPrincipal: this.resolveRequestPrincipal(req), namespace: this.resolveNamespace(req, namespace), ...(sessionKey ? { sessionKey } : {}) };
|
|
720
|
+
}
|
|
721
|
+
|
|
716
722
|
/** Resolve namespace: only use the explicit body value. Adapter-inferred namespace
|
|
717
723
|
* is intentionally NOT used as a fallback for REST requests — omitting namespace
|
|
718
724
|
* should default to the server's global namespace, not silently scope to an adapter. */
|
|
@@ -725,11 +731,7 @@ export class EngramAccessHttpServer {
|
|
|
725
731
|
// and the id-loaded contradiction routes — one rule, every surface. The
|
|
726
732
|
// effective namespace (explicit OR server default) must be a member; fail
|
|
727
733
|
// closed. No-op for unrestricted tokens (no namespaces allow-list).
|
|
728
|
-
enforceNamespaceAllowList(
|
|
729
|
-
tokenCapabilityStore.getStore(),
|
|
730
|
-
namespace,
|
|
731
|
-
this.service.configRef?.defaultNamespace,
|
|
732
|
-
);
|
|
734
|
+
enforceNamespaceAllowList(tokenCapabilityStore.getStore(), namespace, this.service.configRef?.defaultNamespace);
|
|
733
735
|
return namespace;
|
|
734
736
|
}
|
|
735
737
|
|
|
@@ -1351,11 +1353,7 @@ export class EngramAccessHttpServer {
|
|
|
1351
1353
|
req,
|
|
1352
1354
|
namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,
|
|
1353
1355
|
);
|
|
1354
|
-
const payload = await this.service.recallTierExplain(
|
|
1355
|
-
sessionKey,
|
|
1356
|
-
namespace,
|
|
1357
|
-
this.resolveRequestPrincipal(req),
|
|
1358
|
-
);
|
|
1356
|
+
const payload = await this.service.recallTierExplain(sessionKey, namespace, this.resolveRequestPrincipal(req));
|
|
1359
1357
|
this.respondJson(res, 200, payload);
|
|
1360
1358
|
return;
|
|
1361
1359
|
}
|
|
@@ -1493,7 +1491,7 @@ export class EngramAccessHttpServer {
|
|
|
1493
1491
|
(pathname === "/engram/v1/wearables/status" || pathname === "/remnic/v1/wearables/status")
|
|
1494
1492
|
) {
|
|
1495
1493
|
this.enforceTokenOp("wearables_status"); // boundary dispatch (issue #1525)
|
|
1496
|
-
this.respondJson(res, 200, await this.service.wearablesStatus());
|
|
1494
|
+
this.respondJson(res, 200, await this.service.wearablesStatus(this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined)));
|
|
1497
1495
|
return;
|
|
1498
1496
|
}
|
|
1499
1497
|
|
|
@@ -1524,12 +1522,7 @@ export class EngramAccessHttpServer {
|
|
|
1524
1522
|
);
|
|
1525
1523
|
}
|
|
1526
1524
|
try {
|
|
1527
|
-
const summaries = await this.service.wearablesSync({
|
|
1528
|
-
source,
|
|
1529
|
-
date,
|
|
1530
|
-
days,
|
|
1531
|
-
forceMemories: body.forceMemories === true,
|
|
1532
|
-
});
|
|
1525
|
+
const summaries = await this.service.wearablesSync({ source, date, days, forceMemories: body.forceMemories === true, ...this.wearablesScope(req, optionalQueryString(body.namespace, "namespace"), optionalQueryString(body.sessionKey, "sessionKey")) });
|
|
1533
1526
|
this.respondJson(res, 200, { summaries });
|
|
1534
1527
|
} catch (err) {
|
|
1535
1528
|
if (this.respondWearablesError(res, err)) return;
|
|
@@ -1551,10 +1544,7 @@ export class EngramAccessHttpServer {
|
|
|
1551
1544
|
}
|
|
1552
1545
|
const sourceParam = parsed.searchParams.get("source");
|
|
1553
1546
|
try {
|
|
1554
|
-
const transcripts = await this.service.wearablesTranscriptDay({
|
|
1555
|
-
date,
|
|
1556
|
-
source: sourceParam && sourceParam.length > 0 ? sourceParam : undefined,
|
|
1557
|
-
});
|
|
1547
|
+
const transcripts = await this.service.wearablesTranscriptDay({ date, source: sourceParam && sourceParam.length > 0 ? sourceParam : undefined, ...this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined) });
|
|
1558
1548
|
this.respondJson(res, 200, { transcripts });
|
|
1559
1549
|
} catch (err) {
|
|
1560
1550
|
if (this.respondWearablesError(res, err)) return;
|
|
@@ -1576,13 +1566,7 @@ export class EngramAccessHttpServer {
|
|
|
1576
1566
|
);
|
|
1577
1567
|
}
|
|
1578
1568
|
try {
|
|
1579
|
-
const results = await this.service.wearablesTranscriptSearch({
|
|
1580
|
-
query: queryParam,
|
|
1581
|
-
source: nonEmptyQueryParam(parsed.searchParams.get("source")),
|
|
1582
|
-
from: nonEmptyQueryParam(parsed.searchParams.get("from")),
|
|
1583
|
-
to: nonEmptyQueryParam(parsed.searchParams.get("to")),
|
|
1584
|
-
limit: positiveIntQueryParam(parsed.searchParams.get("limit"), "limit"),
|
|
1585
|
-
});
|
|
1569
|
+
const results = await this.service.wearablesTranscriptSearch({ query: queryParam, source: nonEmptyQueryParam(parsed.searchParams.get("source")), from: nonEmptyQueryParam(parsed.searchParams.get("from")), to: nonEmptyQueryParam(parsed.searchParams.get("to")), limit: positiveIntQueryParam(parsed.searchParams.get("limit"), "limit"), ...this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined) });
|
|
1586
1570
|
this.respondJson(res, 200, { results });
|
|
1587
1571
|
} catch (err) {
|
|
1588
1572
|
if (this.respondWearablesError(res, err)) return;
|
|
@@ -1597,11 +1581,7 @@ export class EngramAccessHttpServer {
|
|
|
1597
1581
|
) {
|
|
1598
1582
|
this.enforceTokenOp("transcript_memories"); // boundary dispatch (issue #1525)
|
|
1599
1583
|
try {
|
|
1600
|
-
const memories = await this.service.wearablesTranscriptMemories({
|
|
1601
|
-
source: nonEmptyQueryParam(parsed.searchParams.get("source")),
|
|
1602
|
-
date: nonEmptyQueryParam(parsed.searchParams.get("date")),
|
|
1603
|
-
limit: positiveIntQueryParam(parsed.searchParams.get("limit"), "limit"),
|
|
1604
|
-
});
|
|
1584
|
+
const memories = await this.service.wearablesTranscriptMemories({ source: nonEmptyQueryParam(parsed.searchParams.get("source")), date: nonEmptyQueryParam(parsed.searchParams.get("date")), limit: positiveIntQueryParam(parsed.searchParams.get("limit"), "limit"), ...this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined) });
|
|
1605
1585
|
this.respondJson(res, 200, { memories });
|
|
1606
1586
|
} catch (err) {
|
|
1607
1587
|
if (this.respondWearablesError(res, err)) return;
|
|
@@ -1610,6 +1590,15 @@ export class EngramAccessHttpServer {
|
|
|
1610
1590
|
return;
|
|
1611
1591
|
}
|
|
1612
1592
|
|
|
1593
|
+
if (req.method === "GET" && (pathname === "/engram/v1/meetings" || pathname === "/remnic/v1/meetings")) {
|
|
1594
|
+
this.enforceTokenOp("meetings_list"); await respondMeetingsList(res, this.respondJson.bind(this), this.service, nonEmptyQueryParam(parsed.searchParams.get("date")), this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined)); return; }
|
|
1595
|
+
if (req.method === "POST" && (pathname === "/engram/v1/meetings/build" || pathname === "/remnic/v1/meetings/build")) {
|
|
1596
|
+
this.enforceTokenOp("meetings_build"); await respondMeetingsBuild(req, res, this.respondJson.bind(this), this.readJsonBody.bind(this), this.service, { enforceQuota: () => this.ensureWriteRateLimitAvailable(req), recordHit: () => this.recordWriteRateLimitHit(req) }, (ns, sk) => this.wearablesScope(req, ns, sk)); return; }
|
|
1597
|
+
const meetingGetEngram = /^\/engram\/v1\/meetings\/([^/]+)$/.exec(pathname);
|
|
1598
|
+
if (req.method === "GET" && meetingGetEngram) { this.enforceTokenOp("meetings_get"); await respondMeetingsGet(res, this.respondJson.bind(this), this.service, meetingGetEngram[1] ?? "", this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined)); return; }
|
|
1599
|
+
const meetingGetRemnic = /^\/remnic\/v1\/meetings\/([^/]+)$/.exec(pathname);
|
|
1600
|
+
if (req.method === "GET" && meetingGetRemnic) { this.enforceTokenOp("meetings_get"); await respondMeetingsGet(res, this.respondJson.bind(this), this.service, meetingGetRemnic[1] ?? "", this.wearablesScope(req, parsed.searchParams.get("namespace") ?? undefined, parsed.searchParams.get("sessionKey") ?? undefined)); return; }
|
|
1601
|
+
|
|
1613
1602
|
if (req.method === "POST" && pathname === "/engram/v1/observe") {
|
|
1614
1603
|
this.enforceTokenOp("observe"); // boundary dispatch (issue #1525)
|
|
1615
1604
|
const body = await this.readValidatedBody(req, "observe");
|
|
@@ -3224,6 +3213,7 @@ export class EngramAccessHttpServer {
|
|
|
3224
3213
|
toolName === "remnic.capsule_export" ||
|
|
3225
3214
|
toolName === "engram.capsule_import" ||
|
|
3226
3215
|
toolName === "remnic.capsule_import" ||
|
|
3216
|
+
toolName === "engram.entity_synthesis_run" || toolName === "remnic.entity_synthesis_run" ||
|
|
3227
3217
|
(
|
|
3228
3218
|
!dreamsRunDryRun &&
|
|
3229
3219
|
(toolName === "engram.dreams_run" || toolName === "remnic.dreams_run")
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool-listing entries for the admin/maintenance operation surface
|
|
3
|
+
* (capsules, governance, entity synthesis, procedure mining, pattern
|
|
4
|
+
* reinforcement, procedural stats). Extracted from access-mcp.ts (#2136)
|
|
5
|
+
* to keep the transport file under its structural-ratchet ceiling; the
|
|
6
|
+
* dispatch name map and operation handlers stay in their existing homes.
|
|
7
|
+
*/
|
|
8
|
+
/** Git-context schema props accepted-and-ignored by every tool (issue #569
|
|
9
|
+
* compatibility surface) — defined here so the tool tables and the transport
|
|
10
|
+
* share one copy without an import cycle. */
|
|
11
|
+
export const MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED: Record<string, unknown> = {
|
|
12
|
+
cwd: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Accepted for MCP client compatibility (git-context auto-injection); ignored by this tool.",
|
|
15
|
+
},
|
|
16
|
+
projectTag: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Accepted for MCP client compatibility; ignored by this tool.",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const MCP_ADMIN_OPS_TOOLS: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
inputSchema: Record<string, unknown>;
|
|
26
|
+
}> = [
|
|
27
|
+
{
|
|
28
|
+
name: "engram.capsule_export",
|
|
29
|
+
description: "Export a portable Remnic capsule archive from the namespace-scoped memory store.",
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: "object",
|
|
32
|
+
properties: {
|
|
33
|
+
name: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Capsule id (alphanumeric with single dashes, max 64 characters).",
|
|
36
|
+
},
|
|
37
|
+
namespace: { type: "string" },
|
|
38
|
+
since: {
|
|
39
|
+
type: "string",
|
|
40
|
+
description: "Only include files modified on or after this ISO 8601 timestamp.",
|
|
41
|
+
},
|
|
42
|
+
includeKinds: {
|
|
43
|
+
type: "array",
|
|
44
|
+
items: { type: "string" },
|
|
45
|
+
description: "Optional top-level directory allow-list.",
|
|
46
|
+
},
|
|
47
|
+
peerIds: {
|
|
48
|
+
type: "array",
|
|
49
|
+
items: { type: "string" },
|
|
50
|
+
description: "Optional peer id allow-list for the peers/ subtree.",
|
|
51
|
+
},
|
|
52
|
+
includeTranscripts: { type: "boolean" },
|
|
53
|
+
encrypt: { type: "boolean" },
|
|
54
|
+
...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
|
|
55
|
+
},
|
|
56
|
+
required: ["name"],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "engram.capsule_import",
|
|
62
|
+
description: "Import a Remnic capsule archive into the namespace-scoped memory store.",
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: "object",
|
|
65
|
+
properties: {
|
|
66
|
+
archivePath: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Path to a .capsule.json.gz or .capsule.json.gz.enc archive.",
|
|
69
|
+
},
|
|
70
|
+
namespace: { type: "string" },
|
|
71
|
+
mode: {
|
|
72
|
+
type: "string",
|
|
73
|
+
enum: ["skip", "overwrite", "fork"],
|
|
74
|
+
description: "Conflict handling mode. Defaults to skip.",
|
|
75
|
+
},
|
|
76
|
+
passphrase: {
|
|
77
|
+
type: "string",
|
|
78
|
+
description: "Passphrase for encrypted capsule archives.",
|
|
79
|
+
},
|
|
80
|
+
...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
|
|
81
|
+
},
|
|
82
|
+
required: ["archivePath"],
|
|
83
|
+
additionalProperties: false,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "engram.capsule_list",
|
|
88
|
+
description: "List capsule archives in the namespace-scoped capsule store.",
|
|
89
|
+
inputSchema: {
|
|
90
|
+
type: "object",
|
|
91
|
+
properties: {
|
|
92
|
+
namespace: { type: "string" },
|
|
93
|
+
sessionKey: {
|
|
94
|
+
type: "string",
|
|
95
|
+
description:
|
|
96
|
+
"Optional session key used to derive namespace principal when no trusted transport principal is present.",
|
|
97
|
+
},
|
|
98
|
+
...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
|
|
99
|
+
},
|
|
100
|
+
additionalProperties: false,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "engram.memory_governance_run",
|
|
105
|
+
description: "Run Remnic memory governance in a bounded shadow/apply pass.",
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
namespace: { type: "string" },
|
|
110
|
+
mode: { type: "string", enum: ["shadow", "apply"] },
|
|
111
|
+
recentDays: { type: "number" },
|
|
112
|
+
maxMemories: { type: "number" },
|
|
113
|
+
batchSize: { type: "number" },
|
|
114
|
+
},
|
|
115
|
+
additionalProperties: false,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "engram.entity_synthesis_run",
|
|
120
|
+
description:
|
|
121
|
+
"Bulk-drain the entity synthesis queue (issue #2136). Processes up to maxEntities (default 25, max 200) queued entity names into canonical syntheses; loop until processed < requested to drain fully.",
|
|
122
|
+
inputSchema: {
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
namespace: { type: "string" },
|
|
126
|
+
maxEntities: { type: "number" },
|
|
127
|
+
},
|
|
128
|
+
additionalProperties: false,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "engram.procedure_mining_run",
|
|
133
|
+
description:
|
|
134
|
+
"Run procedural memory mining from causal trajectories (issue #519). Respects procedural.enabled; writes under procedures/ when clusters qualify.",
|
|
135
|
+
inputSchema: {
|
|
136
|
+
type: "object",
|
|
137
|
+
properties: {
|
|
138
|
+
namespace: { type: "string" },
|
|
139
|
+
},
|
|
140
|
+
additionalProperties: false,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "engram.pattern_reinforcement_run",
|
|
145
|
+
description:
|
|
146
|
+
"Run the pattern-reinforcement maintenance job (issue #687 PR 2/4). Clusters duplicate non-procedural memories by normalized content, promotes the most-recent member to canonical, and supersedes the older duplicates. Gated on patternReinforcementEnabled and the patternReinforcementCadenceMs floor — pass force=true to bypass the cadence for an ad-hoc operator run.",
|
|
147
|
+
inputSchema: {
|
|
148
|
+
type: "object",
|
|
149
|
+
properties: {
|
|
150
|
+
namespace: { type: "string" },
|
|
151
|
+
force: { type: "boolean" },
|
|
152
|
+
},
|
|
153
|
+
additionalProperties: false,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
// The canonical `remnic.procedural_stats` alias is added automatically
|
|
158
|
+
// by `withToolAliases` — the dual-naming invariant keeps both names
|
|
159
|
+
// alive for the legacy surface.
|
|
160
|
+
name: "engram.procedural_stats",
|
|
161
|
+
description:
|
|
162
|
+
"Procedural memory stats (issue #567): counts by status, recent write activity, and the active procedural.* config. Read-only, namespace-scoped.",
|
|
163
|
+
inputSchema: {
|
|
164
|
+
type: "object",
|
|
165
|
+
properties: {
|
|
166
|
+
namespace: { type: "string" },
|
|
167
|
+
},
|
|
168
|
+
additionalProperties: false,
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
];
|
|
@@ -56,6 +56,16 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
|
|
|
56
56
|
transcript_day: T_ARRAY,
|
|
57
57
|
transcript_search: T_ARRAY,
|
|
58
58
|
transcript_memories: T_ARRAY,
|
|
59
|
+
meetings_list: objectSchema({ enabled: T_BOOLEAN, days: T_ARRAY }),
|
|
60
|
+
meetings_get: objectSchema({ enabled: T_BOOLEAN, found: T_BOOLEAN, id: T_STRING, record: T_NULLABLE_STRING }),
|
|
61
|
+
meetings_build: objectSchema({
|
|
62
|
+
date: T_STRING,
|
|
63
|
+
enabled: T_BOOLEAN,
|
|
64
|
+
meetings: T_ARRAY,
|
|
65
|
+
built: T_NUMBER,
|
|
66
|
+
skipped: T_NUMBER,
|
|
67
|
+
removed: T_ARRAY,
|
|
68
|
+
}),
|
|
59
69
|
action_confidence: objectSchema({
|
|
60
70
|
schemaVersion: T_NUMBER,
|
|
61
71
|
decision: T_STRING,
|
|
@@ -85,6 +95,12 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
|
|
|
85
95
|
}),
|
|
86
96
|
capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),
|
|
87
97
|
capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),
|
|
98
|
+
entity_synthesis_run: objectSchema({
|
|
99
|
+
namespace: T_STRING,
|
|
100
|
+
requested: T_NUMBER,
|
|
101
|
+
processed: T_NUMBER,
|
|
102
|
+
remaining: T_NUMBER,
|
|
103
|
+
}),
|
|
88
104
|
memory_governance_run: objectSchema({
|
|
89
105
|
namespace: T_STRING,
|
|
90
106
|
runId: T_STRING,
|