@remnic/core 9.22.0 → 9.22.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -12
  2. package/dist/access-admin-ops-surface.js +25 -24
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +13 -10
  5. package/dist/access-boundary.js +25 -24
  6. package/dist/access-cli.js +84 -82
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +16 -9
  9. package/dist/access-http.js +33 -32
  10. package/dist/access-identity-continuity-surface.d.ts +9 -7
  11. package/dist/access-identity-continuity-surface.js +25 -24
  12. package/dist/access-lcm-surface.d.ts +12 -9
  13. package/dist/access-lcm-surface.js +25 -24
  14. package/dist/access-mcp-output-schemas.js +1 -1
  15. package/dist/access-mcp.d.ts +22 -10
  16. package/dist/access-mcp.js +31 -30
  17. package/dist/access-memory-search-fanout.d.ts +2 -2
  18. package/dist/{access-namespace-preflight-tmwQgCT6.d.ts → access-namespace-preflight-CmErR03h.d.ts} +1 -1
  19. package/dist/access-namespace-preflight.d.ts +3 -3
  20. package/dist/access-namespace-preflight.js +25 -24
  21. package/dist/access-observe-write-surface.d.ts +12 -9
  22. package/dist/access-observe-write-surface.js +25 -24
  23. package/dist/access-operations-batch.js +27 -26
  24. package/dist/access-operations.d.ts +16 -13
  25. package/dist/access-operations.js +28 -27
  26. package/dist/access-recall-concurrency.d.ts +12 -9
  27. package/dist/access-recall-concurrency.js +25 -24
  28. package/dist/access-recall-response.d.ts +12 -9
  29. package/dist/access-recall-response.js +25 -24
  30. package/dist/access-recall-surface.d.ts +14 -11
  31. package/dist/access-recall-surface.js +25 -24
  32. package/dist/access-schema.d.ts +76 -76
  33. package/dist/{access-service-BtxW52vv.d.ts → access-service-CKEROeFP.d.ts} +22 -11
  34. package/dist/access-service.d.ts +13 -10
  35. package/dist/access-service.js +25 -24
  36. package/dist/access-surface-catalog.d.ts +12 -9
  37. package/dist/access-surface-catalog.js +6 -0
  38. package/dist/access-surface-catalog.js.map +1 -1
  39. package/dist/access-wearables-meetings-surface.d.ts +78 -0
  40. package/dist/access-wearables-meetings-surface.js +22 -0
  41. package/dist/access-wearables-meetings-surface.js.map +1 -0
  42. package/dist/action-confidence.d.ts +1 -1
  43. package/dist/active-memory-bridge.d.ts +1 -1
  44. package/dist/active-recall.d.ts +1 -1
  45. package/dist/active-recall.js +2 -2
  46. package/dist/{auto-sync-UPTUVE4X.js → auto-sync-5OE5QOZB.js} +3 -3
  47. package/dist/behavior-learner.d.ts +1 -1
  48. package/dist/behavior-signals.d.ts +1 -1
  49. package/dist/bootstrap.d.ts +9 -7
  50. package/dist/briefing.d.ts +2 -2
  51. package/dist/briefing.js +5 -5
  52. package/dist/buffer-surprise-report.d.ts +1 -1
  53. package/dist/buffer.d.ts +2 -2
  54. package/dist/bulk-import/index.d.ts +3 -3
  55. package/dist/calibration.d.ts +1 -1
  56. package/dist/capabilities.d.ts +1 -1
  57. package/dist/{catalog-iWvWz61I.d.ts → catalog-BFTVo2Ez.d.ts} +1 -1
  58. package/dist/causal-behavior.d.ts +1 -1
  59. package/dist/causal-behavior.js +2 -2
  60. package/dist/causal-chain.js +2 -2
  61. package/dist/causal-consolidation.d.ts +1 -1
  62. package/dist/causal-consolidation.js +9 -9
  63. package/dist/causal-retrieval.js +2 -2
  64. package/dist/causal-trajectory-graph.d.ts +1 -1
  65. package/dist/causal-trajectory.js +1 -1
  66. package/dist/{chunk-GF22HWS2.js → chunk-2PHX3I5C.js} +7 -7
  67. package/dist/{chunk-JFDEYXF7.js → chunk-3NAHZQU3.js} +2 -2
  68. package/dist/{chunk-XBRPEGXF.js → chunk-3UOSVTFR.js} +5 -5
  69. package/dist/{chunk-TTKWTT72.js → chunk-3ZW6ZQO6.js} +3 -3
  70. package/dist/{chunk-UV72DEZD.js → chunk-4B77XSG5.js} +5 -5
  71. package/dist/{chunk-IC2TCZJ2.js → chunk-57QKLRBV.js} +3 -1
  72. package/dist/chunk-57QKLRBV.js.map +1 -0
  73. package/dist/{chunk-LMHDFOVV.js → chunk-5CPI2QWG.js} +3 -3
  74. package/dist/{chunk-P72WZMWQ.js → chunk-5FZQ74K5.js} +2 -2
  75. package/dist/{chunk-BRT7KEXU.js → chunk-6TWXQ4E2.js} +5 -5
  76. package/dist/{chunk-CV6ZYXK3.js → chunk-7I7AYIUQ.js} +3 -3
  77. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  78. package/dist/{chunk-MONWCSVL.js → chunk-7RAJ3GXO.js} +2 -1
  79. package/dist/chunk-7RAJ3GXO.js.map +1 -0
  80. package/dist/{chunk-SQEDDWAM.js → chunk-A2RFKL3V.js} +5 -34
  81. package/dist/chunk-A2RFKL3V.js.map +1 -0
  82. package/dist/{chunk-JN57HZCD.js → chunk-ATEAL5EI.js} +6 -6
  83. package/dist/{chunk-4PYLBXX6.js → chunk-AYAROCWD.js} +2 -2
  84. package/dist/chunk-BLDBT6HZ.js +39 -0
  85. package/dist/chunk-BLDBT6HZ.js.map +1 -0
  86. package/dist/{chunk-NB2P47N7.js → chunk-CUUY5CC4.js} +6 -6
  87. package/dist/{chunk-KL5Y6PEV.js → chunk-E3ZMFFQZ.js} +2 -2
  88. package/dist/{chunk-55FDQYPS.js → chunk-ES5IHQ6M.js} +2 -2
  89. package/dist/{chunk-N47ZWQBO.js → chunk-G2NSSQES.js} +2 -2
  90. package/dist/{chunk-GSWPU5CR.js → chunk-GD3QOBMB.js} +2 -2
  91. package/dist/{chunk-6ANPNUVL.js → chunk-IIXLB5E7.js} +58 -36
  92. package/dist/chunk-IIXLB5E7.js.map +1 -0
  93. package/dist/{chunk-SACPRJ7F.js → chunk-JNIJBXVK.js} +2 -2
  94. package/dist/{chunk-W3XT32W7.js → chunk-JVGUY2AU.js} +23 -13
  95. package/dist/chunk-JVGUY2AU.js.map +1 -0
  96. package/dist/{chunk-DGLON3AL.js → chunk-KNRG6ZGJ.js} +6 -6
  97. package/dist/{chunk-GEUDRENF.js → chunk-MMTG3SCJ.js} +2 -2
  98. package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
  99. package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
  100. package/dist/{chunk-QTO2FGBT.js → chunk-OUW4PAY4.js} +191 -117
  101. package/dist/chunk-OUW4PAY4.js.map +1 -0
  102. package/dist/{chunk-KQ2XCQYN.js → chunk-P2BLHUL2.js} +2 -2
  103. package/dist/{chunk-ACGGTPU4.js → chunk-QCKQEBIY.js} +17 -9
  104. package/dist/chunk-QCKQEBIY.js.map +1 -0
  105. package/dist/{chunk-6L775BUB.js → chunk-QE63OHLB.js} +2 -2
  106. package/dist/{chunk-ONHRRJZM.js → chunk-QJAQNXWI.js} +6 -6
  107. package/dist/{chunk-EQYBHXRR.js → chunk-ROUL7RZU.js} +385 -59
  108. package/dist/chunk-ROUL7RZU.js.map +1 -0
  109. package/dist/{chunk-N6M7MRVN.js → chunk-RT4TSR2C.js} +9034 -8726
  110. package/dist/chunk-RT4TSR2C.js.map +1 -0
  111. package/dist/{chunk-6NZ7U4R4.js → chunk-SCOT5DTA.js} +1 -1
  112. package/dist/chunk-SCOT5DTA.js.map +1 -0
  113. package/dist/{chunk-6RYWNBSA.js → chunk-SVZGA2MK.js} +2 -2
  114. package/dist/chunk-SYOIVK7K.js +63 -0
  115. package/dist/chunk-SYOIVK7K.js.map +1 -0
  116. package/dist/{chunk-DM5A4ZFL.js → chunk-TWCOYET2.js} +11 -1
  117. package/dist/chunk-TWCOYET2.js.map +1 -0
  118. package/dist/{chunk-7S5OMI76.js → chunk-WS32QRLO.js} +109 -44
  119. package/dist/chunk-WS32QRLO.js.map +1 -0
  120. package/dist/{chunk-OCMLGND7.js → chunk-WWZ35GWW.js} +5 -5
  121. package/dist/{chunk-QMGIQUBG.js → chunk-XWPFZX6S.js} +503 -139
  122. package/dist/chunk-XWPFZX6S.js.map +1 -0
  123. package/dist/{chunk-A5N6ISRK.js → chunk-ZN4UZWMT.js} +2 -2
  124. package/dist/{chunk-7M6APKJL.js → chunk-ZYU7ZFLT.js} +2 -2
  125. package/dist/{cli-D9vXgWwM.d.ts → cli-BrwT9YMD.d.ts} +5 -5
  126. package/dist/cli.d.ts +14 -11
  127. package/dist/cli.js +57 -56
  128. package/dist/compounding/engine.d.ts +2 -2
  129. package/dist/compounding/engine.js +5 -5
  130. package/dist/compounding/preference-consolidator.d.ts +1 -1
  131. package/dist/compression-optimizer.d.ts +1 -1
  132. package/dist/config.d.ts +1 -1
  133. package/dist/config.js +2 -2
  134. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  135. package/dist/connectors/codex-materialize-runner.js +5 -5
  136. package/dist/connectors/codex-materialize.d.ts +1 -1
  137. package/dist/connectors/index.d.ts +1 -1
  138. package/dist/connectors/index.js +5 -5
  139. package/dist/consolidation-provenance-check.d.ts +2 -2
  140. package/dist/consolidation-undo.d.ts +2 -2
  141. package/dist/contradiction/index.d.ts +2 -2
  142. package/dist/conversation-index/backend.d.ts +1 -1
  143. package/dist/conversation-index/chunker.d.ts +1 -1
  144. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  145. package/dist/conversation-index/indexer.d.ts +1 -1
  146. package/dist/conversation-index/search.d.ts +1 -1
  147. package/dist/day-summary.d.ts +1 -1
  148. package/dist/delinearize.d.ts +1 -1
  149. package/dist/direct-answer-wiring.d.ts +1 -1
  150. package/dist/direct-answer.d.ts +1 -1
  151. package/dist/embedding-fallback.d.ts +1 -1
  152. package/dist/enrichment/index.d.ts +1 -1
  153. package/dist/entity-retrieval.d.ts +2 -2
  154. package/dist/entity-retrieval.js +5 -5
  155. package/dist/entity-schema.d.ts +1 -1
  156. package/dist/explicit-capture.d.ts +9 -7
  157. package/dist/extraction-error-classification.d.ts +22 -0
  158. package/dist/extraction-error-classification.js +11 -0
  159. package/dist/extraction-error-classification.js.map +1 -0
  160. package/dist/extraction-faithfulness.d.ts +1 -1
  161. package/dist/extraction-judge-telemetry.d.ts +1 -1
  162. package/dist/extraction-judge-training.d.ts +1 -1
  163. package/dist/extraction-judge.d.ts +1 -1
  164. package/dist/extraction.d.ts +3 -17
  165. package/dist/extraction.js +5 -3
  166. package/dist/fallback-llm.d.ts +1 -1
  167. package/dist/{first-start-migration-LEXL3XYL.js → first-start-migration-BKNGOFED.js} +4 -4
  168. package/dist/graph-dashboard-diff.d.ts +1 -1
  169. package/dist/graph-dashboard-key.d.ts +1 -1
  170. package/dist/graph-dashboard-parser.d.ts +1 -1
  171. package/dist/graph-edge-reinforcement.d.ts +1 -1
  172. package/dist/graph-snapshot.d.ts +1 -1
  173. package/dist/graph.d.ts +1 -1
  174. package/dist/importance.d.ts +1 -1
  175. package/dist/importers/index.d.ts +1 -1
  176. package/dist/in-flight-reads.d.ts +1 -1
  177. package/dist/index.d.ts +713 -923
  178. package/dist/index.js +176 -140
  179. package/dist/intent.d.ts +1 -1
  180. package/dist/lcm/engine.d.ts +1 -1
  181. package/dist/lcm/engine.js +3 -3
  182. package/dist/lcm/index.d.ts +1 -1
  183. package/dist/lcm/index.js +11 -11
  184. package/dist/lcm/tools.d.ts +1 -1
  185. package/dist/lifecycle.d.ts +1 -1
  186. package/dist/live-connectors-runner.d.ts +1 -1
  187. package/dist/local-llm.d.ts +1 -1
  188. package/dist/local-model-endpoint.d.ts +1 -1
  189. package/dist/maintenance/memory-governance.d.ts +1 -1
  190. package/dist/maintenance/memory-governance.js +6 -6
  191. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  192. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +5 -5
  193. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  194. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  195. package/dist/maintenance-C98njYb8.d.ts +366 -0
  196. package/dist/mcp-memory-inspector-app.d.ts +12 -9
  197. package/dist/mcp-read-only-tools.js +1 -1
  198. package/dist/memory-action-policy.d.ts +1 -1
  199. package/dist/memory-cache.d.ts +1 -1
  200. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  201. package/dist/memory-projection-store.d.ts +1 -1
  202. package/dist/memory-provenance.d.ts +1 -1
  203. package/dist/memory-worth-outcomes.d.ts +2 -2
  204. package/dist/models-json.d.ts +1 -1
  205. package/dist/namespaces/migrate.d.ts +3 -3
  206. package/dist/namespaces/migrate.js +12 -12
  207. package/dist/namespaces/principal.d.ts +1 -1
  208. package/dist/namespaces/search.d.ts +1 -1
  209. package/dist/namespaces/search.js +6 -6
  210. package/dist/namespaces/storage.d.ts +3 -3
  211. package/dist/namespaces/storage.js +5 -5
  212. package/dist/native-knowledge.d.ts +1 -1
  213. package/dist/offline-sync-impression-drain.d.ts +1 -1
  214. package/dist/operator-toolkit.d.ts +2 -2
  215. package/dist/operator-toolkit.js +18 -18
  216. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  217. package/dist/orchestration/maintenance.d.ts +6 -223
  218. package/dist/orchestration/maintenance.js +12 -12
  219. package/dist/{orchestrator-DB93S48I.d.ts → orchestrator-C9ZVppNh.d.ts} +12 -481
  220. package/dist/orchestrator.d.ts +10 -8
  221. package/dist/orchestrator.js +84 -82
  222. package/dist/patterns-cli.d.ts +1 -1
  223. package/dist/{pipeline-DmGc-H66.d.ts → pipeline-id_-sqYm.d.ts} +1 -1
  224. package/dist/policy-runtime.d.ts +1 -1
  225. package/dist/proactive-contention.d.ts +1 -1
  226. package/dist/provenance.d.ts +1 -1
  227. package/dist/{qmd-cJT0crkF.d.ts → qmd-R6XaQOZK.d.ts} +1 -1
  228. package/dist/qmd-preflight.d.ts +2 -2
  229. package/dist/qmd-recall-cache.d.ts +1 -1
  230. package/dist/qmd.d.ts +2 -2
  231. package/dist/qmd.js +4 -4
  232. package/dist/recall-concurrency-config.d.ts +1 -1
  233. package/dist/recall-disclosure-escalation.d.ts +1 -1
  234. package/dist/recall-explain-renderer.d.ts +1 -1
  235. package/dist/recall-explain-renderer.js +3 -3
  236. package/dist/recall-memory-map.d.ts +1 -1
  237. package/dist/recall-planner-llm.d.ts +1 -1
  238. package/dist/recall-state.d.ts +1 -1
  239. package/dist/recall-tag-filter.d.ts +1 -1
  240. package/dist/recall-timings.d.ts +1 -1
  241. package/dist/recall-xray-cli.d.ts +1 -1
  242. package/dist/recall-xray-cli.js +4 -4
  243. package/dist/recall-xray-renderer.d.ts +1 -1
  244. package/dist/recall-xray-renderer.js +3 -3
  245. package/dist/recall-xray.d.ts +1 -1
  246. package/dist/recall-xray.js +2 -2
  247. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  248. package/dist/replay/normalizers/claude.d.ts +1 -1
  249. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  250. package/dist/replay/normalizers/shared.d.ts +1 -1
  251. package/dist/replay/runner.d.ts +1 -1
  252. package/dist/replay/types.d.ts +1 -1
  253. package/dist/resolve-auth-token.d.ts +1 -1
  254. package/dist/resume-bundles.js +4 -4
  255. package/dist/retrieval-agents.d.ts +2 -2
  256. package/dist/retrieval-tiers.d.ts +1 -1
  257. package/dist/routing/engine.d.ts +1 -1
  258. package/dist/routing/store.d.ts +1 -1
  259. package/dist/salvage-envelope.d.ts +1 -1
  260. package/dist/schemas.d.ts +76 -76
  261. package/dist/{scope-profiles-KG2nODX7.d.ts → scope-profiles-EhyuAKkd.d.ts} +1 -1
  262. package/dist/search/embed-helper.d.ts +1 -1
  263. package/dist/search/factory.d.ts +1 -1
  264. package/dist/search/factory.js +5 -5
  265. package/dist/search/index.d.ts +1 -1
  266. package/dist/search/index.js +9 -9
  267. package/dist/search/lancedb-backend.d.ts +1 -1
  268. package/dist/search/meilisearch-backend.d.ts +1 -1
  269. package/dist/search/noop-backend.d.ts +1 -1
  270. package/dist/search/orama-backend.d.ts +1 -1
  271. package/dist/search/port.d.ts +1 -1
  272. package/dist/search/remote-backend.d.ts +1 -1
  273. package/dist/{semantic-consolidation-BaZlg0D8.d.ts → semantic-consolidation-B2xo26UQ.d.ts} +1 -1
  274. package/dist/semantic-consolidation.d.ts +2 -2
  275. package/dist/semantic-consolidation.js +7 -7
  276. package/dist/semantic-rule-promotion.js +5 -5
  277. package/dist/semantic-rule-verifier.d.ts +1 -1
  278. package/dist/semantic-rule-verifier.js +6 -6
  279. package/dist/service-DgFWlZ-r.d.ts +835 -0
  280. package/dist/session-observer-bands.d.ts +1 -1
  281. package/dist/session-observer-state.d.ts +1 -1
  282. package/dist/shared-context/manager.d.ts +9 -9
  283. package/dist/signal.d.ts +1 -1
  284. package/dist/{storage-BKhHHnRo.d.ts → storage-XGawwqXE.d.ts} +131 -2
  285. package/dist/storage.d.ts +2 -2
  286. package/dist/storage.js +4 -4
  287. package/dist/summarizer.d.ts +1 -1
  288. package/dist/summary-snapshot.d.ts +1 -1
  289. package/dist/temporal-supersession.d.ts +2 -2
  290. package/dist/temporal-timeline-recall.d.ts +1 -1
  291. package/dist/temporal-validity.d.ts +1 -1
  292. package/dist/threading.d.ts +1 -1
  293. package/dist/tier-migration.d.ts +2 -2
  294. package/dist/tier-routing.d.ts +1 -1
  295. package/dist/topics.d.ts +1 -1
  296. package/dist/transcript.d.ts +1 -1
  297. package/dist/transfer/types.d.ts +66 -66
  298. package/dist/trust-score-stage.d.ts +1 -1
  299. package/dist/trust-score.d.ts +1 -1
  300. package/dist/{types-GBQZuT7l.d.ts → types-Bbs0qz6b.d.ts} +2 -3
  301. package/dist/types.d.ts +1 -1
  302. package/dist/types.js +1 -1
  303. package/dist/utility-runtime.d.ts +1 -1
  304. package/dist/verified-recall.js +6 -6
  305. package/dist/write-envelope.d.ts +1 -1
  306. package/package.json +2 -2
  307. package/src/access-boundary.ts +3 -0
  308. package/src/access-http.test.ts +63 -0
  309. package/src/access-http.ts +26 -37
  310. package/src/access-mcp-output-schemas.ts +10 -0
  311. package/src/access-mcp.ts +4 -121
  312. package/src/access-operations-batch.ts +10 -5
  313. package/src/access-service.ts +43 -46
  314. package/src/access-surface-catalog.ts +6 -0
  315. package/src/access-wearables-meetings-surface.ts +139 -0
  316. package/src/activity/digest.ts +1 -1
  317. package/src/activity/runner.test.ts +37 -0
  318. package/src/activity/runner.ts +12 -0
  319. package/src/activity/scheduler.test.ts +1 -0
  320. package/src/activity/sync-registration.ts +13 -0
  321. package/src/cli/meetings-commands.ts +70 -0
  322. package/src/cli.ts +7 -6
  323. package/src/extraction-error-classification.ts +52 -0
  324. package/src/extraction.ts +2 -50
  325. package/src/mcp-read-only-tools.ts +2 -0
  326. package/src/meetings/build-memory.test.ts +364 -0
  327. package/src/meetings/build-scheduler.test.ts +55 -0
  328. package/src/meetings/build-scheduler.ts +96 -0
  329. package/src/meetings/day-source.test.ts +275 -0
  330. package/src/meetings/day-source.ts +352 -0
  331. package/src/meetings/http-glue.ts +126 -0
  332. package/src/meetings/index.ts +5 -4
  333. package/src/meetings/manual-sync-flush.test.ts +72 -0
  334. package/src/meetings/mcp-tools.ts +65 -0
  335. package/src/meetings/memory-gen.test.ts +498 -0
  336. package/src/meetings/memory-gen.ts +549 -0
  337. package/src/meetings/memory-generator.ts +5 -0
  338. package/src/meetings/namespace-isolation.test.ts +159 -0
  339. package/src/meetings/service.test.ts +195 -0
  340. package/src/meetings/service.ts +157 -0
  341. package/src/meetings/summary-extractor.test.ts +287 -0
  342. package/src/meetings/summary-extractor.ts +264 -0
  343. package/src/orchestration/maintenance.ts +8 -0
  344. package/src/orchestration/orchestrator-init.ts +6 -1
  345. package/src/orchestration/workspace-ops.ts +172 -8
  346. package/src/orchestrator.ts +12 -13
  347. package/src/storage.ts +21 -0
  348. package/src/testing/subjects/meetings-namespace-harness.ts +159 -0
  349. package/src/testing/subjects/meetings-namespace.test.ts +93 -0
  350. package/src/types.ts +1 -2
  351. package/src/wearables/cli.ts +2 -1
  352. package/src/wearables/index.ts +1 -0
  353. package/src/wearables/mcp-tools.ts +143 -0
  354. package/src/wearables/registry.test.ts +11 -0
  355. package/src/wearables/registry.ts +13 -0
  356. package/src/wearables/service.test.ts +62 -1
  357. package/src/wearables/service.ts +30 -2
  358. package/src/wearables/transcript-search-namespace-isolation.test.ts +98 -0
  359. package/dist/chunk-6ANPNUVL.js.map +0 -1
  360. package/dist/chunk-6NZ7U4R4.js.map +0 -1
  361. package/dist/chunk-7S5OMI76.js.map +0 -1
  362. package/dist/chunk-ACGGTPU4.js.map +0 -1
  363. package/dist/chunk-DM5A4ZFL.js.map +0 -1
  364. package/dist/chunk-EQYBHXRR.js.map +0 -1
  365. package/dist/chunk-IC2TCZJ2.js.map +0 -1
  366. package/dist/chunk-MONWCSVL.js.map +0 -1
  367. package/dist/chunk-N6M7MRVN.js.map +0 -1
  368. package/dist/chunk-QMGIQUBG.js.map +0 -1
  369. package/dist/chunk-QTO2FGBT.js.map +0 -1
  370. package/dist/chunk-SQEDDWAM.js.map +0 -1
  371. package/dist/chunk-W3XT32W7.js.map +0 -1
  372. /package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-5OE5QOZB.js.map} +0 -0
  373. /package/dist/{chunk-GF22HWS2.js.map → chunk-2PHX3I5C.js.map} +0 -0
  374. /package/dist/{chunk-JFDEYXF7.js.map → chunk-3NAHZQU3.js.map} +0 -0
  375. /package/dist/{chunk-XBRPEGXF.js.map → chunk-3UOSVTFR.js.map} +0 -0
  376. /package/dist/{chunk-TTKWTT72.js.map → chunk-3ZW6ZQO6.js.map} +0 -0
  377. /package/dist/{chunk-UV72DEZD.js.map → chunk-4B77XSG5.js.map} +0 -0
  378. /package/dist/{chunk-LMHDFOVV.js.map → chunk-5CPI2QWG.js.map} +0 -0
  379. /package/dist/{chunk-P72WZMWQ.js.map → chunk-5FZQ74K5.js.map} +0 -0
  380. /package/dist/{chunk-BRT7KEXU.js.map → chunk-6TWXQ4E2.js.map} +0 -0
  381. /package/dist/{chunk-CV6ZYXK3.js.map → chunk-7I7AYIUQ.js.map} +0 -0
  382. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  383. /package/dist/{chunk-JN57HZCD.js.map → chunk-ATEAL5EI.js.map} +0 -0
  384. /package/dist/{chunk-4PYLBXX6.js.map → chunk-AYAROCWD.js.map} +0 -0
  385. /package/dist/{chunk-NB2P47N7.js.map → chunk-CUUY5CC4.js.map} +0 -0
  386. /package/dist/{chunk-KL5Y6PEV.js.map → chunk-E3ZMFFQZ.js.map} +0 -0
  387. /package/dist/{chunk-55FDQYPS.js.map → chunk-ES5IHQ6M.js.map} +0 -0
  388. /package/dist/{chunk-N47ZWQBO.js.map → chunk-G2NSSQES.js.map} +0 -0
  389. /package/dist/{chunk-GSWPU5CR.js.map → chunk-GD3QOBMB.js.map} +0 -0
  390. /package/dist/{chunk-SACPRJ7F.js.map → chunk-JNIJBXVK.js.map} +0 -0
  391. /package/dist/{chunk-DGLON3AL.js.map → chunk-KNRG6ZGJ.js.map} +0 -0
  392. /package/dist/{chunk-GEUDRENF.js.map → chunk-MMTG3SCJ.js.map} +0 -0
  393. /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  394. /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  395. /package/dist/{chunk-KQ2XCQYN.js.map → chunk-P2BLHUL2.js.map} +0 -0
  396. /package/dist/{chunk-6L775BUB.js.map → chunk-QE63OHLB.js.map} +0 -0
  397. /package/dist/{chunk-ONHRRJZM.js.map → chunk-QJAQNXWI.js.map} +0 -0
  398. /package/dist/{chunk-6RYWNBSA.js.map → chunk-SVZGA2MK.js.map} +0 -0
  399. /package/dist/{chunk-OCMLGND7.js.map → chunk-WWZ35GWW.js.map} +0 -0
  400. /package/dist/{chunk-A5N6ISRK.js.map → chunk-ZN4UZWMT.js.map} +0 -0
  401. /package/dist/{chunk-7M6APKJL.js.map → chunk-ZYU7ZFLT.js.map} +0 -0
  402. /package/dist/{first-start-migration-LEXL3XYL.js.map → first-start-migration-BKNGOFED.js.map} +0 -0
