@dxos/plugin-thread 0.8.4-main.1f223c7 → 0.8.4-main.21d9917

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 (397) hide show
  1. package/dist/lib/browser/app-graph-builder-SPAZN5XL.mjs +188 -0
  2. package/dist/lib/browser/app-graph-builder-SPAZN5XL.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-YBRTG6T3.mjs +26 -0
  7. package/dist/lib/browser/call-manager-YBRTG6T3.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  9. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-RI3Z6MK3.mjs → chunk-DLO2G3DM.mjs} +79 -76
  11. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-ZCEU5K23.mjs → chunk-ERK254BS.mjs} +207 -287
  13. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-XYUJXHYV.mjs → chunk-ISCHODBV.mjs} +1 -1
  15. package/dist/lib/browser/{chunk-XYUJXHYV.mjs.map → chunk-ISCHODBV.mjs.map} +2 -2
  16. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/browser/chunk-TAWDJPMD.mjs +293 -0
  18. package/dist/lib/browser/chunk-TAWDJPMD.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-VZICDGBW.mjs +1813 -0
  20. package/dist/lib/browser/chunk-VZICDGBW.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 +127 -120
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-TSXOA3GV.mjs +210 -0
  26. package/dist/lib/browser/markdown-TSXOA3GV.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-Q7U5D3DA.mjs +25 -0
  31. package/dist/lib/browser/react-root-Q7U5D3DA.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-WDZQSDWH.mjs +110 -0
  33. package/dist/lib/browser/react-surface-WDZQSDWH.mjs.map +7 -0
  34. package/dist/lib/browser/repair-TDKAFAGH.mjs +38 -0
  35. package/dist/lib/browser/repair-TDKAFAGH.mjs.map +7 -0
  36. package/dist/lib/browser/settings-OOKKVXV7.mjs +32 -0
  37. package/dist/lib/browser/settings-OOKKVXV7.mjs.map +7 -0
  38. package/dist/lib/browser/state-3LKZHDRI.mjs +24 -0
  39. package/dist/lib/browser/state-3LKZHDRI.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +10 -12
  41. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.mjs +189 -0
  42. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.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-MMCTNFOH.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-MMCTNFOH.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-3RD3IVVD.mjs +1814 -0
  49. package/dist/lib/node-esm/chunk-3RD3IVVD.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-ARTUUKTM.mjs +294 -0
  55. package/dist/lib/node-esm/chunk-ARTUUKTM.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  57. package/dist/lib/node-esm/{chunk-JNPKMT7O.mjs → chunk-KRBZBJRI.mjs} +79 -76
  58. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-TIPIOH2J.mjs → chunk-QP3KQOPQ.mjs} +207 -287
  60. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs → chunk-VBI32FGI.mjs} +1 -1
  62. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs.map → chunk-VBI32FGI.mjs.map} +2 -2
  63. package/dist/lib/node-esm/index.mjs +127 -120
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs +111 -0
  73. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs.map +7 -0
  74. package/dist/lib/node-esm/repair-LHLLGXKF.mjs +39 -0
  75. package/dist/lib/node-esm/repair-LHLLGXKF.mjs.map +7 -0
  76. package/dist/lib/node-esm/settings-LXZQXSPL.mjs +33 -0
  77. package/dist/lib/node-esm/settings-LXZQXSPL.mjs.map +7 -0
  78. package/dist/lib/node-esm/state-YYAK5ENM.mjs +25 -0
  79. package/dist/lib/node-esm/state-YYAK5ENM.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 +1 -1
  92. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  93. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  94. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  96. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  97. package/dist/types/src/calls-service.stories.d.ts +0 -1
  98. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  100. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  102. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  104. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  106. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  108. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/index.d.ts +10 -16
  112. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  116. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  118. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  120. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  122. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  124. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  126. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  128. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  130. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  132. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  134. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/settings/settings.d.ts +5 -0
  136. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  138. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  140. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  141. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  142. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  143. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  144. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  145. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  146. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  147. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  148. package/dist/types/src/components/ChannelContainer.stories.d.ts +78 -9
  149. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/Chat.stories.d.ts +77 -6
  151. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ChatContainer.d.ts +7 -6
  153. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  154. package/dist/types/src/components/Comments.stories.d.ts +5 -2
  155. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  157. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/CommentsThreadContainer.d.ts +8 -8
  159. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  160. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  161. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  162. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  163. package/dist/types/src/components/Media/VideoObject.stories.d.ts +6 -4
  164. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  165. package/dist/types/src/components/MessageContainer.d.ts +4 -3
  166. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  167. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  168. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +6 -2
  169. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +6 -2
  171. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  172. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  173. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  174. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  175. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  176. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  177. package/dist/types/src/components/index.d.ts +3 -3
  178. package/dist/types/src/components/index.d.ts.map +1 -1
  179. package/dist/types/src/components/testing.d.ts +3 -3
  180. package/dist/types/src/components/testing.d.ts.map +1 -1
  181. package/dist/types/src/extensions/threads.d.ts +7 -2
  182. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  183. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  184. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  185. package/dist/types/src/functions/index.d.ts +2 -0
  186. package/dist/types/src/functions/index.d.ts.map +1 -0
  187. package/dist/types/src/hooks/analytics.d.ts +2 -3
  188. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  189. package/dist/types/src/hooks/index.d.ts +2 -2
  190. package/dist/types/src/hooks/index.d.ts.map +1 -1
  191. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  192. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  193. package/dist/types/src/index.d.ts +1 -1
  194. package/dist/types/src/index.d.ts.map +1 -1
  195. package/dist/types/src/meta.d.ts +3 -4
  196. package/dist/types/src/meta.d.ts.map +1 -1
  197. package/dist/types/src/testing/stories.d.ts +2 -1
  198. package/dist/types/src/testing/stories.d.ts.map +1 -1
  199. package/dist/types/src/translations.d.ts +76 -6
  200. package/dist/types/src/translations.d.ts.map +1 -1
  201. package/dist/types/src/types/Channel.d.ts +695 -0
  202. package/dist/types/src/types/Channel.d.ts.map +1 -0
  203. package/dist/types/src/types/capabilities.d.ts +23 -0
  204. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  205. package/dist/types/src/types/index.d.ts +2 -1
  206. package/dist/types/src/types/index.d.ts.map +1 -1
  207. package/dist/types/src/types/types.d.ts +3214 -441
  208. package/dist/types/src/types/types.d.ts.map +1 -1
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +88 -67
  211. package/src/ThreadPlugin.tsx +106 -135
  212. package/src/blueprints/index.ts +5 -0
  213. package/src/blueprints/thread-blueprint.ts +32 -0
  214. package/src/calls/call-manager.ts +76 -52
  215. package/src/calls/call-swarm-synchronizer.ts +2 -2
  216. package/src/calls/media-manager.ts +10 -7
  217. package/src/calls/util/calls-service.ts +1 -1
  218. package/src/calls/util/stub-media-streams.ts +2 -2
  219. package/src/calls/util/task-scheduling.ts +4 -4
  220. package/src/calls-service.stories.tsx +2 -5
  221. package/src/capabilities/app-graph-builder/app-graph-builder.ts +201 -0
  222. package/src/capabilities/app-graph-builder/index.ts +7 -0
  223. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  224. package/src/capabilities/blueprint-definition/index.ts +7 -0
  225. package/src/capabilities/call-manager/call-manager.ts +26 -0
  226. package/src/capabilities/call-manager/index.ts +7 -0
  227. package/src/capabilities/index.ts +10 -13
  228. package/src/capabilities/markdown/index.ts +7 -0
  229. package/src/capabilities/markdown/markdown.ts +83 -0
  230. package/src/capabilities/operation-resolver/index.ts +7 -0
  231. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  232. package/src/capabilities/react-root/index.ts +7 -0
  233. package/src/capabilities/react-root/react-root.tsx +20 -0
  234. package/src/capabilities/react-surface/index.ts +7 -0
  235. package/src/capabilities/react-surface/react-surface.tsx +97 -0
  236. package/src/capabilities/repair/index.ts +7 -0
  237. package/src/capabilities/repair/repair.ts +51 -0
  238. package/src/capabilities/settings/index.ts +7 -0
  239. package/src/capabilities/settings/settings.ts +33 -0
  240. package/src/capabilities/state/index.ts +7 -0
  241. package/src/capabilities/state/state.ts +22 -0
  242. package/src/components/Call/Call.tsx +8 -4
  243. package/src/components/Call/Toolbar.tsx +33 -25
  244. package/src/components/CallDebugPanel.tsx +12 -14
  245. package/src/components/CallSidebar.tsx +5 -3
  246. package/src/components/ChannelContainer.stories.tsx +17 -15
  247. package/src/components/ChannelContainer.tsx +31 -25
  248. package/src/components/Chat.stories.tsx +20 -25
  249. package/src/components/ChatContainer.tsx +35 -27
  250. package/src/components/Comments.stories.tsx +30 -33
  251. package/src/components/CommentsContainer.tsx +5 -7
  252. package/src/components/CommentsThreadContainer.tsx +39 -35
  253. package/src/components/Lobby/Lobby.tsx +9 -7
  254. package/src/components/Media/AudioStream.tsx +2 -2
  255. package/src/components/Media/VideoObject.stories.tsx +12 -7
  256. package/src/components/Media/VideoObject.tsx +2 -2
  257. package/src/components/MessageContainer.tsx +59 -28
  258. package/src/components/Participant/Participant.tsx +32 -19
  259. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
  260. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  261. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -5
  262. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
  263. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +6 -3
  264. package/src/components/ThreadCompanion.tsx +193 -0
  265. package/src/components/ThreadSettings.tsx +8 -4
  266. package/src/components/command-extension.ts +2 -2
  267. package/src/components/index.ts +4 -7
  268. package/src/components/testing.ts +7 -9
  269. package/src/extensions/threads.ts +86 -42
  270. package/src/functions/create-proposals.ts +57 -0
  271. package/src/functions/index.ts +5 -0
  272. package/src/hooks/analytics.ts +21 -21
  273. package/src/hooks/index.ts +3 -2
  274. package/src/hooks/useVideoStreamTrack.tsx +1 -1
  275. package/src/index.ts +1 -1
  276. package/src/meta.ts +11 -7
  277. package/src/testing/stories.ts +17 -16
  278. package/src/translations.ts +6 -3
  279. package/src/types/Channel.ts +30 -0
  280. package/src/types/capabilities.ts +34 -0
  281. package/src/types/index.ts +2 -1
  282. package/src/types/types.ts +168 -89
  283. package/src/util.ts +1 -1
  284. package/dist/lib/browser/ChannelContainer-4PYFOIDK.mjs +0 -16
  285. package/dist/lib/browser/ChatContainer-EXNNREYB.mjs +0 -15
  286. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs +0 -171
  287. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
  288. package/dist/lib/browser/call-manager-RMPTWSTF.mjs +0 -24
  289. package/dist/lib/browser/call-manager-RMPTWSTF.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  291. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-7W7QK5ZP.mjs +0 -986
  293. package/dist/lib/browser/chunk-7W7QK5ZP.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  295. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-G4CNILRR.mjs +0 -23
  297. package/dist/lib/browser/chunk-G4CNILRR.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
  300. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-PBMNFG3B.mjs +0 -376
  302. package/dist/lib/browser/chunk-PBMNFG3B.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-RI3Z6MK3.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-ZH2WPTNP.mjs +0 -618
  306. package/dist/lib/browser/chunk-ZH2WPTNP.mjs.map +0 -7
  307. package/dist/lib/browser/intent-resolver-J7OCP2P6.mjs +0 -427
  308. package/dist/lib/browser/intent-resolver-J7OCP2P6.mjs.map +0 -7
  309. package/dist/lib/browser/markdown-Z677YORA.mjs +0 -169
  310. package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-XKOD4KRB.mjs +0 -28
  312. package/dist/lib/browser/react-root-XKOD4KRB.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-GVGZRBDK.mjs +0 -109
  314. package/dist/lib/browser/react-surface-GVGZRBDK.mjs.map +0 -7
  315. package/dist/lib/browser/settings-GRKEID73.mjs +0 -22
  316. package/dist/lib/browser/settings-GRKEID73.mjs.map +0 -7
  317. package/dist/lib/browser/state-2T4KDWBX.mjs +0 -34
  318. package/dist/lib/browser/state-2T4KDWBX.mjs.map +0 -7
  319. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +0 -80
  320. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +0 -7
  321. package/dist/lib/node-esm/ChannelContainer-KQQEZWUN.mjs +0 -17
  322. package/dist/lib/node-esm/ChatContainer-QVQKFBWA.mjs +0 -16
  323. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs +0 -172
  324. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
  325. package/dist/lib/node-esm/call-manager-QAREJFVX.mjs +0 -25
  326. package/dist/lib/node-esm/call-manager-QAREJFVX.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-4T45PCKP.mjs +0 -25
  328. package/dist/lib/node-esm/chunk-4T45PCKP.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  330. package/dist/lib/node-esm/chunk-DKCQCENK.mjs +0 -377
  331. package/dist/lib/node-esm/chunk-DKCQCENK.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  333. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-LE2LIYGX.mjs +0 -619
  336. package/dist/lib/node-esm/chunk-LE2LIYGX.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
  338. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +0 -7
  339. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  340. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-SNKFZQST.mjs +0 -987
  342. package/dist/lib/node-esm/chunk-SNKFZQST.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  344. package/dist/lib/node-esm/intent-resolver-SR2LW4HF.mjs +0 -428
  345. package/dist/lib/node-esm/intent-resolver-SR2LW4HF.mjs.map +0 -7
  346. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs +0 -170
  347. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
  348. package/dist/lib/node-esm/react-root-4JWDRIQB.mjs +0 -29
  349. package/dist/lib/node-esm/react-root-4JWDRIQB.mjs.map +0 -7
  350. package/dist/lib/node-esm/react-surface-WLQUVRAX.mjs +0 -110
  351. package/dist/lib/node-esm/react-surface-WLQUVRAX.mjs.map +0 -7
  352. package/dist/lib/node-esm/settings-F2ODVNNW.mjs +0 -23
  353. package/dist/lib/node-esm/settings-F2ODVNNW.mjs.map +0 -7
  354. package/dist/lib/node-esm/state-62TQKQVB.mjs +0 -35
  355. package/dist/lib/node-esm/state-62TQKQVB.mjs.map +0 -7
  356. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +0 -81
  357. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +0 -7
  358. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  359. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  360. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  361. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  362. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  363. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  364. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  365. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  366. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  367. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  368. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  369. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  370. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  371. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  372. package/dist/types/src/capabilities/settings.d.ts +0 -4
  373. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  374. package/dist/types/src/capabilities/state.d.ts +0 -7
  375. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/toolkit.d.ts +0 -5
  377. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  378. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  379. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  380. package/dist/types/src/types/schema.d.ts +0 -177
  381. package/dist/types/src/types/schema.d.ts.map +0 -1
  382. package/src/capabilities/app-graph-builder.ts +0 -183
  383. package/src/capabilities/call-manager.ts +0 -20
  384. package/src/capabilities/capabilities.ts +0 -33
  385. package/src/capabilities/intent-resolver.ts +0 -348
  386. package/src/capabilities/markdown.ts +0 -69
  387. package/src/capabilities/react-root.tsx +0 -17
  388. package/src/capabilities/react-surface.tsx +0 -89
  389. package/src/capabilities/settings.ts +0 -19
  390. package/src/capabilities/state.ts +0 -26
  391. package/src/capabilities/toolkit.ts +0 -78
  392. package/src/components/ThreadComplementary.tsx +0 -181
  393. package/src/types/schema.ts +0 -33
  394. /package/dist/lib/browser/{ChannelContainer-4PYFOIDK.mjs.map → blueprints/index.mjs.map} +0 -0
  395. /package/dist/lib/browser/{ChatContainer-EXNNREYB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  396. /package/dist/lib/node-esm/{ChannelContainer-KQQEZWUN.mjs.map → blueprints/index.mjs.map} +0 -0
  397. /package/dist/lib/node-esm/{ChatContainer-QVQKFBWA.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -0,0 +1,51 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { Obj, Ref, Type } from '@dxos/echo';
9
+ import { SpaceCapabilities } from '@dxos/plugin-space';
10
+ import { type Space } from '@dxos/react-client/echo';
11
+ import { Collection } from '@dxos/schema';
12
+
13
+ import { Channel } from '../../types';
14
+
15
+ export default Capability.makeModule(() =>
16
+ Effect.succeed(
17
+ Capability.contributes(
18
+ SpaceCapabilities.Repair,
19
+ async ({ space, isDefault }: { space: Space; isDefault: boolean }) => {
20
+ if (isDefault) {
21
+ return;
22
+ }
23
+
24
+ await ensureSystemCollection(space);
25
+ },
26
+ ),
27
+ ),
28
+ );
29
+
30
+ /**
31
+ * Ensure the root collection has a system collection for Channels.
32
+ */
33
+ const ensureSystemCollection = async (space: Space) => {
34
+ const rootCollection: Collection.Collection = await space.properties[Collection.Collection.typename]?.load();
35
+ if (!rootCollection) {
36
+ return;
37
+ }
38
+
39
+ const objects = await Promise.all(rootCollection.objects.map((ref) => ref.load()));
40
+ const channels = objects.find(
41
+ (object) => Obj.instanceOf(Collection.Managed, object) && object.key === Type.getTypename(Channel.Channel),
42
+ );
43
+ if (channels) {
44
+ return;
45
+ }
46
+
47
+ const channelCollectionRef = Ref.make(Collection.makeManaged({ key: Type.getTypename(Channel.Channel) }));
48
+ Obj.change(rootCollection, (c) => {
49
+ c.objects.push(channelCollectionRef);
50
+ });
51
+ };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capability } from '@dxos/app-framework';
6
+
7
+ export const ThreadSettings = Capability.lazy('ThreadSettings', () => import('./settings'));
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability, Common } from '@dxos/app-framework';
8
+ import { createKvsStore } from '@dxos/effect';
9
+
10
+ import { meta } from '../../meta';
11
+ import { ThreadSettingsSchema } from '../../types';
12
+ import { ThreadCapabilities } from '../../types/capabilities';
13
+
14
+ export default Capability.makeModule(() =>
15
+ Effect.sync(() => {
16
+ const settingsAtom = createKvsStore({
17
+ key: meta.id,
18
+ schema: ThreadSettingsSchema,
19
+ defaultValue: () => ({}),
20
+ });
21
+
22
+ return [
23
+ // Expose atom directly for programmatic access.
24
+ Capability.contributes(ThreadCapabilities.Settings, settingsAtom),
25
+ // Contribute to common settings for UI discovery.
26
+ Capability.contributes(Common.Capability.Settings, {
27
+ prefix: meta.id,
28
+ schema: ThreadSettingsSchema,
29
+ atom: settingsAtom,
30
+ }),
31
+ ];
32
+ }),
33
+ );
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capability } from '@dxos/app-framework';
6
+
7
+ export const ThreadState = Capability.lazy('ThreadState', () => import('./state'));
@@ -0,0 +1,22 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { Capability } from '@dxos/app-framework';
9
+
10
+ import { ThreadCapabilities, type ThreadState, type ViewStore } from '../../types';
11
+
12
+ export default Capability.makeModule(
13
+ Effect.fnUntraced(function* () {
14
+ const stateAtom = Atom.make<ThreadState>({ toolbar: {}, drafts: {} }).pipe(Atom.keepAlive);
15
+ const viewStoreAtom = Atom.make<ViewStore>({}).pipe(Atom.keepAlive);
16
+
17
+ return [
18
+ Capability.contributes(ThreadCapabilities.State, stateAtom),
19
+ Capability.contributes(ThreadCapabilities.ViewState, viewStoreAtom),
20
+ ];
21
+ }),
22
+ );
@@ -2,13 +2,14 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
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 { ThreadCapabilities } from '../../capabilities';
11
11
  import { useDebugMode } from '../../hooks';
