@dxos/plugin-thread 0.8.4-main.67995b8 → 0.8.4-main.69d29f4

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 (406) hide show
  1. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs +188 -0
  2. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs +17 -0
  4. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +8 -0
  6. package/dist/lib/browser/call-manager-4P536YNX.mjs +26 -0
  7. package/dist/lib/browser/call-manager-4P536YNX.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-2FIHSX35.mjs +293 -0
  9. package/dist/lib/browser/chunk-2FIHSX35.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  11. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-DLO2G3DM.mjs} +85 -50
  13. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ERK254BS.mjs} +381 -240
  15. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
  17. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/browser/chunk-YSHXWAL3.mjs +1815 -0
  20. package/dist/lib/browser/chunk-YSHXWAL3.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-ZFLSTQSE.mjs +106 -0
  22. package/dist/lib/browser/chunk-ZFLSTQSE.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +132 -114
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-QMJLRR6R.mjs +210 -0
  26. package/dist/lib/browser/markdown-QMJLRR6R.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-56MJI77R.mjs +25 -0
  31. package/dist/lib/browser/react-root-56MJI77R.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs +110 -0
  33. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs.map +7 -0
  34. package/dist/lib/browser/repair-6OZ75AUU.mjs +38 -0
  35. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +7 -0
  36. package/dist/lib/browser/settings-WZMJMML3.mjs +32 -0
  37. package/dist/lib/browser/settings-WZMJMML3.mjs.map +7 -0
  38. package/dist/lib/browser/state-SJR2GL5G.mjs +24 -0
  39. package/dist/lib/browser/state-SJR2GL5G.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +10 -12
  41. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs +189 -0
  42. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs +18 -0
  44. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs.map +7 -0
  45. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  46. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs +1816 -0
  49. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  51. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs +107 -0
  53. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  55. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-KRBZBJRI.mjs} +85 -50
  56. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-QP3KQOPQ.mjs} +381 -240
  58. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
  60. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +294 -0
  62. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +132 -114
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs +111 -0
  73. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs.map +7 -0
  74. package/dist/lib/node-esm/repair-6777EPOM.mjs +39 -0
  75. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +7 -0
  76. package/dist/lib/node-esm/settings-37CO3SNR.mjs +33 -0
  77. package/dist/lib/node-esm/settings-37CO3SNR.mjs.map +7 -0
  78. package/dist/lib/node-esm/state-5R3TZJQE.mjs +25 -0
  79. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +7 -0
  80. package/dist/lib/node-esm/types/index.mjs +10 -12
  81. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  82. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  83. package/dist/types/src/blueprints/index.d.ts +2 -0
  84. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  85. package/dist/types/src/blueprints/thread-blueprint.d.ts +21 -0
  86. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  87. package/dist/types/src/calls/call-manager.d.ts +40 -30
  88. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  89. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  90. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  91. package/dist/types/src/calls/media-manager.d.ts +2 -2
  92. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  93. package/dist/types/src/calls/types.d.ts +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/calls-service.d.ts +5 -3
  96. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  99. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +10 -9
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  103. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  105. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  107. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  109. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  111. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  113. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/index.d.ts +10 -15
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  117. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  119. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  121. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  123. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  125. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  127. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  128. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  129. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  131. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  132. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  133. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  134. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  135. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  136. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  137. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  138. package/dist/types/src/capabilities/settings/settings.d.ts +5 -0
  139. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  141. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  142. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  143. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  144. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  145. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  146. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  147. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  148. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  149. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  150. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  151. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  152. package/dist/types/src/components/ChannelContainer.stories.d.ts +159 -5
  153. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/Chat.stories.d.ts +162 -5
  155. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ChatContainer.d.ts +7 -6
  157. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/Comments.stories.d.ts +160 -4
  159. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  161. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  163. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  164. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  165. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  166. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  167. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  168. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  169. package/dist/types/src/components/MessageContainer.d.ts +7 -3
  170. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  171. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  172. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  173. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +159 -3
  174. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +161 -4
  176. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  177. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  178. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  179. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  180. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  181. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  182. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  183. package/dist/types/src/components/index.d.ts +3 -3
  184. package/dist/types/src/components/index.d.ts.map +1 -1
  185. package/dist/types/src/components/testing.d.ts +3 -2
  186. package/dist/types/src/components/testing.d.ts.map +1 -1
  187. package/dist/types/src/extensions/threads.d.ts +7 -2
  188. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  189. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  190. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  191. package/dist/types/src/functions/index.d.ts +2 -0
  192. package/dist/types/src/functions/index.d.ts.map +1 -0
  193. package/dist/types/src/hooks/analytics.d.ts +2 -3
  194. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +2 -1
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  198. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  199. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  200. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  201. package/dist/types/src/index.d.ts +1 -1
  202. package/dist/types/src/index.d.ts.map +1 -1
  203. package/dist/types/src/meta.d.ts +3 -4
  204. package/dist/types/src/meta.d.ts.map +1 -1
  205. package/dist/types/src/testing/stories.d.ts +2 -1
  206. package/dist/types/src/testing/stories.d.ts.map +1 -1
  207. package/dist/types/src/translations.d.ts +79 -7
  208. package/dist/types/src/translations.d.ts.map +1 -1
  209. package/dist/types/src/types/Channel.d.ts +695 -0
  210. package/dist/types/src/types/Channel.d.ts.map +1 -0
  211. package/dist/types/src/types/capabilities.d.ts +23 -0
  212. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  213. package/dist/types/src/types/index.d.ts +2 -1
  214. package/dist/types/src/types/index.d.ts.map +1 -1
  215. package/dist/types/src/types/types.d.ts +3223 -365
  216. package/dist/types/src/types/types.d.ts.map +1 -1
  217. package/dist/types/tsconfig.tsbuildinfo +1 -1
  218. package/package.json +89 -66
  219. package/src/ThreadPlugin.tsx +107 -129
  220. package/src/blueprints/index.ts +5 -0
  221. package/src/blueprints/thread-blueprint.ts +32 -0
  222. package/src/calls/call-manager.ts +78 -54
  223. package/src/calls/call-swarm-synchronizer.ts +3 -3
  224. package/src/calls/media-manager.ts +67 -38
  225. package/src/calls/types.ts +8 -4
  226. package/src/calls/util/calls-service.ts +66 -15
  227. package/src/calls/util/stub-media-streams.ts +64 -7
  228. package/src/calls/util/task-scheduling.ts +4 -4
  229. package/src/calls-service.stories.tsx +78 -65
  230. package/src/capabilities/app-graph-builder/app-graph-builder.ts +201 -0
  231. package/src/capabilities/app-graph-builder/index.ts +7 -0
  232. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  233. package/src/capabilities/blueprint-definition/index.ts +7 -0
  234. package/src/capabilities/call-manager/call-manager.ts +26 -0
  235. package/src/capabilities/call-manager/index.ts +7 -0
  236. package/src/capabilities/index.ts +10 -12
  237. package/src/capabilities/markdown/index.ts +7 -0
  238. package/src/capabilities/markdown/markdown.ts +83 -0
  239. package/src/capabilities/operation-resolver/index.ts +7 -0
  240. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  241. package/src/capabilities/react-root/index.ts +7 -0
  242. package/src/capabilities/react-root/react-root.tsx +20 -0
  243. package/src/capabilities/react-surface/index.ts +7 -0
  244. package/src/capabilities/react-surface/react-surface.tsx +97 -0
  245. package/src/capabilities/repair/index.ts +7 -0
  246. package/src/capabilities/repair/repair.ts +51 -0
  247. package/src/capabilities/settings/index.ts +7 -0
  248. package/src/capabilities/settings/settings.ts +33 -0
  249. package/src/capabilities/state/index.ts +7 -0
  250. package/src/capabilities/state/state.ts +22 -0
  251. package/src/components/Call/Call.tsx +11 -6
  252. package/src/components/Call/Toolbar.tsx +38 -30
  253. package/src/components/CallDebugPanel.tsx +112 -55
  254. package/src/components/CallSidebar.tsx +6 -3
  255. package/src/components/ChannelContainer.stories.tsx +22 -19
  256. package/src/components/ChannelContainer.tsx +36 -29
  257. package/src/components/Chat.stories.tsx +37 -40
  258. package/src/components/ChatContainer.tsx +52 -38
  259. package/src/components/Comments.stories.tsx +52 -51
  260. package/src/components/CommentsContainer.tsx +7 -8
  261. package/src/components/CommentsThreadContainer.tsx +47 -41
  262. package/src/components/Lobby/Lobby.tsx +10 -8
  263. package/src/components/Media/AudioStream.tsx +2 -2
  264. package/src/components/Media/VideoObject.stories.tsx +36 -28
  265. package/src/components/Media/VideoObject.tsx +2 -2
  266. package/src/components/MessageContainer.tsx +98 -33
  267. package/src/components/Participant/Participant.tsx +34 -15
  268. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  269. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
  270. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  271. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
  272. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +7 -7
  273. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +8 -5
  274. package/src/components/ThreadCompanion.tsx +193 -0
  275. package/src/components/ThreadSettings.tsx +10 -6
  276. package/src/components/command-extension.ts +7 -4
  277. package/src/components/index.ts +4 -7
  278. package/src/components/testing.ts +26 -6
  279. package/src/extensions/threads.ts +86 -42
  280. package/src/functions/create-proposals.ts +57 -0
  281. package/src/functions/index.ts +5 -0
  282. package/src/hooks/analytics.ts +21 -21
  283. package/src/hooks/index.ts +3 -1
  284. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  285. package/src/hooks/useDebugMode.ts +1 -1
  286. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  287. package/src/index.ts +1 -1
  288. package/src/meta.ts +11 -7
  289. package/src/testing/stories.ts +17 -16
  290. package/src/translations.ts +9 -4
  291. package/src/types/Channel.ts +30 -0
  292. package/src/types/capabilities.ts +34 -0
  293. package/src/types/index.ts +2 -1
  294. package/src/types/types.ts +170 -82
  295. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  296. package/src/typings.d.ts +8 -0
  297. package/src/util.ts +1 -1
  298. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  299. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  300. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs +0 -171
  301. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  302. package/dist/lib/browser/call-manager-NIPDYUVD.mjs +0 -24
  303. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  305. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  309. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  310. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  311. package/dist/lib/browser/chunk-FR7KJPNY.mjs.map +0 -7
  312. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  313. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  315. package/dist/lib/browser/chunk-KWPRNHTK.mjs +0 -984
  316. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  317. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  318. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  319. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  320. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  321. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  322. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs +0 -369
  323. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  324. package/dist/lib/browser/markdown-M3FMR7OD.mjs +0 -169
  325. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  326. package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
  327. package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
  328. package/dist/lib/browser/react-surface-XWS6GIZY.mjs +0 -109
  329. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  330. package/dist/lib/browser/settings-E32MTL7A.mjs +0 -22
  331. package/dist/lib/browser/settings-E32MTL7A.mjs.map +0 -7
  332. package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
  333. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  334. package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
  335. package/dist/lib/node-esm/ChatContainer-IQUWU426.mjs +0 -16
  336. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs +0 -172
  337. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  338. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
  339. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  342. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  344. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  345. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  346. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  347. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  348. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs +0 -985
  349. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  350. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  351. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  353. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  355. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  356. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  357. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  358. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs +0 -370
  359. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  360. package/dist/lib/node-esm/markdown-INKTE4MH.mjs +0 -170
  361. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  362. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
  363. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
  364. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs +0 -110
  365. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  366. package/dist/lib/node-esm/settings-SJ24YG7M.mjs +0 -23
  367. package/dist/lib/node-esm/settings-SJ24YG7M.mjs.map +0 -7
  368. package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
  369. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  370. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  371. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  372. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  373. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  374. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  375. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  377. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  379. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  381. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  383. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/settings.d.ts +0 -4
  385. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/state.d.ts +0 -7
  387. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  388. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  389. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  390. package/dist/types/src/types/schema.d.ts +0 -162
  391. package/dist/types/src/types/schema.d.ts.map +0 -1
  392. package/src/capabilities/app-graph-builder.ts +0 -180
  393. package/src/capabilities/call-manager.ts +0 -19
  394. package/src/capabilities/capabilities.ts +0 -33
  395. package/src/capabilities/intent-resolver.ts +0 -314
  396. package/src/capabilities/markdown.ts +0 -68
  397. package/src/capabilities/react-root.tsx +0 -17
  398. package/src/capabilities/react-surface.tsx +0 -88
  399. package/src/capabilities/settings.ts +0 -19
  400. package/src/capabilities/state.ts +0 -25
  401. package/src/components/ThreadComplementary.tsx +0 -151
  402. package/src/types/schema.ts +0 -33
  403. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → blueprints/index.mjs.map} +0 -0
  404. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  405. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → blueprints/index.mjs.map} +0 -0
  406. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,17 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type PropsWithChildren, type FC } from 'react';