@@ -0,0 +1,139 @@
1
+ import type { WearablesService } from "./wearables/service.js";
2
+ import type { MeetingsService, MeetingsGetResult, MeetingsListResult } from "./meetings/service.js";
3
+ import type { MeetingsDayBuildSummary } from "./meetings/build.js";
4
+
5
+ /**
6
+ * Caller scope threaded into the wearables + meetings access ops so reads and
7
+ * writes resolve to the CALLER namespace (caller-derived namespace symmetry,
8
+ * issue #2123), not a machine-wide default. Every field is optional; omitting
9
+ * all three preserves the operator/CLI default-namespace behavior.
10
+ */
11
+ export type WearablesMeetingsScope = {
12
+ sessionKey?: string;
13
+ authenticatedPrincipal?: string;
14
+ namespace?: string;
15
+ };
16
+
17
+ /**
18
+ * The access-service capabilities the wearables + meetings surface needs.
19
+ * A structural host (not the class itself) so these ops stay pure delegators
20
+ * while EngramAccessService keeps its namespace/principal resolvers private.
21
+ */
22
+ export interface WearablesMeetingsHost {
23
+ readonly orchestrator: {
24
+ getWearablesService(namespace: string): WearablesService;
25
+ getMeetingsService(namespace: string): Promise<MeetingsService>;
26
+ readonly config: { readonly meetings: { readonly enabled: boolean } };
27
+ };
28
+ resolveReadableNamespace(namespace: string | undefined, principal?: string): string;
29
+ writableNamespaceFor(
30
+ namespace: string | undefined,
31
+ sessionKey: string | undefined,
32
+ authenticatedPrincipal?: string,
33
+ ): string;
34
+ resolveRequestPrincipal(sessionKey: string | undefined, authenticatedPrincipal?: string): string | undefined;
35
+ }
36
+
37
+ /**
38
+ * Wearables reads resolve to the CALLER namespace via resolveReadableNamespace;
39
+ * sync writes via writableNamespaceFor; build needs BOTH — it reads
40
+ * transcripts/records to derive, then writes episodes. Non-default callers are
41
+ * strictly isolated: no default-ns wearable fallback, no machine-global
42
+ * activity (machine-scoped, consumed only by the default ns).
43
+ */
44
+ function wearablesReadService(host: WearablesMeetingsHost, scope?: WearablesMeetingsScope): WearablesService {
45
+ return host.orchestrator.getWearablesService(
46
+ host.resolveReadableNamespace(scope?.namespace, host.resolveRequestPrincipal(scope?.sessionKey, scope?.authenticatedPrincipal)),
47
+ );
48
+ }
49
+
50
+ export function wearablesStatus(
51
+ host: WearablesMeetingsHost,
52
+ scope?: WearablesMeetingsScope,
53
+ ): Promise<Awaited<ReturnType<WearablesService["status"]>>> {
54
+ return wearablesReadService(host, scope).status();
55
+ }
56
+
57
+ export async function wearablesSync(
58
+ host: WearablesMeetingsHost,
59
+ request: { source?: string; date?: string; days?: number; forceMemories?: boolean } & WearablesMeetingsScope,
60
+ ): Promise<Awaited<ReturnType<WearablesService["sync"]>>> {
61
+ const namespace = host.writableNamespaceFor(request.namespace, request.sessionKey, request.authenticatedPrincipal);
62
+ const summaries = await host.orchestrator
63
+ .getWearablesService(namespace)
64
+ .sync({ source: request.source, date: request.date, days: request.days, forceMemories: request.forceMemories });
65
+ // Manual one-shot sync (HTTP/MCP/CLI): the meeting tail-step arms a
66
+ // debounced, unref'd timer a short-lived caller exits before firing. Drain
67
+ // it now so a manual sync's meeting build actually runs before we return.
68
+ // The long-lived auto-sync daemon does NOT flush — it keeps coalescing.
69
+ if (host.orchestrator.config.meetings.enabled) {
70
+ await (await host.orchestrator.getMeetingsService(namespace)).flushBuilds();
71
+ }
72
+ return summaries;
73
+ }
74
+
75
+ export function wearablesTranscriptDay(
76
+ host: WearablesMeetingsHost,
77
+ request: { date: string; source?: string } & WearablesMeetingsScope,
78
+ ): Promise<Awaited<ReturnType<WearablesService["dayTranscript"]>>> {
79
+ return wearablesReadService(host, request).dayTranscript(request.date, request.source);
80
+ }
81
+
82
+ export function wearablesTranscriptSearch(
83
+ host: WearablesMeetingsHost,
84
+ request: { query: string; source?: string; from?: string; to?: string; limit?: number } & WearablesMeetingsScope,
85
+ ): Promise<Awaited<ReturnType<WearablesService["searchTranscripts"]>>> {
86
+ return wearablesReadService(host, request).searchTranscripts(request.query, {
87
+ source: request.source,
88
+ from: request.from,
89
+ to: request.to,
90
+ limit: request.limit,
91
+ });
92
+ }
93
+
94
+ export function wearablesTranscriptMemories(
95
+ host: WearablesMeetingsHost,
96
+ request: { source?: string; date?: string; limit?: number } & WearablesMeetingsScope,
97
+ ): Promise<Awaited<ReturnType<WearablesService["transcriptMemories"]>>> {
98
+ return wearablesReadService(host, request).transcriptMemories({
99
+ source: request.source,
100
+ date: request.date,
101
+ limit: request.limit,
102
+ });
103
+ }
104
+
105
+ // Meetings (issue #1900): thin delegations to the caller-ns MeetingsService.
106
+ export async function meetingsList(
107
+ host: WearablesMeetingsHost,
108
+ date?: string,
109
+ scope?: WearablesMeetingsScope,
110
+ ): Promise<MeetingsListResult> {
111
+ return (
112
+ await host.orchestrator.getMeetingsService(
113
+ host.resolveReadableNamespace(scope?.namespace, host.resolveRequestPrincipal(scope?.sessionKey, scope?.authenticatedPrincipal)),
114
+ )
115
+ ).meetingsList(date);
116
+ }
117
+
118
+ export async function meetingsGet(
119
+ host: WearablesMeetingsHost,
120
+ id: string,
121
+ scope?: WearablesMeetingsScope,
122
+ ): Promise<MeetingsGetResult> {
123
+ return (
124
+ await host.orchestrator.getMeetingsService(
125
+ host.resolveReadableNamespace(scope?.namespace, host.resolveRequestPrincipal(scope?.sessionKey, scope?.authenticatedPrincipal)),
126
+ )
127
+ ).meetingsGet(id);
128
+ }
129
+
130
+ export async function meetingsBuild(
131
+ host: WearablesMeetingsHost,
132
+ date: string,
133
+ scope?: WearablesMeetingsScope,
134
+ ): Promise<MeetingsDayBuildSummary> {
135
+ const principal = host.resolveRequestPrincipal(scope?.sessionKey, scope?.authenticatedPrincipal);
136
+ const namespace = host.writableNamespaceFor(scope?.namespace, scope?.sessionKey, scope?.authenticatedPrincipal);
137
+ host.resolveReadableNamespace(namespace, principal);
138
+ return (await host.orchestrator.getMeetingsService(namespace)).meetingsBuild(date);
139
+ }
@@ -45,7 +45,7 @@ export function activityDigestPath(memoryDir: string, date: string): string {
45
45
 
46
46
  // ── DST-aware local-day window ──────────────────────────────────────────────
47
47
 
48
- function timezoneOffsetIso(instant: Date, timezone: string): string {
48
+ export function timezoneOffsetIso(instant: Date, timezone: string): string {
49
49
  const parts = new Intl.DateTimeFormat("en-US", {
50
50
  timeZone: timezone,
51
51
  timeZoneName: "longOffset",
@@ -453,3 +453,40 @@ test("an older-day failure does not starve newer dates in a multi-day window", a
453
453
  await rm(memoryDir, { recursive: true, force: true });
454
454
  }
455
455
  });
456
+
457
+ test("runActivitySyncOnce reports every local date that gained snapshots (issue #1900 backfill)", async () => {
458
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-activity-runner-"));
459
+ const store = ActivityStore.open(memoryDir);
460
+ try {
461
+ let calls = 0;
462
+ const client: ActivitySourceClient = {
463
+ machineLabel: "workstation-a",
464
+ async verify() {
465
+ return { ok: true };
466
+ },
467
+ async fetchSnapshots() {
468
+ calls += 1;
469
+ // Dates are processed oldest-first: day 1 = 2026-07-21, day 2 = 2026-07-22.
470
+ const capturedAtUtc = calls === 1 ? "2026-07-21T14:00:00.000Z" : "2026-07-22T14:00:00.000Z";
471
+ return { snapshots: [snapshot({ capturedAtUtc, contentHash: `hash-${calls}` })], nextCursor: null };
472
+ },
473
+ };
474
+
475
+ const summary = await runActivitySyncOnce({
476
+ config: enabledConfig({ syncDays: 2 }),
477
+ memoryDir,
478
+ store,
479
+ now: NOW,
480
+ createSourceClient: () => client,
481
+ });
482
+
483
+ assert.deepEqual(
484
+ summary.touchedDates,
485
+ ["2026-07-21", "2026-07-22"],
486
+ "both days that inserted snapshots are reported so meetings rebuild the older day too",
487
+ );
488
+ } finally {
489
+ store.close();
490
+ await rm(memoryDir, { recursive: true, force: true });
491
+ }
492
+ });
@@ -60,6 +60,12 @@ export interface ActivitySyncRunSummary {
60
60
  reindexErrorCount: number;
61
61
  totalInserted: number;
62
62
  results: ActivitySourceRunItem[];
63
+ /**
64
+ * Local dates (YYYY-MM-DD, in the sync timezone) that gained new snapshots
65
+ * this run — a backfill/rolling window can touch several. Meetings rebuild
66
+ * uses this so a change to an OLDER day rebuilds that day, not just today.
67
+ */
68
+ touchedDates: string[];
63
69
  }
64
70
 
65
71
  export interface ActivitySyncRunOptions {
@@ -148,6 +154,7 @@ export async function runActivitySyncOnce(options: ActivitySyncRunOptions): Prom
148
154
  reindexErrorCount: 0,
149
155
  totalInserted: 0,
150
156
  results: [],
157
+ touchedDates: [],
151
158
  };
152
159
  }
153
160
 
@@ -163,6 +170,9 @@ export async function runActivitySyncOnce(options: ActivitySyncRunOptions): Prom
163
170
  const ownStore = options.store === undefined;
164
171
  const store = options.store ?? ActivityStore.open(options.memoryDir);
165
172
  const results: ActivitySourceRunItem[] = [];
173
+ // Local dates that gained new snapshots this run (any source). Drives the
174
+ // meetings rebuild fan-out so a backfilled OLDER day is rebuilt too.
175
+ const touchedDates = new Set<string>();
166
176
 
167
177
  try {
168
178
  for (const sourceConfig of options.config.sources) {
@@ -191,6 +201,7 @@ export async function runActivitySyncOnce(options: ActivitySyncRunOptions): Prom
191
201
  });
192
202
  item.fetched += result.fetched;
193
203
  item.inserted += result.inserted;
204
+ if (result.inserted > 0) touchedDates.add(date);
194
205
  item.duplicates += result.duplicates;
195
206
  if (result.digestWritten) item.digestsWritten += 1;
196
207
  item.cursor = result.cursor;
@@ -233,5 +244,6 @@ export async function runActivitySyncOnce(options: ActivitySyncRunOptions): Prom
233
244
  reindexErrorCount: results.filter((item) => item.reindexError !== undefined).length,
234
245
  totalInserted: results.reduce((sum, item) => sum + item.inserted, 0),
235
246
  results,
247
+ touchedDates: [...touchedDates].sort(),
236
248
  };
237
249
  }
