@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d

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 (304) hide show
  1. package/dist/lib/browser/ChannelContainer-JI3ZRZ5S.mjs +17 -0
  2. package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +16 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-URVQHGMR.mjs} +32 -32
  4. package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +101 -0
  6. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +7 -0
  7. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-4YFT4XA6.mjs} +8 -7
  8. package/dist/lib/{node-esm/call-manager-EI7FXRAU.mjs.map → browser/call-manager-4YFT4XA6.mjs.map} +1 -1
  9. package/dist/lib/browser/chunk-6LWKNZUV.mjs +377 -0
  10. package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CBUNHCOE.mjs +23 -0
  12. package/dist/lib/browser/chunk-CBUNHCOE.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-CFC7LEPD.mjs +18 -0
  14. package/dist/lib/browser/chunk-CFC7LEPD.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  16. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-F36NHPJG.mjs} +47 -42
  18. package/dist/lib/browser/chunk-F36NHPJG.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-ISCHODBV.mjs} +54 -4
  20. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-KOBXMDCI.mjs} +74 -41
  23. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-QM34EZQK.mjs +20 -0
  25. package/dist/lib/browser/chunk-QM34EZQK.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-R5UOPOO7.mjs +142 -0
  27. package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-VIRD2QSK.mjs +611 -0
  29. package/dist/lib/browser/chunk-VIRD2QSK.mjs.map +7 -0
  30. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCW3NSDZ.mjs} +256 -161
  31. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
  32. package/dist/lib/browser/index.mjs +48 -38
  33. package/dist/lib/browser/index.mjs.map +3 -3
  34. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-YR6W4CRP.mjs} +33 -51
  35. package/dist/lib/browser/intent-resolver-YR6W4CRP.mjs.map +7 -0
  36. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-GSOBOXA7.mjs} +26 -24
  37. package/dist/lib/browser/markdown-GSOBOXA7.mjs.map +7 -0
  38. package/dist/lib/browser/meta.json +1 -1
  39. package/dist/lib/browser/react-root-RAWRPF7Z.mjs +29 -0
  40. package/dist/lib/browser/react-root-RAWRPF7Z.mjs.map +7 -0
  41. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-GOEFSXQ6.mjs} +38 -36
  42. package/dist/lib/browser/react-surface-GOEFSXQ6.mjs.map +7 -0
  43. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-JN2HHORY.mjs} +6 -5
  44. package/dist/lib/{node-esm/settings-N52O7MLS.mjs.map → browser/settings-JN2HHORY.mjs.map} +1 -1
  45. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-UYPLBGZJ.mjs} +6 -5
  46. package/dist/lib/{node-esm/state-62TQKQVB.mjs.map → browser/state-UYPLBGZJ.mjs.map} +1 -1
  47. package/dist/lib/browser/types/index.mjs +7 -10
  48. package/dist/lib/node-esm/ChannelContainer-RQY4PR4F.mjs +18 -0
  49. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +17 -0
  50. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs.map +7 -0
  51. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-2IH5RPR7.mjs} +32 -32
  52. package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +7 -0
  53. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +102 -0
  54. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +7 -0
  55. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-UMUXEYH5.mjs} +8 -7
  56. package/dist/lib/{browser/call-manager-XRRCAVLI.mjs.map → node-esm/call-manager-UMUXEYH5.mjs.map} +1 -1
  57. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +22 -0
  58. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-7KZWZS2U.mjs} +256 -161
  60. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  62. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs +25 -0
  66. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs +143 -0
  68. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-PZH2EDU5.mjs} +74 -41
  70. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs +612 -0
  72. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +19 -0
  74. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-VBI32FGI.mjs} +54 -4
  76. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  77. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-Y3F2SGNH.mjs} +47 -42
  78. package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs +378 -0
  80. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +7 -0
  81. package/dist/lib/node-esm/index.mjs +48 -38
  82. package/dist/lib/node-esm/index.mjs.map +3 -3
  83. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-SJFABEE7.mjs} +33 -51
  84. package/dist/lib/node-esm/intent-resolver-SJFABEE7.mjs.map +7 -0
  85. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-GG5566TL.mjs} +26 -24
  86. package/dist/lib/node-esm/markdown-GG5566TL.mjs.map +7 -0
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/react-root-K5OGECUS.mjs +30 -0
  89. package/dist/lib/node-esm/react-root-K5OGECUS.mjs.map +7 -0
  90. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-5QDQD7MN.mjs} +38 -36
  91. package/dist/lib/node-esm/react-surface-5QDQD7MN.mjs.map +7 -0
  92. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-VSPM3BIM.mjs} +6 -5
  93. package/dist/lib/{browser/settings-AC6YSASL.mjs.map → node-esm/settings-VSPM3BIM.mjs.map} +1 -1
  94. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-XNWOLBNE.mjs} +6 -5
  95. package/dist/lib/{browser/state-2T4KDWBX.mjs.map → node-esm/state-XNWOLBNE.mjs.map} +1 -1
  96. package/dist/lib/node-esm/types/index.mjs +7 -10
  97. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  98. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  99. package/dist/types/src/calls/media-manager.d.ts +1 -1
  100. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  101. package/dist/types/src/calls/types.d.ts.map +1 -1
  102. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  103. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  104. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  105. package/dist/types/src/calls-service.stories.d.ts +10 -9
  106. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  108. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  110. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  112. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  113. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/index.d.ts +11 -10
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  117. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  119. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  121. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  122. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  123. package/dist/types/src/capabilities/settings.d.ts +1 -1
  124. package/dist/types/src/capabilities/state.d.ts +2 -2
  125. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  126. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  127. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  128. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  130. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  131. package/dist/types/src/components/ChannelContainer.stories.d.ts +155 -5
  132. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Chat.stories.d.ts +158 -5
  134. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  136. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  137. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  138. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  140. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  141. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  142. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  144. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  145. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  146. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/MessageContainer.d.ts +6 -3
  148. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  149. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  150. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  151. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  153. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  155. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  156. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  157. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  158. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  159. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  160. package/dist/types/src/components/index.d.ts +3 -3
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/components/testing.d.ts +3 -2
  163. package/dist/types/src/components/testing.d.ts.map +1 -1
  164. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  165. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  166. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  167. package/dist/types/src/functions/index.d.ts +2 -0
  168. package/dist/types/src/functions/index.d.ts.map +1 -0
  169. package/dist/types/src/hooks/analytics.d.ts +2 -2
  170. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  171. package/dist/types/src/hooks/index.d.ts +2 -1
  172. package/dist/types/src/hooks/index.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  174. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  175. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  176. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  177. package/dist/types/src/meta.d.ts +1 -2
  178. package/dist/types/src/meta.d.ts.map +1 -1
  179. package/dist/types/src/testing/stories.d.ts.map +1 -1
  180. package/dist/types/src/translations.d.ts +75 -7
  181. package/dist/types/src/translations.d.ts.map +1 -1
  182. package/dist/types/src/types/Channel.d.ts +16 -0
  183. package/dist/types/src/types/Channel.d.ts.map +1 -0
  184. package/dist/types/src/types/index.d.ts +1 -1
  185. package/dist/types/src/types/index.d.ts.map +1 -1
  186. package/dist/types/src/types/types.d.ts +206 -210
  187. package/dist/types/src/types/types.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +65 -59
  190. package/src/ThreadPlugin.tsx +139 -125
  191. package/src/calls/call-manager.ts +1 -1
  192. package/src/calls/media-manager.ts +64 -35
  193. package/src/calls/types.ts +7 -3
  194. package/src/calls/util/calls-service.ts +61 -11
  195. package/src/calls/util/stub-media-streams.ts +62 -5
  196. package/src/calls-service.stories.tsx +76 -63
  197. package/src/capabilities/app-graph-builder.ts +43 -30
  198. package/src/capabilities/blueprint-definition.ts +38 -0
  199. package/src/capabilities/capabilities.ts +7 -7
  200. package/src/capabilities/index.ts +1 -0
  201. package/src/capabilities/intent-resolver.ts +23 -30
  202. package/src/capabilities/markdown.ts +5 -3
  203. package/src/capabilities/react-root.tsx +2 -2
  204. package/src/capabilities/react-surface.tsx +25 -23
  205. package/src/components/Call/Call.tsx +1 -1
  206. package/src/components/Call/Toolbar.tsx +9 -9
  207. package/src/components/CallDebugPanel.tsx +112 -55
  208. package/src/components/CallSidebar.tsx +1 -1
  209. package/src/components/ChannelContainer.stories.tsx +13 -13
  210. package/src/components/ChannelContainer.tsx +19 -15
  211. package/src/components/Chat.stories.tsx +30 -34
  212. package/src/components/ChatContainer.tsx +32 -21
  213. package/src/components/Comments.stories.tsx +36 -39
  214. package/src/components/CommentsContainer.tsx +5 -7
  215. package/src/components/CommentsThreadContainer.tsx +38 -33
  216. package/src/components/Lobby/Lobby.tsx +1 -1
  217. package/src/components/Media/VideoObject.stories.tsx +35 -28
  218. package/src/components/Media/VideoObject.tsx +1 -1
  219. package/src/components/MessageContainer.tsx +45 -12
  220. package/src/components/Participant/Participant.tsx +14 -8
  221. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  222. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
  223. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -41
  224. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  225. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
  226. package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +72 -35
  227. package/src/components/ThreadSettings.tsx +6 -7
  228. package/src/components/command-extension.ts +4 -1
  229. package/src/components/index.ts +4 -4
  230. package/src/components/testing.ts +26 -6
  231. package/src/extensions/threads.ts +26 -17
  232. package/src/functions/create-proposals.ts +56 -0
  233. package/src/functions/index.ts +5 -0
  234. package/src/hooks/analytics.ts +4 -7
  235. package/src/hooks/index.ts +3 -1
  236. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  237. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  238. package/src/meta.ts +9 -5
  239. package/src/testing/stories.ts +3 -6
  240. package/src/translations.ts +7 -4
  241. package/src/types/Channel.ts +26 -0
  242. package/src/types/index.ts +1 -1
  243. package/src/types/types.ts +27 -28
  244. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  245. package/src/util.ts +1 -1
  246. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  247. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  248. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  250. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  252. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  254. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  255. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  256. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  258. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  261. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  266. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  267. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  268. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  269. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  270. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  271. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  272. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  273. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  274. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  277. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  279. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  280. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  281. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  283. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  287. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  289. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  291. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  292. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  293. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  294. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  295. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  296. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  297. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  298. package/dist/types/src/types/schema.d.ts +0 -164
  299. package/dist/types/src/types/schema.d.ts.map +0 -1
  300. package/src/types/schema.ts +0 -33
  301. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-JI3ZRZ5S.mjs.map} +0 -0
  302. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-6FVFME3R.mjs.map} +0 -0
  303. /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
  304. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChannelContainer-RQY4PR4F.mjs.map} +0 -0
