@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.406dc2a

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 (246) hide show
  1. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-ODKIAXR7.mjs} +17 -17
  4. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-BCKLI4QD.mjs} +7 -7
  6. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs.map → call-manager-BCKLI4QD.mjs.map} +1 -1
  7. package/dist/lib/browser/chunk-2MUYQOQE.mjs +23 -0
  8. package/dist/lib/browser/{chunk-2CWJBXBH.mjs.map → chunk-2MUYQOQE.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +376 -0
  10. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-CMCVHULC.mjs} +17 -15
  12. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  14. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-HDEQRBOC.mjs} +37 -5
  16. package/dist/lib/{node-esm/chunk-SED3O2XO.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
  17. package/dist/lib/browser/chunk-L326LSNS.mjs +18 -0
  18. package/dist/lib/browser/chunk-L326LSNS.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-EV4JWI7L.mjs → chunk-T4KJ5JR4.mjs} +5 -7
  20. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +619 -0
  22. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-DW7JD64V.mjs → chunk-VTYX3SIM.mjs} +26 -16
  24. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-XYUJXHYV.mjs} +54 -4
  26. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCEU5K23.mjs} +460 -268
  28. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +22 -13
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-VOQD3TQ2.mjs} +73 -15
  32. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +7 -0
  33. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-R6MGRIA6.mjs} +6 -6
  34. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs.map → markdown-R6MGRIA6.mjs.map} +1 -1
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-UMSBTN6H.mjs +28 -0
  37. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-SXMQEWKE.mjs} +22 -22
  39. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +7 -0
  40. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-TCNF54PN.mjs} +5 -5
  41. package/dist/lib/browser/{settings-AC6YSASL.mjs.map → settings-TCNF54PN.mjs.map} +1 -1
  42. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-ZQ4IPOJT.mjs} +5 -5
  43. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-ZQ4IPOJT.mjs.map} +1 -1
  44. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +84 -0
  45. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +7 -0
  46. package/dist/lib/browser/types/index.mjs +2 -2
  47. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +17 -0
  48. package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs → ChatContainer-SH6LTFQL.mjs} +6 -6
  49. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-DMPT3MY6.mjs} +17 -17
  50. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +7 -0
  51. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-Q7RY2YP4.mjs} +7 -7
  52. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs.map → call-manager-Q7RY2YP4.mjs.map} +1 -1
  53. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-2KZ4ODHU.mjs} +17 -15
  54. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-2MMJF7DW.mjs} +37 -5
  56. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-2V3WSLUZ.mjs} +54 -4
  58. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-XVKWHTH4.mjs → chunk-BAMZXJS4.mjs} +26 -16
  62. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +377 -0
  64. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +25 -0
  66. package/dist/lib/node-esm/{chunk-6CRHHOST.mjs.map → chunk-GZ4WL2IS.mjs.map} +3 -3
  67. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +19 -0
  68. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +620 -0
  70. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-GRLRWTRU.mjs → chunk-OBVAURUU.mjs} +5 -7
  72. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-TIPIOH2J.mjs} +460 -268
  74. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
  75. package/dist/lib/node-esm/index.mjs +22 -13
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-AKVH66PH.mjs} +73 -15
  78. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +7 -0
  79. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-MYGTDXT6.mjs} +6 -6
  80. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs.map → markdown-MYGTDXT6.mjs.map} +1 -1
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +29 -0
  83. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +7 -0
  84. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-NLSZJGMO.mjs} +22 -22
  85. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +7 -0
  86. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-ZQHGVFBY.mjs} +5 -5
  87. package/dist/lib/node-esm/{settings-N52O7MLS.mjs.map → settings-ZQHGVFBY.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-FSLLJ5TZ.mjs} +5 -5
  89. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-FSLLJ5TZ.mjs.map} +1 -1
  90. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +85 -0
  91. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +7 -0
  92. package/dist/lib/node-esm/types/index.mjs +2 -2
  93. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  94. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  95. package/dist/types/src/calls/media-manager.d.ts +1 -1
  96. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  97. package/dist/types/src/calls/types.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  99. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  100. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  101. package/dist/types/src/calls-service.stories.d.ts +10 -9
  102. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  106. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/index.d.ts +11 -10
  108. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  110. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  112. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  113. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  114. package/dist/types/src/capabilities/settings.d.ts +1 -1
  115. package/dist/types/src/capabilities/state.d.ts +2 -2
  116. package/dist/types/src/capabilities/toolkit.d.ts +6 -0
  117. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  118. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  119. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  120. package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -5
  121. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Chat.stories.d.ts +91 -5
  123. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  126. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  128. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  130. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  132. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  134. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  142. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  143. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  144. package/dist/types/src/components/testing.d.ts +1 -0
  145. package/dist/types/src/components/testing.d.ts.map +1 -1
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  149. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  150. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  151. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  152. package/dist/types/src/meta.d.ts +1 -2
  153. package/dist/types/src/meta.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +3 -1
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/schema.d.ts +126 -111
  157. package/dist/types/src/types/schema.d.ts.map +1 -1
  158. package/dist/types/src/types/types.d.ts +259 -174
  159. package/dist/types/src/types/types.d.ts.map +1 -1
  160. package/dist/types/tsconfig.tsbuildinfo +1 -1
  161. package/package.json +60 -58
  162. package/src/ThreadPlugin.tsx +128 -122
  163. package/src/calls/call-manager.ts +1 -1
  164. package/src/calls/media-manager.ts +58 -32
  165. package/src/calls/types.ts +7 -3
  166. package/src/calls/util/calls-service.ts +61 -11
  167. package/src/calls/util/stub-media-streams.ts +60 -3
  168. package/src/calls-service.stories.tsx +76 -63
  169. package/src/capabilities/app-graph-builder.ts +13 -10
  170. package/src/capabilities/capabilities.ts +5 -5
  171. package/src/capabilities/index.ts +1 -0
  172. package/src/capabilities/intent-resolver.ts +39 -6
  173. package/src/capabilities/react-root.tsx +2 -2
  174. package/src/capabilities/react-surface.tsx +9 -9
  175. package/src/capabilities/toolkit.ts +82 -0
  176. package/src/components/Call/Toolbar.tsx +4 -4
  177. package/src/components/CallDebugPanel.tsx +108 -49
  178. package/src/components/ChannelContainer.stories.tsx +9 -9
  179. package/src/components/ChannelContainer.tsx +1 -1
  180. package/src/components/Chat.stories.tsx +31 -29
  181. package/src/components/ChatContainer.tsx +4 -1
  182. package/src/components/Comments.stories.tsx +33 -35
  183. package/src/components/CommentsThreadContainer.tsx +8 -7
  184. package/src/components/Media/VideoObject.stories.tsx +35 -28
  185. package/src/components/MessageContainer.tsx +40 -7
  186. package/src/components/Participant/Participant.tsx +13 -7
  187. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  188. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +41 -40
  189. package/src/components/ThreadComplementary.tsx +36 -6
  190. package/src/components/ThreadSettings.tsx +6 -7
  191. package/src/components/command-extension.ts +4 -1
  192. package/src/components/testing.ts +22 -0
  193. package/src/hooks/index.ts +1 -0
  194. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  195. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  196. package/src/meta.ts +3 -4
  197. package/src/testing/stories.ts +1 -1
  198. package/src/translations.ts +3 -1
  199. package/src/types/schema.ts +1 -1
  200. package/src/types/types.ts +21 -13
  201. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  202. package/src/util.ts +1 -1
  203. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  204. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  205. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  207. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  208. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  209. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  212. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  215. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  220. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  221. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  222. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  223. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  224. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  225. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  229. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  230. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  233. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  236. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  237. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  239. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  240. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  241. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  242. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  243. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-BGDGZHV4.mjs.map} +0 -0
  244. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-75KJZ4XR.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{ChannelContainer-B2ZGAE4P.mjs.map → ChannelContainer-OXC6BTU7.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChatContainer-SH6LTFQL.mjs.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Effect } from 'effect';