@@ -50,6 +50,7 @@ const SUMMARY: ActivitySyncRunSummary = {
50
50
  reindexErrorCount: 0,
51
51
  totalInserted: 0,
52
52
  results: [],
53
+ touchedDates: [],
53
54
  };
54
55
 
55
56
  function enabledConfig(): ActivityConfig {
@@ -50,6 +50,13 @@ export interface ActivitySyncRegistrarDeps {
50
50
  readonly getQmd: () => ActivityIndexRefresher;
51
51
  /** Debounced/singleflighted QMD retry used when a tick's reindex fails. */
52
52
  readonly requestReindexRetry: () => void;
53
+ /**
54
+ * Tail step (issue #1900): observe a completed sync tick so a dependent
55
+ * subsystem (meeting building) can rebuild the affected day(s). Fired only
56
+ * after a durable tick and never after teardown. Optional; omitted by hosts
57
+ * that do not build meetings.
58
+ */
59
+ readonly onSynced?: (summary: ActivitySyncRunSummary) => void;
53
60
  /** Scheduler factory (injectable for tests); defaults to the real scheduler. */
54
61
  readonly createScheduler?: (options: ActivitySyncSchedulerOptions) => ActivitySyncSchedulerLike;
55
62
  }
@@ -111,6 +118,12 @@ export class ActivitySyncRegistrar {
111
118
  );
112
119
  this.deps.requestReindexRetry();
113
120
  }