@@ -7,11 +7,11 @@ import React from 'react';
7
7
  import { Capabilities, contributes } from '@dxos/app-framework';
8
8
 
9
9
  import { Call } from '../components';
10
- import { THREAD_PLUGIN } from '../meta';
10
+ import { meta } from '../meta';
11
11
 
12
12
  export default () => {
13
13
  return contributes(Capabilities.ReactRoot, {
14
- id: THREAD_PLUGIN,
14
+ id: meta.id,
15
15
  root: () => <Call.Audio />,
16
16
  });
17
17
  };
@@ -4,37 +4,39 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { Capabilities, contributes, createSurface, useCapability } from '@dxos/app-framework';
7
+ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/react';
8
9
  import { Obj, type Ref } from '@dxos/echo';
9
10
  import { SettingsStore } from '@dxos/local-storage';
10
11
  import { getSpace } from '@dxos/react-client/echo';
12
+ import { Thread } from '@dxos/types';
11
13
 
12
14
  import {
13
15
  CallDebugPanel,
14
16
  CallSidebar,
15
17
  ChannelContainer,
16
18
  ChatContainer,
17
- ThreadComplementary,
19
+ ThreadCompanion,
18
20
  ThreadSettings,
19
21
  } from '../components';
20
- import { THREAD_PLUGIN } from '../meta';
21
- import { ChannelType, type ThreadSettingsProps, ThreadType } from '../types';
22
+ import { meta } from '../meta';
23
+ import { Channel, type ThreadSettingsProps } from '../types';
22
24
 
