@remnic/core 9.54.4 → 9.54.6

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 (648) hide show
  1. package/dist/access-admin-ops-surface.d.ts +24 -23
  2. package/dist/access-admin-ops-surface.js +55 -50
  3. package/dist/access-authorization-probe.d.ts +25 -22
  4. package/dist/access-authorization-probe.js +58 -51
  5. package/dist/access-boundary.d.ts +26 -23
  6. package/dist/access-boundary.js +59 -52
  7. package/dist/access-cli.js +115 -107
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +19 -18
  11. package/dist/access-extraction-force-flush.js +55 -50
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +22 -21
  14. package/dist/access-http-lifecycle-flush.d.ts +22 -21
  15. package/dist/access-http-offline-stream.d.ts +19 -18
  16. package/dist/access-http-query.js +55 -50
  17. package/dist/access-http.d.ts +55 -36
  18. package/dist/access-http.js +76 -65
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +55 -50
  21. package/dist/access-lcm-surface.d.ts +21 -20
  22. package/dist/access-lcm-surface.js +55 -50
  23. package/dist/access-mcp.d.ts +22 -21
  24. package/dist/access-mcp.js +63 -57
  25. package/dist/access-memory-search-fanout.d.ts +22 -2
  26. package/dist/access-memory-search-fanout.js +1 -1
  27. package/dist/{access-namespace-preflight-C7n4tgWC.d.ts → access-namespace-preflight-CCNn_6NE.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +55 -50
  30. package/dist/access-observe-write-surface.d.ts +22 -21
  31. package/dist/access-observe-write-surface.js +55 -50
  32. package/dist/access-offline-manifest.d.ts +10 -9
  33. package/dist/access-offline-manifest.js +12 -10
  34. package/dist/access-operations-batch.js +57 -52
  35. package/dist/access-operations.d.ts +23 -22
  36. package/dist/access-operations.js +61 -55
  37. package/dist/access-recall-concurrency.d.ts +21 -20
  38. package/dist/access-recall-concurrency.js +55 -50
  39. package/dist/access-recall-response.d.ts +19 -18
  40. package/dist/access-recall-response.js +55 -50
  41. package/dist/access-recall-surface.d.ts +19 -18
  42. package/dist/access-recall-surface.js +55 -50
  43. package/dist/access-schema.d.ts +2 -2
  44. package/dist/access-schema.js +5 -4
  45. package/dist/{access-service-CXvbxLK-.d.ts → access-service-DkSdXK4S.d.ts} +1314 -83
  46. package/dist/access-service-helpers.d.ts +22 -21
  47. package/dist/access-service.d.ts +31 -30
  48. package/dist/access-service.js +55 -50
  49. package/dist/access-surface-catalog.d.ts +22 -21
  50. package/dist/access-surface-catalog.js +209 -2
  51. package/dist/access-surface-catalog.js.map +1 -1
  52. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  53. package/dist/action-confidence.d.ts +1 -1
  54. package/dist/active-memory-bridge.d.ts +14 -1
  55. package/dist/active-memory-bridge.js +6 -1
  56. package/dist/active-recall.d.ts +1 -1
  57. package/dist/active-recall.js +4 -2
  58. package/dist/active-recall.js.map +1 -1
  59. package/dist/adapters/index.js +7 -7
  60. package/dist/adapters/registry.js +3 -3
  61. package/dist/admin-console/public/what-helps-me/app.js +1594 -0
  62. package/dist/admin-console/public/what-helps-me/index.html +339 -0
  63. package/dist/admin-console/public/what-helps-me/model.js +685 -0
  64. package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
  65. package/dist/ambient-provenance.d.ts +1 -1
  66. package/dist/artifact-search.d.ts +1 -1
  67. package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
  68. package/dist/behavior-learner.d.ts +1 -1
  69. package/dist/behavior-signals.d.ts +1 -1
  70. package/dist/bootstrap.d.ts +9 -9
  71. package/dist/briefing.d.ts +2 -2
  72. package/dist/briefing.js +33 -12
  73. package/dist/buffer-surprise-report.d.ts +1 -1
  74. package/dist/buffer-turn-helpers.d.ts +1 -1
  75. package/dist/buffer.d.ts +2 -2
  76. package/dist/buffer.js +3 -3
  77. package/dist/bulk-import/index.d.ts +3 -3
  78. package/dist/calibration.d.ts +1 -1
  79. package/dist/calibration.js +1 -1
  80. package/dist/capabilities.d.ts +1 -1
  81. package/dist/{catalog-BOOxl-I2.d.ts → catalog-DGFf8mD9.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -1
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +34 -13
  85. package/dist/causal-consolidation.js.map +1 -1
  86. package/dist/causal-trajectory-graph.d.ts +1 -1
  87. package/dist/{chunk-ZYLC7NFO.js → chunk-26ZXBTYN.js} +4 -4
  88. package/dist/chunk-26ZXBTYN.js.map +1 -0
  89. package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
  90. package/dist/{chunk-3CSX3ETE.js → chunk-2LWQSV6A.js} +23 -11
  91. package/dist/chunk-2LWQSV6A.js.map +1 -0
  92. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  93. package/dist/chunk-37DZZFFM.js +502 -0
  94. package/dist/chunk-37DZZFFM.js.map +1 -0
  95. package/dist/chunk-3HSRWJTC.js +9 -0
  96. package/dist/chunk-3HSRWJTC.js.map +1 -0
  97. package/dist/{chunk-XUAMCLY4.js → chunk-3TIZPSJC.js} +17 -13
  98. package/dist/chunk-3TIZPSJC.js.map +1 -0
  99. package/dist/{chunk-PDDTI7IC.js → chunk-43SEBY2M.js} +1 -1
  100. package/dist/{chunk-HWRD23DW.js → chunk-46SZBVDS.js} +3 -3
  101. package/dist/{chunk-6HPHEFXT.js → chunk-5FD7JMTX.js} +2 -2
  102. package/dist/{chunk-7BZOBA5J.js → chunk-5NB726GV.js} +70 -16
  103. package/dist/chunk-5NB726GV.js.map +1 -0
  104. package/dist/chunk-62OKGIJA.js +39 -0
  105. package/dist/chunk-62OKGIJA.js.map +1 -0
  106. package/dist/{chunk-IBKR2TFR.js → chunk-6CYHUWCO.js} +2 -2
  107. package/dist/{chunk-YN6ASZUG.js → chunk-6QPI2ITJ.js} +5 -5
  108. package/dist/{chunk-UU3G6GUP.js → chunk-76JJSXK7.js} +1 -1
  109. package/dist/chunk-76JJSXK7.js.map +1 -0
  110. package/dist/{chunk-PX2LSHYM.js → chunk-7BD6O7ZV.js} +189 -4
  111. package/dist/chunk-7BD6O7ZV.js.map +1 -0
  112. package/dist/chunk-7TBXNYLO.js +346 -0
  113. package/dist/chunk-7TBXNYLO.js.map +1 -0
  114. package/dist/{chunk-NH5IR2WM.js → chunk-BRR5EUTF.js} +6 -2
  115. package/dist/chunk-BRR5EUTF.js.map +1 -0
  116. package/dist/{chunk-NIS256NW.js → chunk-CIAI24TQ.js} +3 -3
  117. package/dist/{chunk-T2JHZWH6.js → chunk-D3LBIUWV.js} +11703 -7573
  118. package/dist/chunk-D3LBIUWV.js.map +1 -0
  119. package/dist/{chunk-7FGL6CGA.js → chunk-DVYRD4HY.js} +2 -2
  120. package/dist/{chunk-G7Z6EENO.js → chunk-EKTP7MNS.js} +4 -4
  121. package/dist/{chunk-S75M5ZRK.js → chunk-F2JRDPON.js} +16 -1
  122. package/dist/chunk-F2JRDPON.js.map +1 -0
  123. package/dist/{chunk-RZ4XGKOJ.js → chunk-FFRTNF3L.js} +8 -8
  124. package/dist/{chunk-VKXWK44Q.js → chunk-FONWBCVY.js} +3 -3
  125. package/dist/{chunk-DZD576ZU.js → chunk-FPLM2TKD.js} +2 -2
  126. package/dist/{chunk-ZPJ4QSGP.js → chunk-FTPONF6B.js} +2 -2
  127. package/dist/{chunk-LJS7KUPV.js → chunk-FWX7W5PM.js} +2 -2
  128. package/dist/{chunk-UTRO5UJU.js → chunk-G6DFSS6A.js} +5 -1
  129. package/dist/chunk-G6DFSS6A.js.map +1 -0
  130. package/dist/{chunk-6LAPLZOS.js → chunk-GJ776BC2.js} +8 -3
  131. package/dist/chunk-GJ776BC2.js.map +1 -0
  132. package/dist/{chunk-G4T7L557.js → chunk-GN3WRFJY.js} +6 -6
  133. package/dist/{chunk-QT2FRYI4.js → chunk-H7NAZ3UB.js} +2 -2
  134. package/dist/{chunk-APPFNGX6.js → chunk-HBUFQRIM.js} +2 -2
  135. package/dist/{chunk-UU7TRFNE.js → chunk-HGJ6NJ4E.js} +2 -2
  136. package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
  137. package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
  138. package/dist/{chunk-UES4BHA2.js → chunk-I3MSGFGD.js} +17 -6
  139. package/dist/chunk-I3MSGFGD.js.map +1 -0
  140. package/dist/{chunk-C4ZNGVK3.js → chunk-IKP5OYQQ.js} +2 -2
  141. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  142. package/dist/{chunk-RDJRFDJY.js → chunk-IQ4NVWEF.js} +2 -2
  143. package/dist/{chunk-CGVHPCP2.js → chunk-JYG4OLWH.js} +2 -2
  144. package/dist/{chunk-WOPA3SGI.js → chunk-K26NWEOC.js} +8 -8
  145. package/dist/{chunk-K4QS7LXU.js → chunk-K2UGPTYY.js} +485 -44
  146. package/dist/chunk-K2UGPTYY.js.map +1 -0
  147. package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
  148. package/dist/chunk-KFBOPMF6.js.map +1 -0
  149. package/dist/{chunk-G7A5HLUS.js → chunk-KJH6W2I7.js} +2 -2
  150. package/dist/{chunk-IXEBUYO4.js → chunk-KM55SMLG.js} +11 -2
  151. package/dist/{chunk-IXEBUYO4.js.map → chunk-KM55SMLG.js.map} +1 -1
  152. package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
  153. package/dist/chunk-LC2BDILZ.js +57 -0
  154. package/dist/chunk-LC2BDILZ.js.map +1 -0
  155. package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
  156. package/dist/{chunk-6R4G7N4S.js → chunk-M4YHAODQ.js} +388 -748
  157. package/dist/chunk-M4YHAODQ.js.map +1 -0
  158. package/dist/{chunk-3JLPGJ43.js → chunk-MIH3CJPN.js} +5 -5
  159. package/dist/{chunk-QHFV6VNU.js → chunk-MK5VEWCR.js} +2 -2
  160. package/dist/chunk-NISZQW72.js +140 -0
  161. package/dist/chunk-NISZQW72.js.map +1 -0
  162. package/dist/{chunk-GUKBW4HL.js → chunk-NQMSEB5D.js} +6 -6
  163. package/dist/{chunk-G2LUMAUF.js → chunk-OCIP6YMD.js} +12 -5
  164. package/dist/chunk-OCIP6YMD.js.map +1 -0
  165. package/dist/{chunk-47P3RYZP.js → chunk-PG4QBPVG.js} +21 -11
  166. package/dist/chunk-PG4QBPVG.js.map +1 -0
  167. package/dist/{chunk-WRJVB3C2.js → chunk-PO7NXBG2.js} +2 -2
  168. package/dist/{chunk-QWGE2PUH.js → chunk-PT54WISF.js} +190 -56
  169. package/dist/chunk-PT54WISF.js.map +1 -0
  170. package/dist/{chunk-AZM4CCAC.js → chunk-QZLDRQ4I.js} +8 -8
  171. package/dist/{chunk-THPPCISA.js → chunk-RBII7637.js} +5 -5
  172. package/dist/{chunk-JDZPNCMA.js → chunk-RUNORG2P.js} +6 -3
  173. package/dist/chunk-RUNORG2P.js.map +1 -0
  174. package/dist/{chunk-JV5YUBIZ.js → chunk-RZQ6W2W4.js} +50 -44
  175. package/dist/chunk-RZQ6W2W4.js.map +1 -0
  176. package/dist/{chunk-RUMNY5DT.js → chunk-SMNYAMJD.js} +6 -2
  177. package/dist/chunk-SMNYAMJD.js.map +1 -0
  178. package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
  179. package/dist/chunk-TB6CBZ5V.js.map +1 -0
  180. package/dist/{chunk-VMMQDEN5.js → chunk-TO7ZTWJW.js} +2 -2
  181. package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
  182. package/dist/{chunk-HLYR2TQL.js → chunk-UCTS3DDH.js} +2 -2
  183. package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
  184. package/dist/{chunk-WM65LU67.js → chunk-UKYS3NU5.js} +2 -2
  185. package/dist/{chunk-WDBX6VER.js → chunk-UPLZNJKN.js} +5 -5
  186. package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
  187. package/dist/chunk-UW5NPZJ2.js.map +1 -0
  188. package/dist/{chunk-2GFK22OZ.js → chunk-V6ERBR7U.js} +2 -2
  189. package/dist/{chunk-CYF6WVE7.js → chunk-W5ZKPI34.js} +139 -158
  190. package/dist/chunk-W5ZKPI34.js.map +1 -0
  191. package/dist/chunk-XX4HPFFM.js +370 -0
  192. package/dist/chunk-XX4HPFFM.js.map +1 -0
  193. package/dist/{chunk-ZMYDYNI4.js → chunk-XZHE2DEN.js} +4 -4
  194. package/dist/chunk-YXQEKCZM.js +223 -0
  195. package/dist/chunk-YXQEKCZM.js.map +1 -0
  196. package/dist/{chunk-GYPQL6XN.js → chunk-Z4N7SVVF.js} +35 -47
  197. package/dist/chunk-Z4N7SVVF.js.map +1 -0
  198. package/dist/{chunk-MAXVH44E.js → chunk-Z54EM5YZ.js} +7 -7
  199. package/dist/{chunk-YGLY6QFV.js → chunk-ZRZVLB7O.js} +2 -2
  200. package/dist/{chunk-4IIFL7GC.js → chunk-ZUKIUXHQ.js} +10 -10
  201. package/dist/{cli-DVUFIa5E.d.ts → cli-Bze8S0Qs.d.ts} +5 -5
  202. package/dist/cli.d.ts +22 -21
  203. package/dist/cli.js +90 -80
  204. package/dist/coding/pre-action-gate.d.ts +1 -1
  205. package/dist/compounding/engine.d.ts +2 -2
  206. package/dist/compounding/engine.js +33 -12
  207. package/dist/compounding/preference-consolidator.d.ts +1 -1
  208. package/dist/compression-optimizer.d.ts +1 -1
  209. package/dist/config.d.ts +1 -1
  210. package/dist/config.js +4 -2
  211. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  212. package/dist/connectors/codex-materialize-runner.js +33 -12
  213. package/dist/connectors/codex-materialize.d.ts +1 -1
  214. package/dist/connectors/index.d.ts +1 -1
  215. package/dist/connectors/index.js +32 -12
  216. package/dist/consolidation-provenance-check.d.ts +2 -2
  217. package/dist/consolidation-undo.d.ts +2 -2
  218. package/dist/contradiction/index.d.ts +2 -2
  219. package/dist/contradiction/index.js +3 -1
  220. package/dist/contradiction-scan-JDTBXRGW.js +20 -0
  221. package/dist/converge-config.d.ts +1 -1
  222. package/dist/convergence-refresh.d.ts +2 -2
  223. package/dist/convergence-refresh.js +35 -14
  224. package/dist/conversation-index/backend.d.ts +1 -1
  225. package/dist/conversation-index/backend.js +2 -2
  226. package/dist/conversation-index/chunker.d.ts +1 -1
  227. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  228. package/dist/conversation-index/indexer.d.ts +1 -1
  229. package/dist/conversation-index/search.d.ts +1 -1
  230. package/dist/corpus-watermark.d.ts +1 -1
  231. package/dist/corpus-watermark.js +25 -24
  232. package/dist/day-summary.d.ts +1 -1
  233. package/dist/delinearize.d.ts +1 -1
  234. package/dist/dependency-propagation-config.d.ts +1 -1
  235. package/dist/{dependency-propagation-delivery-XzF76C9n.d.ts → dependency-propagation-delivery-CzEfB31P.d.ts} +1 -1
  236. package/dist/direct-answer-wiring.d.ts +1 -1
  237. package/dist/direct-answer.d.ts +1 -1
  238. package/dist/embedding-fallback.d.ts +1 -1
  239. package/dist/enrichment/index.d.ts +1 -1
  240. package/dist/entity-retrieval.d.ts +2 -2
  241. package/dist/entity-retrieval.js +33 -12
  242. package/dist/entity-schema.d.ts +1 -1
  243. package/dist/explicit-capture.d.ts +9 -9
  244. package/dist/explicit-capture.js +7 -4
  245. package/dist/external-wiki-access.d.ts +22 -21
  246. package/dist/external-wiki-access.js +56 -51
  247. package/dist/external-wiki-collection-registration.d.ts +1 -1
  248. package/dist/external-wiki-collection.d.ts +1 -1
  249. package/dist/external-wiki-mcp-tools.d.ts +22 -21
  250. package/dist/extraction-error-classification.d.ts +1 -1
  251. package/dist/extraction-faithfulness.d.ts +1 -1
  252. package/dist/extraction-faithfulness.js +2 -2
  253. package/dist/extraction-judge-telemetry.d.ts +1 -1
  254. package/dist/extraction-judge-training.d.ts +1 -1
  255. package/dist/extraction-judge.d.ts +1 -1
  256. package/dist/extraction-judge.js +2 -2
  257. package/dist/extraction-liveness.d.ts +1 -1
  258. package/dist/extraction-normalization.d.ts +1 -1
  259. package/dist/extraction-prompt.d.ts +1 -1
  260. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  261. package/dist/extraction-source-grounding.d.ts +1 -1
  262. package/dist/extraction.d.ts +1 -1
  263. package/dist/extraction.js +35 -19
  264. package/dist/fallback-llm.d.ts +14 -1
  265. package/dist/fallback-llm.js +1 -1
  266. package/dist/{first-start-migration-626C5554.js → first-start-migration-CRZCZAJN.js} +11 -3
  267. package/dist/first-start-migration-CRZCZAJN.js.map +1 -0
  268. package/dist/graph-dashboard-diff.d.ts +1 -1
  269. package/dist/graph-dashboard-key.d.ts +1 -1
  270. package/dist/graph-dashboard-parser.d.ts +1 -1
  271. package/dist/graph-edge-reinforcement.d.ts +1 -1
  272. package/dist/graph-path-reconstruction.d.ts +1 -1
  273. package/dist/graph-path-scoring.d.ts +1 -1
  274. package/dist/graph-snapshot.d.ts +1 -1
  275. package/dist/graph.d.ts +1 -1
  276. package/dist/harmonic-retrieval.js +1 -1
  277. package/dist/importance.d.ts +1 -1
  278. package/dist/importers/index.d.ts +1 -1
  279. package/dist/in-flight-reads.d.ts +1 -1
  280. package/dist/index.d.ts +314 -308
  281. package/dist/index.js +304 -133
  282. package/dist/inline-script.d.ts +3 -0
  283. package/dist/inline-script.js +8 -0
  284. package/dist/inline-script.js.map +1 -0
  285. package/dist/intent.d.ts +1 -1
  286. package/dist/lcm/engine.d.ts +1 -1
  287. package/dist/lcm/engine.js +3 -3
  288. package/dist/lcm/index.d.ts +1 -1
  289. package/dist/lcm/index.js +6 -6
  290. package/dist/lcm/tools.d.ts +1 -1
  291. package/dist/lifecycle.d.ts +1 -1
  292. package/dist/live-connectors-runner.d.ts +1 -1
  293. package/dist/local-llm.d.ts +2 -1
  294. package/dist/local-llm.js +2 -2
  295. package/dist/local-model-endpoint.d.ts +1 -1
  296. package/dist/maintenance/memory-governance.d.ts +1 -1
  297. package/dist/maintenance/memory-governance.js +33 -12
  298. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  299. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -12
  300. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  301. package/dist/maintenance/rebuild-memory-projection.js +34 -13
  302. package/dist/{maintenance-BJzNIKBE.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
  303. package/dist/mcp-memory-inspector-app.d.ts +22 -21
  304. package/dist/mcp-read-only-tools.js +1 -1
  305. package/dist/memory-action-policy.d.ts +1 -1
  306. package/dist/memory-cache.d.ts +1 -1
  307. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  308. package/dist/memory-projection-mutations.js +2 -2
  309. package/dist/memory-projection-store.d.ts +6 -2
  310. package/dist/memory-projection-store.js +1 -1
  311. package/dist/memory-provenance.d.ts +1 -1
  312. package/dist/memory-snapshot.d.ts +1 -1
  313. package/dist/memory-worth-outcomes.d.ts +2 -2
  314. package/dist/models-json.d.ts +1 -1
  315. package/dist/namespaces/migrate.d.ts +3 -3
  316. package/dist/namespaces/migrate.js +24 -23
  317. package/dist/namespaces/principal.d.ts +1 -1
  318. package/dist/namespaces/search.d.ts +1 -1
  319. package/dist/namespaces/search.js +8 -8
  320. package/dist/namespaces/storage.d.ts +3 -3
  321. package/dist/namespaces/storage.js +33 -12
  322. package/dist/native-knowledge.d.ts +1 -1
  323. package/dist/offline-sync-file-io.d.ts +20 -0
  324. package/dist/offline-sync-file-io.js +18 -0
  325. package/dist/offline-sync-file-io.js.map +1 -0
  326. package/dist/offline-sync-impression-drain.d.ts +1 -1
  327. package/dist/offline-sync-impression-drain.js +5 -5
  328. package/dist/offline-sync.d.ts +8 -6
  329. package/dist/offline-sync.js +2 -1
  330. package/dist/operator-doctor-corpus.d.ts +1 -1
  331. package/dist/operator-doctor-corpus.js +26 -25
  332. package/dist/operator-doctor-replica.d.ts +1 -1
  333. package/dist/operator-toolkit.d.ts +3 -3
  334. package/dist/operator-toolkit.js +39 -36
  335. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  336. package/dist/orchestration/maintenance.d.ts +4 -4
  337. package/dist/orchestration/maintenance.js +38 -18
  338. package/dist/{orchestrator-BiXgBJBQ.d.ts → orchestrator-D85CzDDY.d.ts} +11 -8
  339. package/dist/orchestrator.d.ts +9 -9
  340. package/dist/orchestrator.js +117 -109
  341. package/dist/patterns-cli.d.ts +1 -1
  342. package/dist/{pipeline-sz_dcuLg.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
  343. package/dist/policy-runtime.d.ts +1 -1
  344. package/dist/proactive-contention.d.ts +1 -1
  345. package/dist/provenance.d.ts +1 -1
  346. package/dist/public-http-D-SyWNj6.d.ts +25 -0
  347. package/dist/{purge-533FZLS4.js → purge-GB7PZHT2.js} +2 -2
  348. package/dist/{qmd-eAWObK4M.d.ts → qmd-dFCHp1r0.d.ts} +1 -1
  349. package/dist/qmd-preflight.d.ts +2 -2
  350. package/dist/qmd-recall-cache.d.ts +1 -1
  351. package/dist/qmd.d.ts +2 -2
  352. package/dist/recall-concurrency-config.d.ts +1 -1
  353. package/dist/recall-disclosure-escalation.d.ts +1 -1
  354. package/dist/recall-explain-renderer.d.ts +1 -1
  355. package/dist/recall-explain-renderer.js +3 -3
  356. package/dist/recall-memory-map.d.ts +1 -1
  357. package/dist/recall-planner-llm.d.ts +1 -1
  358. package/dist/recall-planner-llm.js +1 -1
  359. package/dist/recall-state.d.ts +1 -1
  360. package/dist/recall-tag-filter.d.ts +1 -1
  361. package/dist/recall-timings.d.ts +1 -1
  362. package/dist/recall-xray-cli.d.ts +1 -1
  363. package/dist/recall-xray-cli.js +4 -4
  364. package/dist/recall-xray-renderer.d.ts +1 -1
  365. package/dist/recall-xray-renderer.js +3 -3
  366. package/dist/recall-xray.d.ts +1 -1
  367. package/dist/recall-xray.js +2 -2
  368. package/dist/reconcile/cursor.d.ts +2 -1
  369. package/dist/reconcile/manifest.d.ts +2 -1
  370. package/dist/reconcile/manifest.js +6 -5
  371. package/dist/reconcile/plan.d.ts +2 -1
  372. package/dist/reconcile/plan.js +3 -2
  373. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  374. package/dist/replay/normalizers/claude.d.ts +1 -1
  375. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  376. package/dist/replay/normalizers/shared.d.ts +1 -1
  377. package/dist/replay/runner.d.ts +1 -1
  378. package/dist/replay/types.d.ts +1 -1
  379. package/dist/replica-divergence.d.ts +1 -1
  380. package/dist/replica-peers-config.d.ts +1 -1
  381. package/dist/resolve-auth-token.d.ts +1 -1
  382. package/dist/resume-bundles.js +5 -3
  383. package/dist/retrieval-agents.d.ts +2 -2
  384. package/dist/retrieval-tiers.d.ts +1 -1
  385. package/dist/routing/engine.d.ts +1 -1
  386. package/dist/routing/store.d.ts +1 -1
  387. package/dist/salvage-envelope.d.ts +1 -1
  388. package/dist/schemas.d.ts +38 -38
  389. package/dist/{scope-profiles-BBQsXuyj.d.ts → scope-profiles-DICK7GtN.d.ts} +1 -1
  390. package/dist/search/embed-helper.d.ts +1 -1
  391. package/dist/search/factory.d.ts +1 -1
  392. package/dist/search/factory.js +6 -6
  393. package/dist/search/index.d.ts +1 -1
  394. package/dist/search/index.js +12 -12
  395. package/dist/search/lancedb-backend.d.ts +1 -1
  396. package/dist/search/meilisearch-backend.d.ts +1 -1
  397. package/dist/search/noop-backend.d.ts +1 -1
  398. package/dist/search/orama-backend.d.ts +1 -1
  399. package/dist/search/port.d.ts +1 -1
  400. package/dist/search/remote-backend.d.ts +1 -1
  401. package/dist/{semantic-consolidation-HD8RkzVA.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
  402. package/dist/semantic-consolidation.d.ts +2 -2
  403. package/dist/semantic-consolidation.js +34 -13
  404. package/dist/semantic-rule-promotion.js +33 -12
  405. package/dist/semantic-rule-verifier.d.ts +1 -1
  406. package/dist/semantic-rule-verifier.js +33 -12
  407. package/dist/{service-DIrtHHEg.d.ts → service-DT-pJyda.d.ts} +660 -660
  408. package/dist/session-observer-bands.d.ts +1 -1
  409. package/dist/session-observer-state.d.ts +1 -1
  410. package/dist/shared-context/manager.d.ts +1 -1
  411. package/dist/signal.d.ts +1 -1
  412. package/dist/source-agent-qualifier.d.ts +1 -1
  413. package/dist/source-agent-qualifier.js +31 -15
  414. package/dist/{storage-DqCzXi56.d.ts → storage-qOnaJ1Lw.d.ts} +49 -13
  415. package/dist/storage.d.ts +2 -2
  416. package/dist/storage.js +33 -12
  417. package/dist/summarizer.d.ts +1 -1
  418. package/dist/summarizer.js +5 -5
  419. package/dist/summary-snapshot.d.ts +1 -1
  420. package/dist/support-passport/index.d.ts +518 -0
  421. package/dist/support-passport/index.js +357 -0
  422. package/dist/support-passport/index.js.map +1 -0
  423. package/dist/temporal-supersession.d.ts +2 -2
  424. package/dist/temporal-timeline-recall.d.ts +1 -1
  425. package/dist/temporal-validity.d.ts +1 -1
  426. package/dist/threading.d.ts +1 -1
  427. package/dist/tier-migration.d.ts +2 -2
  428. package/dist/tier-routing.d.ts +2 -2
  429. package/dist/tier-routing.js +7 -1
  430. package/dist/{tier-stats-2JCZYEF7.js → tier-stats-EXYSKSVN.js} +8 -2
  431. package/dist/{tier-stats-2JCZYEF7.js.map → tier-stats-EXYSKSVN.js.map} +1 -1
  432. package/dist/topics.d.ts +1 -1
  433. package/dist/transcript.d.ts +1 -1
  434. package/dist/transfer/autodetect.js +1 -1
  435. package/dist/transfer/backup.js +1 -1
  436. package/dist/transfer/capsule-export.js +2 -2
  437. package/dist/transfer/types.d.ts +36 -36
  438. package/dist/trust-score-stage.d.ts +1 -1
  439. package/dist/trust-score.d.ts +1 -1
  440. package/dist/{types-d_j4vC6N.d.ts → types-ed-SvS2t.d.ts} +8 -1
  441. package/dist/types.d.ts +1 -1
  442. package/dist/types.js +1 -1
  443. package/dist/utility-runtime.d.ts +2 -2
  444. package/dist/verified-recall.js +33 -12
  445. package/dist/write-envelope.d.ts +1 -1
  446. package/dist/write-rate-limiter.d.ts +11 -5
  447. package/dist/write-rate-limiter.js +1 -1
  448. package/package.json +12 -2
  449. package/scripts/build-with-heap.mjs +11 -1
  450. package/src/access-authorization-probe.ts +20 -2
  451. package/src/access-boundary.ts +32 -0
  452. package/src/access-http.test.ts +1971 -643
  453. package/src/access-http.ts +81 -74
  454. package/src/access-mcp.ts +3 -1
  455. package/src/access-memory-search-fanout.ts +24 -1
  456. package/src/access-offline-manifest.ts +5 -0
  457. package/src/access-operations.ts +2 -0
  458. package/src/access-service-namespace.test.ts +14 -0
  459. package/src/access-service-observe-scope.test.ts +2 -0
  460. package/src/access-service-offline-file-content.test.ts +211 -0
  461. package/src/access-service.ts +628 -884
  462. package/src/access-surface-catalog.test.ts +40 -10
  463. package/src/access-surface-catalog.ts +15 -0
  464. package/src/active-memory-bridge.test.ts +151 -0
  465. package/src/active-memory-bridge.ts +95 -21
  466. package/src/briefing.test.ts +38 -0
  467. package/src/briefing.ts +3 -3
  468. package/src/cli.ts +6 -1
  469. package/src/config.ts +18 -9
  470. package/src/connectors/codex-materialize-runner.ts +2 -0
  471. package/src/contradiction/contradiction-scan.ts +2 -0
  472. package/src/contradiction/contradiction.test.ts +42 -0
  473. package/src/correction/correction-access-wiring.ts +8 -2
  474. package/src/correction/correction-storage-integration.test.ts +7 -0
  475. package/src/explicit-capture.test.ts +24 -0
  476. package/src/explicit-capture.ts +2 -0
  477. package/src/fallback-llm.test.ts +54 -0
  478. package/src/fallback-llm.ts +54 -9
  479. package/src/index.ts +3 -0
  480. package/src/inline-script.ts +6 -0
  481. package/src/local-llm-headers-timeout.test.ts +42 -0
  482. package/src/local-llm.ts +8 -8
  483. package/src/maintenance/first-start-migration.ts +2 -1
  484. package/src/maintenance/memory-governance.test.ts +25 -0
  485. package/src/maintenance/memory-governance.ts +4 -1
  486. package/src/maintenance/pattern-reinforcement.test.ts +20 -0
  487. package/src/maintenance/pattern-reinforcement.ts +2 -1
  488. package/src/maintenance/rebuild-memory-projection.ts +8 -8
  489. package/src/mcp-read-only-tools.ts +3 -0
  490. package/src/memory-projection-store.ts +25 -27
  491. package/src/offline-sync-file-io.ts +68 -0
  492. package/src/offline-sync.ts +43 -57
  493. package/src/orchestration/consolidation-run.ts +5 -4
  494. package/src/orchestration/contradiction-linking-coordinator.ts +7 -0
  495. package/src/orchestration/contradiction-localization.integration.test.ts +115 -0
  496. package/src/orchestration/lifecycle-policy-coordinator.ts +2 -1
  497. package/src/orchestration/qmd-result-resolver.test.ts +215 -14
  498. package/src/orchestration/qmd-result-resolver.ts +142 -82
  499. package/src/orchestration/recall-search-pipeline.test.ts +41 -0
  500. package/src/orchestration/recall-search-pipeline.ts +12 -0
  501. package/src/orchestration/semantic-consolidation-coordinator.ts +2 -1
  502. package/src/orchestration/tier-migration-coordinator.ts +23 -56
  503. package/src/orchestration/workspace-ops.test.ts +37 -0
  504. package/src/orchestration/workspace-ops.ts +5 -29
  505. package/src/orchestrator.ts +7 -8
  506. package/src/relay/mission-access.test.ts +11 -11
  507. package/src/relay/mission-ui.test.ts +3 -1
  508. package/src/storage/supersession-audit.ts +7 -1
  509. package/src/storage/supersession-side-effects.ts +17 -5
  510. package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
  511. package/src/storage-contract/failure-semantics.test.ts +102 -0
  512. package/src/storage.ts +18 -19
  513. package/src/support-passport/access-http-base.ts +143 -0
  514. package/src/support-passport/access-http.ts +172 -0
  515. package/src/support-passport/access-operations.ts +272 -0
  516. package/src/support-passport/access-service-base.test.ts +193 -0
  517. package/src/support-passport/access-service-base.ts +176 -0
  518. package/src/support-passport/access-surface.test.ts +283 -0
  519. package/src/support-passport/access-surface.ts +286 -0
  520. package/src/support-passport/card-projection.test.ts +137 -0
  521. package/src/support-passport/card-projection.ts +348 -0
  522. package/src/support-passport/card-replacement.ts +126 -0
  523. package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
  524. package/src/support-passport/card-service.test.ts +2964 -0
  525. package/src/support-passport/card-service.ts +1184 -0
  526. package/src/support-passport/card-state.ts +158 -0
  527. package/src/support-passport/config-model-routing.test.ts +37 -0
  528. package/src/support-passport/config.test.ts +34 -0
  529. package/src/support-passport/config.ts +41 -0
  530. package/src/support-passport/contracts.test.ts +156 -0
  531. package/src/support-passport/contracts.ts +149 -0
  532. package/src/support-passport/errors.ts +30 -0
  533. package/src/support-passport/generated-batch.test.ts +185 -0
  534. package/src/support-passport/generated-batch.ts +338 -0
  535. package/src/support-passport/grant-contracts.ts +183 -0
  536. package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
  537. package/src/support-passport/grant-service-cache.test.ts +148 -0
  538. package/src/support-passport/grant-service-cancellation.test.ts +83 -0
  539. package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
  540. package/src/support-passport/grant-service.test.ts +3496 -0
  541. package/src/support-passport/grant-service.ts +513 -0
  542. package/src/support-passport/grant-store-commit-hook.test.ts +123 -0
  543. package/src/support-passport/grant-store-order.test.ts +60 -0
  544. package/src/support-passport/grant-store-path-safety.test.ts +30 -0
  545. package/src/support-passport/grant-store-recovery.test.ts +448 -0
  546. package/src/support-passport/grant-store.ts +906 -0
  547. package/src/support-passport/index.ts +17 -0
  548. package/src/support-passport/mcp-tools.test.ts +222 -0
  549. package/src/support-passport/mcp-tools.ts +187 -0
  550. package/src/support-passport/model-adapter.test.ts +840 -0
  551. package/src/support-passport/model-adapter.ts +602 -0
  552. package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
  553. package/src/support-passport/model-audit.ts +152 -0
  554. package/src/support-passport/model-bridge.test.ts +456 -0
  555. package/src/support-passport/model-bridge.ts +439 -0
  556. package/src/support-passport/model-contracts.ts +124 -0
  557. package/src/support-passport/model-service.test.ts +1731 -0
  558. package/src/support-passport/model-service.ts +399 -0
  559. package/src/support-passport/offline-sync-guard.ts +230 -0
  560. package/src/support-passport/owner-http.test.ts +671 -0
  561. package/src/support-passport/owner-lock.ts +70 -0
  562. package/src/support-passport/private-file.test.ts +99 -0
  563. package/src/support-passport/private-file.ts +498 -0
  564. package/src/support-passport/public-http.test.ts +476 -0
  565. package/src/support-passport/public-http.ts +601 -0
  566. package/src/support-passport/ui.test.ts +181 -0
  567. package/src/tier-routing.ts +28 -17
  568. package/src/training-export/converter.test.ts +24 -0
  569. package/src/training-export/converter.ts +2 -0
  570. package/src/types.ts +8 -1
  571. package/src/wearables/service.test.ts +13 -0
  572. package/src/wearables/service.ts +2 -0
  573. package/src/write-rate-limiter.test.ts +30 -6
  574. package/src/write-rate-limiter.ts +29 -18
  575. package/dist/chunk-3CSX3ETE.js.map +0 -1
  576. package/dist/chunk-47P3RYZP.js.map +0 -1
  577. package/dist/chunk-6LAPLZOS.js.map +0 -1
  578. package/dist/chunk-6R4G7N4S.js.map +0 -1
  579. package/dist/chunk-7BZOBA5J.js.map +0 -1
  580. package/dist/chunk-C23BYTJV.js.map +0 -1
  581. package/dist/chunk-CYF6WVE7.js.map +0 -1
  582. package/dist/chunk-G2LUMAUF.js.map +0 -1
  583. package/dist/chunk-GYPQL6XN.js.map +0 -1
  584. package/dist/chunk-JDZPNCMA.js.map +0 -1
  585. package/dist/chunk-JV5YUBIZ.js.map +0 -1
  586. package/dist/chunk-K4QS7LXU.js.map +0 -1
  587. package/dist/chunk-L6CQ7WIW.js.map +0 -1
  588. package/dist/chunk-MKQBXQKU.js.map +0 -1
  589. package/dist/chunk-NH5IR2WM.js.map +0 -1
  590. package/dist/chunk-PX2LSHYM.js.map +0 -1
  591. package/dist/chunk-QWGE2PUH.js.map +0 -1
  592. package/dist/chunk-RUMNY5DT.js.map +0 -1
  593. package/dist/chunk-S75M5ZRK.js.map +0 -1
  594. package/dist/chunk-T2JHZWH6.js.map +0 -1
  595. package/dist/chunk-UES4BHA2.js.map +0 -1
  596. package/dist/chunk-UTRO5UJU.js.map +0 -1
  597. package/dist/chunk-UU3G6GUP.js.map +0 -1
  598. package/dist/chunk-XUAMCLY4.js.map +0 -1
  599. package/dist/chunk-ZYLC7NFO.js.map +0 -1
  600. package/dist/contradiction-scan-HYLIRMJ2.js +0 -14
  601. package/dist/first-start-migration-626C5554.js.map +0 -1
  602. /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
  603. /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
  604. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  605. /package/dist/{chunk-PDDTI7IC.js.map → chunk-43SEBY2M.js.map} +0 -0
  606. /package/dist/{chunk-HWRD23DW.js.map → chunk-46SZBVDS.js.map} +0 -0
  607. /package/dist/{chunk-6HPHEFXT.js.map → chunk-5FD7JMTX.js.map} +0 -0
  608. /package/dist/{chunk-IBKR2TFR.js.map → chunk-6CYHUWCO.js.map} +0 -0
  609. /package/dist/{chunk-YN6ASZUG.js.map → chunk-6QPI2ITJ.js.map} +0 -0
  610. /package/dist/{chunk-NIS256NW.js.map → chunk-CIAI24TQ.js.map} +0 -0
  611. /package/dist/{chunk-7FGL6CGA.js.map → chunk-DVYRD4HY.js.map} +0 -0
  612. /package/dist/{chunk-G7Z6EENO.js.map → chunk-EKTP7MNS.js.map} +0 -0
  613. /package/dist/{chunk-RZ4XGKOJ.js.map → chunk-FFRTNF3L.js.map} +0 -0
  614. /package/dist/{chunk-VKXWK44Q.js.map → chunk-FONWBCVY.js.map} +0 -0
  615. /package/dist/{chunk-DZD576ZU.js.map → chunk-FPLM2TKD.js.map} +0 -0
  616. /package/dist/{chunk-ZPJ4QSGP.js.map → chunk-FTPONF6B.js.map} +0 -0
  617. /package/dist/{chunk-LJS7KUPV.js.map → chunk-FWX7W5PM.js.map} +0 -0
  618. /package/dist/{chunk-G4T7L557.js.map → chunk-GN3WRFJY.js.map} +0 -0
  619. /package/dist/{chunk-QT2FRYI4.js.map → chunk-H7NAZ3UB.js.map} +0 -0
  620. /package/dist/{chunk-APPFNGX6.js.map → chunk-HBUFQRIM.js.map} +0 -0
  621. /package/dist/{chunk-UU7TRFNE.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
  622. /package/dist/{chunk-C4ZNGVK3.js.map → chunk-IKP5OYQQ.js.map} +0 -0
  623. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  624. /package/dist/{chunk-RDJRFDJY.js.map → chunk-IQ4NVWEF.js.map} +0 -0
  625. /package/dist/{chunk-CGVHPCP2.js.map → chunk-JYG4OLWH.js.map} +0 -0
  626. /package/dist/{chunk-WOPA3SGI.js.map → chunk-K26NWEOC.js.map} +0 -0
  627. /package/dist/{chunk-G7A5HLUS.js.map → chunk-KJH6W2I7.js.map} +0 -0
  628. /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
  629. /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
  630. /package/dist/{chunk-3JLPGJ43.js.map → chunk-MIH3CJPN.js.map} +0 -0
  631. /package/dist/{chunk-QHFV6VNU.js.map → chunk-MK5VEWCR.js.map} +0 -0
  632. /package/dist/{chunk-GUKBW4HL.js.map → chunk-NQMSEB5D.js.map} +0 -0
  633. /package/dist/{chunk-WRJVB3C2.js.map → chunk-PO7NXBG2.js.map} +0 -0
  634. /package/dist/{chunk-AZM4CCAC.js.map → chunk-QZLDRQ4I.js.map} +0 -0
  635. /package/dist/{chunk-THPPCISA.js.map → chunk-RBII7637.js.map} +0 -0
  636. /package/dist/{chunk-VMMQDEN5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
  637. /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
  638. /package/dist/{chunk-HLYR2TQL.js.map → chunk-UCTS3DDH.js.map} +0 -0
  639. /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
  640. /package/dist/{chunk-WM65LU67.js.map → chunk-UKYS3NU5.js.map} +0 -0
  641. /package/dist/{chunk-WDBX6VER.js.map → chunk-UPLZNJKN.js.map} +0 -0
  642. /package/dist/{chunk-2GFK22OZ.js.map → chunk-V6ERBR7U.js.map} +0 -0
  643. /package/dist/{chunk-ZMYDYNI4.js.map → chunk-XZHE2DEN.js.map} +0 -0
  644. /package/dist/{chunk-MAXVH44E.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  645. /package/dist/{chunk-YGLY6QFV.js.map → chunk-ZRZVLB7O.js.map} +0 -0
  646. /package/dist/{chunk-4IIFL7GC.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
  647. /package/dist/{contradiction-scan-HYLIRMJ2.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
  648. /package/dist/{purge-533FZLS4.js.map → purge-GB7PZHT2.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { j as BufferTurn, a5 as ExtractionResult, aq as ImportanceScore, y as MemoryStatus, aZ as WearableConversation, a_ as WearableSourceSettings, a$ as WearableNativeMemory, b0 as WearableMemoryMode, b1 as WearableSourceConnector, b2 as WearablesConfig, b3 as WearableSyncSummary, b4 as WearableSourceStatus, b5 as WearableDayTranscript, aL as FusedWearableConversation, b6 as WearableCorrectionRule, b7 as MeetingBuildInput, b8 as MeetingsConfig, aQ as FusedMeeting, aO as MeetingRecord, b9 as MeetingsDetectionInput, ba as FusionConversationInput, bb as MeetingActivitySnapshot, bc as DetectedMeeting } from './types-d_j4vC6N.js';
2
- import { M as MemoryWriteResult, F as FusionArtifactStore, a as MeetingRecordStore, b as MeetingRecordSummary } from './storage-DqCzXi56.js';
1
+ import { aL as MeetingBuildInput, aM as MeetingsConfig, aN as FusedMeeting, aO as MeetingRecord, aq as ImportanceScore, y as MemoryStatus, aP as MeetingsDetectionInput, aQ as FusionConversationInput, aR as MeetingActivitySnapshot, aS as DetectedMeeting, j as BufferTurn, a5 as ExtractionResult, aT as WearableConversation, aU as WearableSourceSettings, aV as WearableNativeMemory, aW as WearableMemoryMode, aX as WearableSourceConnector, aY as WearablesConfig, aZ as WearableSyncSummary, a_ as WearableSourceStatus, a$ as WearableDayTranscript, b0 as FusedWearableConversation, b1 as WearableCorrectionRule } from './types-ed-SvS2t.js';
2
+ import { M as MemoryWriteResult, a as MeetingRecordStore, b as MeetingRecordSummary, F as FusionArtifactStore } from './storage-qOnaJ1Lw.js';
3
3
  import { SealedMemoryEnvelope } from './write-envelope.js';
4
4
  import { JudgeCandidate, JudgeBatchResult } from './extraction-judge.js';
5
5
 
@@ -59,777 +59,777 @@ declare function distinctSpeakerLabels(sourceId: string, segments: Array<{
59
59
  isWearer?: boolean;
60
60
  }>, registry: SpeakerRegistry): string[];
61
61
 
62
- interface CorroborationContext {
63
- /**
64
- * Same-day transcript bodies from OTHER sources, keyed by source id.
65
- * Pre-tokenized once per sync (day bodies are large).
66
- */
67
- otherSourceDayTokens: Map<string, Set<string>>;
68
- /** Existing active memories: id + content. */
69
- existingMemories: Array<{
70
- id: string;
71
- content: string;
72
- }>;
73
- }
74
-
75
62
  /**
76
- * Wearable memory generation trust-gated extraction from cleaned day
77
- * transcripts.
63
+ * Meeting fusion (issue #1900, Phase 4 slice 2).
78
64
  *
79
- * Wearable ASR quality varies wildly between providers and rooms, so
80
- * unlike live-session extraction this path is gated per source:
65
+ * For a detected meeting window `[startUtc, endUtc)` (half-open, AGENTS.md §23),
66
+ * fuse the concurrent signals into a screen-aware `FusedMeeting`:
81
67
  *
82
- * - memoryMode "off" -> never runs
83
- * - memoryMode "review" -> candidates land with status
84
- * "pending_review" (operator approves via
85
- * the existing review-queue surfaces)
86
- * - memoryMode "auto" -> candidates that pass every gate land
87
- * active
68
+ * 1. Transcript clip every wearable source's segments to the window and run
69
+ * them through the SHARED wearables reconciliation (`fuseCluster`). Higher-
70
+ * `sourceTrust` text wins overlapping regions and the out-voted sources are
71
+ * recorded per segment; this module never re-implements alignment/dedup —
72
+ * the repo rule is "extend the shared fusion module, never fork it".
73
+ * 2. Screen context — other-app foreground dwell within the window, kept only
74
+ * when it lasts `contextDwellSeconds`, plus deduped on-screen text excerpts
75
+ * capped at `maxContextChars`.
76
+ * 3. Attendees — distinct non-wearer speaker labels from the fused transcript
77
+ * (already resolved through the wearables speaker registry upstream).
88
78
  *
89
- * Deterministic gates (applied in order, all modes except "off"):
90
- * 1. category gate — procedure / reasoning_trace candidates are
91
- * skipped (they need richer persistence than
92
- * this path provides)
93
- * 2. confidence floor — `minConfidence`
94
- * 3. importance floor — local `scoreImportance` >= `minImportance`
95
- * 4. dedup — storage content-hash index + intra-run set
96
- * 5. day cap — top `maxMemoriesPerDay` by importance score
97
- * (0 disables the cap)
79
+ * Pure and deterministic: same inputs same `FusedMeeting`.
80
+ */
81
+
82
+ /** Per-run tuning that mirrors the wearables fusion knobs. */
83
+ interface MeetingFusionOptions {
84
+ /** Per-source trust priors handed to reconciliation. */
85
+ sourceTrust?: Record<string, number>;
86
+ /** Max drift (ms) for two segments to align across sources. */
87
+ windowToleranceMs?: number;
88
+ }
89
+ /** Fuse one detected meeting's transcript + screen context into a FusedMeeting. */
90
+ declare function fuseMeeting(input: MeetingBuildInput, config: MeetingsConfig, options?: MeetingFusionOptions): FusedMeeting;
91
+
92
+ /**
93
+ * Meeting memory-generation SEAM (issue #1900 — engine/memory decouple).
98
94
  *
99
- * The extraction engine itself is injected so this module stays free of
100
- * LLM-client construction; callers hand in `orchestrator`-owned or
101
- * standalone engines alike.
95
+ * Engine-layer boundary between the deterministic meeting builder and the
96
+ * memory-generation layer. `MeetingsBuilder` (detect/fuse/store/build) depends
97
+ * ONLY on `MeetingMemoryGenerator` declared here — never on `memory-gen.ts` — so
98
+ * the deterministic engine carries zero dependency on episode/fact generation
99
+ * and ships in its own scope-budgeted PR. The concrete generator lives in
100
+ * `memory-gen.ts` behind `createMeetingMemoryGenerator`, which implements this
101
+ * interface by driving the existing episode/fact/retract logic.
102
102
  */
103
103
 
104
- declare function memoryStatusForMode(mode: WearableMemoryMode): Extract<MemoryStatus, "active" | "pending_review">;
105
- /** Narrow writer interface satisfied by `StorageManager`. */
106
- interface WearableMemoryWriter {
107
- /**
108
- * Sealed-envelope write entry point (issue #1989 PR4): cross-cutting
109
- * fields ride the composed envelope; per-write extras stay explicit.
110
- */
104
+ /**
105
+ * Narrow writer interface satisfied by `StorageManager` — the same sealed
106
+ * write entry point the wearables generator uses, so meeting memories inherit
107
+ * encrypted-at-rest + atomic write + dedup without this module knowing the key.
108
+ */
109
+ interface MeetingMemoryWriter {
111
110
  writeSealedMemory(envelope: SealedMemoryEnvelope, extras: {
112
111
  importance?: ImportanceScore;
113
112
  contentHashSource?: string;
114
113
  status?: MemoryStatus;
115
114
  memoryKind?: "episode" | "note" | "box" | "dream" | "procedural";
116
115
  }): Promise<MemoryWriteResult>;
117
- hasFactContentHash(content: string): Promise<boolean>;
118
- /**
119
- * Locate an earlier wearable write of the same content (any status).
120
- * Optional: enables in-place promotion when re-scoring with stronger
121
- * evidence.
122
- */
123
- findWearableMemoryByContent?(content: string): Promise<{
124
- id: string;
125
- status: MemoryStatus | undefined;
126
- } | null>;
127
116
  /**
128
- * Promote a pending_review wearable memory to active, merging trust
129
- * evidence. Returns false when missing or no longer pending.
117
+ * True when an active/pending memory whose frontmatter `source` equals
118
+ * `source` already carries this exact content. Meeting memories are episodes
119
+ * (`moment`) and decisions/commitments (`decision`/`commitment`) — categories
120
+ * the storage fact-hash index does NOT cover — so idempotency is a
121
+ * source-scoped content scan, mirroring the wearables writer, NOT
122
+ * `hasFactContentHash` (fact-only; always false here → duplicates on rebuild).
130
123
  */
131
- promoteWearableMemory?(id: string, attributeUpdates: Record<string, string>, confidence?: number): Promise<boolean>;
124
+ hasMemoryFromSource(source: string, content: string): Promise<boolean>;
132
125
  /**
133
- * Demote a pending_review wearable memory to rejected on an explicit
134
- * judge-reject re-verdict. Returns false when missing or no longer
135
- * pending. Active rows are never auto-demoted.
126
+ * Retire (invalidate) every memory whose frontmatter `source` equals `source`.
127
+ * Returns the count retired. Used to reconcile away a removed meeting's
128
+ * episode/summary memories so recall never surfaces a meeting `show` can't load.
136
129
  */
137
- demoteWearableMemory?(id: string, attributeUpdates: Record<string, string>): Promise<boolean>;
130
+ retireMemoriesFromSource(source: string): Promise<number>;
138
131
  }
139
- interface WearableMemoryGenDeps {
140
- extract(turns: BufferTurn[]): Promise<ExtractionResult>;
141
- writer: WearableMemoryWriter;
142
- /**
143
- * LLM-as-judge batch evaluation (the existing extraction judge).
144
- * Absent when no judge is wired (degraded smart mode: trust scoring
145
- * runs on confidence x sourceTrust + corroboration alone).
146
- */
147
- judgeFacts?(candidates: JudgeCandidate[]): Promise<JudgeBatchResult>;
148
- /**
149
- * Corroboration evidence for smart mode: other sources' same-day
150
- * transcript tokens + existing active memories. Absent disables
151
- * corroboration boosts.
152
- */
153
- corroboration?: CorroborationContext;
132
+ /** Result of generating episode memories for a day's meetings. */
133
+ interface MeetingEpisodeGenResult {
134
+ /** Episodes newly written. */
135
+ written: number;
136
+ /** Episodes skipped because an identical one already existed. */
137
+ skipped: number;
154
138
  }
155
- interface WearableMemoryGenResult {
156
- created: number;
157
- /**
158
- * Writes the #1579 tombstone chokepoint downgraded to pending_review (no
159
- * active copy). Surfaced distinctly from `created` so sync summaries and
160
- * callers don't count blocked content as successfully created (#1645).
161
- */
162
- tombstoneBlocked: number;
163
- /** Earlier borderline writes promoted to active by new evidence. */
164
- promoted: number;
165
- /** Earlier pending writes retired by a fresh judge-reject verdict. */
166
- demoted: number;
139
+ /** Day-level aggregate of the trust-gated summary/fact layer across records. */
140
+ interface MeetingsDayFactGenResult {
141
+ /** True when the LLM extractor ran for at least one record. */
142
+ llmInvoked: boolean;
143
+ /** Facts written active. */
144
+ active: number;
145
+ /** Facts queued for review (pending_review). */
146
+ review: number;
147
+ /** Candidates/summaries dropped below the trust bar or judge-rejected. */
148
+ dropped: number;
149
+ /** Candidates/summaries skipped because an identical memory already existed. */
167
150
  skipped: number;
168
- skippedByReason: Record<string, number>;
169
- /** Non-fatal problems (e.g. the extraction engine erroring). */
170
- warnings: string[];
171
- /**
172
- * True when every conversation was extracted (the pass may still
173
- * carry degraded-mode warnings, e.g. judge unavailable). False only
174
- * when extraction itself aborted mid-day — the signal callers use to
175
- * re-run the pass on the next sync. A degraded-but-complete pass
176
- * must NOT re-run forever: its facts are already written and dedup
177
- * would suppress improvements anyway.
178
- */
179
- completed: boolean;
151
+ /** Count of records whose summary memory was written. */
152
+ summariesWritten: number;
153
+ /** Facts the #1579 tombstone chokepoint downgraded to pending_review (no
154
+ * active copy). Surfaced distinctly from `active`/`review` so callers never
155
+ * count a blocked write as a successfully written active/review fact (#1645).
156
+ * Optional so the seam's canned outcomes stay valid when unset. */
157
+ tombstoneBlocked?: number;
180
158
  }
181
- declare const WEARABLE_SOURCE_PREFIX = "wearable";
182
- declare function wearableSourceLabel(sourceId: string): string;
183
- declare function wearableDayTag(date: string): string;
184
- /**
185
- * Render a cleaned conversation into extraction-ready turns. Each turn
186
- * carries a labeled multi-speaker transcript block; the wearer is
187
- * marked "(you)" so first-person facts attribute correctly.
188
- */
189
- declare function buildExtractionTurns(sourceId: string, date: string, conversation: WearableConversation, registry: SpeakerRegistry): BufferTurn[];
190
159
  /**
191
- * Run extraction + gates over a day's conversations and persist the
192
- * survivors. Returns counts for the sync summary.
160
+ * Outcome the memory generator returns to the builder after a day's records are
161
+ * built and persisted. Counts feed the day-build summary; `reindexNeeded` folds
162
+ * the "reindex when new episodes/facts were written even if no record changed"
163
+ * rule so the builder never reaches into the memory layer to decide it.
193
164
  */
194
- declare function generateWearableMemories(sourceId: string, date: string, conversations: WearableConversation[], settings: WearableSourceSettings, registry: SpeakerRegistry, deps: WearableMemoryGenDeps): Promise<WearableMemoryGenResult>;
165
+ interface MeetingMemoryOutcome {
166
+ /** Episode-memory counts, present only when records were built. */
167
+ episodes?: MeetingEpisodeGenResult;
168
+ /** Trust-gated summary/fact counts, present only when summary deps ran. */
169
+ facts?: MeetingsDayFactGenResult;
170
+ /** True when newly written memories require an isolated reindex. */
171
+ reindexNeeded: boolean;
172
+ /** Non-fatal warnings raised while generating memories. */
173
+ warnings: readonly string[];
174
+ }
195
175
  /**
196
- * Write one compact daily-digest memory summarizing the day's recorded
197
- * conversations. Deterministic (no LLM): titles, time ranges, speaker
198
- * counts. Gated by `wearables.digestEnabled`.
176
+ * Seam the deterministic builder depends on. Invoked once per day build after
177
+ * the record-store writes with, for the day:
178
+ * - `built` — every record composed this build (new, updated, unchanged).
179
+ * - `removedIds` — stale ids the rebuild reconciled away (retract memories).
180
+ * - `unchangedIds`— built ids whose stored `contentHash` was IDENTICAL this
181
+ * build (nothing rewritten). The generator SKIPS all
182
+ * episode/summary/fact work for these: an idempotent rebuild
183
+ * must not re-invoke the LLM or duplicate memories.
184
+ * - `updatedIds` — built ids that existed before AND were rewritten this build
185
+ * (same id, changed `contentHash`). The generator REFRESHES
186
+ * them: retract the stale episode/summary memories for that
187
+ * source, then regenerate from the new record.
188
+ * Ids not in `unchangedIds` or `updatedIds` are newly built — generated fresh
189
+ * with no retract. The three id sets are disjoint subsets of `built`. The
190
+ * implementation reports the counts + reindex signal the builder folds into its
191
+ * day summary.
199
192
  */
200
- declare function writeDailyDigestMemory(sourceId: string, date: string, conversations: WearableConversation[], settings: WearableSourceSettings, registry: SpeakerRegistry, writer: WearableMemoryWriter): Promise<boolean>;
201
- declare function importNativeMemories(sourceId: string, memories: WearableNativeMemory[], alreadyImportedIds: ReadonlySet<string>, settings: WearableSourceSettings, deps: WearableMemoryGenDeps): Promise<{
202
- imported: number;
203
- tombstoneBlocked: number;
204
- importedIds: string[];
205
- warnings: string[];
206
- }>;
193
+ interface MeetingMemoryGenerator {
194
+ onRecordsBuilt(input: {
195
+ built: readonly MeetingRecord[];
196
+ removedIds: readonly string[];
197
+ unchangedIds: readonly string[];
198
+ updatedIds: readonly string[];
199
+ }): Promise<MeetingMemoryOutcome>;
200
+ }
207
201
 
208
202
  /**
209
- * Wearable sync pipeline pull clean label → correct → store →
210
- * (optionally) remember, for one source.
203
+ * Meeting building orchestration (issue #1900, Phase 4 slice 2).
211
204
  *
212
- * Stage order per conversation is deliberate:
213
- * 1. off-the-record elision (before anything can persist the span)
214
- * 2. cleanup (merging first lets redaction see numbers
215
- * that ASR split across segments)
216
- * 3. redaction (built-in + user patterns)
217
- * 4. corrections (user-specific word fixes)
205
+ * Ties the pure pieces together: detect the day's meetings, fuse each window's
206
+ * transcript + screen context, and compose idempotent records. Day data is
207
+ * supplied through an injected source so fixtures (and the later activity/
208
+ * wearables wiring) share one code path — no hidden IO here.
218
209
  *
219
- * Day files are rebuilt idempotently; the per-day body hash recorded in
220
- * sync state lets unchanged days skip both the rewrite and the
221
- * (expensive) memory extraction. Sync state advances only after every
222
- * write for the run has succeeded.
210
+ * Gated on `meetings.enabled`: a disabled subsystem builds nothing on every
211
+ * surface (degradation-matrix row). Degrades within an enabled build too a
212
+ * window with no audio yields an empty transcript, and no activity yields a
213
+ * record with no screen-context section — because `fuseMeeting` handles both.
223
214
  */
224
215
 
225
- interface WearableSyncOptions {
226
- /** Sync exactly this day (YYYY-MM-DD). Overrides `days`. */
227
- date?: string;
228
- /** Lookback window in days ending today (default 2, max 90). */
229
- days?: number;
230
- /** Re-run memory extraction even for unchanged days. */
231
- forceMemories?: boolean;
232
- signal?: AbortSignal;
216
+ /** All of a day's already-loaded signals a build needs. */
217
+ interface MeetingDayData {
218
+ /** App spans + audio windows for the day (fed to the detector). */
219
+ detection: MeetingsDetectionInput;
220
+ /** Fusion conversation inputs across all wearable sources for the day. */
221
+ conversations: FusionConversationInput[];
222
+ /** Screen-activity snapshots for the day. */
223
+ activity?: MeetingActivitySnapshot[];
233
224
  }
234
- interface WearableSyncDeps {
235
- /** Memory dir for state files (speakers, corrections, sync ledger). */
236
- memoryDir: string;
237
- /** Read the stored content hash for a day file, if present. */
238
- readDayContentHash(sourceId: string, date: string): Promise<string | null>;
239
- /** Persist a serialized day-transcript file (atomic). */
240
- writeDayTranscript(sourceId: string, date: string, serialized: string): Promise<void>;
225
+ /** Supplies a day's signals. Backed by fixtures in tests; by the activity +
226
+ * wearables stores in the wiring slice. */
227
+ interface MeetingsDaySource {
228
+ loadDayData(date: string): Promise<MeetingDayData> | MeetingDayData;
229
+ }
230
+ declare function buildMeetingRecordsForDay(data: MeetingDayData, config: MeetingsConfig, options?: MeetingFusionOptions,
231
+ /** Map a detected meeting to the id its record should carry. Defaults to the
232
+ * detector's start-anchored id; the builder overrides this to preserve an
233
+ * existing overlapping record's id across shifted-start resyncs. */
234
+ resolveMeetingId?: (meeting: DetectedMeeting) => string): MeetingRecord[];
235
+ /** Per-meeting outcome of a day build. */
236
+ interface MeetingBuildOutcome {
237
+ id: string;
238
+ startUtc: string;
239
+ endUtc: string;
240
+ detectionSource: string;
241
+ sources: string[];
242
+ attendees: string[];
243
+ snapshotCount: number;
244
+ /** False when the record's contentHash was unchanged (nothing rewritten). */
245
+ written: boolean;
246
+ }
247
+ /** Result of building one day's meetings. */
248
+ interface MeetingsDayBuildSummary {
249
+ date: string;
250
+ /** False when `meetings.enabled` is off (zero behavior). */
251
+ enabled: boolean;
252
+ meetings: MeetingBuildOutcome[];
253
+ /** Records written (new or changed). */
254
+ built: number;
255
+ /** Records skipped (unchanged contentHash). */
256
+ skipped: number;
257
+ /** Ids of stale same-day records deleted because they no longer detect. */
258
+ removed: string[];
241
259
  /**
242
- * Optional hook fired once after the sync wrote ANYTHING the search
243
- * index should see: day transcripts, created memories, in-place
244
- * promotions, or native imports. (A cross-source invalidation can
245
- * promote memories on a run with zero transcript writes the index
246
- * must still refresh.)
260
+ * Set when the optional reindex hook rejected AFTER records were already
261
+ * persisted. The store mutation still succeeded the build is reported as
262
+ * successful with this generic warning, and the next scheduled index catches
263
+ * up. Deliberately does NOT embed the raw error text: this string is printed
264
+ * to the CLI's stdout, and internal error detail is logged separately.
247
265
  */
248
- afterWrites?(): Promise<void>;
266
+ reindexWarning?: string;
249
267
  /**
250
- * Memory-generation dependencies, or null when no extraction engine
251
- * is available in this context (transcripts still sync; memory
252
- * creation is skipped with a warning when the mode wanted it).
268
+ * Set when the injected `memoryGenerator` rejected AFTER records were already
269
+ * persisted, OR when a successful generation returned non-fatal warnings. Like
270
+ * `reindexWarning`, the record writes still succeeded, so the build is reported
271
+ * successful with this warning; on rejection the next build (or scheduled
272
+ * maintenance) regenerates the missing memories. Carries no raw exception text —
273
+ * only the generic rejection message or the generator's own warning strings.
253
274
  */
254
- memoryGen: WearableMemoryGenDeps | null;
275
+ memoryWarning?: string;
255
276
  /**
256
- * Same-day transcript bodies from OTHER sources, for cross-device
257
- * corroboration in smart mode. Absent disables the boost.
277
+ * Deterministic episode-memory counts, present only when a `memoryGenerator`
278
+ * was injected. One recall-anchor episode is written per built record (idempotent).
258
279
  */
259
- readOtherSourceDayBodies?(date: string, excludeSource: string): Promise<Map<string, string>>;
280
+ episodes?: MeetingEpisodeGenResult;
260
281
  /**
261
- * Existing memories usable as support evidence: status "active" or
262
- * "pending_review" (explicit allow-list a borderline fact observed
263
- * again on a later day is repetition signal, and the +0.10 boost is
264
- * how it earns promotion). Rejected/quarantined/superseded/archived/
265
- * forgotten rows are never support evidence.
282
+ * Trust-gated summary/fact counts (decisions, commitments, questions, and the
283
+ * synthesized summary), present only when a `memoryGenerator` with summary deps
284
+ * ran and `summaryMode !== "off"`. Aggregated across the day's records.
266
285
  */
267
- listSupportMemories?(): Promise<Array<{
268
- id: string;
269
- content: string;
270
- }>>;
271
- /** Clock injection for tests. */
272
- now?: () => Date;
273
- }
274
- /** Format a Date as YYYY-MM-DD in the given IANA timezone. */
275
- declare function dateInTimezone(date: Date, timezone: string): string;
276
- /** Resolve the list of days to sync, oldest first. */
277
- declare function resolveSyncDates(options: WearableSyncOptions, timezone: string, now: Date): string[];
278
- /** Sync one source. */
279
- declare function syncWearableSource(connector: WearableSourceConnector, settings: WearableSourceSettings, config: WearablesConfig, options: WearableSyncOptions, deps: WearableSyncDeps): Promise<WearableSyncSummary>;
280
- declare function defaultTimezone(): string;
281
-
282
- /**
283
- * WearablesService — the single implementation behind every wearables
284
- * access surface (CLI, MCP tools, HTTP routes). Surfaces stay thin and
285
- * delegate here; formatting differences live with the surface, behavior
286
- * lives here (same renderer-sharing rule as recall explain/xray).
287
- */
288
-
289
- /** Storage capabilities the service needs (satisfied by StorageManager). */
290
- interface WearableStorageIo {
291
- readonly dir: string;
292
- writeWearableDayTranscript(sourceId: string, date: string, serialized: string): Promise<void>;
293
- readWearableDayTranscript(sourceId: string, date: string): Promise<string | null>;
294
- listWearableTranscriptDays(sourceId?: string): Promise<Array<{
295
- source: string;
296
- date: string;
297
- }>>;
298
- fusionArtifactStore(): FusionArtifactStore;
299
- readAllMemories(): Promise<Array<{
300
- path: string;
301
- frontmatter: {
302
- id: string;
303
- source: string;
304
- created: string;
305
- tags: string[];
306
- status?: string;
307
- /** Archival timestamp — rows with this set are not support. */
308
- archivedAt?: string;
309
- structuredAttributes?: Record<string, string>;
310
- };
311
- content: string;
312
- }>>;
313
- writeSealedMemory: WearableMemoryGenDeps["writer"]["writeSealedMemory"];
314
- hasFactContentHash(content: string): Promise<boolean>;
315
- findWearableMemoryByContent(content: string): Promise<{
316
- id: string;
317
- status: string | undefined;
318
- } | null>;
319
- promoteWearableMemory(id: string, attributeUpdates: Record<string, string>, confidence?: number): Promise<boolean>;
320
- demoteWearableMemory(id: string, attributeUpdates: Record<string, string>): Promise<boolean>;
321
- }
322
- interface WearableSearchBackend {
323
- /** Full-text search over the memory dir; null when unavailable. */
324
- search(query: string, maxResults: number): Promise<Array<{
325
- path: string;
326
- score: number;
327
- preview: string;
328
- }> | null>;
286
+ facts?: MeetingsDayFactGenResult;
329
287
  }
330
- interface WearablesServiceDeps {
331
- config: WearablesConfig;
332
- getStorage(): Promise<WearableStorageIo>;
333
- /** Extraction hook; null when no engine is available. */
334
- extract: WearableMemoryGenDeps["extract"] | null;
288
+ /** Optional side effects the builder fires after a day build. */
289
+ interface MeetingsBuilderHooks {
335
290
  /**
336
- * LLM-as-judge hook for smart memoryMode (the orchestrator wires the
337
- * existing extraction judge here). Absent degrades smart mode to
338
- * confidence x sourceTrust + corroboration scoring.
291
+ * Invoked once per build when records changed (`built > 0 || removed > 0`).
292
+ * Meeting records live inside the QMD collection root for full-text search,
293
+ * so a host that wants them discoverable immediately (rather than at the next
294
+ * scheduled reindex) supplies a reindex here. No-op when omitted — records are
295
+ * still picked up by the next index update.
339
296
  */
340
- judgeFacts?: WearableMemoryGenDeps["judgeFacts"];
341
- /** Search backend (QMD); null disables indexed search. */
342
- searchBackend: WearableSearchBackend | null;
343
- /** Fired after transcript writes so the search index refreshes. */
344
- reindexSearch?: () => Promise<void>;
297
+ reindex?(summary: MeetingsDayBuildSummary): void | Promise<void>;
298
+ }
299
+ /** Orchestrates a store-backed build of a day's meetings. */
300
+ declare class MeetingsBuilder {
301
+ private readonly opts;
302
+ constructor(opts: {
303
+ source: MeetingsDaySource;
304
+ store: MeetingRecordStore;
305
+ config: MeetingsConfig;
306
+ fusionOptions?: MeetingFusionOptions;
307
+ hooks?: MeetingsBuilderHooks;
308
+ /**
309
+ * When present, the memory-generation layer runs after the record-store
310
+ * writes: deterministic recall-anchor episodes per built record, the
311
+ * trust-gated summary/facts layer, and retract-on-removal — all behind the
312
+ * `MeetingMemoryGenerator` seam (issue #1900). Omitted → pure
313
+ * detect+fuse+store with no memory writes. The engine depends only on this
314
+ * interface, never on the memory-gen module.
315
+ */
316
+ memoryGenerator?: MeetingMemoryGenerator;
317
+ });
318
+ buildDay(date: string): Promise<MeetingsDayBuildSummary>;
345
319
  /**
346
- * Meeting tail-step (issue #1900): fired once after a sync with the union of
347
- * days it touched, so a dependent subsystem (meeting building) can rebuild the
348
- * affected day(s). Wired for EVERY sync path auto-sync AND manual
349
- * HTTP/MCP/CLI backfill because they all share this one service. Optional;
350
- * omitted by hosts that do not build meetings. The hook self-gates and never
351
- * fails the sync.
320
+ * Pick the existing same-day record whose window best overlaps `meeting` and
321
+ * reuse its id but ONLY when adoption is safe: the windows substantially
322
+ * coincide (overlap covers a majority of the shorter window), OR a corroborating
323
+ * identity signal (same app, same title, or a shared transcript source) is
324
+ * BACKED by a non-marginal overlap (>= a quarter of the shorter window). Coarse
325
+ * identity signals alone never license adoption across a thin sliver of overlap,
326
+ * or two genuinely different back-to-back same-app meetings would overwrite each
327
+ * other's record and `show <old-id>` would point at the wrong meeting. Candidate
328
+ * selection is deterministic (max overlap, then earliest start, then id).
329
+ * Returns the detector's fresh id when nothing qualifies.
352
330
  */
353
- onDaysSynced?: (days: readonly string[]) => void | Promise<void>;
331
+ private adoptExistingId;
354
332
  }
355
- interface WearableTranscriptSearchResult {
356
- source: string;
333
+
334
+ /**
335
+ * Meetings service (issue #1900) — the orchestrator-owned facade every meeting
336
+ * surface (CLI, MCP tools, HTTP routes) shares, so behavior + validation never
337
+ * fork across hosts (the same rule the wearables service follows). It owns the
338
+ * record store, the store-backed builder, and the debounced post-sync build
339
+ * scheduler.
340
+ *
341
+ * `meetings.enabled` is honored at every entrypoint: `meetingsList`/`meetingsGet`
342
+ * short-circuit to an empty/absent result when disabled, `meetingsBuild`
343
+ * delegates to the builder (which already reports `enabled: false` and writes
344
+ * nothing), and the tail-step `requestBuild` is a no-op. Caller-correctable
345
+ * faults (bad dates/ids) throw `MeetingsInputError`, which the transports map to
346
+ * 400-class responses; the CLI reuses the store + builder directly through the
347
+ * shared `runMeetingsCliCommand` runner.
348
+ */
349
+
350
+ /** One day's stored meeting summaries in a list result. */
351
+ interface MeetingsListDay {
357
352
  date: string;
358
- score: number;
359
- snippet: string;
360
- /** "indexed" (QMD) or "scan" (substring fallback). */
361
- backend: "indexed" | "scan";
353
+ meetings: MeetingRecordSummary[];
362
354
  }
363
- interface WearableMemorySearchResult {
364
- id: string;
365
- source: string;
366
- date?: string;
367
- conversationId?: string;
368
- status?: string;
369
- content: string;
370
- created: string;
355
+ /** Structured result of a meetings list query (all days, or one day). */
356
+ interface MeetingsListResult {
357
+ /** False when `meetings.enabled` is off (zero behavior). */
358
+ enabled: boolean;
359
+ days: MeetingsListDay[];
371
360
  }
372
- interface WearableDayTranscriptView {
373
- source: string;
374
- date: string;
375
- meta: WearableDayTranscript["meta"] | null;
376
- body: string;
377
- /** Other sources that also recorded during this day (overlap hint). */
378
- overlapsWith: string[];
361
+ /** Structured result of fetching one stored meeting record. */
362
+ interface MeetingsGetResult {
363
+ /** False when `meetings.enabled` is off (zero behavior). */
364
+ enabled: boolean;
365
+ found: boolean;
366
+ id: string;
367
+ /** Raw persisted markdown, or null when disabled/absent. */
368
+ record: string | null;
379
369
  }
380
- declare class WearablesService {
381
- private readonly deps;
382
- constructor(deps: WearablesServiceDeps);
383
- get enabled(): boolean;
384
- private assertEnabled;
385
- private timezone;
386
- private enabledSources;
387
- /** Status for every configured source (and connector availability). */
388
- status(): Promise<{
389
- enabled: boolean;
390
- timezone: string;
391
- sources: WearableSourceStatus[];
392
- connectorsInstalled: string[];
393
- }>;
394
- /** Run a sync for one source or all enabled sources. */
395
- sync(options: WearableSyncOptions & {
396
- source?: string;
397
- }): Promise<WearableSyncSummary[]>;
398
- /** Verify connectivity/credentials for one source. */
399
- checkAuth(sourceId: string): Promise<{
400
- ok: boolean;
401
- detail?: string;
402
- }>;
403
- /**
404
- * Full transcript(s) for a day. Without `source`, returns every
405
- * source that recorded that day, annotated with overlap hints.
406
- */
407
- dayTranscript(date: string, sourceId?: string): Promise<WearableDayTranscriptView[]>;
408
- /** List days that have stored transcripts. */
409
- listDays(sourceId?: string): Promise<Array<{
410
- source: string;
411
- date: string;
412
- }>>;
413
- /**
414
- * Fuse all enabled sources' stored transcripts for one day into a
415
- * derived `FusedWearableConversation[]` artifact. Deterministic and
416
- * idempotent: unchanged inputs and fusion config produce a stable
417
- * content hash and the derived file is left untouched on re-run. Requires
418
- * `wearables.fusion.enabled`; otherwise it throws. Raw per-source
419
- * transcripts are never modified.
420
- */
421
- fuseDay(date: string): Promise<{
422
- date: string;
423
- sources: string[];
424
- conversationCount: number;
425
- contentHash: string;
426
- written: boolean;
427
- skipped?: {
428
- reason: string;
429
- };
430
- }>;
370
+ interface MeetingsServiceDeps {
371
+ config: MeetingsConfig;
372
+ store: MeetingRecordStore;
373
+ builder: MeetingsBuilder;
374
+ /** Trailing-edge coalescing window for post-sync rebuilds (ms). */
375
+ buildDebounceMs: number;
376
+ /** Observe a tail-step build failure (logging); never called on success. */
377
+ onBuildError?(date: string, err: unknown): void;
378
+ }
379
+ declare class MeetingsService {
380
+ readonly store: MeetingRecordStore;
381
+ readonly builder: MeetingsBuilder;
382
+ readonly config: MeetingsConfig;
383
+ private readonly scheduler;
384
+ constructor(deps: MeetingsServiceDeps);
385
+ /** List stored meetings for one day, or across all days when no date given. */
386
+ meetingsList(date?: string): Promise<MeetingsListResult>;
387
+ /** Fetch one stored meeting record's raw markdown by id. */
388
+ meetingsGet(id: string): Promise<MeetingsGetResult>;
389
+ /** Detect + fuse + store the day's meetings. Gated inside the builder. */
390
+ meetingsBuild(date: string): Promise<MeetingsDayBuildSummary>;
431
391
  /**
432
- * List fused conversations for a date (the fusion listing surface).
433
- * Returns the persisted derived artifact's conversations, or an empty
434
- * array when no fused artifact has been written for that day. When a
435
- * file EXISTS but its body is corrupt (parseOk:false), throws
436
- * WearablesInputError so the caller can distinguish a broken artifact
437
- * from a day that was never fused — never silently returns an empty
438
- * list that looks identical to "no artifact" (issue #1849).
392
+ * Tail-step after a sync touched a day: schedule a debounced (re)build. A
393
+ * no-op when the subsystem is disabled, so a sync of other signals never
394
+ * spins up meeting building behind the master gate.
439
395
  */
440
- fusedConversations(date: string): Promise<FusedWearableConversation[]>;
441
- /** List dates with stored fused artifacts, newest first. */
442
- listFusedDays(): Promise<string[]>;
396
+ requestBuild(date: string): void;
443
397
  /**
444
- * Search stored transcripts. Uses the indexed backend when available
445
- * and falls back to a bounded substring scan otherwise the two
446
- * paths are distinguishable in the result (`backend`) so callers can
447
- * tell "no hits" from "weaker search ran".
398
+ * Activity tail-step (issue #1900): schedule a debounced (re)build for every
399
+ * local day the sync touched. The tick's own local day (from `ranAtIso`, in
400
+ * the activity timezone) is always eligible; `touchedDates` adds any OTHER
401
+ * days a rolling/backfill sync changed, so a change to yesterday's activity
402
+ * rebuilds yesterday's meetings rather than only today's. No-op when disabled,
403
+ * so a sync of other signals never spins up meeting building behind the gate.
448
404
  */
449
- searchTranscripts(query: string, options?: {
450
- source?: string;
451
- from?: string;
452
- to?: string;
453
- limit?: number;
454
- }): Promise<WearableTranscriptSearchResult[]>;
405
+ requestBuildForActivitySync(ranAtIso: string, timezone: string, touchedDates?: readonly string[]): void;
406
+ /** Force any pending debounced builds to run now (teardown/tests). */
407
+ flushBuilds(): Promise<void>;
408
+ /** Cancel armed build timers (orchestrator teardown). */
409
+ dispose(): void;
410
+ }
411
+
412
+ interface CorroborationContext {
455
413
  /**
456
- * Memories created from wearable transcripts, filterable by source
457
- * and/or day. Includes pending_review candidates the whole point of
458
- * review mode is seeing what's queued.
414
+ * Same-day transcript bodies from OTHER sources, keyed by source id.
415
+ * Pre-tokenized once per sync (day bodies are large).
459
416
  */
460
- transcriptMemories(options?: {
461
- source?: string;
462
- date?: string;
463
- limit?: number;
464
- }): Promise<WearableMemorySearchResult[]>;
465
- listSpeakers(): Promise<SpeakerRegistry>;
466
- setSpeaker(sourceId: string, speakerKey: string, name: string, opts?: {
467
- isSelf?: boolean;
468
- }): Promise<SpeakerRegistry>;
469
- setSelfName(name: string): Promise<SpeakerRegistry>;
470
- removeSpeaker(sourceId: string, speakerKey: string): Promise<SpeakerRegistry>;
471
- listCorrections(): Promise<{
472
- fromConfig: WearableCorrectionRule[];
473
- fromState: WearableCorrectionRule[];
474
- stateFilePath: string;
417
+ otherSourceDayTokens: Map<string, Set<string>>;
418
+ /** Existing active memories: id + content. */
419
+ existingMemories: Array<{
420
+ id: string;
421
+ content: string;
475
422
  }>;
476
- addCorrection(rule: WearableCorrectionRule): Promise<void>;
477
- removeCorrection(index: number): Promise<WearableCorrectionRule>;
478
423
  }
479
- /** Map an indexed-search hit path back to (source, date), or null. */
480
- declare function locateTranscriptPath(hitPath: string): {
481
- source: string;
482
- date: string;
483
- } | null;
484
424
 
485
425
  /**
486
- * Meeting fusion (issue #1900, Phase 4 slice 2).
426
+ * Wearable memory generation trust-gated extraction from cleaned day
427
+ * transcripts.
487
428
  *
488
- * For a detected meeting window `[startUtc, endUtc)` (half-open, AGENTS.md §23),
489
- * fuse the concurrent signals into a screen-aware `FusedMeeting`:
429
+ * Wearable ASR quality varies wildly between providers and rooms, so
430
+ * unlike live-session extraction this path is gated per source:
490
431
  *
491
- * 1. Transcript clip every wearable source's segments to the window and run
492
- * them through the SHARED wearables reconciliation (`fuseCluster`). Higher-
493
- * `sourceTrust` text wins overlapping regions and the out-voted sources are
494
- * recorded per segment; this module never re-implements alignment/dedup —
495
- * the repo rule is "extend the shared fusion module, never fork it".
496
- * 2. Screen context — other-app foreground dwell within the window, kept only
497
- * when it lasts `contextDwellSeconds`, plus deduped on-screen text excerpts
498
- * capped at `maxContextChars`.
499
- * 3. Attendees — distinct non-wearer speaker labels from the fused transcript
500
- * (already resolved through the wearables speaker registry upstream).
432
+ * - memoryMode "off" -> never runs
433
+ * - memoryMode "review" -> candidates land with status
434
+ * "pending_review" (operator approves via
435
+ * the existing review-queue surfaces)
436
+ * - memoryMode "auto" -> candidates that pass every gate land
437
+ * active
501
438
  *
502
- * Pure and deterministic: same inputs same `FusedMeeting`.
503
- */
504
-
505
- /** Per-run tuning that mirrors the wearables fusion knobs. */
506
- interface MeetingFusionOptions {
507
- /** Per-source trust priors handed to reconciliation. */
508
- sourceTrust?: Record<string, number>;
509
- /** Max drift (ms) for two segments to align across sources. */
510
- windowToleranceMs?: number;
511
- }
512
- /** Fuse one detected meeting's transcript + screen context into a FusedMeeting. */
513
- declare function fuseMeeting(input: MeetingBuildInput, config: MeetingsConfig, options?: MeetingFusionOptions): FusedMeeting;
514
-
515
- /**
516
- * Meeting memory-generation SEAM (issue #1900 — engine/memory decouple).
439
+ * Deterministic gates (applied in order, all modes except "off"):
440
+ * 1. category gate — procedure / reasoning_trace candidates are
441
+ * skipped (they need richer persistence than
442
+ * this path provides)
443
+ * 2. confidence floor — `minConfidence`
444
+ * 3. importance floor — local `scoreImportance` >= `minImportance`
445
+ * 4. dedup — storage content-hash index + intra-run set
446
+ * 5. day cap — top `maxMemoriesPerDay` by importance score
447
+ * (0 disables the cap)
517
448
  *
518
- * Engine-layer boundary between the deterministic meeting builder and the
519
- * memory-generation layer. `MeetingsBuilder` (detect/fuse/store/build) depends
520
- * ONLY on `MeetingMemoryGenerator` declared here — never on `memory-gen.ts` — so
521
- * the deterministic engine carries zero dependency on episode/fact generation
522
- * and ships in its own scope-budgeted PR. The concrete generator lives in
523
- * `memory-gen.ts` behind `createMeetingMemoryGenerator`, which implements this
524
- * interface by driving the existing episode/fact/retract logic.
449
+ * The extraction engine itself is injected so this module stays free of
450
+ * LLM-client construction; callers hand in `orchestrator`-owned or
451
+ * standalone engines alike.
525
452
  */
526
453
 
527
- /**
528
- * Narrow writer interface satisfied by `StorageManager` — the same sealed
529
- * write entry point the wearables generator uses, so meeting memories inherit
530
- * encrypted-at-rest + atomic write + dedup without this module knowing the key.
531
- */
532
- interface MeetingMemoryWriter {
454
+ declare function memoryStatusForMode(mode: WearableMemoryMode): Extract<MemoryStatus, "active" | "pending_review">;
455
+ /** Narrow writer interface satisfied by `StorageManager`. */
456
+ interface WearableMemoryWriter {
457
+ /**
458
+ * Sealed-envelope write entry point (issue #1989 PR4): cross-cutting
459
+ * fields ride the composed envelope; per-write extras stay explicit.
460
+ */
533
461
  writeSealedMemory(envelope: SealedMemoryEnvelope, extras: {
534
462
  importance?: ImportanceScore;
535
463
  contentHashSource?: string;
536
464
  status?: MemoryStatus;
537
465
  memoryKind?: "episode" | "note" | "box" | "dream" | "procedural";
538
466
  }): Promise<MemoryWriteResult>;
467
+ hasFactContentHash(content: string): Promise<boolean>;
539
468
  /**
540
- * True when an active/pending memory whose frontmatter `source` equals
541
- * `source` already carries this exact content. Meeting memories are episodes
542
- * (`moment`) and decisions/commitments (`decision`/`commitment`) — categories
543
- * the storage fact-hash index does NOT cover — so idempotency is a
544
- * source-scoped content scan, mirroring the wearables writer, NOT
545
- * `hasFactContentHash` (fact-only; always false here → duplicates on rebuild).
469
+ * Locate an earlier wearable write of the same content (any status).
470
+ * Optional: enables in-place promotion when re-scoring with stronger
471
+ * evidence.
546
472
  */
547
- hasMemoryFromSource(source: string, content: string): Promise<boolean>;
473
+ findWearableMemoryByContent?(content: string): Promise<{
474
+ id: string;
475
+ status: MemoryStatus | undefined;
476
+ } | null>;
548
477
  /**
549
- * Retire (invalidate) every memory whose frontmatter `source` equals `source`.
550
- * Returns the count retired. Used to reconcile away a removed meeting's
551
- * episode/summary memories so recall never surfaces a meeting `show` can't load.
478
+ * Promote a pending_review wearable memory to active, merging trust
479
+ * evidence. Returns false when missing or no longer pending.
552
480
  */
553
- retireMemoriesFromSource(source: string): Promise<number>;
481
+ promoteWearableMemory?(id: string, attributeUpdates: Record<string, string>, confidence?: number): Promise<boolean>;
482
+ /**
483
+ * Demote a pending_review wearable memory to rejected on an explicit
484
+ * judge-reject re-verdict. Returns false when missing or no longer
485
+ * pending. Active rows are never auto-demoted.
486
+ */
487
+ demoteWearableMemory?(id: string, attributeUpdates: Record<string, string>): Promise<boolean>;
554
488
  }
555
- /** Result of generating episode memories for a day's meetings. */
556
- interface MeetingEpisodeGenResult {
557
- /** Episodes newly written. */
558
- written: number;
559
- /** Episodes skipped because an identical one already existed. */
560
- skipped: number;
489
+ interface WearableMemoryGenDeps {
490
+ extract(turns: BufferTurn[]): Promise<ExtractionResult>;
491
+ writer: WearableMemoryWriter;
492
+ /**
493
+ * LLM-as-judge batch evaluation (the existing extraction judge).
494
+ * Absent when no judge is wired (degraded smart mode: trust scoring
495
+ * runs on confidence x sourceTrust + corroboration alone).
496
+ */
497
+ judgeFacts?(candidates: JudgeCandidate[]): Promise<JudgeBatchResult>;
498
+ /**
499
+ * Corroboration evidence for smart mode: other sources' same-day
500
+ * transcript tokens + existing active memories. Absent disables
501
+ * corroboration boosts.
502
+ */
503
+ corroboration?: CorroborationContext;
561
504
  }
562
- /** Day-level aggregate of the trust-gated summary/fact layer across records. */
563
- interface MeetingsDayFactGenResult {
564
- /** True when the LLM extractor ran for at least one record. */
565
- llmInvoked: boolean;
566
- /** Facts written active. */
567
- active: number;
568
- /** Facts queued for review (pending_review). */
569
- review: number;
570
- /** Candidates/summaries dropped below the trust bar or judge-rejected. */
571
- dropped: number;
572
- /** Candidates/summaries skipped because an identical memory already existed. */
505
+ interface WearableMemoryGenResult {
506
+ created: number;
507
+ /**
508
+ * Writes the #1579 tombstone chokepoint downgraded to pending_review (no
509
+ * active copy). Surfaced distinctly from `created` so sync summaries and
510
+ * callers don't count blocked content as successfully created (#1645).
511
+ */
512
+ tombstoneBlocked: number;
513
+ /** Earlier borderline writes promoted to active by new evidence. */
514
+ promoted: number;
515
+ /** Earlier pending writes retired by a fresh judge-reject verdict. */
516
+ demoted: number;
573
517
  skipped: number;
574
- /** Count of records whose summary memory was written. */
575
- summariesWritten: number;
576
- /** Facts the #1579 tombstone chokepoint downgraded to pending_review (no
577
- * active copy). Surfaced distinctly from `active`/`review` so callers never
578
- * count a blocked write as a successfully written active/review fact (#1645).
579
- * Optional so the seam's canned outcomes stay valid when unset. */
580
- tombstoneBlocked?: number;
518
+ skippedByReason: Record<string, number>;
519
+ /** Non-fatal problems (e.g. the extraction engine erroring). */
520
+ warnings: string[];
521
+ /**
522
+ * True when every conversation was extracted (the pass may still
523
+ * carry degraded-mode warnings, e.g. judge unavailable). False only
524
+ * when extraction itself aborted mid-day — the signal callers use to
525
+ * re-run the pass on the next sync. A degraded-but-complete pass
526
+ * must NOT re-run forever: its facts are already written and dedup
527
+ * would suppress improvements anyway.
528
+ */
529
+ completed: boolean;
581
530
  }
531
+ declare const WEARABLE_SOURCE_PREFIX = "wearable";
532
+ declare function wearableSourceLabel(sourceId: string): string;
533
+ declare function wearableDayTag(date: string): string;
582
534
  /**
583
- * Outcome the memory generator returns to the builder after a day's records are
584
- * built and persisted. Counts feed the day-build summary; `reindexNeeded` folds
585
- * the "reindex when new episodes/facts were written even if no record changed"
586
- * rule so the builder never reaches into the memory layer to decide it.
535
+ * Render a cleaned conversation into extraction-ready turns. Each turn
536
+ * carries a labeled multi-speaker transcript block; the wearer is
537
+ * marked "(you)" so first-person facts attribute correctly.
587
538
  */
588
- interface MeetingMemoryOutcome {
589
- /** Episode-memory counts, present only when records were built. */
590
- episodes?: MeetingEpisodeGenResult;
591
- /** Trust-gated summary/fact counts, present only when summary deps ran. */
592
- facts?: MeetingsDayFactGenResult;
593
- /** True when newly written memories require an isolated reindex. */
594
- reindexNeeded: boolean;
595
- /** Non-fatal warnings raised while generating memories. */
596
- warnings: readonly string[];
597
- }
539
+ declare function buildExtractionTurns(sourceId: string, date: string, conversation: WearableConversation, registry: SpeakerRegistry): BufferTurn[];
598
540
  /**
599
- * Seam the deterministic builder depends on. Invoked once per day build after
600
- * the record-store writes with, for the day:
601
- * - `built` — every record composed this build (new, updated, unchanged).
602
- * - `removedIds` — stale ids the rebuild reconciled away (retract memories).
603
- * - `unchangedIds`— built ids whose stored `contentHash` was IDENTICAL this
604
- * build (nothing rewritten). The generator SKIPS all
605
- * episode/summary/fact work for these: an idempotent rebuild
606
- * must not re-invoke the LLM or duplicate memories.
607
- * - `updatedIds` — built ids that existed before AND were rewritten this build
608
- * (same id, changed `contentHash`). The generator REFRESHES
609
- * them: retract the stale episode/summary memories for that
610
- * source, then regenerate from the new record.
611
- * Ids not in `unchangedIds` or `updatedIds` are newly built — generated fresh
612
- * with no retract. The three id sets are disjoint subsets of `built`. The
613
- * implementation reports the counts + reindex signal the builder folds into its
614
- * day summary.
541
+ * Run extraction + gates over a day's conversations and persist the
542
+ * survivors. Returns counts for the sync summary.
615
543
  */
616
- interface MeetingMemoryGenerator {
617
- onRecordsBuilt(input: {
618
- built: readonly MeetingRecord[];
619
- removedIds: readonly string[];
620
- unchangedIds: readonly string[];
621
- updatedIds: readonly string[];
622
- }): Promise<MeetingMemoryOutcome>;
623
- }
544
+ declare function generateWearableMemories(sourceId: string, date: string, conversations: WearableConversation[], settings: WearableSourceSettings, registry: SpeakerRegistry, deps: WearableMemoryGenDeps): Promise<WearableMemoryGenResult>;
545
+ /**
546
+ * Write one compact daily-digest memory summarizing the day's recorded
547
+ * conversations. Deterministic (no LLM): titles, time ranges, speaker
548
+ * counts. Gated by `wearables.digestEnabled`.
549
+ */
550
+ declare function writeDailyDigestMemory(sourceId: string, date: string, conversations: WearableConversation[], settings: WearableSourceSettings, registry: SpeakerRegistry, writer: WearableMemoryWriter): Promise<boolean>;
551
+ declare function importNativeMemories(sourceId: string, memories: WearableNativeMemory[], alreadyImportedIds: ReadonlySet<string>, settings: WearableSourceSettings, deps: WearableMemoryGenDeps): Promise<{
552
+ imported: number;
553
+ tombstoneBlocked: number;
554
+ importedIds: string[];
555
+ warnings: string[];
556
+ }>;
624
557
 
625
558
  /**
626
- * Meeting building orchestration (issue #1900, Phase 4 slice 2).
559
+ * Wearable sync pipeline pull clean label → correct → store →
560
+ * (optionally) remember, for one source.
627
561
  *
628
- * Ties the pure pieces together: detect the day's meetings, fuse each window's
629
- * transcript + screen context, and compose idempotent records. Day data is
630
- * supplied through an injected source so fixtures (and the later activity/
631
- * wearables wiring) share one code path — no hidden IO here.
562
+ * Stage order per conversation is deliberate:
563
+ * 1. off-the-record elision (before anything can persist the span)
564
+ * 2. cleanup (merging first lets redaction see numbers
565
+ * that ASR split across segments)
566
+ * 3. redaction (built-in + user patterns)
567
+ * 4. corrections (user-specific word fixes)
632
568
  *
633
- * Gated on `meetings.enabled`: a disabled subsystem builds nothing on every
634
- * surface (degradation-matrix row). Degrades within an enabled build too a
635
- * window with no audio yields an empty transcript, and no activity yields a
636
- * record with no screen-context section — because `fuseMeeting` handles both.
569
+ * Day files are rebuilt idempotently; the per-day body hash recorded in
570
+ * sync state lets unchanged days skip both the rewrite and the
571
+ * (expensive) memory extraction. Sync state advances only after every
572
+ * write for the run has succeeded.
637
573
  */
638
574
 
639
- /** All of a day's already-loaded signals a build needs. */
640
- interface MeetingDayData {
641
- /** App spans + audio windows for the day (fed to the detector). */
642
- detection: MeetingsDetectionInput;
643
- /** Fusion conversation inputs across all wearable sources for the day. */
644
- conversations: FusionConversationInput[];
645
- /** Screen-activity snapshots for the day. */
646
- activity?: MeetingActivitySnapshot[];
647
- }
648
- /** Supplies a day's signals. Backed by fixtures in tests; by the activity +
649
- * wearables stores in the wiring slice. */
650
- interface MeetingsDaySource {
651
- loadDayData(date: string): Promise<MeetingDayData> | MeetingDayData;
652
- }
653
- declare function buildMeetingRecordsForDay(data: MeetingDayData, config: MeetingsConfig, options?: MeetingFusionOptions,
654
- /** Map a detected meeting to the id its record should carry. Defaults to the
655
- * detector's start-anchored id; the builder overrides this to preserve an
656
- * existing overlapping record's id across shifted-start resyncs. */
657
- resolveMeetingId?: (meeting: DetectedMeeting) => string): MeetingRecord[];
658
- /** Per-meeting outcome of a day build. */
659
- interface MeetingBuildOutcome {
660
- id: string;
661
- startUtc: string;
662
- endUtc: string;
663
- detectionSource: string;
664
- sources: string[];
665
- attendees: string[];
666
- snapshotCount: number;
667
- /** False when the record's contentHash was unchanged (nothing rewritten). */
668
- written: boolean;
575
+ interface WearableSyncOptions {
576
+ /** Sync exactly this day (YYYY-MM-DD). Overrides `days`. */
577
+ date?: string;
578
+ /** Lookback window in days ending today (default 2, max 90). */
579
+ days?: number;
580
+ /** Re-run memory extraction even for unchanged days. */
581
+ forceMemories?: boolean;
582
+ signal?: AbortSignal;
669
583
  }
670
- /** Result of building one day's meetings. */
671
- interface MeetingsDayBuildSummary {
672
- date: string;
673
- /** False when `meetings.enabled` is off (zero behavior). */
674
- enabled: boolean;
675
- meetings: MeetingBuildOutcome[];
676
- /** Records written (new or changed). */
677
- built: number;
678
- /** Records skipped (unchanged contentHash). */
679
- skipped: number;
680
- /** Ids of stale same-day records deleted because they no longer detect. */
681
- removed: string[];
682
- /**
683
- * Set when the optional reindex hook rejected AFTER records were already
684
- * persisted. The store mutation still succeeded — the build is reported as
685
- * successful with this generic warning, and the next scheduled index catches
686
- * up. Deliberately does NOT embed the raw error text: this string is printed
687
- * to the CLI's stdout, and internal error detail is logged separately.
688
- */
689
- reindexWarning?: string;
584
+ interface WearableSyncDeps {
585
+ /** Memory dir for state files (speakers, corrections, sync ledger). */
586
+ memoryDir: string;
587
+ /** Read the stored content hash for a day file, if present. */
588
+ readDayContentHash(sourceId: string, date: string): Promise<string | null>;
589
+ /** Persist a serialized day-transcript file (atomic). */
590
+ writeDayTranscript(sourceId: string, date: string, serialized: string): Promise<void>;
690
591
  /**
691
- * Set when the injected `memoryGenerator` rejected AFTER records were already
692
- * persisted, OR when a successful generation returned non-fatal warnings. Like
693
- * `reindexWarning`, the record writes still succeeded, so the build is reported
694
- * successful with this warning; on rejection the next build (or scheduled
695
- * maintenance) regenerates the missing memories. Carries no raw exception text —
696
- * only the generic rejection message or the generator's own warning strings.
592
+ * Optional hook fired once after the sync wrote ANYTHING the search
593
+ * index should see: day transcripts, created memories, in-place
594
+ * promotions, or native imports. (A cross-source invalidation can
595
+ * promote memories on a run with zero transcript writes the index
596
+ * must still refresh.)
697
597
  */
698
- memoryWarning?: string;
598
+ afterWrites?(): Promise<void>;
699
599
  /**
700
- * Deterministic episode-memory counts, present only when a `memoryGenerator`
701
- * was injected. One recall-anchor episode is written per built record (idempotent).
600
+ * Memory-generation dependencies, or null when no extraction engine
601
+ * is available in this context (transcripts still sync; memory
602
+ * creation is skipped with a warning when the mode wanted it).
702
603
  */
703
- episodes?: MeetingEpisodeGenResult;
604
+ memoryGen: WearableMemoryGenDeps | null;
704
605
  /**
705
- * Trust-gated summary/fact counts (decisions, commitments, questions, and the
706
- * synthesized summary), present only when a `memoryGenerator` with summary deps
707
- * ran and `summaryMode !== "off"`. Aggregated across the day's records.
606
+ * Same-day transcript bodies from OTHER sources, for cross-device
607
+ * corroboration in smart mode. Absent disables the boost.
708
608
  */
709
- facts?: MeetingsDayFactGenResult;
710
- }
711
- /** Optional side effects the builder fires after a day build. */
712
- interface MeetingsBuilderHooks {
609
+ readOtherSourceDayBodies?(date: string, excludeSource: string): Promise<Map<string, string>>;
713
610
  /**
714
- * Invoked once per build when records changed (`built > 0 || removed > 0`).
715
- * Meeting records live inside the QMD collection root for full-text search,
716
- * so a host that wants them discoverable immediately (rather than at the next
717
- * scheduled reindex) supplies a reindex here. No-op when omitted — records are
718
- * still picked up by the next index update.
611
+ * Existing memories usable as support evidence: status "active" or
612
+ * "pending_review" (explicit allow-list a borderline fact observed
613
+ * again on a later day is repetition signal, and the +0.10 boost is
614
+ * how it earns promotion). Rejected/quarantined/superseded/archived/
615
+ * forgotten rows are never support evidence.
719
616
  */
720
- reindex?(summary: MeetingsDayBuildSummary): void | Promise<void>;
721
- }
722
- /** Orchestrates a store-backed build of a day's meetings. */
723
- declare class MeetingsBuilder {
724
- private readonly opts;
725
- constructor(opts: {
726
- source: MeetingsDaySource;
727
- store: MeetingRecordStore;
728
- config: MeetingsConfig;
729
- fusionOptions?: MeetingFusionOptions;
730
- hooks?: MeetingsBuilderHooks;
731
- /**
732
- * When present, the memory-generation layer runs after the record-store
733
- * writes: deterministic recall-anchor episodes per built record, the
734
- * trust-gated summary/facts layer, and retract-on-removal — all behind the
735
- * `MeetingMemoryGenerator` seam (issue #1900). Omitted → pure
736
- * detect+fuse+store with no memory writes. The engine depends only on this
737
- * interface, never on the memory-gen module.
738
- */
739
- memoryGenerator?: MeetingMemoryGenerator;
740
- });
741
- buildDay(date: string): Promise<MeetingsDayBuildSummary>;
742
- /**
743
- * Pick the existing same-day record whose window best overlaps `meeting` and
744
- * reuse its id — but ONLY when adoption is safe: the windows substantially
745
- * coincide (overlap covers a majority of the shorter window), OR a corroborating
746
- * identity signal (same app, same title, or a shared transcript source) is
747
- * BACKED by a non-marginal overlap (>= a quarter of the shorter window). Coarse
748
- * identity signals alone never license adoption across a thin sliver of overlap,
749
- * or two genuinely different back-to-back same-app meetings would overwrite each
750
- * other's record and `show <old-id>` would point at the wrong meeting. Candidate
751
- * selection is deterministic (max overlap, then earliest start, then id).
752
- * Returns the detector's fresh id when nothing qualifies.
753
- */
754
- private adoptExistingId;
617
+ listSupportMemories?(): Promise<Array<{
618
+ id: string;
619
+ content: string;
620
+ }>>;
621
+ /** Clock injection for tests. */
622
+ now?: () => Date;
755
623
  }
624
+ /** Format a Date as YYYY-MM-DD in the given IANA timezone. */
625
+ declare function dateInTimezone(date: Date, timezone: string): string;
626
+ /** Resolve the list of days to sync, oldest first. */
627
+ declare function resolveSyncDates(options: WearableSyncOptions, timezone: string, now: Date): string[];
628
+ /** Sync one source. */
629
+ declare function syncWearableSource(connector: WearableSourceConnector, settings: WearableSourceSettings, config: WearablesConfig, options: WearableSyncOptions, deps: WearableSyncDeps): Promise<WearableSyncSummary>;
630
+ declare function defaultTimezone(): string;
756
631
 
757
632
  /**
758
- * Meetings service (issue #1900) — the orchestrator-owned facade every meeting
759
- * surface (CLI, MCP tools, HTTP routes) shares, so behavior + validation never
760
- * fork across hosts (the same rule the wearables service follows). It owns the
761
- * record store, the store-backed builder, and the debounced post-sync build
762
- * scheduler.
763
- *
764
- * `meetings.enabled` is honored at every entrypoint: `meetingsList`/`meetingsGet`
765
- * short-circuit to an empty/absent result when disabled, `meetingsBuild`
766
- * delegates to the builder (which already reports `enabled: false` and writes
767
- * nothing), and the tail-step `requestBuild` is a no-op. Caller-correctable
768
- * faults (bad dates/ids) throw `MeetingsInputError`, which the transports map to
769
- * 400-class responses; the CLI reuses the store + builder directly through the
770
- * shared `runMeetingsCliCommand` runner.
633
+ * WearablesService — the single implementation behind every wearables
634
+ * access surface (CLI, MCP tools, HTTP routes). Surfaces stay thin and
635
+ * delegate here; formatting differences live with the surface, behavior
636
+ * lives here (same renderer-sharing rule as recall explain/xray).
771
637
  */
772
638
 
773
- /** One day's stored meeting summaries in a list result. */
774
- interface MeetingsListDay {
775
- date: string;
776
- meetings: MeetingRecordSummary[];
639
+ /** Storage capabilities the service needs (satisfied by StorageManager). */
640
+ interface WearableStorageIo {
641
+ readonly dir: string;
642
+ writeWearableDayTranscript(sourceId: string, date: string, serialized: string): Promise<void>;
643
+ readWearableDayTranscript(sourceId: string, date: string): Promise<string | null>;
644
+ listWearableTranscriptDays(sourceId?: string): Promise<Array<{
645
+ source: string;
646
+ date: string;
647
+ }>>;
648
+ fusionArtifactStore(): FusionArtifactStore;
649
+ readAllMemories(): Promise<Array<{
650
+ path: string;
651
+ frontmatter: {
652
+ id: string;
653
+ source: string;
654
+ created: string;
655
+ tags: string[];
656
+ status?: string;
657
+ /** Archival timestamp — rows with this set are not support. */
658
+ archivedAt?: string;
659
+ structuredAttributes?: Record<string, string>;
660
+ };
661
+ content: string;
662
+ }>>;
663
+ writeSealedMemory: WearableMemoryGenDeps["writer"]["writeSealedMemory"];
664
+ hasFactContentHash(content: string): Promise<boolean>;
665
+ findWearableMemoryByContent(content: string): Promise<{
666
+ id: string;
667
+ status: string | undefined;
668
+ } | null>;
669
+ promoteWearableMemory(id: string, attributeUpdates: Record<string, string>, confidence?: number): Promise<boolean>;
670
+ demoteWearableMemory(id: string, attributeUpdates: Record<string, string>): Promise<boolean>;
777
671
  }
778
- /** Structured result of a meetings list query (all days, or one day). */
779
- interface MeetingsListResult {
780
- /** False when `meetings.enabled` is off (zero behavior). */
781
- enabled: boolean;
782
- days: MeetingsListDay[];
672
+ interface WearableSearchBackend {
673
+ /** Full-text search over the memory dir; null when unavailable. */
674
+ search(query: string, maxResults: number): Promise<Array<{
675
+ path: string;
676
+ score: number;
677
+ preview: string;
678
+ }> | null>;
783
679
  }
784
- /** Structured result of fetching one stored meeting record. */
785
- interface MeetingsGetResult {
786
- /** False when `meetings.enabled` is off (zero behavior). */
787
- enabled: boolean;
788
- found: boolean;
680
+ interface WearablesServiceDeps {
681
+ config: WearablesConfig;
682
+ getStorage(): Promise<WearableStorageIo>;
683
+ /** Extraction hook; null when no engine is available. */
684
+ extract: WearableMemoryGenDeps["extract"] | null;
685
+ /**
686
+ * LLM-as-judge hook for smart memoryMode (the orchestrator wires the
687
+ * existing extraction judge here). Absent degrades smart mode to
688
+ * confidence x sourceTrust + corroboration scoring.
689
+ */
690
+ judgeFacts?: WearableMemoryGenDeps["judgeFacts"];
691
+ /** Search backend (QMD); null disables indexed search. */
692
+ searchBackend: WearableSearchBackend | null;
693
+ /** Fired after transcript writes so the search index refreshes. */
694
+ reindexSearch?: () => Promise<void>;
695
+ /**
696
+ * Meeting tail-step (issue #1900): fired once after a sync with the union of
697
+ * days it touched, so a dependent subsystem (meeting building) can rebuild the
698
+ * affected day(s). Wired for EVERY sync path — auto-sync AND manual
699
+ * HTTP/MCP/CLI backfill — because they all share this one service. Optional;
700
+ * omitted by hosts that do not build meetings. The hook self-gates and never
701
+ * fails the sync.
702
+ */
703
+ onDaysSynced?: (days: readonly string[]) => void | Promise<void>;
704
+ }
705
+ interface WearableTranscriptSearchResult {
706
+ source: string;
707
+ date: string;
708
+ score: number;
709
+ snippet: string;
710
+ /** "indexed" (QMD) or "scan" (substring fallback). */
711
+ backend: "indexed" | "scan";
712
+ }
713
+ interface WearableMemorySearchResult {
789
714
  id: string;
790
- /** Raw persisted markdown, or null when disabled/absent. */
791
- record: string | null;
715
+ source: string;
716
+ date?: string;
717
+ conversationId?: string;
718
+ status?: string;
719
+ content: string;
720
+ created: string;
792
721
  }
793
- interface MeetingsServiceDeps {
794
- config: MeetingsConfig;
795
- store: MeetingRecordStore;
796
- builder: MeetingsBuilder;
797
- /** Trailing-edge coalescing window for post-sync rebuilds (ms). */
798
- buildDebounceMs: number;
799
- /** Observe a tail-step build failure (logging); never called on success. */
800
- onBuildError?(date: string, err: unknown): void;
722
+ interface WearableDayTranscriptView {
723
+ source: string;
724
+ date: string;
725
+ meta: WearableDayTranscript["meta"] | null;
726
+ body: string;
727
+ /** Other sources that also recorded during this day (overlap hint). */
728
+ overlapsWith: string[];
801
729
  }
802
- declare class MeetingsService {
803
- readonly store: MeetingRecordStore;
804
- readonly builder: MeetingsBuilder;
805
- readonly config: MeetingsConfig;
806
- private readonly scheduler;
807
- constructor(deps: MeetingsServiceDeps);
808
- /** List stored meetings for one day, or across all days when no date given. */
809
- meetingsList(date?: string): Promise<MeetingsListResult>;
810
- /** Fetch one stored meeting record's raw markdown by id. */
811
- meetingsGet(id: string): Promise<MeetingsGetResult>;
812
- /** Detect + fuse + store the day's meetings. Gated inside the builder. */
813
- meetingsBuild(date: string): Promise<MeetingsDayBuildSummary>;
730
+ declare class WearablesService {
731
+ private readonly deps;
732
+ constructor(deps: WearablesServiceDeps);
733
+ get enabled(): boolean;
734
+ private assertEnabled;
735
+ private timezone;
736
+ private enabledSources;
737
+ /** Status for every configured source (and connector availability). */
738
+ status(): Promise<{
739
+ enabled: boolean;
740
+ timezone: string;
741
+ sources: WearableSourceStatus[];
742
+ connectorsInstalled: string[];
743
+ }>;
744
+ /** Run a sync for one source or all enabled sources. */
745
+ sync(options: WearableSyncOptions & {
746
+ source?: string;
747
+ }): Promise<WearableSyncSummary[]>;
748
+ /** Verify connectivity/credentials for one source. */
749
+ checkAuth(sourceId: string): Promise<{
750
+ ok: boolean;
751
+ detail?: string;
752
+ }>;
814
753
  /**
815
- * Tail-step after a sync touched a day: schedule a debounced (re)build. A
816
- * no-op when the subsystem is disabled, so a sync of other signals never
817
- * spins up meeting building behind the master gate.
754
+ * Full transcript(s) for a day. Without `source`, returns every
755
+ * source that recorded that day, annotated with overlap hints.
818
756
  */
819
- requestBuild(date: string): void;
757
+ dayTranscript(date: string, sourceId?: string): Promise<WearableDayTranscriptView[]>;
758
+ /** List days that have stored transcripts. */
759
+ listDays(sourceId?: string): Promise<Array<{
760
+ source: string;
761
+ date: string;
762
+ }>>;
820
763
  /**
821
- * Activity tail-step (issue #1900): schedule a debounced (re)build for every
822
- * local day the sync touched. The tick's own local day (from `ranAtIso`, in
823
- * the activity timezone) is always eligible; `touchedDates` adds any OTHER
824
- * days a rolling/backfill sync changed, so a change to yesterday's activity
825
- * rebuilds yesterday's meetings rather than only today's. No-op when disabled,
826
- * so a sync of other signals never spins up meeting building behind the gate.
764
+ * Fuse all enabled sources' stored transcripts for one day into a
765
+ * derived `FusedWearableConversation[]` artifact. Deterministic and
766
+ * idempotent: unchanged inputs and fusion config produce a stable
767
+ * content hash and the derived file is left untouched on re-run. Requires
768
+ * `wearables.fusion.enabled`; otherwise it throws. Raw per-source
769
+ * transcripts are never modified.
827
770
  */
828
- requestBuildForActivitySync(ranAtIso: string, timezone: string, touchedDates?: readonly string[]): void;
829
- /** Force any pending debounced builds to run now (teardown/tests). */
830
- flushBuilds(): Promise<void>;
831
- /** Cancel armed build timers (orchestrator teardown). */
832
- dispose(): void;
771
+ fuseDay(date: string): Promise<{
772
+ date: string;
773
+ sources: string[];
774
+ conversationCount: number;
775
+ contentHash: string;
776
+ written: boolean;
777
+ skipped?: {
778
+ reason: string;
779
+ };
780
+ }>;
781
+ /**
782
+ * List fused conversations for a date (the fusion listing surface).
783
+ * Returns the persisted derived artifact's conversations, or an empty
784
+ * array when no fused artifact has been written for that day. When a
785
+ * file EXISTS but its body is corrupt (parseOk:false), throws
786
+ * WearablesInputError so the caller can distinguish a broken artifact
787
+ * from a day that was never fused — never silently returns an empty
788
+ * list that looks identical to "no artifact" (issue #1849).
789
+ */
790
+ fusedConversations(date: string): Promise<FusedWearableConversation[]>;
791
+ /** List dates with stored fused artifacts, newest first. */
792
+ listFusedDays(): Promise<string[]>;
793
+ /**
794
+ * Search stored transcripts. Uses the indexed backend when available
795
+ * and falls back to a bounded substring scan otherwise — the two
796
+ * paths are distinguishable in the result (`backend`) so callers can
797
+ * tell "no hits" from "weaker search ran".
798
+ */
799
+ searchTranscripts(query: string, options?: {
800
+ source?: string;
801
+ from?: string;
802
+ to?: string;
803
+ limit?: number;
804
+ }): Promise<WearableTranscriptSearchResult[]>;
805
+ /**
806
+ * Memories created from wearable transcripts, filterable by source
807
+ * and/or day. Includes pending_review candidates — the whole point of
808
+ * review mode is seeing what's queued.
809
+ */
810
+ transcriptMemories(options?: {
811
+ source?: string;
812
+ date?: string;
813
+ limit?: number;
814
+ }): Promise<WearableMemorySearchResult[]>;
815
+ listSpeakers(): Promise<SpeakerRegistry>;
816
+ setSpeaker(sourceId: string, speakerKey: string, name: string, opts?: {
817
+ isSelf?: boolean;
818
+ }): Promise<SpeakerRegistry>;
819
+ setSelfName(name: string): Promise<SpeakerRegistry>;
820
+ removeSpeaker(sourceId: string, speakerKey: string): Promise<SpeakerRegistry>;
821
+ listCorrections(): Promise<{
822
+ fromConfig: WearableCorrectionRule[];
823
+ fromState: WearableCorrectionRule[];
824
+ stateFilePath: string;
825
+ }>;
826
+ addCorrection(rule: WearableCorrectionRule): Promise<void>;
827
+ removeCorrection(index: number): Promise<WearableCorrectionRule>;
833
828
  }
829
+ /** Map an indexed-search hit path back to (source, date), or null. */
830
+ declare function locateTranscriptPath(hitPath: string): {
831
+ source: string;
832
+ date: string;
833
+ } | null;
834
834
 
835
835
  export { wearableSourceLabel as $, type WearableSyncOptions as A, type WearableTranscriptSearchResult as B, type WearablesServiceDeps as C, DEFAULT_SELF_NAME as D, buildExtractionTurns as E, buildMeetingRecordsForDay as F, dateInTimezone as G, defaultTimezone as H, distinctSpeakerLabels as I, emptySpeakerRegistry as J, fuseMeeting as K, generateWearableMemories as L, MeetingsService as M, importNativeMemories as N, loadSpeakerRegistry as O, locateTranscriptPath as P, memoryStatusForMode as Q, type ResolvedSpeaker as R, type SpeakerRegistry as S, resolveSpeaker as T, resolveSyncDates as U, saveSpeakerRegistry as V, WearablesService as W, speakerRegistryKey as X, speakersFilePath as Y, syncWearableSource as Z, wearableDayTag as _, type MeetingsDayBuildSummary as a, writeDailyDigestMemory as a0, type MeetingsGetResult as b, type MeetingsListResult as c, type MeetingMemoryWriter as d, type MeetingMemoryGenerator as e, type MeetingEpisodeGenResult as f, MeetingsBuilder as g, type MeetingsDaySource as h, type MeetingDayData as i, type MeetingBuildOutcome as j, type MeetingFusionOptions as k, type MeetingMemoryOutcome as l, type MeetingsBuilderHooks as m, type MeetingsDayFactGenResult as n, type MeetingsListDay as o, type MeetingsServiceDeps as p, type SpeakerOverride as q, WEARABLE_SOURCE_PREFIX as r, type WearableDayTranscriptView as s, type WearableMemoryGenDeps as t, type WearableMemoryGenResult as u, type WearableMemorySearchResult as v, type WearableMemoryWriter as w, type WearableSearchBackend as x, type WearableStorageIo as y, type WearableSyncDeps as z };