@dxos/plugin-thread 0.8.3-staging.0fa589b → 0.8.4-main.28f8d3d

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 (294) hide show
  1. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs → app-graph-builder-AF3M7UWN.mjs} +8 -8
  4. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-APQAZWHT.mjs → call-manager-XRRCAVLI.mjs} +6 -5
  6. package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2CWJBXBH.mjs +21 -0
  8. package/dist/lib/browser/{chunk-R5MDLUPC.mjs → chunk-4APCDRSH.mjs} +3 -3
  9. package/dist/lib/browser/{chunk-R5MDLUPC.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  10. package/dist/lib/browser/{chunk-AEXWNS6Z.mjs → chunk-DW7JD64V.mjs} +14 -5
  11. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-IIUTBDVB.mjs → chunk-EV4JWI7L.mjs} +2 -2
  13. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +367 -0
  14. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-GERVMFQW.mjs} +2 -2
  16. package/dist/lib/browser/chunk-J3JO5NWO.mjs +477 -0
  17. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-JGKMMI65.mjs +56 -0
  19. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-TUFWPOVS.mjs} +148 -158
  21. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-5P5BH5GE.mjs → chunk-X5PIP5YR.mjs} +67 -6
  23. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-XZKBN3NS.mjs → chunk-ZJ7QBXK6.mjs} +246 -245
  25. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +7 -0
  26. package/dist/lib/browser/index.mjs +36 -42
  27. package/dist/lib/browser/index.mjs.map +3 -3
  28. package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs → intent-resolver-DCY4P4OX.mjs} +31 -15
  29. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +7 -0
  30. package/dist/lib/browser/{markdown-TE5SWWNJ.mjs → markdown-WZSXCEZJ.mjs} +8 -8
  31. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +7 -0
  32. package/dist/lib/browser/meta.json +1 -1
  33. package/dist/lib/browser/react-root-QXPALOUQ.mjs +28 -0
  34. package/dist/lib/browser/{react-surface-VXUJKSOG.mjs → react-surface-PYAMIADB.mjs} +12 -11
  35. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +7 -0
  36. package/dist/lib/browser/{settings-RB2RSLXV.mjs → settings-AC6YSASL.mjs} +4 -4
  37. package/dist/lib/browser/{state-RKL5MSDP.mjs → state-2T4KDWBX.mjs} +4 -4
  38. package/dist/lib/browser/{state-RKL5MSDP.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
  39. package/dist/lib/browser/types/index.mjs +2 -2
  40. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +17 -0
  41. package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs → ChatContainer-2CT4PJ7I.mjs} +6 -5
  42. package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs → app-graph-builder-OLSJVCWY.mjs} +8 -8
  43. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +7 -0
  44. package/dist/lib/node-esm/{call-manager-UUYXLF4T.mjs → call-manager-EI7FXRAU.mjs} +6 -5
  45. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-4TME3BR4.mjs} +147 -158
  47. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-57XR3LEF.mjs} +2 -2
  49. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +23 -0
  50. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +368 -0
  51. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs → chunk-GRLRWTRU.mjs} +2 -2
  53. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs → chunk-PYTVBN5J.mjs} +3 -3
  54. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  55. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs +58 -0
  56. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-O3V45YJP.mjs → chunk-SED3O2XO.mjs} +66 -6
  58. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +478 -0
  60. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs → chunk-XVKWHTH4.mjs} +14 -5
  62. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-2RNIPFDA.mjs → chunk-YIDU3DXK.mjs} +246 -245
  64. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +7 -0
  65. package/dist/lib/node-esm/index.mjs +36 -42
  66. package/dist/lib/node-esm/index.mjs.map +3 -3
  67. package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs → intent-resolver-QGTPU6QB.mjs} +31 -15
  68. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +7 -0
  69. package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs → markdown-3MZXUGUA.mjs} +8 -8
  70. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +7 -0
  71. package/dist/lib/node-esm/meta.json +1 -1
  72. package/dist/lib/node-esm/{react-root-RUXOAQNW.mjs → react-root-7ZFJYVUZ.mjs} +12 -11
  73. package/dist/lib/{browser/react-root-NK3A4VG7.mjs.map → node-esm/react-root-7ZFJYVUZ.mjs.map} +1 -1
  74. package/dist/lib/node-esm/{react-surface-ELXFYKP6.mjs → react-surface-UJFCSFNO.mjs} +12 -11
  75. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +7 -0
  76. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs → settings-N52O7MLS.mjs} +4 -4
  77. package/dist/lib/node-esm/{state-6AUTNROZ.mjs → state-62TQKQVB.mjs} +4 -4
  78. package/dist/lib/node-esm/{state-6AUTNROZ.mjs.map → state-62TQKQVB.mjs.map} +2 -2
  79. package/dist/lib/node-esm/types/index.mjs +2 -2
  80. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  81. package/dist/types/src/calls/call-manager.d.ts +1 -1
  82. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  83. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  84. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  85. package/dist/types/src/calls/types.d.ts +1 -1
  86. package/dist/types/src/calls/types.d.ts.map +1 -1
  87. package/dist/types/src/calls/util/calls-service.d.ts +5 -2
  88. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  89. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  90. package/dist/types/src/calls-service.stories.d.ts +22 -0
  91. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  95. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/index.d.ts +1 -1
  97. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  100. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  103. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  104. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  105. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  106. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  107. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  108. package/dist/types/src/components/ChannelContainer.stories.d.ts +2 -2
  109. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/Chat.stories.d.ts +3 -2
  111. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/ChatContainer.d.ts +2 -2
  113. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  114. package/dist/types/src/components/Comments.stories.d.ts +1 -1
  115. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/CommentsContainer.d.ts +4 -4
  117. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  119. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  120. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  121. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  122. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  123. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  126. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +1 -1
  127. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  128. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +1 -1
  129. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  131. package/dist/types/src/components/index.d.ts +1 -1
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/extensions/threads.d.ts +2 -2
  134. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  135. package/dist/types/src/hooks/index.d.ts +2 -0
  136. package/dist/types/src/hooks/index.d.ts.map +1 -1
  137. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  138. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  139. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  140. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  141. package/dist/types/src/testing/stories.d.ts.map +1 -1
  142. package/dist/types/src/translations.d.ts +74 -194
  143. package/dist/types/src/translations.d.ts.map +1 -1
  144. package/dist/types/src/types/schema.d.ts +53 -22
  145. package/dist/types/src/types/schema.d.ts.map +1 -1
  146. package/dist/types/src/types/types.d.ts +72 -24
  147. package/dist/types/src/types/types.d.ts.map +1 -1
  148. package/dist/types/src/util.d.ts +17 -2
  149. package/dist/types/src/util.d.ts.map +1 -1
  150. package/dist/types/tsconfig.tsbuildinfo +1 -1
  151. package/package.json +49 -48
  152. package/src/ThreadPlugin.tsx +9 -24
  153. package/src/calls/call-manager.ts +7 -3
  154. package/src/calls/call-swarm-synchronizer.ts +1 -1
  155. package/src/calls/media-manager.ts +13 -6
  156. package/src/calls/types.ts +1 -1
  157. package/src/calls/util/calls-service.ts +12 -8
  158. package/src/calls/util/stub-media-streams.ts +5 -8
  159. package/src/calls-service.stories.tsx +216 -0
  160. package/src/capabilities/app-graph-builder.ts +6 -5
  161. package/src/capabilities/call-manager.ts +3 -2
  162. package/src/capabilities/capabilities.ts +2 -2
  163. package/src/capabilities/intent-resolver.ts +26 -7
  164. package/src/capabilities/markdown.ts +4 -3
  165. package/src/capabilities/react-surface.tsx +5 -4
  166. package/src/capabilities/state.ts +2 -1
  167. package/src/components/Call/Call.tsx +4 -3
  168. package/src/components/Call/Toolbar.tsx +5 -5
  169. package/src/components/CallDebugPanel.tsx +3 -3
  170. package/src/components/CallSidebar.tsx +2 -1
  171. package/src/components/ChannelContainer.stories.tsx +8 -7
  172. package/src/components/ChannelContainer.tsx +13 -11
  173. package/src/components/Chat.stories.tsx +7 -6
  174. package/src/components/ChatContainer.tsx +16 -14
  175. package/src/components/Comments.stories.tsx +24 -16
  176. package/src/components/CommentsContainer.tsx +17 -11
  177. package/src/components/{CommentContainer.tsx → CommentsThreadContainer.tsx} +51 -81
  178. package/src/components/Lobby/Lobby.tsx +1 -1
  179. package/src/components/Media/VideoObject.stories.tsx +4 -3
  180. package/src/components/MessageContainer.tsx +31 -46
  181. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  182. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -4
  183. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +5 -4
  184. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  185. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +4 -4
  186. package/src/components/ThreadComplementary.tsx +3 -3
  187. package/src/components/ThreadSettings.tsx +2 -2
  188. package/src/components/command-extension.ts +1 -1
  189. package/src/components/index.ts +1 -1
  190. package/src/components/testing.ts +2 -2
  191. package/src/extensions/threads.ts +6 -6
  192. package/src/hooks/index.ts +2 -0
  193. package/src/hooks/useDebugMode.ts +1 -1
  194. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  195. package/src/hooks/useVideoStreamTrack.tsx +33 -0
  196. package/src/testing/stories.ts +7 -3
  197. package/src/translations.ts +11 -8
  198. package/src/types/types.ts +11 -2
  199. package/src/typings.d.ts +8 -0
  200. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  201. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  202. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
  203. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  207. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
  209. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
  211. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  212. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  213. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  214. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
  215. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  216. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
  217. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  218. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  219. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  220. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  221. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  222. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  223. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  224. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  225. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  226. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  227. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  228. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  229. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  230. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  231. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  232. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  233. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  234. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  235. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  236. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  237. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  238. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  239. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  240. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  241. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  242. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  243. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  244. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  245. package/dist/lib/node/index.cjs +0 -310
  246. package/dist/lib/node/index.cjs.map +0 -7
  247. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  248. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  249. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  250. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  251. package/dist/lib/node/meta.json +0 -1
  252. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  253. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  254. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  255. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  256. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  257. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  258. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  259. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  260. package/dist/lib/node/types/index.cjs +0 -38
  261. package/dist/lib/node/types/index.cjs.map +0 -7
  262. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  263. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
  264. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
  265. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  266. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  267. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  268. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
  269. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  270. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  271. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
  272. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  273. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  274. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  275. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
  276. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
  277. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  278. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  279. package/dist/types/src/peers.stories.d.ts +0 -11
  280. package/dist/types/src/peers.stories.d.ts.map +0 -1
  281. package/src/peers.stories.tsx +0 -189
  282. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → ChannelContainer-O2SFQJU7.mjs.map} +0 -0
  283. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → ChatContainer-PVT3DUZJ.mjs.map} +0 -0
  284. /package/dist/lib/browser/{chunk-6NBVNXTM.mjs.map → chunk-2CWJBXBH.mjs.map} +0 -0
  285. /package/dist/lib/browser/{chunk-IIUTBDVB.mjs.map → chunk-EV4JWI7L.mjs.map} +0 -0
  286. /package/dist/lib/browser/{chunk-JKQUJOTX.mjs.map → chunk-GERVMFQW.mjs.map} +0 -0
  287. /package/dist/lib/{node-esm/react-root-RUXOAQNW.mjs.map → browser/react-root-QXPALOUQ.mjs.map} +0 -0
  288. /package/dist/lib/browser/{settings-RB2RSLXV.mjs.map → settings-AC6YSASL.mjs.map} +0 -0
  289. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → ChannelContainer-B2ZGAE4P.mjs.map} +0 -0
  290. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → ChatContainer-2CT4PJ7I.mjs.map} +0 -0
  291. /package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs.map → chunk-57XR3LEF.mjs.map} +0 -0
  292. /package/dist/lib/node-esm/{chunk-O63QJPQX.mjs.map → chunk-6CRHHOST.mjs.map} +0 -0
  293. /package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs.map → chunk-GRLRWTRU.mjs.map} +0 -0
  294. /package/dist/lib/node-esm/{settings-EA7DFSM6.mjs.map → settings-N52O7MLS.mjs.map} +0 -0