23
25
  import { ThreadCapabilities } from './capabilities';
24
26
 
25
27
  export default () =>
26
28
  contributes(Capabilities.ReactSurface, [
27
29
  createSurface({
28
- id: `${THREAD_PLUGIN}/channel`,
30
+ id: `${meta.id}/channel`,
29
31
  role: 'article',
30
- filter: (data): data is { subject: ChannelType } => Obj.instanceOf(ChannelType, data.subject),
31
- component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
32
+ filter: (data): data is { subject: Channel.Channel } => Obj.instanceOf(Channel.Channel, data.subject),
33
+ component: ({ data: { subject }, role }) => <ChannelContainer channel={subject} role={role} />,
32
34
  }),
33
35
  createSurface({
34
- id: `${THREAD_PLUGIN}/chat-companion`,
36
+ id: `${meta.id}/chat-companion`,
35
37
  role: 'article',
36
- filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>
37
- Obj.instanceOf(ChannelType, data.companionTo) && data.subject === 'chat',
38
+ filter: (data): data is { companionTo: Channel.Channel; subject: 'chat' } =>
39
+ Obj.instanceOf(Channel.Channel, data.companionTo) && data.subject === 'chat',
38
40
  component: ({ data: { companionTo: channel } }) => {
39
41
  const space = getSpace(channel);
40
42
  const thread = channel.defaultThread.target;
@@ -46,40 +48,40 @@ export default () =>
46
48
  },
47
49
  }),
48
50
  createSurface({
49
- id: `${THREAD_PLUGIN}/thread`,
51
+ id: `${meta.id}/thread`,
50
52
  role: 'article',
51
- filter: (data): data is { subject: ThreadType } => Obj.instanceOf(ThreadType, data.subject),
52
- component: ({ data: { subject: thread } }) => {
53
- const space = getSpace(thread);
54
- if (!space || !thread) {
53
+ filter: (data): data is { subject: Thread.Thread } => Obj.instanceOf(Thread.Thread, data.subject),
54
+ component: ({ data: { subject } }) => {
55
+ const space = getSpace(subject);
56
+ if (!space || !subject) {
55
57
  return null;
56
58
  }
57
59
 
58
- return <ChatContainer thread={thread} space={space} />;
60
+ return <ChatContainer thread={subject} space={space} />;
59
61
  },
60
62
  }),
61
63
  createSurface({
62
- id: `${THREAD_PLUGIN}/comments`,
64
+ id: `${meta.id}/comments`,
63
65
  role: 'article',
64
- filter: (data): data is { companionTo: { threads: Ref.Ref<ThreadType>[] } } =>
66
+ filter: (data): data is { companionTo: { threads: Ref.Ref<Thread.Thread>[] } } =>
65
67
  data.subject === 'comments' && Obj.isObject(data.companionTo),
66
68
  // TODO(wittjosiah): This isn't scrolling properly in a plank.
67
- component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
69
+ component: ({ data }) => <ThreadCompanion subject={data.companionTo} />,
68
70
  }),
69
71
  createSurface({
70
- id: `${THREAD_PLUGIN}/plugin-settings`,
72
+ id: `${meta.id}/plugin-settings`,
71
73
  role: 'article',
72
74
  filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
73
- data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
75
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
74
76
  component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
75
77
  }),
76
78
  createSurface({
77
- id: `${THREAD_PLUGIN}/assistant`,
79
+ id: `${meta.id}/assistant`,
78
80
  role: 'deck-companion--active-call',
79
81
  component: () => <CallSidebar />,
80
82
  }),
81
83
  createSurface({
82
- id: `${THREAD_PLUGIN}/devtools-overview`,
84
+ id: `${meta.id}/devtools-overview`,
83
85
  role: 'devtools-overview',
84
86
  component: () => {
85
87
  const call = useCapability(ThreadCapabilities.CallManager);
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { type FC, type PropsWithChildren } from 'react';
6
6
 
7
- import { useCapability } from '@dxos/app-framework';
7
+ import { useCapability } from '@dxos/app-framework/react';
8
8
  import { type ThemedClassName } from '@dxos/react-ui';
9
9
 
10
10
  import { ThreadCapabilities } from '../../capabilities';
@@ -4,14 +4,14 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { useAppGraph, useCapability } from '@dxos/app-framework';
7
+ import { useAppGraph, useCapability } from '@dxos/app-framework/react';
8
+ import { Obj } from '@dxos/echo';
8
9
  import { useActions, useNode } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
10
10
  import {
11
11
  Icon,
12
12
  IconButton,
13
13
  type IconButtonProps,
14
- Toolbar as NativeToolbar,
14
+ Toolbar as NaturalToolbar,
15
15
  type ThemedClassName,
16
16
  toLocalizedString,
17
17
  useTranslation,
@@ -20,10 +20,10 @@ import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
20
20
 
21
21
  import { ThreadCapabilities } from '../../capabilities';
22
22
  import { meta } from '../../meta';
23
- import { type ChannelType } from '../../types';
23
+ import { type Channel } from '../../types';
24
24
 
25
25
  export type ToolbarProps = ThemedClassName<{
26
- channel?: ChannelType;
26
+ channel?: Channel.Channel;
27
27
  participants?: number;
28
28
  autoHideControls?: boolean;
29
29
  isInRoom?: boolean;
@@ -45,7 +45,7 @@ export const Toolbar = ({
45
45
  const call = useCapability(ThreadCapabilities.CallManager);
46
46
 
47
47
  // Channel app graph node.
48
- const node = useNode(graph, channel && fullyQualifiedId(channel));
48
+ const node = useNode(graph, channel && Obj.getDXN(channel).toString());
49
49
  const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');
50
50
 
51
51
  // Screen sharing.
@@ -56,7 +56,7 @@ export const Toolbar = ({
56
56
  // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
57
57
  return (
58
58
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
59
- <NativeToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
59
+ <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
60
60
  <ToggleButton
61
61
  active={call.media.audioEnabled}
62
62
  state={{
@@ -95,7 +95,7 @@ export const Toolbar = ({
95
95
  <Icon icon='ph--users--regular' size={4} />
96
96
  <div>{participants}</div>
97
97
  </div>
98
- )) || <NativeToolbar.Separator variant='gap' />}
98
+ )) || <NaturalToolbar.Separator variant='gap' />}
99
99
 
100
100
  {call.joined && (
101
101
  <>
@@ -151,7 +151,7 @@ export const Toolbar = ({
151
151
  ) : (
152
152
  <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
153
153
  )}
154
- </NativeToolbar.Root>
154
+ </NaturalToolbar.Root>
155
155
  </div>
156
156
  );
157
157
  };
@@ -2,28 +2,31 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { WebRTCStats } from '@peermetrics/webrtc-stats';
5
+ import { WebRTCStats, type WebRTCStatsEvent } from '@peermetrics/webrtc-stats';
6
6
  import React, { useEffect, useMemo, useState } from 'react';
7
7
 
8
- import { Panel } from '@dxos/devtools';
8
+ import { truncateKey } from '@dxos/debug';
9
+ import { JsonView, Panel } from '@dxos/devtools';
9
10
  import { log } from '@dxos/log';
10
- import { Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
11
- import { Json } from '@dxos/react-ui-syntax-highlighter';
11
+ import { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
12
12
 
13
- import { type GlobalState } from '../calls';
13
+ import { type EncodedTrackName, type GlobalState } from '../calls';
14
14
  import { meta } from '../meta';
15
15
 
16
- export type CallDebugPanelProps = ThemedClassName<{
17
- state?: GlobalState;
18
- }>;
16
+ export type CallDebugPanelProps = ThemedClassName<{ state?: GlobalState }>;
19
17
 
20
18
  export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
21
19
  const { t } = useTranslation(meta.id);
22
- const users = state?.call?.users;
23
- const self = state?.call?.self;
24
20
 
25
21
  const [open, setOpen] = useState(false);
26
22
  const handleToggle = () => setOpen(!open);
23
+ const [showServiceHistory, setShowServiceHistory] = useState(false);
24
+ const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);
25
+
26
+ const handleCopyRaw = async () => {
27
+ await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));
28
+ };
29
+
27
30
  const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);
28
31
  const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);
29
32
 
@@ -34,22 +37,24 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
34
37
  }),
35
38
  [],
36
39
  );
40
+ const [stats, setStats] = useState<WebRTCStatsEvent['data']>();
37
41
 
38
- const [stats, setStats] = useState<Record<string, any>>({});
39
42
  useEffect(() => {
40
43
  const pc = state?.media.peer?.session?.peerConnection;
41
- const handleStats = (stats: Record<string, any>) => setStats(stats.data);
44
+ const handleStats = (stats: WebRTCStatsEvent) => {
45
+ setStats(stats.data);
46
+ };
42
47
  let added = false;
43
48
  if (pc && showDetailedWebRTCStats) {
44
49
  webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });
45
- webrtcStats.on('stats', handleStats);
50
+ webrtcStats.on('stats', handleStats as never);
46
51
  added = true;
47
52
  }
48
53
  return () => {
49
54
  try {
50
55
  if (pc && added) {
51
56
  webrtcStats.removeConnection({ pc });
52
- webrtcStats.removeListener('stats', handleStats);
57
+ webrtcStats.removeListener('stats', handleStats as never);
53
58
  }
54
59
  } catch (error) {
55
60
  log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });
@@ -57,6 +62,8 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
57
62
  };
58
63
  }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);
59
64
 
65
+ const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);
66
+
60
67
  return (
61
68
  <Panel
62
69
  id='meeting-status'
@@ -64,52 +71,102 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
64
71
  open={open}
65
72
  onToggle={handleToggle}
66
73
  title={t('meeting status title')}
67
- maxHeight={false}
68
- info={
69
- <div className='flex items-center gap-2'>
70
- <span title='Joined'>{self?.joined ? 'Active' : 'Inactive'}</span>
71
- {users?.length !== undefined && <span title='Users'>{users?.length ?? 0} User(s)</span>}
72
- </div>
73
- }
74
+ info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}
75
+ maxHeight={0}
74
76
  >
75
- <div className='flex flex-col gap-2 overflow-y-auto'>
76
- <div className='flex items-row gap-2'>
77
+ <div className='flex flex-col is-full text-xs'>
78
+ <div className='flex items-center gap-2 items-center'>
77
79
  <Input.Root>
78
- <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>
79
- <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
80
+ <Input.Switch checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
81
+ <Input.Label>{t('show webrtc stats title')}</Input.Label>
80
82
  </Input.Root>
81
83
  </div>
82
- <Json
83
- classNames='text-sm'
84
- data={{
85
- users,
86
- activities: state?.call?.activities,
87
- ...(showDetailedWebRTCStats
88
- ? {
89
- webrtc: {
90
- connectionState: state?.media.peer?.session?.peerConnection.connectionState,
91
- iceConnectionState: state?.media.peer?.session?.peerConnection.iceConnectionState,
92
- stats,
93
- },
94
- }
95
- : {}),
96
- tracks: state?.media.peer?.session?.peerConnection.getTransceivers().map((transceiver) => {
97
- const track =
98
- transceiver.direction === 'recvonly' ? transceiver.receiver.track : transceiver.sender.track;
99
- return {
100
- id: track?.id,
101
- kind: track?.kind,
102
- direction: transceiver.direction,
103
- enabled: track?.enabled,
104
- muted: track?.muted,
105
- readyState: track?.readyState,
106
- settings: track?.getSettings(),
107
- };
108
- }),
109
- callsServiceHistory: state?.media.peer?.history.get(),
110
- }}
111
- />
84
+ <div className='flex items-center gap-2 items-center'>
85
+ <Input.Root>
86
+ <Input.Switch checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
87
+ <Input.Label>{t('show calls history title')}</Input.Label>
88
+ </Input.Root>
89
+ </div>
90
+ <div className='flex items-center gap-2 items-center'>
91
+ <IconButton icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
92
+ </div>
93
+ <Table rows={rows} />
94
+ {showDetailedWebRTCStats && <JsonView data={{ stats }} />}
95
+ {showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}
112
96
  </div>
113
97
  </Panel>
114
98
  );
115
99
  };