121
+ // Tail step: a durable tick that ingested snapshots may have changed a
122
+ // meeting's screen context; notify the dependent builder. Never after
123
+ // teardown.
124
+ if (summary.enabled && summary.totalInserted > 0 && !this.disposed) {
125
+ this.deps.onSynced?.(summary);
126
+ }
114
127
  },
115
128
  });
116
129
  this.scheduler = scheduler;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Meetings command group (issue #1900) — extracted from cli.ts so the surface
3
+ * file stays under its structural ceiling. Mirrors the
4
+ * registerResearchStatusCommands / registerCreationLedgerCommands seam: a single
5
+ * registrar wires the `meetings` command (list / show / build) on the parent
6
+ * `engram` command.
7
+ *
8
+ * Every subcommand forwards to the shared runner in meetings/cli.ts so this host
9
+ * CLI and the standalone `remnic` CLI never fork behavior or formatting.
10
+ * Behaviour is identical to the inline registration it replaces — the
11
+ * cli-command-surface contract tests guard against silent drift.
12
+ */
13
+
14
+ import type { Orchestrator } from "../orchestrator.js";
15
+ import type { CliCommand } from "../cli.js";
16
+ import { runMeetingsCliCommand } from "../meetings/cli.js";
17
+
18
+ export function registerMeetingsCommands(cmd: CliCommand, orchestrator: Orchestrator): void {
19
+ const meetingsCmd = cmd
20
+ .command("meetings")
21
+ .description(
22
+ "Retrospective meetings: list records, show one, build (detect + fuse + store) a day",
23
+ );
24
+ const forwardMeetings = async (argv: string[]): Promise<void> => {
25
+ const service = await orchestrator.getMeetingsService();
26
+ const code = await runMeetingsCliCommand(
27
+ { store: service.store, builder: service.builder, config: service.config },
28
+ argv,
29
+ { stdout: process.stdout, stderr: process.stderr },
30
+ );
31
+ if (code !== 0) process.exitCode = code;
32
+ };
33
+
34
+ meetingsCmd
35
+ .command("list")
36
+ .description("List meeting records (all days, or one day)")
37
+ .option("--date <date>", "Day to list (YYYY-MM-DD)")
38
+ .option("--json", "JSON output")
39
+ .action(async (...args: unknown[]) => {
40
+ const options = (args[0] ?? {}) as Record<string, unknown>;
41
+ await forwardMeetings([
42
+ "list",
43
+ ...(typeof options.date === "string" && options.date.length > 0
44
+ ? ["--date", options.date]
45
+ : []),
46
+ ...(options.json === true ? ["--json"] : []),
47
+ ]);
48
+ });
49
+
50
+ meetingsCmd
51
+ .command("show <meeting-id>")
52
+ .description("Print a stored meeting record")
53
+ .action(async (...args: unknown[]) => {
54
+ await forwardMeetings(["show", String(args[0] ?? "")]);
55
+ });
56
+
57
+ meetingsCmd
58
+ .command("build")
59
+ .description("Detect + fuse + store the day's meetings")
60
+ .option("--date <date>", "Day to build (YYYY-MM-DD)")
61
+ .option("--json", "JSON output")
62
+ .action(async (...args: unknown[]) => {
63
+ const options = (args[0] ?? {}) as Record<string, unknown>;
64
+ await forwardMeetings([
65
+ "build",
66
+ ...(typeof options.date === "string" ? ["--date", options.date] : []),
67
+ ...(options.json === true ? ["--json"] : []),
68
+ ]);
69
+ });
70
+ }
package/src/cli.ts CHANGED
@@ -13,6 +13,7 @@ import { ThreadingManager } from "./threading.js";
13
13
  import { bumpMemoryCorpusVersionForDir } from "./memory-corpus-version.js";
14
14
  import { utcDayRange } from "./transcript.js";
15
15
  import { runWearablesCliCommand } from "./wearables/cli.js";
16
+ import { registerMeetingsCommands } from "./cli/meetings-commands.js";
16
17
  import { registerResearchStatusCommands } from "./cli/research-status-commands.js";
17
18
  import { registerCreationLedgerCommands } from "./cli/creation-ledger-commands.js";
18
19
  import type {
@@ -5197,11 +5198,11 @@ export function registerCli(
5197
5198
  "Wearable transcript sources (Limitless / Bee / Omi): sync, transcripts, search, speakers, corrections",
5198
5199
  );
5199
5200
  const forwardWearables = async (argv: string[]): Promise<void> => {
5200
- const code = await runWearablesCliCommand(
5201
- orchestrator.getWearablesService(),
5202
- argv,
5203
- { stdout: process.stdout, stderr: process.stderr },
5204
- );
5201
+ const io = { stdout: process.stdout, stderr: process.stderr };
5202
+ const code = await runWearablesCliCommand(orchestrator.getWearablesService(), argv, io);
5203
+ if (argv[0] === "sync" && code === 0 && orchestrator.config.meetings.enabled) { // drain debounced build
5204
+ await (await orchestrator.getMeetingsService()).flushBuilds();
5205
+ }
5205
5206
  if (code !== 0) process.exitCode = code;
5206
5207
  };
5207
5208
  const stringOpt = (options: Record<string, unknown>, key: string, flag: string): string[] =>
@@ -6230,7 +6231,7 @@ export function registerCli(
6230
6231
 
6231
6232
  registerResearchStatusCommands(cmd, orchestrator);
6232
6233
 
6233
- registerCreationLedgerCommands(cmd, orchestrator);
6234
+ registerCreationLedgerCommands(cmd, orchestrator); registerMeetingsCommands(cmd, orchestrator);
6234
6235
 
6235
6236
  cmd
6236
6237
  .command("trust-zone-promote")
@@ -0,0 +1,52 @@
1
+ import type { ExtractionFailureClass } from "./types.js";
2
+ import { isTransientHttpError } from "./connectors/live/transient-errors.js";
3
+
4
+ /**
5
+ * Read a numeric HTTP status off a thrown error without re-implementing the
6
+ * shared transient classifier. Uses `in`/typeof narrowing (no inline casts).
7
+ */
8
+ function httpStatusFromError(err: unknown): number | undefined {
9
+ if (!err || typeof err !== "object") return undefined;
10
+ if ("status" in err && typeof err.status === "number" && Number.isFinite(err.status)) return err.status;
11
+ if ("statusCode" in err && typeof err.statusCode === "number" && Number.isFinite(err.statusCode)) {
12
+ return err.statusCode;
13
+ }
14
+ return undefined;
15
+ }
16
+
17
+ /**
18
+ * Map a thrown extraction error to a coarse failure class for the retry/breaker
19
+ * layer. 401/403 → `auth_config` (misconfigured provider, open the breaker);
20
+ * transient (429/5xx/network, per the shared `isTransientHttpError`) → back off;
21
+ * anything else defaults to `provider_retryable` (fail-open toward retry, but
22
+ * capped by the per-fingerprint attempt budget). Never throws.
23
+ */
24
+ export function classifyExtractionThrownError(err: unknown): ExtractionFailureClass {
25
+ try {
26
+ const status = httpStatusFromError(err);
27
+ if (status === 401 || status === 403) return "auth_config";
28
+ if (isTransientHttpError(err)) return "provider_retryable";
29
+ return "provider_retryable";
30
+ } catch {
31
+ return "provider_retryable";
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Map the gateway fallback's discriminated parse-failure reason to a coarse
37
+ * extraction failure class. "no models configured" is an auth/config problem;
38
+ * an HTTP/transport failure backs off; an unparseable-but-present response is a
39
+ * genuine empty-parse.
40
+ */
41
+ export function classifyFallbackParseFailure(
42
+ reason: "no_models" | "empty" | "http_error",
43
+ ): ExtractionFailureClass {
44
+ switch (reason) {
45
+ case "no_models":
46
+ return "auth_config";
47
+ case "http_error":
48
+ return "provider_retryable";
49
+ case "empty":
50
+ return "parse_empty";
51
+ }
52
+ }
package/src/extraction.ts CHANGED
@@ -40,7 +40,8 @@ import { normalizeProcedureSteps } from "./procedural/procedure-types.js";
40
40
  import { normalizeReasoningTrace } from "./reasoning-trace-types.js";
41
41
  import { looksLikeMechanicalTelemetryTranscript } from "./telemetry-transcript.js";
42
42
  import { buildFactProvenance, type ProvenanceTurnInput } from "./provenance.js";
43
- import { isTransientHttpError } from "./connectors/live/transient-errors.js";
43
+ import { classifyExtractionThrownError, classifyFallbackParseFailure } from "./extraction-error-classification.js";
44
+ export { classifyExtractionThrownError, classifyFallbackParseFailure } from "./extraction-error-classification.js";
44
45
  import { resolvePipelineProcessingCapabilities } from "./capabilities.js";
45
46
  import { resolveMemoryLifecycleCapabilities,
46
47
  resolveLocalLlmCapabilities,resolveRecallAuxiliaryCapabilities } from "./capabilities.js";
@@ -50,55 +51,6 @@ type ExtractedFactResult = ExtractionResult["facts"][number];
50
51
  type ExtractedEntityResult = ExtractionResult["entities"][number];
51
52
  type ExtractedRelationshipResult = NonNullable<ExtractionResult["relationships"]>[number];
52
53
 
53
- /**
54
- * Read a numeric HTTP status off a thrown error without re-implementing the
55
- * shared transient classifier. Uses `in`/typeof narrowing (no inline casts).
56
- */
57
- function httpStatusFromError(err: unknown): number | undefined {
58
- if (!err || typeof err !== "object") return undefined;
59
- if ("status" in err && typeof err.status === "number" && Number.isFinite(err.status)) return err.status;
60
- if ("statusCode" in err && typeof err.statusCode === "number" && Number.isFinite(err.statusCode)) {
61
- return err.statusCode;
62
- }
63
- return undefined;
64
- }
65
-
66
- /**
67
- * Map a thrown extraction error to a coarse failure class for the retry/breaker
68
- * layer. 401/403 → `auth_config` (misconfigured provider, open the breaker);
69
- * transient (429/5xx/network, per the shared `isTransientHttpError`) → back off;
70
- * anything else defaults to `provider_retryable` (fail-open toward retry, but
71
- * capped by the per-fingerprint attempt budget). Never throws.
72
- */
73
- export function classifyExtractionThrownError(err: unknown): ExtractionFailureClass {
74
- try {
75
- const status = httpStatusFromError(err);
76
- if (status === 401 || status === 403) return "auth_config";
77
- if (isTransientHttpError(err)) return "provider_retryable";
78
- return "provider_retryable";
79
- } catch {
80
- return "provider_retryable";
81
- }
82
- }
83
-
84
- /**
85
- * Map the gateway fallback's discriminated parse-failure reason to a coarse
86
- * extraction failure class. "no models configured" is an auth/config problem;
87
- * an HTTP/transport failure backs off; an unparseable-but-present response is a
88
- * genuine empty-parse.
89
- */
90
- export function classifyFallbackParseFailure(
91
- reason: "no_models" | "empty" | "http_error",
92
- ): ExtractionFailureClass {
93
- switch (reason) {
94
- case "no_models":
95
- return "auth_config";
96
- case "http_error":
97
- return "provider_retryable";
98
- case "empty":
99
- return "parse_empty";
100
- }
101
- }
102
54
  const PROACTIVE_MIN_CONFIDENCE = 0.8;
103
55
  const CONSOLIDATION_RESPONSE_SCHEMA = `{
104
56
  "items": [
@@ -21,6 +21,8 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
21
21
  transcript_day: true,
22
22
  transcript_search: true,
23
23
  transcript_memories: true,
24
+ meetings_list: true,
25
+ meetings_get: true,
24
26
  action_confidence: true,
25
27
  capsule_list: true,
26
28
  procedural_stats: true,