@@ -2,97 +2,39 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { CheckCircle, X } from '@phosphor-icons/react';
6
5
  import React, { useCallback, useMemo, useRef, useState } from 'react';
7
6
 
8
- import { Relation } from '@dxos/echo';
9
- import { RefArray } from '@dxos/live-object';
7
+ import { Ref, Relation } from '@dxos/echo';
10
8
  import { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';
11
9
  import { useIdentity } from '@dxos/react-client/halo';
12
- import { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
10
+ import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
13
11
  import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';
14
- import {
15
- getSize,
16
- hoverableControlItem,
17
- hoverableControls,
18
- hoverableFocusedWithinControls,
19
- mx,
20
- } from '@dxos/react-ui-theme';
21
- import {
22
- MessageTextbox,
23
- type MessageTextboxProps,
24
- Thread,
25
- ThreadFooter,
26
- ThreadHeading,
27
- type ThreadProps,
28
- } from '@dxos/react-ui-thread';
12
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
13
+ import { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';
29
14
  import { type AnchoredTo } from '@dxos/schema';
30
15
  import { isNonNullable } from '@dxos/util';
31
16
 
32
- import { MessageContainer } from './MessageContainer';
33
- import { command } from './command-extension';
34
17
  import { useStatus } from '../hooks';
35
- import { THREAD_PLUGIN } from '../meta';
18
+ import { meta } from '../meta';
36
19
  import { type ThreadType } from '../types';
37
20
  import { getMessageMetadata } from '../util';
38
21
 
39
- const sizeClass = getSize(4);
40
-
41
- // TODO(thure): #8149
42
- const commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';
43
-
44
- const ToggleResolvedButton = ({
45
- isResolved,
46
- onResolve,
47
- }: {
48
- isResolved: boolean | undefined;
49
- onResolve: () => void;
50
- }) => {
51
- const { t } = useTranslation(THREAD_PLUGIN);
52
- const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');
53
- return (
54
- <Tooltip.Trigger asChild content={label}>
55
- <Button
56
- variant='ghost'
57
- data-testid='thread.toggle-resolved'
58
- onClick={onResolve}
59
- classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}
60
- >
61
- <span className='sr-only'>{label}</span>
62
- {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}
63
- </Button>
64
- </Tooltip.Trigger>
65
- );
66
- };
22
+ import { command } from './command-extension';
23
+ import { MessageContainer } from './MessageContainer';
67
24
 
68
- const DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {
69
- const { t } = useTranslation(THREAD_PLUGIN);
70
- const label = t('delete thread label');
71
- return (
72
- <Tooltip.Trigger asChild content={label}>
73
- <Button
74
- variant='ghost'
75
- data-testid='thread.delete'
76
- onClick={onDelete}
77
- classNames={[commentControlClassNames, hoverableControlItem]}
78
- >
79
- <span className='sr-only'>{label}</span>
80
- <X className={sizeClass} />
81
- </Button>
82
- </Tooltip.Trigger>
83
- );
84
- };
25
+ // TODO(burdon): Remove need for p-1.
26
+ export const commentControlClassNames = '!p-1 transition-opacity';
85
27
 
86
- export type CommentContainerProps = {
28
+ export type CommentsThreadContainerProps = {
87
29
  anchor: AnchoredTo;
88
30
  onAttend?: (anchor: AnchoredTo) => void;
89
31
  onComment?: (anchor: AnchoredTo, message: string) => void;
90
32
  onResolve?: (anchor: AnchoredTo) => void;
91
33
  onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;
92
34
  onThreadDelete?: (anchor: AnchoredTo) => void;
93
- } & Pick<ThreadProps, 'current'>;
35
+ } & Pick<ThreadRootProps, 'current'>;
94
36
 
95
- export const CommentContainer = ({
37
+ export const CommentsThreadContainer = ({
96
38
  anchor,
97
39
  current,
98
40
  onAttend,
@@ -100,14 +42,14 @@ export const CommentContainer = ({
100
42
  onResolve,
101
43
  onMessageDelete,
102
44
  onThreadDelete,
103
- }: CommentContainerProps) => {
45
+ }: CommentsThreadContainerProps) => {
46
+ const { t } = useTranslation(meta.id);
104
47
  const identity = useIdentity()!;
105
48
  const space = getSpace(anchor);
106
49
  const members = useMembers(space?.key);
107
50
  const detached = !anchor.anchor;
108
51
  const thread = Relation.getSource(anchor) as ThreadType;
109
52
  const activity = useStatus(space, fullyQualifiedId(thread));
110
- const { t } = useTranslation(THREAD_PLUGIN);
111
53
  const threadScrollRef = useRef<HTMLDivElement | null>(null);
112
54
  const { themeMode } = useThemeContext();
113
55
 
@@ -149,7 +91,13 @@ export const CommentContainer = ({
149
91
  }, [anchor, identity]);
150
92
 
151
93
  return (
152
- <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>
94
+ <Thread.Root
95
+ id={fullyQualifiedId(thread)}
96
+ classNames='pbs-2 border-be border-subduedSeparator last:border-none'
97
+ current={current}
98
+ onClickCapture={handleAttend}
99
+ onFocusCapture={handleAttend}
100
+ >
153
101
  <div
154
102
  role='none'
155
103
  className={mx(
@@ -160,21 +108,40 @@ export const CommentContainer = ({
160
108
  >
161
109
  {detached ? (
162
110
  <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
163
- <ThreadHeading detached>{thread.name}</ThreadHeading>
111
+ <Thread.Header detached>{thread.name}</Thread.Header>
164
112
  </Tooltip.Trigger>
165
113
  ) : (
166
- <ThreadHeading>{thread.name}</ThreadHeading>
114
+ <Thread.Header>{thread.name}</Thread.Header>
167
115
  )}
168
- <div className='flex flex-row items-center pli-1'>
116
+ <div className='flex flex-row items-center gap-0.5'>
169
117
  {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
170
118
  {onResolve && !(thread?.status === 'staged') && (
171
- <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />
119
+ <IconButton
120
+ data-testid='thread.resolve'
121
+ variant='ghost'
122
+ icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
123
+ iconOnly
124
+ label={t('resolve thread label')}
125
+ classNames={[commentControlClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
126
+ onClick={handleResolve}
127
+ />
128
+ )}
129
+ {onThreadDelete && (
130
+ <IconButton
131
+ data-testid='thread.delete'
132
+ variant='ghost'
133
+ icon='ph--x--regular'
134
+ iconOnly
135
+ label={t('delete thread label')}
136
+ classNames={[commentControlClassNames, hoverableControlItem]}
137
+ onClick={handleThreadDelete}
138
+ />
172
139
  )}
173
- {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}
174
140
  </div>
175
141
  </div>
142
+
176
143
  {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}
177
- {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
144
+ {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
178
145
  <MessageContainer
179
146
  key={message.id}
180
147
  editable
@@ -183,6 +150,7 @@ export const CommentContainer = ({
183
150
  onDelete={handleMessageDelete}
184
151
  />
185
152
  ))}
153
+
186
154
  {/*
187
155
  TODO(wittjosiah): Can't autofocus this generally.
188
156
  There can be multiple threads with inputs and they can't all be focused.
@@ -190,9 +158,11 @@ export const CommentContainer = ({
190
158
  Need to find a way to autofocus in one scenario only: when a new thread is created.
191
159
  */}
192
160
  <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
193
- <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>
161
+
162
+ <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>
163
+
194
164
  {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
195
165
  <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
196
- </Thread>
166
+ </Thread.Root>
197
167
  );
198
168
  };
@@ -5,7 +5,7 @@
5
5
  import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
6
6
 
7
7
  import { useCapability } from '@dxos/app-framework';
8
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
8
+ import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
9
9
  import { mx } from '@dxos/react-ui-theme';
10
10
 
11
11
  import { ThreadCapabilities } from '../../capabilities';
@@ -4,18 +4,19 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
10
  import { scheduleTask } from '@dxos/async';
11
11
  import { Context } from '@dxos/context';
12
12
  import { log } from '@dxos/log';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
13
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
14
14
 
15
- import { VideoObject } from './VideoObject';
16
15
  import { getUserMediaTrack } from '../../calls';
17
16
  import { ResponsiveContainer } from '../ResponsiveGrid';
18
17
 
18
+ import { VideoObject } from './VideoObject';
19
+
19
20
  const meta: Meta<typeof VideoObject> = {
20
21
  title: 'plugins/plugin-thread/VideoObject',
21
22
  component: VideoObject,
@@ -3,34 +3,25 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
- import { Check, PencilSimple, X } from '@phosphor-icons/react';
7
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
8
7
 
9
8
  import { Surface } from '@dxos/app-framework';
10
- import { type Obj, type Type } from '@dxos/echo';
11
- import { RefArray } from '@dxos/live-object';
9
+ import { type Obj, Ref, type Type } from '@dxos/echo';
12
10
  import { PublicKey } from '@dxos/react-client';
13
11
  import { type SpaceMember } from '@dxos/react-client/echo';
14
- import { useIdentity, type Identity } from '@dxos/react-client/halo';
15
- import { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
12
+ import { type Identity, useIdentity } from '@dxos/react-client/halo';
13
+ import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
16
14
  import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
17
- import {
18
- getSize,
19
- hoverableControlItem,
20
- hoverableControls,
21
- hoverableFocusedWithinControls,
22
- mx,
23
- } from '@dxos/react-ui-theme';
15
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
24
16
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
25
17
  import { type DataType } from '@dxos/schema';
26
18
 
27
- import { command } from './command-extension';
28
19
  import { useOnEditAnalytics } from '../hooks';
29
- import { THREAD_PLUGIN } from '../meta';
20
+ import { meta } from '../meta';
30
21
  import { getMessageMetadata } from '../util';
31
22
 
32
- // TODO(thure): #8149
33
- const messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];
23
+ import { command } from './command-extension';
24
+ import { commentControlClassNames } from './CommentsThreadContainer';
34
25
 
35
26
  export type MessageContainerProps = {
36
27
  message: DataType.Message;
@@ -40,6 +31,7 @@ export type MessageContainerProps = {
40
31
  };
41
32
 
42
33
  export const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {
34
+ const { t } = useTranslation(meta.id);
43
35
  const senderIdentity = members.find(
44
36
  (member) =>
45
37
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
@@ -49,48 +41,41 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
49
41
  const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
50
42
  const [editing, setEditing] = useState(false);
51
43
  const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
52
- const { t } = useTranslation(THREAD_PLUGIN);
53
- const editLabel = t(editing ? 'save message label' : 'edit message label');
54
- const deleteLabel = t('delete message label');
55
- const textBlock = message.blocks.find((block) => block.type === 'text');
56
- const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);
44
+ const textBlock = message.blocks.find((block) => block._tag === 'text');
45
+ const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
57
46
 
58
47
  useOnEditAnalytics(message, textBlock, !!editing);
59
48
 
60
49
  return (
61
50
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
62
51
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
63
- <ButtonGroup classNames='mie-1'>
52
+ <div className='flex flex-row items-center gap-0.5'>
64
53
  {userIsAuthor && editable && (
65
- <Tooltip.Trigger asChild content={editLabel}>
66
- <Button
67
- variant='ghost'
68
- data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
69
- classNames={messageControlClassNames}
70
- onClick={() => setEditing((editing) => !editing)}
71
- >
72
- <span className='sr-only'>{editLabel}</span>
73
- {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}
74
- </Button>
75
- </Tooltip.Trigger>
54
+ <IconButton
55
+ data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
56
+ variant='ghost'
57
+ icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
58
+ iconOnly
59
+ label={t(editing ? 'save message label' : 'edit message label')}
60
+ classNames={[commentControlClassNames, hoverableControlItem]}
61
+ onClick={() => setEditing((editing) => !editing)}
62
+ />
76
63
  )}
77
64
  {onDelete && (
78
- <Tooltip.Trigger asChild content={deleteLabel}>
79
- <Button
80
- variant='ghost'
81
- data-testid='thread.message.delete'
82
- classNames={messageControlClassNames}
83
- onClick={() => handleDelete()}
84
- >
85
- <span className='sr-only'>{deleteLabel}</span>
86
- <X className={getSize(4)} />
87
- </Button>
88
- </Tooltip.Trigger>
65
+ <IconButton
66
+ data-testid='thread.message.delete'
67
+ variant='ghost'
68
+ icon='ph--x--regular'
69
+ iconOnly
70
+ label={t('delete message label')}
71
+ classNames={[commentControlClassNames, hoverableControlItem]}
72
+ onClick={() => handleDelete()}
73
+ />
89
74
  )}
90
- </ButtonGroup>
75
+ </div>
91
76
  </MessageHeading>
92
77
  {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
93
- {RefArray.targets(references).map((reference, index) => (
78
+ {Ref.Array.targets(references).map((reference, index) => (
94
79
  <MessagePart key={index} part={reference} />
95
80
  ))}
96
81
  </MessageRoot>
@@ -6,10 +6,11 @@ import React, { useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { type ThemedClassName } from '@dxos/react-ui';
8
8
 
9
- import { Participant, SCREENSHARE_SUFFIX } from './Participant';
10
9
  import { type UserState } from '../../calls';
11
10
  import { ResponsiveGrid } from '../ResponsiveGrid';
12
11
 
12
+ import { Participant, SCREENSHARE_SUFFIX } from './Participant';
13
+
13
14
  const getId = (user: UserState): string => user.id!;
14
15
 
15
16
  export type ParticipantGridProps = ThemedClassName<{
@@ -4,15 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
10
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
11
11
 
12
- import { ResponsiveContainer } from './ResponsiveContainer';
13
- import translations from '../../translations';
12
+ import { translations } from '../../translations';
14
13
  import { VideoObject as VideoObjectComponent } from '../Media';
15
14
 
15
+ import { ResponsiveContainer } from './ResponsiveContainer';
16
+
16
17
  const meta: Meta<typeof ResponsiveContainer> = {
17
18
  title: 'plugins/plugin-thread/ResponsiveContainer',
18
19
  component: ResponsiveContainer,
@@ -4,15 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
10
  import { faker } from '@dxos/random';
11
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
12
+
13
+ import { translations } from '../../translations';
12
14
 
13
15
  import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
14
16
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
15
- import translations from '../../translations';
16
17
 
17
18
  type TestItem = {
18
19
  id: string;
@@ -61,7 +62,7 @@ const meta: Meta<StoryProps> = {
61
62
  component: ResponsiveGrid,
62
63
  render: (args) => {
63
64
  const [pinned, setPinned] = useState<string | undefined>(
64
- args.pinned ?? args.items.length > 1 ? args.items[0]?.id : undefined,
65
+ (args.pinned ?? args.items.length > 1) ? args.items[0]?.id : undefined,
65
66
  );
66
67
  const [items, setItems] = useState<TestItem[]>(args.items);
67
68
  useEffect(() => {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type ComponentType, type FC, useLayoutEffect, useState, useEffect, useMemo, useCallback } from 'react';
5
+ import React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
6
6
  import { useResizeDetector } from 'react-resize-detector';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
@@ -2,13 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useEffect, useState, type CSSProperties, type PropsWithChildren } from 'react';
5
+ import React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';
6
6
 
7
- import { Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';
7
+ import { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
8
  import { Waveform } from '@dxos/react-ui-sfx';
9
9
  import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
10
10
 
11
- import { THREAD_PLUGIN } from '../../meta';
11
+ import { meta } from '../../meta';
12
12
 
13
13
  export type ResponsiveGridItemProps<T extends object = any> = PropsWithChildren<
14
14
  ThemedClassName<{
@@ -45,7 +45,7 @@ export const ResponsiveGridItem = <T extends object = any>({
45
45
  speaking,
46
46
  onClick,
47
47
  }: ResponsiveGridItemProps<T>) => {
48
- const { t } = useTranslation(THREAD_PLUGIN);
48
+ const { t } = useTranslation(meta.id);
49
49
  const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {
50
50
  wave: {
51
51
  icon: 'ph--hand-waving--duotone',
@@ -8,8 +8,8 @@ import {
8
8
  Capabilities,
9
9
  LayoutAction,
10
10
  createIntent,
11
- useCapability,
12
11
  useCapabilities,
12
+ useCapability,
13
13
  useIntentDispatcher,
14
14
  } from '@dxos/app-framework';
15
15
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
@@ -23,13 +23,13 @@ import { AnchoredTo } from '@dxos/schema';
23
23
 
24
24
  import { ThreadCapabilities } from '../capabilities';
25
25
  import { CommentsContainer } from '../components';
26
- import { THREAD_PLUGIN } from '../meta';
26
+ import { meta } from '../meta';
27
27
  import { ThreadAction, ThreadType } from '../types';
28
28
 
29
29
  export const ThreadComplementary = ({ subject }: { subject: any }) => {
30
+ const { t } = useTranslation(meta.id);
30
31
  const { dispatchPromise: dispatch } = useIntentDispatcher();
31
32
  const identity = useIdentity();
32
- const { t } = useTranslation(THREAD_PLUGIN);
33
33
  const { tx } = useThemeContext();
34
34
  const subjectId = fullyQualifiedId(subject);
35
35
 
@@ -7,11 +7,11 @@ import React from 'react';
7
7
  // import { useTranslation } from '@dxos/react-ui';
8
8
  import { DeprecatedFormContainer } from '@dxos/react-ui-form';
9
9
 
10
- // import { THREAD_PLUGIN } from '../meta';
10
+ // import { meta } from '../meta';
11
11
  import type { ThreadSettingsProps } from '../types';
12
12
 
13
13
  export const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {
14
- // const { t } = useTranslation(THREAD_PLUGIN);
14
+ // const { t } = useTranslation(meta.id);
15
15
 
16
16
  return <DeprecatedFormContainer></DeprecatedFormContainer>;
17
17
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';
5
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';
6
6
  import { type Extension } from '@codemirror/state';
7
7
 
8
8
  import { tags } from '@dxos/react-ui-editor';
@@ -11,8 +11,8 @@ export const ChatContainer = lazy(() => import('./ChatContainer'));
11
11
  export * from './Call';
12
12
  export * from './CallDebugPanel';
13
13
  export * from './CallSidebar';
14
- export * from './CommentContainer';
15
14
  export * from './CommentsContainer';
15
+ export * from './CommentsThreadContainer';
16
16
  export * from './MessageContainer';
17
17
  export * from './ThreadComplementary';
18
18
  export * from './ThreadSettings';
@@ -16,11 +16,11 @@ export const createCommentThread = (identity: Identity): ThreadType => {
16
16
  () =>
17
17
  Ref.make(
18
18
  Obj.make(DataType.Message, {
19
+ created: new Date().toISOString(),
19
20
  sender: {
20
21
  identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
21
22
  },
22
- created: new Date().toISOString(),
23
- blocks: [{ type: 'text', text: faker.lorem.sentences(3) }],
23
+ blocks: [{ _tag: 'text', text: faker.lorem.sentences(3) }],
24
24
  }),
25
25
  ),
26
26
  { count: { min: 2, max: 3 } },
@@ -6,17 +6,17 @@ import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
  import { computed, effect } from '@preact/signals-core';
8
8
 
9
- import { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
9
+ import { type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
10
10
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
- import { type DocumentType } from '@dxos/plugin-markdown/types';
12
- import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
11
+ import { type Markdown } from '@dxos/plugin-markdown/types';
12
+ import { createDocAccessor, fullyQualifiedId, getSource, getSpace, getTextInRange } from '@dxos/react-client/echo';
13
13
  import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
14
14
  import { AnchoredTo } from '@dxos/schema';
15
15
 
16
- import { ThreadAction, ThreadType, type ThreadState } from '../types';
16
+ import { ThreadAction, type ThreadState, ThreadType } from '../types';
17
17
 
18
18
  // TODO(burdon): Factor out.
19
- const getName = (doc: DocumentType, anchor: string): string | undefined => {
19
+ const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
20
20
  if (doc.content) {
21
21
  const [start, end] = anchor.split(':');
22
22
  return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);
@@ -26,7 +26,7 @@ const getName = (doc: DocumentType, anchor: string): string | undefined => {
26
26
  /**
27
27
  * Construct plugins.
28
28
  */
29
- export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {
29
+ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?: PromiseIntentDispatcher): Extension => {
30
30
  const space = doc && getSpace(doc);
31
31
  if (!doc || !space || !dispatch) {
32
32
  // Include no-op comments extension here to ensure that the facets are always present when they are expected.
@@ -5,3 +5,5 @@
5
5
  export * from './analytics';
6
6
  export * from './useDebugMode';
7
7
  export * from './useStatus';
8
+ export * from './useVideoStreamTrack';
9
+ export * from './useInaudibleAudioStreamTrack';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useState, useEffect } from 'react';
5
+ import { useEffect, useState } from 'react';
6
6
 
7
7
  // TODO(burdon): Standardize across plugins/composer.
8
8
  export const useDebugMode = () => {
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import { scheduleTask } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
9
+
10
+ import { createInaudibleAudioStreamTrack } from '../calls/util/stub-media-streams';
11
+
12
+ export const useInaudibleAudioStreamTrack = () => {
13
+ const [audioStreamTrack, setAudioStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
14
+ useEffect(() => {
15
+ const ctx = new Context();
16
+ scheduleTask(ctx, async () => {
17
+ const audioStreamTrack = await createInaudibleAudioStreamTrack({ ctx });
18
+ setAudioStreamTrack(audioStreamTrack);
19
+ });
20
+
21
+ return () => {
22
+ void ctx.dispose();
23
+ };
24
+ }, []);
25
+
26
+ return audioStreamTrack;
27
+ };