100
+
101
+ const getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {
102
+ if (!state || !state.call?.users) {
103
+ return [];
104
+ }
105
+
106
+ const self = state.call.self;
107
+ const users = state.call.users
108
+ .filter((user) => user.id !== self!.id)
109
+ .map((user) => {
110
+ const isOk = {
111
+ audio:
112
+ user.tracks?.audio &&
113
+ state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,
114
+ video:
115
+ user.tracks?.video &&
116
+ state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,
117
+ screenshare:
118
+ user.tracks?.screenshare &&
119
+ state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,
120
+ };
121
+
122
+ return {
123
+ ...user,
124
+ isOk,
125
+ };
126
+ });
127
+
128
+ return [
129
+ ['users', state.call.users.length ?? 0],
130
+ [
131
+ '*self* ' + (self?.name ?? truncateKey(self!.id, 8)),
132
+ self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',
133
+ self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',
134
+ self?.tracks?.screenshareEnabled
135
+ ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack
136
+ ? 'SCR ✅'
137
+ : 'SCR ❌'
138
+ : undefined,
139
+ ],
140
+
141
+ ...users.map((user) => [
142
+ user.name ?? truncateKey(user.id, 8),
143
+ user.isOk.audio ? 'AUD ✅' : 'AUD ❌',
144
+ user.isOk.video ? 'VID ✅' : 'VID ❌',
145
+ user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,
146
+ ]),
147
+ ['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],
148
+ ];
149
+ };
150
+
151
+ export namespace Unit {
152
+ export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);
153
+ }
154
+
155
+ export type TableProps = {
156
+ rows: (string | number | undefined)[][];
157
+ };
158
+
159
+ export const Table = ({ rows }: TableProps) => {
160
+ return (
161
+ <div className='is-full text-xs font-mono'>
162
+ {rows.map(([prefix, label, value, unit], i) => (
163
+ <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>
164
+ <div className='p-1'>{prefix}</div>
165
+ <div className='p-1'>{label}</div>
166
+ <div className='p-1'>{value}</div>
167
+ <div className='p-1'>{unit}</div>
168
+ </div>
169
+ ))}
170
+ </div>
171
+ );
172
+ };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { useCapability } from '@dxos/app-framework';
7
+ import { useCapability } from '@dxos/app-framework/react';
8
8
 