12
+ import { ThreadCapabilities } from '../../types';
12
13
  import { AudioStream } from '../Media';
13
14
  import { ParticipantGrid } from '../Participant';
14
15
 
@@ -34,8 +35,9 @@ type CallAudioProps = {};
34
35
 
35
36
  const CallAudio: FC<CallAudioProps> = () => {
36
37
  const call = useCapability(ThreadCapabilities.CallManager);
38
+ const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
37
39
 
38
- return <AudioStream tracks={call.audioTracksToPlay} />;
40
+ return <AudioStream tracks={audioTracksToPlay} />;
39
41
  };
40
42
 
41
43
  CallAudio.displayName = 'CallAudio';
@@ -51,10 +53,12 @@ type CallGridProps = {
51
53
  const CallGrid: FC<CallGridProps> = ({ fullscreen }) => {
52
54
  const debug = useDebugMode();
53
55
  const call = useCapability(ThreadCapabilities.CallManager);
56
+ const self = useAtomValue(call.selfAtom);
57
+ const users = useAtomValue(call.usersAtom);
54
58
 
55
59
  return (
56
60
  <div className='grid grow p-4 dark:bg-neutral-900'>
57
- <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />
61
+ <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />
58
62
  </div>
59
63
  );
60
64
  };
@@ -2,11 +2,13 @@
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 { useAppGraph, useCapability } from '@dxos/app-framework/react';
9
+ import { Obj } from '@dxos/echo';
10
+ import { Node, useActionRunner } from '@dxos/plugin-graph';
8
11
  import { useActions, useNode } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
10
12
  import {
11
13
  Icon,
12
14
  IconButton,
@@ -16,14 +18,14 @@ import {
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,14 +44,18 @@ 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
 
@@ -58,7 +64,7 @@ export const Toolbar = ({
58
64
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
59
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',
@@ -97,7 +103,7 @@ export const Toolbar = ({
97
103
  </div>
98
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,7 +154,7 @@ 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} />
@@ -13,9 +13,7 @@ import { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/r
13
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);
@@ -73,24 +71,24 @@ export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
73
71
  open={open}
74
72
  onToggle={handleToggle}
75
73
  title={t('meeting status title')}
76
- maxHeight={false}
77
74
  info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}
75
+ maxHeight={0}
78
76
  >
79
- <div className='flex flex-col w-full gap-2 text-xs'>
80
- <div className='flex items-center gap-2'>
77
+ <div className='flex flex-col is-full text-xs'>
78
+ <div className='flex items-center gap-2 items-center'>
81
79
  <Input.Root>
82
- <Input.Label classNames={'text-sm'}>{t('show webrtc stats title')}</Input.Label>
83
- <Input.Checkbox checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
80
+ <Input.Switch checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />
81
+ <Input.Label>{t('show webrtc stats title')}</Input.Label>
84
82
  </Input.Root>
85
83
  </div>
86
- <div className='flex items-center gap-2'>
84
+ <div className='flex items-center gap-2 items-center'>
87
85
  <Input.Root>
88
- <Input.Label classNames={'text-sm'}>{t('show calls history title')}</Input.Label>
89
- <Input.Checkbox checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
86
+ <Input.Switch checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />
87
+ <Input.Label>{t('show calls history title')}</Input.Label>
90
88
  </Input.Root>
91
89
  </div>
92
- <div className='flex items-center gap-2'>
93
- <IconButton classNames={'text-sm'} icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
90
+ <div className='flex items-center gap-2 items-center'>
91
+ <IconButton icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />
94
92
  </div>
95
93
  <Table rows={rows} />
96
94
  {showDetailedWebRTCStats && <JsonView data={{ stats }} />}
@@ -160,7 +158,7 @@ export type TableProps = {
160
158
 
161
159
  export const Table = ({ rows }: TableProps) => {
162
160
  return (
163
- <div className='w-full text-xs font-mono'>
161
+ <div className='is-full text-xs font-mono'>
164
162
  {rows.map(([prefix, label, value, unit], i) => (
165
163
  <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>
166
164
  <div className='p-1'>{prefix}</div>
@@ -2,17 +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';
8
9
 
9
- import { ThreadCapabilities } from '../capabilities';
10
+ import { ThreadCapabilities } from '../types';
10
11
 
11
12
  import { ChannelContainer } from './ChannelContainer';
12
13
 
13
14
  export const CallSidebar = () => {
14
15
  const call = useCapability(ThreadCapabilities.CallManager);
15
- return <ChannelContainer roomId={call.roomId} />;
16
+ const roomId = useAtomValue(call.roomIdAtom);
17
+ return <ChannelContainer subject={undefined} roomId={roomId} />;
16
18
  };
17
19
 
18
20
  export default CallSidebar;
@@ -2,45 +2,46 @@
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 { ColumnContainer, withLayout } 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
15
  import { createThreadPlugins } from '../testing';
18
16
  import { translations } from '../translations';
19
- import { ChannelType, ThreadType } from '../types';
17
+ import { Channel } from '../types';
20
18
 
21
19
  import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
22
20
 
23
21
  // TODO(wittjosiah): Channel doesn't render full height.
24
- const Story = ({ roomId }: ChannelContainerProps) => {
25
- const space = useSpace();
26
- 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));
27
25
  if (!channel) {
28
26
  return null;
29
27
  }
30
28
 
31
- return <ChannelContainer channel={channel} roomId={roomId} />;
29
+ return <ChannelContainer subject={channel} roomId={roomId} />;
32
30
  };
33
31
 
34
32
  const meta = {
35
33
  title: 'plugins/plugin-thread/ChannelContainer',
36
34
  component: ChannelContainer,
37
- render: (args) => <Story {...args} />,
35
+ render: render(DefaultStory),
38
36
  decorators: [
37
+ withTheme,
38
+ withLayout({ layout: 'column' }),
39
39
  withPluginManager({
40
40
  plugins: [...(await createThreadPlugins())],
41
- capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
41
+ capabilities: [
42
+ Capability.contributes(Common.Capability.Schema, [Channel.Channel, Thread.Thread, Message.Message]),
43
+ ],
42
44
  }),
43
- withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
44
45
  ],
45
46
  parameters: {
46
47
  translations,
@@ -54,6 +55,7 @@ type Story = StoryObj<typeof meta>;
54
55
  export const Default: Story = {
55
56
  args: {
56
57
  // Fixed room for testing.
58
+ subject: undefined,
57
59
  roomId: '04a1d1911703b8e929d0649021a965',
58
60
  },
59
61
  };
@@ -2,43 +2,49 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
6
  import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
7
7
 
8
- import { useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { 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 { ElevationProvider, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
16
+ import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
16
17
  import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
17
18
  import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
18
19
  import { useSoundEffect } from '@dxos/react-ui-sfx';
19
20
  import { StackItem } from '@dxos/react-ui-stack';
20
21
 
21
- import { ThreadCapabilities } from '../capabilities';
22
22
  import { meta } from '../meta';
23
- import { type ChannelType } from '../types';
23
+ import { ThreadCapabilities } from '../types';
24
+ import { type Channel } from '../types';
24
25
 
25
26
  import { Call } from './Call';
26
27
  import ChatContainer from './ChatContainer';
27
28
 
28
- export type ChannelContainerProps = {
29
- channel?: ChannelType;
30
- roomId?: string;
31
- role?: string;
32
- fullscreen?: boolean;
33
- };
29
+ export type ChannelContainerProps = SurfaceComponentProps<
30
+ Channel.Channel | undefined,
31
+ {
32
+ roomId?: string;
33
+ fullscreen?: boolean;
34
+ }
35
+ >;
34
36
 
35
37
  /**
36
38
  * Renders a call when active, otherwise renders the channel chat.
37
39
  */
38
- 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) => {
39
42
  const space = getSpace(channel);
40
43
  const callManager = useCapability(ThreadCapabilities.CallManager);
41
- 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();
42
48
  const identity = useIdentity();
43
49
  const isNamed = !!identity?.profile?.displayName;
44
50
  const joinSound = useSoundEffect('JoinCall');
@@ -79,7 +85,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
79
85
  return;
80
86
  }
81
87
 
82
- if (callManager.joined) {
88
+ if (joined) {
83
89
  await callManager.leave();
84
90
  }
85
91
 
@@ -92,7 +98,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
92
98
  // TODO(burdon): Error sound.
93
99
  log.catch(err);
94
100
  }
95
- }, [extensions, channel, roomId]);
101
+ }, [extensions, channel, roomId, joined]);
96
102
 
97
103
  /**
98
104
  * Leave the call.
@@ -111,10 +117,10 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
111
117
  }
112
118
  }, [extensions, roomId]);
113
119
 
114
- const isJoined = callManager.joined && callManager.roomId === roomId;
120
+ const isJoined = joined && currentRoomId === roomId;
115
121
 
116
122
  return (
117
- <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>
123
+ <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
118
124
  {isJoined && !isNamed && <DisplayNameMissing />}
119
125
  {isJoined && isNamed && (
120
126
  <Call.Root>
@@ -124,8 +130,8 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
124
130
  )}
125
131
  {!isJoined && channel && channel.defaultThread.target && space && (
126
132
  <>
127
- <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />
128
- <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' />
129
135
  </>
130
136
  )}
131
137
  </StackItem.Content>
@@ -161,7 +167,7 @@ const DisplayNameMissing = () => {
161
167
  const useChannelToolbarActions = (onJoinCall?: () => void) => {
162
168
  const creator = useMemo(
163
169
  () =>
164
- Rx.make(() => {
170
+ Atom.make(() => {
165
171
  return {
166
172
  nodes: [
167
173
  createMenuItemGroup('root', {
@@ -182,19 +188,19 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
182
188
  return useMenuActions(creator);
183
189
  };
184
190
 
185
- type ChannelToolbarProps = ThemedClassName<{
191
+ type ChannelToolbarProps = {
186
192
  attendableId?: string;
187
193
  role?: string;
188
194
  onJoinCall?: () => void;
189
- }>;
195
+ };
190
196
 
191
- const ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }: ChannelToolbarProps) => {
197
+ const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
192
198
  const menuProps = useChannelToolbarActions(onJoinCall);
193
199
 
194
200
  return (
195
201
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
196
202
  <MenuProvider {...menuProps} attendableId={attendableId}>
197
- <ToolbarMenu classNames={classNames} />
203
+ <ToolbarMenu textBlockWidth />
198
204
  </MenuProvider>
199
205
  </ElevationProvider>
200
206
  );