@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.
Files changed (422) hide show
  1. package/dist/access-admin-ops-surface.d.ts +32 -12
  2. package/dist/access-admin-ops-surface.js +44 -43
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +13 -10
  5. package/dist/access-boundary.js +44 -43
  6. package/dist/access-cli.js +125 -122
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +16 -9
  9. package/dist/access-http.js +56 -54
  10. package/dist/access-identity-continuity-surface.d.ts +9 -7
  11. package/dist/access-identity-continuity-surface.js +44 -43
  12. package/dist/access-lcm-surface.d.ts +12 -9
  13. package/dist/access-lcm-surface.js +44 -43
  14. package/dist/access-mcp-admin-tools.d.ts +18 -0
  15. package/dist/access-mcp-admin-tools.js +10 -0
  16. package/dist/access-mcp-admin-tools.js.map +1 -0
  17. package/dist/access-mcp-output-schemas.js +1 -1
  18. package/dist/access-mcp.d.ts +22 -10
  19. package/dist/access-mcp.js +52 -50
  20. package/dist/access-memory-search-fanout.d.ts +2 -2
  21. package/dist/{access-namespace-preflight-tmwQgCT6.d.ts → access-namespace-preflight-CmErR03h.d.ts} +1 -1
  22. package/dist/access-namespace-preflight.d.ts +3 -3
  23. package/dist/access-namespace-preflight.js +44 -43
  24. package/dist/access-observe-write-surface.d.ts +12 -9
  25. package/dist/access-observe-write-surface.js +44 -43
  26. package/dist/access-operations-batch.js +46 -45
  27. package/dist/access-operations.d.ts +16 -13
  28. package/dist/access-operations.js +48 -47
  29. package/dist/access-recall-concurrency.d.ts +12 -9
  30. package/dist/access-recall-concurrency.js +44 -43
  31. package/dist/access-recall-response.d.ts +12 -9
  32. package/dist/access-recall-response.js +44 -43
  33. package/dist/access-recall-surface.d.ts +14 -11
  34. package/dist/access-recall-surface.js +44 -43
  35. package/dist/access-schema.d.ts +76 -76
  36. package/dist/{access-service-BqUii7LY.d.ts → access-service-CKEROeFP.d.ts} +32 -11
  37. package/dist/access-service.d.ts +13 -10
  38. package/dist/access-service.js +46 -45
  39. package/dist/access-surface-catalog.d.ts +12 -9
  40. package/dist/access-surface-catalog.js +7 -0
  41. package/dist/access-surface-catalog.js.map +1 -1
  42. package/dist/access-wearables-meetings-surface.d.ts +78 -0
  43. package/dist/access-wearables-meetings-surface.js +22 -0
  44. package/dist/access-wearables-meetings-surface.js.map +1 -0
  45. package/dist/action-confidence.d.ts +1 -1
  46. package/dist/active-memory-bridge.d.ts +1 -1
  47. package/dist/active-recall.d.ts +1 -1
  48. package/dist/active-recall.js +7 -7
  49. package/dist/adapters/index.js +4 -4
  50. package/dist/adapters/registry.js +2 -2
  51. package/dist/{auto-sync-UPTUVE4X.js → auto-sync-5OE5QOZB.js} +4 -4
  52. package/dist/behavior-learner.d.ts +1 -1
  53. package/dist/behavior-signals.d.ts +1 -1
  54. package/dist/bootstrap.d.ts +9 -7
  55. package/dist/briefing.d.ts +2 -2
  56. package/dist/briefing.js +11 -11
  57. package/dist/buffer-surprise-report.d.ts +1 -1
  58. package/dist/buffer.d.ts +2 -2
  59. package/dist/bulk-import/index.d.ts +3 -3
  60. package/dist/calibration.d.ts +1 -1
  61. package/dist/capabilities.d.ts +1 -1
  62. package/dist/{catalog-iWvWz61I.d.ts → catalog-BFTVo2Ez.d.ts} +1 -1
  63. package/dist/causal-behavior.d.ts +1 -1
  64. package/dist/causal-behavior.js +2 -2
  65. package/dist/causal-chain.js +2 -2
  66. package/dist/causal-consolidation.d.ts +1 -1
  67. package/dist/causal-consolidation.js +15 -15
  68. package/dist/causal-retrieval.js +2 -2
  69. package/dist/causal-trajectory-graph.d.ts +1 -1
  70. package/dist/causal-trajectory.js +1 -1
  71. package/dist/{chunk-Z54EM5YZ.js → chunk-2PHX3I5C.js} +10 -10
  72. package/dist/{chunk-JFDEYXF7.js → chunk-3NAHZQU3.js} +2 -2
  73. package/dist/{chunk-MJYYXODM.js → chunk-3UOSVTFR.js} +8 -8
  74. package/dist/{chunk-HPOY2PHQ.js → chunk-3ZW6ZQO6.js} +6 -6
  75. package/dist/{chunk-UV72DEZD.js → chunk-4B77XSG5.js} +5 -5
  76. package/dist/chunk-56BSXSHC.js +158 -0
  77. package/dist/chunk-56BSXSHC.js.map +1 -0
  78. package/dist/{chunk-IC2TCZJ2.js → chunk-57QKLRBV.js} +3 -1
  79. package/dist/chunk-57QKLRBV.js.map +1 -0
  80. package/dist/{chunk-LMHDFOVV.js → chunk-5CPI2QWG.js} +3 -3
  81. package/dist/{chunk-3ZUY2VQF.js → chunk-5FZQ74K5.js} +2 -2
  82. package/dist/{chunk-B7C3TF5H.js → chunk-6TWXQ4E2.js} +5 -5
  83. package/dist/{chunk-JN3IUA2Q.js → chunk-7I7AYIUQ.js} +3 -3
  84. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  85. package/dist/{chunk-MONWCSVL.js → chunk-7RAJ3GXO.js} +2 -1
  86. package/dist/chunk-7RAJ3GXO.js.map +1 -0
  87. package/dist/{chunk-SQEDDWAM.js → chunk-A2RFKL3V.js} +5 -34
  88. package/dist/chunk-A2RFKL3V.js.map +1 -0
  89. package/dist/{chunk-5JQLAQUZ.js → chunk-ATEAL5EI.js} +6 -6
  90. package/dist/{chunk-4PYLBXX6.js → chunk-AYAROCWD.js} +2 -2
  91. package/dist/chunk-BLDBT6HZ.js +39 -0
  92. package/dist/chunk-BLDBT6HZ.js.map +1 -0
  93. package/dist/{chunk-EXU5IQ3S.js → chunk-CUUY5CC4.js} +6 -6
  94. package/dist/{chunk-X5QS5C2O.js → chunk-E3ZMFFQZ.js} +2 -2
  95. package/dist/{chunk-JWMYVQAM.js → chunk-ES5IHQ6M.js} +2 -2
  96. package/dist/{chunk-HJEEAO4O.js → chunk-G2NSSQES.js} +2 -2
  97. package/dist/{chunk-QO2KODU6.js → chunk-GD3QOBMB.js} +2 -2
  98. package/dist/{chunk-62QM5MKY.js → chunk-IIXLB5E7.js} +118 -62
  99. package/dist/chunk-IIXLB5E7.js.map +1 -0
  100. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  101. package/dist/{chunk-Q3FWRDCP.js → chunk-JNIJBXVK.js} +2 -2
  102. package/dist/{chunk-EILX7SQR.js → chunk-JVGUY2AU.js} +27 -16
  103. package/dist/chunk-JVGUY2AU.js.map +1 -0
  104. package/dist/{chunk-N7EVMKP6.js → chunk-KNRG6ZGJ.js} +11 -11
  105. package/dist/{chunk-GEUDRENF.js → chunk-MMTG3SCJ.js} +2 -2
  106. package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
  107. package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
  108. package/dist/{chunk-TCZWBJBO.js → chunk-OUW4PAY4.js} +199 -256
  109. package/dist/chunk-OUW4PAY4.js.map +1 -0
  110. package/dist/{chunk-275ENJDK.js → chunk-P2BLHUL2.js} +2 -2
  111. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  112. package/dist/{chunk-V5TSUGRB.js → chunk-QCKQEBIY.js} +17 -9
  113. package/dist/chunk-QCKQEBIY.js.map +1 -0
  114. package/dist/{chunk-EZKKHVFY.js → chunk-QE63OHLB.js} +2 -2
  115. package/dist/{chunk-ONHRRJZM.js → chunk-QJAQNXWI.js} +6 -6
  116. package/dist/{chunk-KHRKEELC.js → chunk-ROUL7RZU.js} +395 -69
  117. package/dist/chunk-ROUL7RZU.js.map +1 -0
  118. package/dist/{chunk-AT3TDN6O.js → chunk-RT4TSR2C.js} +8953 -8645
  119. package/dist/chunk-RT4TSR2C.js.map +1 -0
  120. package/dist/{chunk-6NZ7U4R4.js → chunk-SCOT5DTA.js} +1 -1
  121. package/dist/chunk-SCOT5DTA.js.map +1 -0
  122. package/dist/{chunk-LI4ZOFHW.js → chunk-SVZGA2MK.js} +2 -2
  123. package/dist/chunk-SYOIVK7K.js +63 -0
  124. package/dist/chunk-SYOIVK7K.js.map +1 -0
  125. package/dist/{chunk-5RUE3GHQ.js → chunk-TWCOYET2.js} +17 -1
  126. package/dist/chunk-TWCOYET2.js.map +1 -0
  127. package/dist/{chunk-5IXPWEQB.js → chunk-WS32QRLO.js} +113 -48
  128. package/dist/chunk-WS32QRLO.js.map +1 -0
  129. package/dist/{chunk-53WDAG7X.js → chunk-WWZ35GWW.js} +5 -5
  130. package/dist/{chunk-4F6AANKS.js → chunk-XWPFZX6S.js} +507 -143
  131. package/dist/chunk-XWPFZX6S.js.map +1 -0
  132. package/dist/{chunk-SB4OKS6C.js → chunk-ZN4UZWMT.js} +2 -2
  133. package/dist/{chunk-7M6APKJL.js → chunk-ZYU7ZFLT.js} +2 -2
  134. package/dist/{cli-DPEhq0Cp.d.ts → cli-BrwT9YMD.d.ts} +5 -5
  135. package/dist/cli.d.ts +14 -11
  136. package/dist/cli.js +86 -84
  137. package/dist/compounding/engine.d.ts +2 -2
  138. package/dist/compounding/engine.js +11 -11
  139. package/dist/compounding/preference-consolidator.d.ts +1 -1
  140. package/dist/compression-optimizer.d.ts +1 -1
  141. package/dist/config.d.ts +1 -1
  142. package/dist/config.js +4 -4
  143. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  144. package/dist/connectors/codex-materialize-runner.js +11 -11
  145. package/dist/connectors/codex-materialize.d.ts +1 -1
  146. package/dist/connectors/index.d.ts +1 -1
  147. package/dist/connectors/index.js +12 -12
  148. package/dist/consolidation-provenance-check.d.ts +2 -2
  149. package/dist/consolidation-undo.d.ts +2 -2
  150. package/dist/contradiction/index.d.ts +2 -2
  151. package/dist/contradiction/index.js +1 -1
  152. package/dist/conversation-index/backend.d.ts +1 -1
  153. package/dist/conversation-index/chunker.d.ts +1 -1
  154. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  155. package/dist/conversation-index/indexer.d.ts +1 -1
  156. package/dist/conversation-index/search.d.ts +1 -1
  157. package/dist/day-summary.d.ts +1 -1
  158. package/dist/delinearize.d.ts +1 -1
  159. package/dist/direct-answer-wiring.d.ts +1 -1
  160. package/dist/direct-answer.d.ts +1 -1
  161. package/dist/embedding-fallback.d.ts +1 -1
  162. package/dist/enrichment/index.d.ts +1 -1
  163. package/dist/entity-retrieval.d.ts +2 -2
  164. package/dist/entity-retrieval.js +11 -11
  165. package/dist/entity-schema.d.ts +1 -1
  166. package/dist/explicit-capture.d.ts +9 -7
  167. package/dist/explicit-capture.js +1 -1
  168. package/dist/extraction-error-classification.d.ts +22 -0
  169. package/dist/extraction-error-classification.js +11 -0
  170. package/dist/extraction-error-classification.js.map +1 -0
  171. package/dist/extraction-faithfulness.d.ts +1 -1
  172. package/dist/extraction-judge-telemetry.d.ts +1 -1
  173. package/dist/extraction-judge-training.d.ts +1 -1
  174. package/dist/extraction-judge.d.ts +1 -1
  175. package/dist/extraction.d.ts +3 -17
  176. package/dist/extraction.js +5 -3
  177. package/dist/fallback-llm.d.ts +1 -1
  178. package/dist/{first-start-migration-LEXL3XYL.js → first-start-migration-BKNGOFED.js} +4 -4
  179. package/dist/graph-dashboard-diff.d.ts +1 -1
  180. package/dist/graph-dashboard-key.d.ts +1 -1
  181. package/dist/graph-dashboard-parser.d.ts +1 -1
  182. package/dist/graph-edge-reinforcement.d.ts +1 -1
  183. package/dist/graph-snapshot.d.ts +1 -1
  184. package/dist/graph.d.ts +1 -1
  185. package/dist/importance.d.ts +1 -1
  186. package/dist/importers/index.d.ts +1 -1
  187. package/dist/in-flight-reads.d.ts +1 -1
  188. package/dist/index.d.ts +713 -923
  189. package/dist/index.js +249 -212
  190. package/dist/intent.d.ts +1 -1
  191. package/dist/lcm/engine.d.ts +1 -1
  192. package/dist/lcm/engine.js +4 -4
  193. package/dist/lcm/index.d.ts +1 -1
  194. package/dist/lcm/index.js +13 -13
  195. package/dist/lcm/tools.d.ts +1 -1
  196. package/dist/lifecycle.d.ts +1 -1
  197. package/dist/live-connectors-runner.d.ts +1 -1
  198. package/dist/local-llm.d.ts +1 -1
  199. package/dist/local-model-endpoint.d.ts +1 -1
  200. package/dist/maintenance/memory-governance.d.ts +1 -1
  201. package/dist/maintenance/memory-governance.js +12 -12
  202. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  203. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -11
  204. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  205. package/dist/maintenance/rebuild-memory-projection.js +13 -13
  206. package/dist/maintenance-C98njYb8.d.ts +366 -0
  207. package/dist/mcp-memory-inspector-app.d.ts +12 -9
  208. package/dist/mcp-read-only-tools.js +1 -1
  209. package/dist/memory-action-policy.d.ts +1 -1
  210. package/dist/memory-cache.d.ts +1 -1
  211. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  212. package/dist/memory-projection-store.d.ts +1 -1
  213. package/dist/memory-provenance.d.ts +1 -1
  214. package/dist/memory-worth-outcomes.d.ts +2 -2
  215. package/dist/models-json.d.ts +1 -1
  216. package/dist/namespaces/migrate.d.ts +3 -3
  217. package/dist/namespaces/migrate.js +19 -19
  218. package/dist/namespaces/principal.d.ts +1 -1
  219. package/dist/namespaces/search.d.ts +1 -1
  220. package/dist/namespaces/search.js +7 -7
  221. package/dist/namespaces/storage.d.ts +3 -3
  222. package/dist/namespaces/storage.js +11 -11
  223. package/dist/native-knowledge.d.ts +1 -1
  224. package/dist/offline-sync-impression-drain.d.ts +1 -1
  225. package/dist/offline-sync-impression-drain.js +1 -1
  226. package/dist/operator-toolkit.d.ts +2 -2
  227. package/dist/operator-toolkit.js +28 -28
  228. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  229. package/dist/orchestration/maintenance.d.ts +6 -223
  230. package/dist/orchestration/maintenance.js +19 -19
  231. package/dist/{orchestrator-DB93S48I.d.ts → orchestrator-C9ZVppNh.d.ts} +12 -481
  232. package/dist/orchestrator.d.ts +10 -8
  233. package/dist/orchestrator.js +122 -119
  234. package/dist/patterns-cli.d.ts +1 -1
  235. package/dist/{pipeline-DmGc-H66.d.ts → pipeline-id_-sqYm.d.ts} +1 -1
  236. package/dist/policy-runtime.d.ts +1 -1
  237. package/dist/proactive-contention.d.ts +1 -1
  238. package/dist/provenance.d.ts +1 -1
  239. package/dist/{qmd-cJT0crkF.d.ts → qmd-R6XaQOZK.d.ts} +1 -1
  240. package/dist/qmd-preflight.d.ts +2 -2
  241. package/dist/qmd-recall-cache.d.ts +1 -1
  242. package/dist/qmd.d.ts +2 -2
  243. package/dist/qmd.js +4 -4
  244. package/dist/recall-concurrency-config.d.ts +1 -1
  245. package/dist/recall-disclosure-escalation.d.ts +1 -1
  246. package/dist/recall-explain-renderer.d.ts +1 -1
  247. package/dist/recall-explain-renderer.js +3 -3
  248. package/dist/recall-memory-map.d.ts +1 -1
  249. package/dist/recall-planner-llm.d.ts +1 -1
  250. package/dist/recall-state.d.ts +1 -1
  251. package/dist/recall-tag-filter.d.ts +1 -1
  252. package/dist/recall-timings.d.ts +1 -1
  253. package/dist/recall-xray-cli.d.ts +1 -1
  254. package/dist/recall-xray-cli.js +4 -4
  255. package/dist/recall-xray-renderer.d.ts +1 -1
  256. package/dist/recall-xray-renderer.js +3 -3
  257. package/dist/recall-xray.d.ts +1 -1
  258. package/dist/recall-xray.js +2 -2
  259. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  260. package/dist/replay/normalizers/claude.d.ts +1 -1
  261. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  262. package/dist/replay/normalizers/shared.d.ts +1 -1
  263. package/dist/replay/runner.d.ts +1 -1
  264. package/dist/replay/types.d.ts +1 -1
  265. package/dist/resolution-3K27T4VO.js +1 -1
  266. package/dist/resolve-auth-token.d.ts +1 -1
  267. package/dist/resume-bundles.js +6 -6
  268. package/dist/retrieval-agents.d.ts +2 -2
  269. package/dist/retrieval-tiers.d.ts +1 -1
  270. package/dist/routing/engine.d.ts +1 -1
  271. package/dist/routing/store.d.ts +1 -1
  272. package/dist/salvage-envelope.d.ts +1 -1
  273. package/dist/salvage-envelope.js +1 -1
  274. package/dist/schemas.d.ts +76 -76
  275. package/dist/{scope-profiles-KG2nODX7.d.ts → scope-profiles-EhyuAKkd.d.ts} +1 -1
  276. package/dist/search/embed-helper.d.ts +1 -1
  277. package/dist/search/factory.d.ts +1 -1
  278. package/dist/search/factory.js +6 -6
  279. package/dist/search/index.d.ts +1 -1
  280. package/dist/search/index.js +12 -12
  281. package/dist/search/lancedb-backend.d.ts +1 -1
  282. package/dist/search/meilisearch-backend.d.ts +1 -1
  283. package/dist/search/noop-backend.d.ts +1 -1
  284. package/dist/search/orama-backend.d.ts +1 -1
  285. package/dist/search/port.d.ts +1 -1
  286. package/dist/search/remote-backend.d.ts +1 -1
  287. package/dist/{semantic-consolidation-BaZlg0D8.d.ts → semantic-consolidation-B2xo26UQ.d.ts} +1 -1
  288. package/dist/semantic-consolidation.d.ts +2 -2
  289. package/dist/semantic-consolidation.js +13 -13
  290. package/dist/semantic-rule-promotion.js +11 -11
  291. package/dist/semantic-rule-verifier.d.ts +1 -1
  292. package/dist/semantic-rule-verifier.js +12 -12
  293. package/dist/service-DgFWlZ-r.d.ts +835 -0
  294. package/dist/session-observer-bands.d.ts +1 -1
  295. package/dist/session-observer-state.d.ts +1 -1
  296. package/dist/shared-context/manager.d.ts +9 -9
  297. package/dist/signal.d.ts +1 -1
  298. package/dist/{storage-BKhHHnRo.d.ts → storage-XGawwqXE.d.ts} +131 -2
  299. package/dist/storage.d.ts +2 -2
  300. package/dist/storage.js +10 -10
  301. package/dist/summarizer.d.ts +1 -1
  302. package/dist/summary-snapshot.d.ts +1 -1
  303. package/dist/temporal-supersession.d.ts +2 -2
  304. package/dist/temporal-timeline-recall.d.ts +1 -1
  305. package/dist/temporal-validity.d.ts +1 -1
  306. package/dist/threading.d.ts +1 -1
  307. package/dist/tier-migration.d.ts +2 -2
  308. package/dist/tier-routing.d.ts +1 -1
  309. package/dist/topics.d.ts +1 -1
  310. package/dist/transcript.d.ts +1 -1
  311. package/dist/transfer/import-sqlite.js +2 -2
  312. package/dist/transfer/types.d.ts +66 -66
  313. package/dist/trust-score-stage.d.ts +1 -1
  314. package/dist/trust-score.d.ts +1 -1
  315. package/dist/{types-GBQZuT7l.d.ts → types-Bbs0qz6b.d.ts} +2 -3
  316. package/dist/types.d.ts +1 -1
  317. package/dist/types.js +1 -1
  318. package/dist/utility-runtime.d.ts +1 -1
  319. package/dist/verified-recall.js +12 -12
  320. package/dist/write-envelope.d.ts +1 -1
  321. package/dist/write-envelope.js +1 -1
  322. package/package.json +2 -2
  323. package/src/access-admin-ops-surface.ts +47 -0
  324. package/src/access-boundary.ts +4 -0
  325. package/src/access-http.test.ts +63 -0
  326. package/src/access-http.ts +27 -37
  327. package/src/access-mcp-admin-tools.ts +171 -0
  328. package/src/access-mcp-output-schemas.ts +16 -0
  329. package/src/access-mcp.ts +10 -262
  330. package/src/access-operations-batch.ts +11 -5
  331. package/src/access-service.ts +59 -46
  332. package/src/access-surface-catalog.ts +7 -0
  333. package/src/access-wearables-meetings-surface.ts +139 -0
  334. package/src/activity/digest.ts +1 -1
  335. package/src/activity/runner.test.ts +37 -0
  336. package/src/activity/runner.ts +12 -0
  337. package/src/activity/scheduler.test.ts +1 -0
  338. package/src/activity/sync-registration.ts +13 -0
  339. package/src/cli/meetings-commands.ts +70 -0
  340. package/src/cli.ts +7 -6
  341. package/src/extraction-error-classification.ts +52 -0
  342. package/src/extraction.ts +2 -50
  343. package/src/mcp-read-only-tools.ts +2 -0
  344. package/src/meetings/build-memory.test.ts +364 -0
  345. package/src/meetings/build-scheduler.test.ts +55 -0
  346. package/src/meetings/build-scheduler.ts +96 -0
  347. package/src/meetings/day-source.test.ts +275 -0
  348. package/src/meetings/day-source.ts +352 -0
  349. package/src/meetings/http-glue.ts +126 -0
  350. package/src/meetings/index.ts +5 -4
  351. package/src/meetings/manual-sync-flush.test.ts +72 -0
  352. package/src/meetings/mcp-tools.ts +65 -0
  353. package/src/meetings/memory-gen.test.ts +498 -0
  354. package/src/meetings/memory-gen.ts +549 -0
  355. package/src/meetings/memory-generator.ts +5 -0
  356. package/src/meetings/namespace-isolation.test.ts +159 -0
  357. package/src/meetings/service.test.ts +195 -0
  358. package/src/meetings/service.ts +157 -0
  359. package/src/meetings/summary-extractor.test.ts +287 -0
  360. package/src/meetings/summary-extractor.ts +264 -0
  361. package/src/orchestration/maintenance.ts +8 -0
  362. package/src/orchestration/orchestrator-init.ts +6 -1
  363. package/src/orchestration/workspace-ops.ts +172 -8
  364. package/src/orchestrator.ts +12 -13
  365. package/src/storage.ts +21 -0
  366. package/src/testing/subjects/meetings-namespace-harness.ts +159 -0
  367. package/src/testing/subjects/meetings-namespace.test.ts +93 -0
  368. package/src/types.ts +1 -2
  369. package/src/wearables/cli.ts +2 -1
  370. package/src/wearables/index.ts +1 -0
  371. package/src/wearables/mcp-tools.ts +143 -0
  372. package/src/wearables/registry.test.ts +11 -0
  373. package/src/wearables/registry.ts +13 -0
  374. package/src/wearables/service.test.ts +62 -1
  375. package/src/wearables/service.ts +30 -2
  376. package/src/wearables/transcript-search-namespace-isolation.test.ts +98 -0
  377. package/dist/chunk-4F6AANKS.js.map +0 -1
  378. package/dist/chunk-5IXPWEQB.js.map +0 -1
  379. package/dist/chunk-5RUE3GHQ.js.map +0 -1
  380. package/dist/chunk-62QM5MKY.js.map +0 -1
  381. package/dist/chunk-6NZ7U4R4.js.map +0 -1
  382. package/dist/chunk-AT3TDN6O.js.map +0 -1
  383. package/dist/chunk-EILX7SQR.js.map +0 -1
  384. package/dist/chunk-IC2TCZJ2.js.map +0 -1
  385. package/dist/chunk-KHRKEELC.js.map +0 -1
  386. package/dist/chunk-MONWCSVL.js.map +0 -1
  387. package/dist/chunk-SQEDDWAM.js.map +0 -1
  388. package/dist/chunk-TCZWBJBO.js.map +0 -1
  389. package/dist/chunk-V5TSUGRB.js.map +0 -1
  390. /package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-5OE5QOZB.js.map} +0 -0
  391. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-2PHX3I5C.js.map} +0 -0
  392. /package/dist/{chunk-JFDEYXF7.js.map → chunk-3NAHZQU3.js.map} +0 -0
  393. /package/dist/{chunk-MJYYXODM.js.map → chunk-3UOSVTFR.js.map} +0 -0
  394. /package/dist/{chunk-HPOY2PHQ.js.map → chunk-3ZW6ZQO6.js.map} +0 -0
  395. /package/dist/{chunk-UV72DEZD.js.map → chunk-4B77XSG5.js.map} +0 -0
  396. /package/dist/{chunk-LMHDFOVV.js.map → chunk-5CPI2QWG.js.map} +0 -0
  397. /package/dist/{chunk-3ZUY2VQF.js.map → chunk-5FZQ74K5.js.map} +0 -0
  398. /package/dist/{chunk-B7C3TF5H.js.map → chunk-6TWXQ4E2.js.map} +0 -0
  399. /package/dist/{chunk-JN3IUA2Q.js.map → chunk-7I7AYIUQ.js.map} +0 -0
  400. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  401. /package/dist/{chunk-5JQLAQUZ.js.map → chunk-ATEAL5EI.js.map} +0 -0
  402. /package/dist/{chunk-4PYLBXX6.js.map → chunk-AYAROCWD.js.map} +0 -0
  403. /package/dist/{chunk-EXU5IQ3S.js.map → chunk-CUUY5CC4.js.map} +0 -0
  404. /package/dist/{chunk-X5QS5C2O.js.map → chunk-E3ZMFFQZ.js.map} +0 -0
  405. /package/dist/{chunk-JWMYVQAM.js.map → chunk-ES5IHQ6M.js.map} +0 -0
  406. /package/dist/{chunk-HJEEAO4O.js.map → chunk-G2NSSQES.js.map} +0 -0
  407. /package/dist/{chunk-QO2KODU6.js.map → chunk-GD3QOBMB.js.map} +0 -0
  408. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  409. /package/dist/{chunk-Q3FWRDCP.js.map → chunk-JNIJBXVK.js.map} +0 -0
  410. /package/dist/{chunk-N7EVMKP6.js.map → chunk-KNRG6ZGJ.js.map} +0 -0
  411. /package/dist/{chunk-GEUDRENF.js.map → chunk-MMTG3SCJ.js.map} +0 -0
  412. /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  413. /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  414. /package/dist/{chunk-275ENJDK.js.map → chunk-P2BLHUL2.js.map} +0 -0
  415. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  416. /package/dist/{chunk-EZKKHVFY.js.map → chunk-QE63OHLB.js.map} +0 -0
  417. /package/dist/{chunk-ONHRRJZM.js.map → chunk-QJAQNXWI.js.map} +0 -0
  418. /package/dist/{chunk-LI4ZOFHW.js.map → chunk-SVZGA2MK.js.map} +0 -0
  419. /package/dist/{chunk-53WDAG7X.js.map → chunk-WWZ35GWW.js.map} +0 -0
  420. /package/dist/{chunk-SB4OKS6C.js.map → chunk-ZN4UZWMT.js.map} +0 -0
  421. /package/dist/{chunk-7M6APKJL.js.map → chunk-ZYU7ZFLT.js.map} +0 -0
  422. /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;
@@ -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",
@@ -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
+ });
@@ -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,