9
9
  import { ThreadCapabilities } from '../capabilities';
10
10
 
@@ -2,8 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
@@ -11,19 +9,20 @@ import { contributes } from '@dxos/app-framework';
11
9
  import { withPluginManager } from '@dxos/app-framework/testing';
12
10
  import { ClientCapabilities } from '@dxos/plugin-client';
13
11
  import { Query, useQuery, useSpace } from '@dxos/react-client/echo';
14
- import { DataType } from '@dxos/schema';
15
- import { ColumnContainer, withLayout } from '@dxos/storybook-utils';
12
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
13
+ import { render } from '@dxos/storybook-utils';
14
+ import { Message, Thread } from '@dxos/types';
16
15
 
17
16
  import { createThreadPlugins } from '../testing';
18
17
  import { translations } from '../translations';
19
- import { ChannelType, ThreadType } from '../types';
18
+ import { Channel } from '../types';
20
19
 
21
20
  import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
22
21
 
23
22
  // TODO(wittjosiah): Channel doesn't render full height.
24
- const Story = ({ roomId }: ChannelContainerProps) => {
23
+ const DefaultStory = ({ roomId }: ChannelContainerProps) => {
25
24
  const space = useSpace();
26
- const [channel] = useQuery(space, Query.type(ChannelType));
25
+ const [channel] = useQuery(space, Query.type(Channel.Channel));
27
26
  if (!channel) {
28
27
  return null;
29
28
  }
@@ -31,25 +30,26 @@ const Story = ({ roomId }: ChannelContainerProps) => {
31
30
  return <ChannelContainer channel={channel} roomId={roomId} />;
32
31
  };
33
32
 
34
- const meta: Meta<ChannelContainerProps> = {
33
+ const meta = {
35
34
  title: 'plugins/plugin-thread/ChannelContainer',
36
35
  component: ChannelContainer,
37
- render: (args) => <Story {...args} />,
36
+ render: render(DefaultStory),
38
37
  decorators: [
38
+ withTheme,
39
+ withLayout({ container: 'column' }),
39
40
  withPluginManager({
40
41
  plugins: [...(await createThreadPlugins())],
41
- capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
42
+ capabilities: [contributes(ClientCapabilities.Schema, [Channel.Channel, Thread.Thread, Message.Message])],
42
43
  }),
43
- withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
44
44
  ],
45
45
  parameters: {
46
46
  translations,
47
47
  },
48
- };
48
+ } satisfies Meta<typeof ChannelContainer>;
49
49
 
50
50
  export default meta;
51
51
 
52
- type Story = StoryObj<ChannelContainerProps>;
52
+ type Story = StoryObj<typeof meta>;
53
53
 
54
54
  export const Default: Story = {
55
55
  args: {
@@ -2,17 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
5
+ import { Atom } from '@effect-atom/atom-react';
6
6
  import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
7
7
 
8
- import { useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { useCapabilities, useCapability } from '@dxos/app-framework/react';
9
9
  import { Context } from '@dxos/context';
10
10
  import { failUndefined } from '@dxos/debug';
11
+ import { Obj } from '@dxos/echo';
11
12
  import { log } from '@dxos/log';
12
13
  import { useClient } from '@dxos/react-client';
13
- import { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
14
+ import { getSpace } from '@dxos/react-client/echo';
14
15
  import { useIdentity } from '@dxos/react-client/halo';
15
- import { ElevationProvider, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
16
+ import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
16
17
  import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
17
18
  import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
18
19
  import { useSoundEffect } from '@dxos/react-ui-sfx';
@@ -20,13 +21,15 @@ import { StackItem } from '@dxos/react-ui-stack';
20
21
 
21
22
  import { ThreadCapabilities } from '../capabilities';
22
23
  import { meta } from '../meta';
23
- import { type ChannelType } from '../types';
24
+ import { type Channel } from '../types';
24
25
 
25
26
  import { Call } from './Call';
26
27
  import ChatContainer from './ChatContainer';
27
28
 
29
+ // TODO(burdon): Create Radix style layout.
30
+
28
31
  export type ChannelContainerProps = {
29
- channel?: ChannelType;
32
+ channel?: Channel.Channel;
30
33
  roomId?: string;
31
34
  role?: string;
32
35
  fullscreen?: boolean;
@@ -38,7 +41,8 @@ export type ChannelContainerProps = {
38
41
  export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {
39
42
  const space = getSpace(channel);
40
43
  const callManager = useCapability(ThreadCapabilities.CallManager);
41
- const roomId = _roomId ?? (channel ? fullyQualifiedId(channel) : failUndefined());
44
+ const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
45
+ const roomId = _roomId ?? attendableId ?? failUndefined();
42
46
  const identity = useIdentity();
43
47
  const isNamed = !!identity?.profile?.displayName;
44
48
  const joinSound = useSoundEffect('JoinCall');
@@ -114,7 +118,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
114
118
  const isJoined = callManager.joined && callManager.roomId === roomId;
115
119
 
116
120
  return (
117
- <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>
121
+ <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
118
122
  {isJoined && !isNamed && <DisplayNameMissing />}
119
123
  {isJoined && isNamed && (
120
124
  <Call.Root>
@@ -124,8 +128,8 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
124
128
  )}
125
129
  {!isJoined && channel && channel.defaultThread.target && space && (
126
130
  <>
127
- <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />
128
- <ChatContainer space={space} thread={channel.defaultThread.target} />
131
+ <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
132
+ <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />
129
133
  </>
130
134
  )}
131
135
  </StackItem.Content>
@@ -161,7 +165,7 @@ const DisplayNameMissing = () => {
161
165
  const useChannelToolbarActions = (onJoinCall?: () => void) => {
162
166
  const creator = useMemo(
163
167
  () =>
164
- Rx.make(() => {
168
+ Atom.make(() => {
165
169
  return {
166
170
  nodes: [
167
171
  createMenuItemGroup('root', {
@@ -182,19 +186,19 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
182
186
  return useMenuActions(creator);
183
187
  };
184
188
 
185
- type ChannelToolbarProps = ThemedClassName<{
189
+ type ChannelToolbarProps = {
186
190
  attendableId?: string;
187
191
  role?: string;
188
192
  onJoinCall?: () => void;
189
- }>;
193
+ };
190
194
 
191
- const ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }: ChannelToolbarProps) => {
195
+ const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
192
196
  const menuProps = useChannelToolbarActions(onJoinCall);
193
197
 
194
198
  return (
195
199
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
196
200
  <MenuProvider {...menuProps} attendableId={attendableId}>
197
- <ToolbarMenu classNames={classNames} />
201
+ <ToolbarMenu textBlockWidth />
198
202
  </MenuProvider>
199
203
  </ElevationProvider>
200
204
  );