@dxos/plugin-thread 0.8.4-main.1f223c7 → 0.8.4-main.2244d791bb

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-XFGLMIGK.mjs +189 -0
  2. package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-RWH6FTW7.mjs +17 -0
  4. package/dist/lib/browser/blueprint-definition-RWH6FTW7.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +8 -0
  6. package/dist/lib/browser/call-manager-GDGIKJKN.mjs +26 -0
  7. package/dist/lib/browser/call-manager-GDGIKJKN.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-4EUEMHNI.mjs +1817 -0
  11. package/dist/lib/browser/chunk-4EUEMHNI.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-CBX65FMW.mjs +105 -0
  13. package/dist/lib/browser/chunk-CBX65FMW.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  15. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-ZCEU5K23.mjs → chunk-ERK254BS.mjs} +207 -287
  17. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-XYUJXHYV.mjs → chunk-ISCHODBV.mjs} +1 -1
  19. package/dist/lib/browser/{chunk-XYUJXHYV.mjs.map → chunk-ISCHODBV.mjs.map} +2 -2
  20. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  21. package/dist/lib/browser/{chunk-RI3Z6MK3.mjs → chunk-JBB73URQ.mjs} +79 -76
  22. package/dist/lib/browser/chunk-JBB73URQ.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +147 -139
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-YJCSOWXX.mjs +210 -0
  26. package/dist/lib/browser/markdown-YJCSOWXX.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-FHK2SVPU.mjs +25 -0
  31. package/dist/lib/browser/react-root-FHK2SVPU.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-7MQA6VSH.mjs +111 -0
  33. package/dist/lib/browser/react-surface-7MQA6VSH.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-TWKOTGSU.mjs +33 -0
  37. package/dist/lib/browser/settings-TWKOTGSU.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-IN6VLJBO.mjs +190 -0
  42. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprint-definition-QZ3GXYAN.mjs +18 -0
  44. package/dist/lib/node-esm/blueprint-definition-QZ3GXYAN.mjs.map +7 -0
  45. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  46. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-2UQ73JQJ.mjs +107 -0
  49. package/dist/lib/node-esm/chunk-2UQ73JQJ.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-JNPKMT7O.mjs → chunk-G7PZNN3Z.mjs} +79 -76
  53. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  55. package/dist/lib/node-esm/{chunk-TIPIOH2J.mjs → chunk-QP3KQOPQ.mjs} +207 -287
  56. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs +1818 -0
  58. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs → chunk-VBI32FGI.mjs} +1 -1
  60. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs.map → chunk-VBI32FGI.mjs.map} +2 -2
  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 +147 -139
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs +112 -0
  73. package/dist/lib/node-esm/react-surface-M7VI5XG2.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-5O254B3Z.mjs +34 -0
  77. package/dist/lib/node-esm/settings-5O254B3Z.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 +4 -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 +6 -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 +6 -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 +13 -0
  184. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  185. package/dist/types/src/functions/index.d.ts +14 -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 +3218 -445
  208. package/dist/types/src/types/types.d.ts.map +1 -1
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +90 -67
  211. package/src/ThreadPlugin.tsx +107 -135
  212. package/src/blueprints/index.ts +5 -0
  213. package/src/blueprints/thread-blueprint.ts +40 -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 +202 -0
  222. package/src/capabilities/app-graph-builder/index.ts +7 -0
  223. package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -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 +98 -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 +34 -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 +34 -25
  244. package/src/components/CallDebugPanel.tsx +12 -14
  245. package/src/components/CallSidebar.tsx +5 -3
  246. package/src/components/ChannelContainer.stories.tsx +16 -15
  247. package/src/components/ChannelContainer.tsx +39 -32
  248. package/src/components/Chat.stories.tsx +20 -24
  249. package/src/components/ChatContainer.tsx +46 -39
  250. package/src/components/Comments.stories.tsx +31 -34
  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 +194 -0
  265. package/src/components/ThreadSettings.tsx +11 -6
  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 +9 -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 +18 -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,34 @@
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 { AppCapabilities } from '@dxos/app-toolkit';
9
+ import { createKvsStore } from '@dxos/effect';
10
+
11
+ import { meta } from '../../meta';
12
+ import { ThreadSettingsSchema } from '../../types';
13
+ import { ThreadCapabilities } from '../../types/capabilities';
14
+
15
+ export default Capability.makeModule(() =>
16
+ Effect.sync(() => {
17
+ const settingsAtom = createKvsStore({
18
+ key: meta.id,
19
+ schema: ThreadSettingsSchema,
20
+ defaultValue: () => ({}),
21
+ });
22
+
23
+ return [
24
+ // Expose atom directly for programmatic access.
25
+ Capability.contributes(ThreadCapabilities.Settings, settingsAtom),
26
+ // Contribute to common settings for UI discovery.
27
+ Capability.contributes(AppCapabilities.Settings, {
28
+ prefix: meta.id,
29
+ schema: ThreadSettingsSchema,
30
+ atom: settingsAtom,
31
+ }),
32
+ ];
33
+ }),
34
+ );
@@ -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/ui';
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,14 @@
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 { useCapability } from '@dxos/app-framework/ui';
9
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
10
+ import { Obj } from '@dxos/echo';
11
+ import { Node, useActionRunner } from '@dxos/plugin-graph';
8
12
  import { useActions, useNode } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