5
+ import { useAtomValue } from '@effect-atom/atom-react';
6
+ import React, { type FC, type PropsWithChildren } from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/react';
8
9
  import { type ThemedClassName } from '@dxos/react-ui';
9
10
 
10
- import { Toolbar, type ToolbarProps } from './Toolbar';
11
- import { ThreadCapabilities } from '../../capabilities';
12
11
  import { useDebugMode } from '../../hooks';
12
+ import { ThreadCapabilities } from '../../types';
13
13
  import { AudioStream } from '../Media';
14
14
  import { ParticipantGrid } from '../Participant';
15
15
 
16
+ import { Toolbar, type ToolbarProps } from './Toolbar';
17
+
16
18
  //
17
19
  // Root
18
20
  //
@@ -33,8 +35,9 @@ type CallAudioProps = {};
33
35
 
34
36
  const CallAudio: FC<CallAudioProps> = () => {
35
37
  const call = useCapability(ThreadCapabilities.CallManager);
38
+ const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
36
39
 
37
- return <AudioStream tracks={call.audioTracksToPlay} />;
40
+ return <AudioStream tracks={audioTracksToPlay} />;
38
41
  };
39
42
 
40
43
  CallAudio.displayName = 'CallAudio';
@@ -50,10 +53,12 @@ type CallGridProps = {
50
53
  const CallGrid: FC<CallGridProps> = ({ fullscreen }) => {
51
54
  const debug = useDebugMode();
52
55
  const call = useCapability(ThreadCapabilities.CallManager);
56
+ const self = useAtomValue(call.selfAtom);
57
+ const users = useAtomValue(call.usersAtom);
53
58
 
54
59
  return (
55
60
  <div className='grid grow p-4 dark:bg-neutral-900'>
56
- <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />
61
+ <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />
57
62
  </div>
58
63
  );
59
64
  };
@@ -2,28 +2,30 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React from 'react';
6
7
 
7
- import { useAppGraph, useCapability } from '@dxos/app-framework';
8
- import { useNode, useActions } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
8
+ import { useAppGraph, useCapability } from '@dxos/app-framework/react';
9
+ import { Obj } from '@dxos/echo';
10
+ import { Node, useActionRunner } from '@dxos/plugin-graph';
11
+ import { useActions, useNode } from '@dxos/plugin-graph';
10
12
  import {
11
13
  Icon,
12
14
  IconButton,
13
15
  type IconButtonProps,
16
+ Toolbar as NaturalToolbar,
14
17
  type ThemedClassName,
15
- Toolbar as NativeToolbar,
16
18
  toLocalizedString,
17
19
  useTranslation,
18
20
  } from '@dxos/react-ui';
19
- import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
21
+ import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
20
22
 
21
- import { ThreadCapabilities } from '../../capabilities';
22
23
  import { meta } from '../../meta';
23
- import { type ChannelType } from '../../types';
24
+ import { ThreadCapabilities } from '../../types';
25
+ import { type Channel } from '../../types';
24
26
 
25
27
  export type ToolbarProps = ThemedClassName<{
26
- channel?: ChannelType;
28
+ channel?: Channel.Channel;
27
29
  participants?: number;
28
30
  autoHideControls?: boolean;
29
31
  isInRoom?: boolean;
@@ -42,23 +44,27 @@ export const Toolbar = ({
42
44
  }: ToolbarProps) => {
43
45
  const { t } = useTranslation(meta.id);
44
46
  const { graph } = useAppGraph();
47
+ const runAction = useActionRunner();
45
48
  const call = useCapability(ThreadCapabilities.CallManager);
49
+ const media = useAtomValue(call.mediaAtom);
50
+ const joined = useAtomValue(call.joinedAtom);
51
+ const raisedHand = useAtomValue(call.raisedHandAtom);
46
52
 
47
53
  // Channel app graph node.
48
- const node = useNode(graph, channel && fullyQualifiedId(channel));
54
+ const node = useNode(graph, channel && Obj.getDXN(channel).toString());
49
55
  const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');
50
56
 
51
57
  // Screen sharing.
52
- const isScreensharing = call.media.screenshareTrack !== undefined;
58
+ const isScreensharing = media.screenshareTrack !== undefined;
53
59
  const canSharescreen =
54
60
  typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;
55
61
 
56
62
  // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
57
63
  return (
58
64
  <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]}>
65
+ <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
60
66
  <ToggleButton
61
- active={call.media.audioEnabled}
67
+ active={media.audioEnabled}
62
68
  state={{
63
69
  on: {
64
70
  icon: 'ph--microphone--regular',
@@ -70,12 +76,12 @@ export const Toolbar = ({
70
76
  icon: 'ph--microphone-slash--duotone',
71
77
  label: t('mic on'),
72
78
  onClick: () => call.turnAudioOn(),
73
- classNames: [call.joined && 'bg-callAlert'],
79
+ classNames: [joined && 'bg-callAlert'],
74
80
  },
75
81
  }}
76
82
  />
77
83
  <ToggleButton
78
- active={call.media.videoEnabled}
84
+ active={media.videoEnabled}
79
85
  state={{
80
86
  on: {
81
87
  icon: 'ph--video-camera--regular',
@@ -95,9 +101,9 @@ export const Toolbar = ({
95
101
  <Icon icon='ph--users--regular' size={4} />
96
102
  <div>{participants}</div>
97
103
  </div>
98
- )) || <NativeToolbar.Separator variant='gap' />}
104
+ )) || <NaturalToolbar.Separator variant='gap' />}
99
105
 
100
- {call.joined && (
106
+ {joined && (
101
107
  <>
102
108
  <ToggleButton
103
109
  disabled={!canSharescreen}
@@ -117,25 +123,27 @@ export const Toolbar = ({
117
123
  />
118
124
 
119
125
  {/* Companion actions. */}
120
- {actions.map((action) => (
121
- <IconButton
122
- key={action.id}
123
- {...defaultButtonProps}
124
- icon={action.properties.icon}
125
- label={toLocalizedString(action.properties.label, t)}
126
- classNames={action.properties.classNames}
127
- onClick={() => action.data({ node })}
128
- />
129
- ))}
126
+ {actions
127
+ .filter((action): action is Node.Action => Node.isAction(action))
128
+ .map((action) => (
129
+ <IconButton
130
+ key={action.id}
131
+ {...defaultButtonProps}
132
+ icon={action.properties.icon}
133
+ label={toLocalizedString(action.properties.label, t)}
134
+ classNames={action.properties.classNames}
135
+ onClick={() => node && void runAction(action, { parent: node })}
136
+ />
137
+ ))}
130
138
 
131
139
  <ToggleButton
132
- active={call.raisedHand}
140
+ active={raisedHand}
133
141
  state={{
134
142
  on: {
135
143
  icon: 'ph--hand-waving--regular',
136
144
  label: t('lower hand'),
137
145
  onClick: () => call.setRaisedHand(false),
138
- classNames: [call.joined && 'bg-callAlert'],
146
+ classNames: [joined && 'bg-callAlert'],
139
147
  },
140
148
  off: {
141
149
  icon: 'ph--hand-palm--duotone',
@@ -146,12 +154,12 @@ export const Toolbar = ({
146
154
  />
147
155
  </>
148
156
  )}
149
- {call.joined ? (
157
+ {joined ? (
150
158
  <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />
151
159
  ) : (
152
160
  <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
153
161
  )}
154
- </NativeToolbar.Root>
162
+ </NaturalToolbar.Root>
155
163
  </div>
156
164
  );
157
165
  };
@@ -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, useTranslation, type ThemedClassName } 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
+ };
@@ -2,16 +2,19 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/react';
9
+
10
+ import { ThreadCapabilities } from '../types';
8
11
 
9
12
  import { ChannelContainer } from './ChannelContainer';
10
- import { ThreadCapabilities } from '../capabilities';
11
13
 
12
14
  export const CallSidebar = () => {
13
15
  const call = useCapability(ThreadCapabilities.CallManager);
14
- return <ChannelContainer roomId={call.roomId} />;
16
+ const roomId = useAtomValue(call.roomIdAtom);
17
+ return <ChannelContainer subject={undefined} roomId={roomId} />;
15
18
  };
16
19
 
17
20
  export default CallSidebar;
@@ -2,57 +2,60 @@
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
 
10
- import { contributes } from '@dxos/app-framework';
8
+ import { Capability, Common } from '@dxos/app-framework';
11
9
  import { withPluginManager } from '@dxos/app-framework/testing';
12
- import { ClientCapabilities } from '@dxos/plugin-client';
13
- import { Query, useQuery, useSpace } from '@dxos/react-client/echo';
14
- import { DataType } from '@dxos/schema';
15
- import { withLayout, ColumnContainer } from '@dxos/storybook-utils';
10
+ import { Query, useDatabase, useQuery } from '@dxos/react-client/echo';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+ import { render } from '@dxos/storybook-utils';
13
+ import { Message, Thread } from '@dxos/types';
16
14
 
17
- import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
18
15
  import { createThreadPlugins } from '../testing';
19
16
  import { translations } from '../translations';
20
- import { ChannelType, ThreadType } from '../types';
17
+ import { Channel } from '../types';
18
+
19
+ import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
21
20
 
22
21
  // TODO(wittjosiah): Channel doesn't render full height.
23
- const Story = ({ roomId }: ChannelContainerProps) => {
24
- const space = useSpace();
25
- const [channel] = useQuery(space, Query.type(ChannelType));
22
+ const DefaultStory = ({ roomId }: ChannelContainerProps) => {
23
+ const db = useDatabase();
24
+ const [channel] = useQuery(db, Query.type(Channel.Channel));
26
25
  if (!channel) {
27
26
  return null;
28
27
  }
29
28
 
30
- return <ChannelContainer channel={channel} roomId={roomId} />;
29
+ return <ChannelContainer subject={channel} roomId={roomId} />;
31
30
  };
32
31
 
33
- const meta: Meta<ChannelContainerProps> = {
32
+ const meta = {
34
33
  title: 'plugins/plugin-thread/ChannelContainer',
35
34
  component: ChannelContainer,
36
- render: (args) => <Story {...args} />,
35
+ render: render(DefaultStory),
37
36
  decorators: [
37
+ withTheme,
38
+ withLayout({ layout: 'column' }),
38
39
  withPluginManager({
39
40
  plugins: [...(await createThreadPlugins())],
40
- capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
41
+ capabilities: [
42
+ Capability.contributes(Common.Capability.Schema, [Channel.Channel, Thread.Thread, Message.Message]),
43
+ ],
41
44
  }),
42
- withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
43
45
  ],
44
46
  parameters: {
45
47
  translations,
46
48
  },
47
- };
49
+ } satisfies Meta<typeof ChannelContainer>;
48
50
 
49
51
  export default meta;
50
52
 
51
- type Story = StoryObj<ChannelContainerProps>;
53
+ type Story = StoryObj<typeof meta>;
52
54
 
53
55
  export const Default: Story = {
54
56
  args: {
55
57
  // Fixed room for testing.
58
+ subject: undefined,
56
59
  roomId: '04a1d1911703b8e929d0649021a965',
57
60
  },
58
61
  };
@@ -2,42 +2,49 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import React, { useCallback, useEffect, useMemo, useState, type ChangeEvent } from 'react';
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
7
7
 
8
- import { useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { type SurfaceComponentProps, 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 { useTranslation, Input, ElevationProvider, type ThemedClassName } from '@dxos/react-ui';
16
- import { ControlGroup, ControlItemInput, ControlGroupButton } from '@dxos/react-ui-form';
17
- import { ToolbarMenu, MenuProvider, createMenuAction, useMenuActions, createMenuItemGroup } from '@dxos/react-ui-menu';
16
+ import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
17
+ import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
18
+ import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
18
19
  import { useSoundEffect } from '@dxos/react-ui-sfx';
19
20
  import { StackItem } from '@dxos/react-ui-stack';
20
21
 
22
+ import { meta } from '../meta';
23
+ import { ThreadCapabilities } from '../types';
24
+ import { type Channel } from '../types';
25
+
21
26
  import { Call } from './Call';
22
27
  import ChatContainer from './ChatContainer';
23
- import { ThreadCapabilities } from '../capabilities';
24
- import { meta } from '../meta';
25
- import { type ChannelType } from '../types';
26
28
 
27
- export type ChannelContainerProps = {
28
- channel?: ChannelType;
29
- roomId?: string;
30
- role?: string;
31
- fullscreen?: boolean;
32
- };
29
+ export type ChannelContainerProps = SurfaceComponentProps<
30
+ Channel.Channel | undefined,
31
+ {
32
+ roomId?: string;
33
+ fullscreen?: boolean;
34
+ }
35
+ >;
33
36
 
34
37
  /**
35
38
  * Renders a call when active, otherwise renders the channel chat.
36
39
  */
37
- export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {
40
+ // TODO(burdon): Create Radix style layout.
41
+ export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {
38
42
  const space = getSpace(channel);
39
43
  const callManager = useCapability(ThreadCapabilities.CallManager);
40
- const roomId = _roomId ?? (channel ? fullyQualifiedId(channel) : failUndefined());
44
+ const joined = useAtomValue(callManager.joinedAtom);
45
+ const currentRoomId = useAtomValue(callManager.roomIdAtom);
46
+ const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
47
+ const roomId = roomIdProp ?? attendableId ?? failUndefined();
41
48
  const identity = useIdentity();
42
49
  const isNamed = !!identity?.profile?.displayName;
43
50
  const joinSound = useSoundEffect('JoinCall');
@@ -78,7 +85,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
78
85
  return;
79
86
  }
80
87
 
81
- if (callManager.joined) {
88
+ if (joined) {
82
89
  await callManager.leave();
83
90
  }
84
91
 
@@ -91,7 +98,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
91
98
  // TODO(burdon): Error sound.
92
99
  log.catch(err);
93
100
  }
94
- }, [extensions, channel, roomId]);
101
+ }, [extensions, channel, roomId, joined]);
95
102
 
96
103
  /**
97
104
  * Leave the call.
@@ -110,10 +117,10 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
110
117
  }
111
118
  }, [extensions, roomId]);
112
119
 
113
- const isJoined = callManager.joined && callManager.roomId === roomId;
120
+ const isJoined = joined && currentRoomId === roomId;
114
121
 
115
122
  return (
116
- <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>
123
+ <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
117
124
  {isJoined && !isNamed && <DisplayNameMissing />}
118
125
  {isJoined && isNamed && (
119
126
  <Call.Root>
@@ -123,8 +130,8 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
123
130
  )}
124
131
  {!isJoined && channel && channel.defaultThread.target && space && (
125
132
  <>
126
- <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />
127
- <ChatContainer space={space} thread={channel.defaultThread.target} />
133
+ <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
134
+ <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />
128
135
  </>
129
136
  )}
130
137
  </StackItem.Content>
@@ -160,7 +167,7 @@ const DisplayNameMissing = () => {
160
167
  const useChannelToolbarActions = (onJoinCall?: () => void) => {
161
168
  const creator = useMemo(
162
169
  () =>
163
- Rx.make(() => {
170
+ Atom.make(() => {
164
171
  return {
165
172
  nodes: [
166
173
  createMenuItemGroup('root', {
@@ -181,19 +188,19 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
181
188
  return useMenuActions(creator);
182
189
  };
183
190
 
184
- type ChannelToolbarProps = ThemedClassName<{
191
+ type ChannelToolbarProps = {
185
192
  attendableId?: string;
186
193
  role?: string;
187
194
  onJoinCall?: () => void;
188
- }>;
195
+ };
189
196
 
190
- const ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }: ChannelToolbarProps) => {
197
+ const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
191
198
  const menuProps = useChannelToolbarActions(onJoinCall);
192
199
 
193
200
  return (
194
201
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
195
202
  <MenuProvider {...menuProps} attendableId={attendableId}>
196
- <ToolbarMenu classNames={classNames} />
203
+ <ToolbarMenu textBlockWidth />
197
204
  </MenuProvider>
198
205
  </ElevationProvider>
199
206
  );