5
+ import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
8
8
  import { sleep } from '@dxos/async';
@@ -14,7 +14,7 @@ import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
14
14
  import { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
15
15
  import { AnchoredTo, DataType } from '@dxos/schema';
16
16
 
17
- import { THREAD_PLUGIN } from '../meta';
17
+ import { meta } from '../meta';
18
18
  import { ChannelType, ThreadAction, ThreadType } from '../types';
19
19
 
20
20
  import { ThreadCapabilities } from './capabilities';
@@ -22,7 +22,7 @@ import { ThreadCapabilities } from './capabilities';
22
22
  export default (context: PluginContext) =>
23
23
  contributes(Capabilities.IntentResolver, [
24
24
  createResolver({
25
- intent: ThreadAction.OnSpaceCreated,
25
+ intent: ThreadAction.onCreateSpace,
26
26
  resolve: ({ space, rootCollection }) =>
27
27
  Effect.gen(function* () {
28
28
  const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
@@ -95,6 +95,39 @@ export default (context: PluginContext) =>
95
95
  };
96
96
  },
97
97
  }),
98
+ createResolver({
99
+ intent: ThreadAction.AddProposal,
100
+ resolve: ({ text, anchor, sender, subject }) => {
101
+ const space = getSpace(subject);
102
+ invariant(space, 'Space not found');
103
+
104
+ const subjectId = fullyQualifiedId(subject);
105
+ const proposal = Obj.make(DataType.Message, {
106
+ created: new Date().toISOString(),
107
+ sender,
108
+ blocks: [{ _tag: 'proposal', text }],
109
+ });
110
+ const thread = Obj.make(ThreadType, { name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
111
+
112
+ return {
113
+ intents: [
114
+ createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }),
115
+ createIntent(SpaceAction.AddRelation, {
116
+ space,
117
+ schema: AnchoredTo,
118
+ source: thread,
119
+ target: subject,
120
+ fields: { anchor },
121
+ }),
122
+ createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
123
+ createIntent(DeckAction.ChangeCompanion, {
124
+ primary: subjectId,
125
+ companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
126
+ }),
127
+ ],
128
+ };
129
+ },
130
+ }),
98
131
  createResolver({
99
132
  intent: ThreadAction.Select,
100
133
  resolve: ({ current }) => {
@@ -157,7 +190,7 @@ export default (context: PluginContext) =>
157
190
 
158
191
  return {
159
192
  undoable: {
160
- message: ['thread deleted label', { ns: THREAD_PLUGIN }],
193
+ message: ['thread deleted label', { ns: meta.id }],
161
194
  data: { thread, anchor },
162
195
  },
163
196
  intents: [
@@ -198,7 +231,6 @@ export default (context: PluginContext) =>
198
231
  const subjectId = fullyQualifiedId(subject);
199
232
  const space = getSpace(subject);
200
233
  invariant(space, 'Space not found');
201
- const intents = [];
202
234
 
203
235
  const message = Obj.make(DataType.Message, {
204
236
  created: new Date().toISOString(),
@@ -209,6 +241,7 @@ export default (context: PluginContext) =>
209
241
  });
210
242
  thread.messages.push(Ref.make(message));
211
243
 
244
+ const intents = [];
212
245
  const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
213
246
  if (draft) {
214
247
  // Move draft to document.
@@ -277,7 +310,7 @@ export default (context: PluginContext) =>
277
310
 
278
311
  return {
279
312
  undoable: {
280
- message: ['message deleted label', { ns: THREAD_PLUGIN }],
313
+ message: ['message deleted label', { ns: meta.id }],
281
314
  data: { message, messageIndex },
282
315
  },
283
316
  intents: [
@@ -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
  };
@@ -17,7 +17,7 @@ import {
17
17
  ThreadComplementary,
18
18
  ThreadSettings,
19
19
  } from '../components';
20
- import { THREAD_PLUGIN } from '../meta';
20
+ import { meta } from '../meta';
21
21
  import { ChannelType, type ThreadSettingsProps, ThreadType } from '../types';
22
22
 
23
23
  import { ThreadCapabilities } from './capabilities';
@@ -25,13 +25,13 @@ import { ThreadCapabilities } from './capabilities';
25
25
  export default () =>
26
26
  contributes(Capabilities.ReactSurface, [
27
27
  createSurface({
28
- id: `${THREAD_PLUGIN}/channel`,
28
+ id: `${meta.id}/channel`,
29
29
  role: 'article',
30
30
  filter: (data): data is { subject: ChannelType } => Obj.instanceOf(ChannelType, data.subject),
31
31
  component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
32
32
  }),
33
33
  createSurface({
34
- id: `${THREAD_PLUGIN}/chat-companion`,
34
+ id: `${meta.id}/chat-companion`,
35
35
  role: 'article',
36
36
  filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>
37
37
  Obj.instanceOf(ChannelType, data.companionTo) && data.subject === 'chat',
@@ -46,7 +46,7 @@ export default () =>
46
46
  },
47
47
  }),
48
48
  createSurface({
49
- id: `${THREAD_PLUGIN}/thread`,
49
+ id: `${meta.id}/thread`,
50
50
  role: 'article',
51
51
  filter: (data): data is { subject: ThreadType } => Obj.instanceOf(ThreadType, data.subject),
52
52
  component: ({ data: { subject: thread } }) => {
@@ -59,7 +59,7 @@ export default () =>
59
59
  },
60
60
  }),
61
61
  createSurface({
62
- id: `${THREAD_PLUGIN}/comments`,
62
+ id: `${meta.id}/comments`,
63
63
  role: 'article',
64
64
  filter: (data): data is { companionTo: { threads: Ref.Ref<ThreadType>[] } } =>
65
65
  data.subject === 'comments' && Obj.isObject(data.companionTo),
@@ -67,19 +67,19 @@ export default () =>
67
67
  component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
68
68
  }),
69
69
  createSurface({
70
- id: `${THREAD_PLUGIN}/plugin-settings`,
70
+ id: `${meta.id}/plugin-settings`,
71
71
  role: 'article',
72
72
  filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
73
- data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
73
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
74
74
  component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
75
75
  }),
76
76
  createSurface({
77
- id: `${THREAD_PLUGIN}/assistant`,
77
+ id: `${meta.id}/assistant`,
78
78
  role: 'deck-companion--active-call',
79
79
  component: () => <CallSidebar />,
80
80
  }),
81
81
  createSurface({
82
- id: `${THREAD_PLUGIN}/devtools-overview`,
82
+ id: `${meta.id}/devtools-overview`,
83
83
  role: 'devtools-overview',
84
84
  component: () => {
85
85
  const call = useCapability(ThreadCapabilities.CallManager);
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Tool from '@effect/ai/Tool';
6
+ import * as Toolkit from '@effect/ai/Toolkit';
7
+ import * as Array from 'effect/Array';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Function from 'effect/Function';
10
+ import * as Schema from 'effect/Schema';
11
+
12
+ import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
13
+ import { ArtifactId, computeDiffsWithCursors } from '@dxos/assistant';
14
+ import { type SpaceId } from '@dxos/keys';
15
+ import { ClientCapabilities } from '@dxos/plugin-client';
16
+ import { type Markdown } from '@dxos/plugin-markdown/types';
17
+ import { createDocAccessor } from '@dxos/react-client/echo';
18
+ import { trim } from '@dxos/util';
19
+
20
+ import { ThreadAction } from '../types';
21
+
22
+ // TODO(wittjosiah): How to make this work for more than Documents?
23
+ class ThreadToolkit extends Toolkit.make(
24
+ Tool.make('add-proposals', {
25
+ description: trim`
26
+ Proposes a set of changes to a document.
27
+ `,
28
+ parameters: {
29
+ id: ArtifactId,
30
+ diffs: Schema.Array(Schema.String).annotations({
31
+ description: 'The diffs to propose for the document.',
32
+ }),
33
+ },
34
+ success: Schema.Any,
35
+ failure: Schema.Never,
36
+ }),
37
+ ) {
38
+ static layer = (context: PluginContext) =>
39
+ ThreadToolkit.toLayer({
40
+ 'add-proposals': ({ id, diffs: _diffs }) =>
41
+ Effect.gen(function* () {
42
+ // TODO(wittjosiah): Get capabilities via layers.
43
+ const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
44
+ const client = context.getCapability(ClientCapabilities.Client);
45
+ const state = context.getCapability(Capabilities.Layout);
46
+
47
+ const dxn = ArtifactId.toDXN(id, state.workspace as SpaceId);
48
+
49
+ const echoDxn = dxn.asEchoDXN();
50
+ if (!echoDxn) {
51
+ throw new Error(`Invalid object ID: ${id}`);
52
+ }
53
+
54
+ const space = client.spaces.get(echoDxn.spaceId!);
55
+ const object = space?.db.getObjectById<Markdown.Document>(echoDxn.echoId);
56
+ if (!object) {
57
+ throw new Error(`Object not found: ${id}`);
58
+ }
59
+
60
+ const content = yield* Effect.promise(() => object.content.load());
61
+ const accessor = createDocAccessor(content, ['content']);
62
+ yield* Function.pipe(
63
+ computeDiffsWithCursors(accessor, _diffs),
64
+ Array.map(({ cursor, text }) =>
65
+ createIntent(ThreadAction.AddProposal, {
66
+ subject: object,
67
+ sender: { role: 'assistant' },
68
+ anchor: cursor,
69
+ text,
70
+ }),
71
+ ),
72
+ Array.map(dispatch),
73
+ Effect.allWith({ concurrency: 'unbounded' }),
74
+ );
75
+ }).pipe(Effect.orDie),
76
+ });
77
+ }
78
+
79
+ export default (context: PluginContext) => [
80
+ contributes(Capabilities.Toolkit, ThreadToolkit),
81
+ contributes(Capabilities.ToolkitHandler, ThreadToolkit.layer(context)),
82
+ ];
@@ -11,7 +11,7 @@ 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,
@@ -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,15 +2,15 @@
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
16
  export type CallDebugPanelProps = ThemedClassName<{
@@ -19,11 +19,16 @@ export type CallDebugPanelProps = ThemedClassName<{
19
19
 
20
20
  export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
21
21
  const { t } = useTranslation(meta.id);
22
- const users = state?.call?.users;
23
- const self = state?.call?.self;
24
22
 
25
23
  const [open, setOpen] = useState(false);
26
24
  const handleToggle = () => setOpen(!open);
25
+ const [showServiceHistory, setShowServiceHistory] = useState(false);
26
+ const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);
27
+
28
+ const handleCopyRaw = async () => {
29
+ await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));
30
+ };
31
+
27
32
  const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);
28
33
  const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);
29
34
 
@@ -34,22 +39,24 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
34
39
  }),
35
40
  [],
36
41
  );
42
+ const [stats, setStats] = useState<WebRTCStatsEvent['data']>();
37
43
 
38
- const [stats, setStats] = useState<Record<string, any>>({});
39
44
  useEffect(() => {
40
45
  const pc = state?.media.peer?.session?.peerConnection;
41
- const handleStats = (stats: Record<string, any>) => setStats(stats.data);
46
+ const handleStats = (stats: WebRTCStatsEvent) => {
47
+ setStats(stats.data);
48
+ };
42
49
  let added = false;
43
50
  if (pc && showDetailedWebRTCStats) {
44
51
  webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });
45
- webrtcStats.on('stats', handleStats);
52
+ webrtcStats.on('stats', handleStats as never);
46
53
  added = true;
47
54
  }
48
55
  return () => {
49
56
  try {
50
57
  if (pc && added) {
51
58
  webrtcStats.removeConnection({ pc });
52
- webrtcStats.removeListener('stats', handleStats);
59
+ webrtcStats.removeListener('stats', handleStats as never);
53
60
  }
54
61
  } catch (error) {
55
62
  log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });
@@ -57,6 +64,8 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
57
64
  };
58
65
  }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);
59
66
 
67
+ const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);
68
+
60
69
  return (
61
70
  <Panel
62
71
  id='meeting-status'
@@ -65,51 +74,101 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
65
74
  onToggle={handleToggle}
66
75
  title={t('meeting status title')}
67
76
  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
- }
77
+ info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}
74
78
  >
75
- <div className='flex flex-col gap-2 overflow-y-auto'>
76
- <div className='flex items-row gap-2'>
79
+ <div className='flex flex-col w-full gap-2 text-xs'>
80
+ <div className='flex items-center gap-2'>
77
81
  <Input.Root>
78
82
  <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>
79
83
  <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
80
84
  </Input.Root>
81
85
  </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
- />
86
+ <div className='flex items-center gap-2'>
87
+ <Input.Root>
88
+ <Input.Label classNames={'text-sm'}>{t('show calls history title')}</Input.Label>
89
+ <Input.Checkbox checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
90
+ </Input.Root>
91
+ </div>
92
+ <div className='flex items-center gap-2'>
93
+ <IconButton classNames={'text-sm'} icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
94
+ </div>
95
+ <Table rows={rows} />
96
+ {showDetailedWebRTCStats && <JsonView data={{ stats }} />}
97
+ {showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}
112
98
  </div>
113
99
  </Panel>
114
100
  );
115
101
  };
102
+
103
+ const getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {
104
+ if (!state || !state.call?.users) {
105
+ return [];
106
+ }
107
+
108
+ const self = state.call.self;
109
+ const users = state.call.users
110
+ .filter((user) => user.id !== self!.id)
111
+ .map((user) => {
112
+ const isOk = {
113
+ audio:
114
+ user.tracks?.audio &&
115
+ state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,
116
+ video:
117
+ user.tracks?.video &&
118
+ state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,
119
+ screenshare:
120
+ user.tracks?.screenshare &&
121
+ state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,
122
+ };
123
+
124
+ return {
125
+ ...user,
126
+ isOk,
127
+ };
128
+ });
129
+
130
+ return [
131
+ ['users', state.call.users.length ?? 0],
132
+ [
133
+ '*self* ' + (self?.name ?? truncateKey(self!.id, 8)),
134
+ self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',
135
+ self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',
136
+ self?.tracks?.screenshareEnabled
137
+ ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack
138
+ ? 'SCR ✅'
139
+ : 'SCR ❌'
140
+ : undefined,
141
+ ],
142
+
143
+ ...users.map((user) => [
144
+ user.name ?? truncateKey(user.id, 8),
145
+ user.isOk.audio ? 'AUD ✅' : 'AUD ❌',
146
+ user.isOk.video ? 'VID ✅' : 'VID ❌',
147
+ user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,
148
+ ]),
149
+ ['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],
150
+ ];
151
+ };
152
+
153
+ export namespace Unit {
154
+ export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);
155
+ }
156
+
157
+ export type TableProps = {
158
+ rows: (string | number | undefined)[][];
159
+ };
160
+
161
+ export const Table = ({ rows }: TableProps) => {
162
+ return (
163
+ <div className='w-full text-xs font-mono'>
164
+ {rows.map(([prefix, label, value, unit], i) => (
165
+ <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>
166
+ <div className='p-1'>{prefix}</div>
167
+ <div className='p-1'>{label}</div>
168
+ <div className='p-1'>{value}</div>
169
+ <div className='p-1'>{unit}</div>
170
+ </div>
171
+ ))}
172
+ </div>
173
+ );
174
+ };
@@ -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,8 +9,9 @@ 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';
12
+ import { withTheme } from '@dxos/react-ui/testing';
14
13
  import { DataType } from '@dxos/schema';
15
- import { ColumnContainer, withLayout } from '@dxos/storybook-utils';
14
+ import { render } from '@dxos/storybook-utils';
16
15
 
17
16
  import { createThreadPlugins } from '../testing';
18
17
  import { translations } from '../translations';
@@ -21,7 +20,7 @@ import { ChannelType, ThreadType } from '../types';
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
25
  const [channel] = useQuery(space, Query.type(ChannelType));
27
26
  if (!channel) {
@@ -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
39
  withPluginManager({
40
40
  plugins: [...(await createThreadPlugins())],
41
41
  capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
42
42
  }),
43
- withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
44
43
  ],
45
44
  parameters: {
45
+ layout: 'column',
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: {
@@ -114,7 +114,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
114
114
  const isJoined = callManager.joined && callManager.roomId === roomId;
115
115
 
116
116
  return (
117
- <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>
117
+ <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
118
118
  {isJoined && !isNamed && <DisplayNameMissing />}
119
119
  {isJoined && isNamed && (
120
120
  <Call.Root>