10
13
  import {
11
14
  Icon,
12
15
  IconButton,
@@ -16,14 +19,14 @@ import {
16
19
  toLocalizedString,
17
20
  useTranslation,
18
21
  } from '@dxos/react-ui';
19
- import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
22
+ import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
20
23
 
21
- import { ThreadCapabilities } from '../../capabilities';
22
24
  import { meta } from '../../meta';
23
- import { type ChannelType } from '../../types';
25
+ import { ThreadCapabilities } from '../../types';
26
+ import { type Channel } from '../../types';
24
27
 
25
28
  export type ToolbarProps = ThemedClassName<{
26
- channel?: ChannelType;
29
+ channel?: Channel.Channel;
27
30
  participants?: number;
28
31
  autoHideControls?: boolean;
29
32
  isInRoom?: boolean;
@@ -42,14 +45,18 @@ export const Toolbar = ({
42
45
  }: ToolbarProps) => {
43
46
  const { t } = useTranslation(meta.id);
44
47
  const { graph } = useAppGraph();
48
+ const runAction = useActionRunner();
45
49
  const call = useCapability(ThreadCapabilities.CallManager);
50
+ const media = useAtomValue(call.mediaAtom);
51
+ const joined = useAtomValue(call.joinedAtom);
52
+ const raisedHand = useAtomValue(call.raisedHandAtom);
46
53
 
47
54
  // Channel app graph node.
48
- const node = useNode(graph, channel && fullyQualifiedId(channel));
55
+ const node = useNode(graph, channel && Obj.getDXN(channel).toString());
49
56
  const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');
50
57
 
51
58
  // Screen sharing.
52
- const isScreensharing = call.media.screenshareTrack !== undefined;
59
+ const isScreensharing = media.screenshareTrack !== undefined;
53
60
  const canSharescreen =
54
61
  typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;
55
62
 
@@ -58,7 +65,7 @@ export const Toolbar = ({
58
65
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
59
66
  <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
60
67
  <ToggleButton
61
- active={call.media.audioEnabled}
68
+ active={media.audioEnabled}
62
69
  state={{
63
70
  on: {
64
71
  icon: 'ph--microphone--regular',
@@ -70,12 +77,12 @@ export const Toolbar = ({
70
77
  icon: 'ph--microphone-slash--duotone',
71
78
  label: t('mic on'),
72
79
  onClick: () => call.turnAudioOn(),
73
- classNames: [call.joined && 'bg-callAlert'],
80
+ classNames: [joined && 'bg-callAlert'],
74
81
  },
75
82
  }}
76
83
  />
77
84
  <ToggleButton
78
- active={call.media.videoEnabled}
85
+ active={media.videoEnabled}
79
86
  state={{
80
87
  on: {
81
88
  icon: 'ph--video-camera--regular',
@@ -97,7 +104,7 @@ export const Toolbar = ({
97
104
  </div>
98
105
  )) || <NaturalToolbar.Separator variant='gap' />}
99
106
 
100
- {call.joined && (
107
+ {joined && (
101
108
  <>
102
109
  <ToggleButton
103
110
  disabled={!canSharescreen}
@@ -117,25 +124,27 @@ export const Toolbar = ({
117
124
  />
118
125
 
119
126
  {/* 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
- ))}
127
+ {actions
128
+ .filter((action): action is Node.Action => Node.isAction(action))
129
+ .map((action) => (
130
+ <IconButton
131
+ key={action.id}
132
+ {...defaultButtonProps}
133
+ icon={action.properties.icon}
134
+ label={toLocalizedString(action.properties.label, t)}
135
+ classNames={action.properties.classNames}
136
+ onClick={() => node && void runAction(action, { parent: node })}
137
+ />
138
+ ))}
130
139
 
131
140
  <ToggleButton
132
- active={call.raisedHand}
141
+ active={raisedHand}
133
142
  state={{
134
143
  on: {
135
144
  icon: 'ph--hand-waving--regular',
136
145
  label: t('lower hand'),
137
146
  onClick: () => call.setRaisedHand(false),
138
- classNames: [call.joined && 'bg-callAlert'],
147
+ classNames: [joined && 'bg-callAlert'],
139
148
  },
140
149
  off: {
141
150
  icon: 'ph--hand-palm--duotone',
@@ -146,7 +155,7 @@ export const Toolbar = ({
146
155
  />
147
156
  </>
148
157
  )}
149
- {call.joined ? (
158
+ {joined ? (
150
159
  <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />
151
160
  ) : (
152
161
  <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/ui';
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,45 @@
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 } 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 { AppCapabilities } from '@dxos/app-toolkit';
11
+ import { Query, useDatabase, useQuery } from '@dxos/react-client/echo';
12
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
13
+ import { render } from '@dxos/storybook-utils';
14
+ import { Message, Thread } from '@dxos/types';
16
15
 
17
16
  import { createThreadPlugins } from '../testing';
18
17
  import { translations } from '../translations';
19
- import { ChannelType, ThreadType } from '../types';
18
+ import { Channel } from '../types';
20
19
 
21
20
  import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
22
21
 
23
22
  // TODO(wittjosiah): Channel doesn't render full height.
24
- const Story = ({ roomId }: ChannelContainerProps) => {
25
- const space = useSpace();
26
- const [channel] = useQuery(space, Query.type(ChannelType));
23
+ const DefaultStory = ({ roomId }: ChannelContainerProps) => {
24
+ const db = useDatabase();
25
+ const [channel] = useQuery(db, Query.type(Channel.Channel));
27
26
  if (!channel) {
28
27
  return null;
29
28
  }
30
29
 
31
- return <ChannelContainer channel={channel} roomId={roomId} />;
30
+ return <ChannelContainer subject={channel} roomId={roomId} />;
32
31
  };
33
32
 
34
33
  const meta = {
35
34
  title: 'plugins/plugin-thread/ChannelContainer',
36
35
  component: ChannelContainer,
37
- render: (args) => <Story {...args} />,
36
+ render: render(DefaultStory),
38
37
  decorators: [
38
+ withTheme(),
39
+ withLayout({ layout: 'column' }),
39
40
  withPluginManager({
40
41
  plugins: [...(await createThreadPlugins())],
41
- capabilities: [contributes(ClientCapabilities.Schema, [ChannelType, ThreadType, DataType.Message])],
42
+ capabilities: [Capability.contributes(AppCapabilities.Schema, [Channel.Channel, Thread.Thread, Message.Message])],
42
43
  }),
43
- withLayout({ Container: ColumnContainer, classNames: 'w-[40rem] overflow-hidden' }),
44
44
  ],
45
45
  parameters: {
46
46
  translations,
@@ -54,6 +54,7 @@ type Story = StoryObj<typeof meta>;
54
54
  export const Default: Story = {
55
55
  args: {
56
56
  // Fixed room for testing.
57
+ subject: undefined,
57
58
  roomId: '04a1d1911703b8e929d0649021a965',
58
59
  },
59
60
  };
@@ -2,43 +2,50 @@
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 { useCapabilities, useCapability } from '@dxos/app-framework/ui';
9
+ import { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';
9
10
  import { Context } from '@dxos/context';
10
11
  import { failUndefined } from '@dxos/debug';
12
+ import { Obj } from '@dxos/echo';
11
13
  import { log } from '@dxos/log';
12
14
  import { useClient } from '@dxos/react-client';
13
- import { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
15
+ import { getSpace } from '@dxos/react-client/echo';
14
16
  import { useIdentity } from '@dxos/react-client/halo';
15
- import { ElevationProvider, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
16
- import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
17
+ import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
18
+ import { Settings } from '@dxos/react-ui-form';
17
19
  import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
18
20
  import { useSoundEffect } from '@dxos/react-ui-sfx';
19
21
  import { StackItem } from '@dxos/react-ui-stack';
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
  import { Call } from './Call';
26
28
  import ChatContainer from './ChatContainer';
27
29
 
28
- export type ChannelContainerProps = {
29
- channel?: ChannelType;
30
- roomId?: string;
31
- role?: string;
32
- fullscreen?: boolean;
33
- };
30
+ export type ChannelContainerProps = SurfaceComponentProps<
31
+ Channel.Channel | undefined,
32
+ {
33
+ roomId?: string;
34
+ fullscreen?: boolean;
35
+ }
36
+ >;
34
37
 
35
38
  /**
36
39
  * Renders a call when active, otherwise renders the channel chat.
37
40
  */
38
- export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {
41
+ // TODO(burdon): Create Radix style layout.
42
+ export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {
39
43
  const space = getSpace(channel);
40
44
  const callManager = useCapability(ThreadCapabilities.CallManager);
41
- const roomId = _roomId ?? (channel ? fullyQualifiedId(channel) : failUndefined());
45
+ const joined = useAtomValue(callManager.joinedAtom);
46
+ const currentRoomId = useAtomValue(callManager.roomIdAtom);
47
+ const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
48
+ const roomId = roomIdProp ?? attendableId ?? failUndefined();
42
49
  const identity = useIdentity();
43
50
  const isNamed = !!identity?.profile?.displayName;
44
51
  const joinSound = useSoundEffect('JoinCall');
@@ -79,7 +86,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
79
86
  return;
80
87
  }
81
88
 
82
- if (callManager.joined) {
89
+ if (joined) {
83
90
  await callManager.leave();
84
91
  }
85
92
 
@@ -92,7 +99,7 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
92
99
  // TODO(burdon): Error sound.
93
100
  log.catch(err);
94
101
  }
95
- }, [extensions, channel, roomId]);
102
+ }, [extensions, channel, roomId, joined]);
96
103
 
97
104
  /**
98
105
  * Leave the call.
@@ -111,10 +118,10 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
111
118
  }
112
119
  }, [extensions, roomId]);
113
120
 
114
- const isJoined = callManager.joined && callManager.roomId === roomId;
121
+ const isJoined = joined && currentRoomId === roomId;
115
122
 
116
123
  return (
117
- <StackItem.Content toolbar={!isJoined} classNames={isJoined && 'h-full'}>
124
+ <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
118
125
  {isJoined && !isNamed && <DisplayNameMissing />}
119
126
  {isJoined && isNamed && (
120
127
  <Call.Root>
@@ -124,8 +131,8 @@ export const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }:
124
131
  )}
125
132
  {!isJoined && channel && channel.defaultThread.target && space && (
126
133
  <>
127
- <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />
128
- <ChatContainer space={space} thread={channel.defaultThread.target} />
134
+ <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
135
+ <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />
129
136
  </>
130
137
  )}
131
138
  </StackItem.Content>
@@ -142,26 +149,26 @@ const DisplayNameMissing = () => {
142
149
  const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);
143
150
 
144
151
  return (
145
- <ControlGroup classNames='p-4 place-content-center'>
146
- <ControlItemInput title={t('display name label')} description={t('display name description')}>
152
+ <Settings.Group classNames='p-4 place-content-center'>
153
+ <Settings.ItemInput title={t('display name label')} description={t('display name description')}>
147
154
  <Input.TextInput
148
155
  value={displayName}
149
156
  onChange={handleChange}
150
157
  placeholder={t('display name input placeholder')}
151
158
  classNames='md:min-is-64'
152
159
  />
153
- </ControlItemInput>
154
- <ControlGroupButton disabled={!displayName} onClick={handleSave}>
160
+ </Settings.ItemInput>
161
+ <Settings.GroupButton disabled={!displayName} onClick={handleSave}>
155
162
  {t('set display name label')}
156
- </ControlGroupButton>
157
- </ControlGroup>
163
+ </Settings.GroupButton>
164
+ </Settings.Group>
158
165
  );
159
166
  };
160
167
 
161
168
  const useChannelToolbarActions = (onJoinCall?: () => void) => {
162
169
  const creator = useMemo(
163
170
  () =>
164
- Rx.make(() => {
171
+ Atom.make(() => {
165
172
  return {
166
173
  nodes: [
167
174
  createMenuItemGroup('root', {
@@ -182,19 +189,19 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
182
189
  return useMenuActions(creator);
183
190
  };
184
191
 
185
- type ChannelToolbarProps = ThemedClassName<{
192
+ type ChannelToolbarProps = {
186
193
  attendableId?: string;
187
194
  role?: string;
188
195
  onJoinCall?: () => void;
189
- }>;
196
+ };
190
197
 
191
- const ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }: ChannelToolbarProps) => {
198
+ const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
192
199
  const menuProps = useChannelToolbarActions(onJoinCall);
193
200
 
194
201
  return (
195
202
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
196
203
  <MenuProvider {...menuProps} attendableId={attendableId}>
197
- <ToolbarMenu classNames={classNames} />
204
+ <ToolbarMenu textBlockWidth />
198
205
  </MenuProvider>
199
206
  </ElevationProvider>
200
207
  );