@dxos/plugin-thread 0.8.4-main.406dc2a → 0.8.4-main.52d7546f51

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 (383) 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-ACPH22F7.mjs +18 -0
  4. package/dist/lib/browser/blueprint-definition-ACPH22F7.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-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-HDEQRBOC.mjs → chunk-JBB73URQ.mjs} +79 -76
  18. package/dist/lib/browser/chunk-JBB73URQ.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-RH7XTXSR.mjs +106 -0
  20. package/dist/lib/browser/chunk-RH7XTXSR.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +147 -137
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/markdown-YJCSOWXX.mjs +210 -0
  24. package/dist/lib/browser/markdown-YJCSOWXX.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs +441 -0
  27. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs.map +7 -0
  28. package/dist/lib/browser/react-root-FHK2SVPU.mjs +25 -0
  29. package/dist/lib/browser/react-root-FHK2SVPU.mjs.map +7 -0
  30. package/dist/lib/browser/react-surface-7MQA6VSH.mjs +111 -0
  31. package/dist/lib/browser/react-surface-7MQA6VSH.mjs.map +7 -0
  32. package/dist/lib/browser/repair-6OZ75AUU.mjs +38 -0
  33. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +7 -0
  34. package/dist/lib/browser/settings-TWKOTGSU.mjs +33 -0
  35. package/dist/lib/browser/settings-TWKOTGSU.mjs.map +7 -0
  36. package/dist/lib/browser/state-SJR2GL5G.mjs +24 -0
  37. package/dist/lib/browser/state-SJR2GL5G.mjs.map +7 -0
  38. package/dist/lib/browser/types/index.mjs +10 -12
  39. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs +190 -0
  40. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs.map +7 -0
  41. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs +19 -0
  42. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  44. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs +27 -0
  45. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-2MMJF7DW.mjs → chunk-G7PZNN3Z.mjs} +79 -76
  47. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  49. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs +107 -0
  50. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-TIPIOH2J.mjs → chunk-QP3KQOPQ.mjs} +207 -287
  52. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs +1818 -0
  54. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs → chunk-VBI32FGI.mjs} +1 -1
  56. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs.map → chunk-VBI32FGI.mjs.map} +2 -2
  57. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +294 -0
  58. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +147 -137
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs +211 -0
  62. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs.map +7 -0
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs +442 -0
  65. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs.map +7 -0
  66. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs +26 -0
  67. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs.map +7 -0
  68. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs +112 -0
  69. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs.map +7 -0
  70. package/dist/lib/node-esm/repair-6777EPOM.mjs +39 -0
  71. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +7 -0
  72. package/dist/lib/node-esm/settings-5O254B3Z.mjs +34 -0
  73. package/dist/lib/node-esm/settings-5O254B3Z.mjs.map +7 -0
  74. package/dist/lib/node-esm/state-5R3TZJQE.mjs +25 -0
  75. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +7 -0
  76. package/dist/lib/node-esm/types/index.mjs +10 -12
  77. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  78. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  79. package/dist/types/src/blueprints/index.d.ts +2 -0
  80. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  81. package/dist/types/src/blueprints/thread-blueprint.d.ts +21 -0
  82. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  83. package/dist/types/src/calls/call-manager.d.ts +40 -30
  84. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  85. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  86. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  87. package/dist/types/src/calls/media-manager.d.ts +1 -1
  88. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  89. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  90. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  91. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  92. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  94. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  96. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +10 -0
  98. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  100. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  102. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  104. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/index.d.ts +10 -16
  106. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  108. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  110. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  112. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  114. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  116. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  118. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  120. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  122. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  124. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  126. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  128. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/settings/settings.d.ts +6 -0
  130. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  132. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  134. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  135. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  136. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  137. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  138. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  139. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  140. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  141. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  142. package/dist/types/src/components/ChannelContainer.stories.d.ts +77 -7
  143. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Chat.stories.d.ts +76 -5
  145. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/ChatContainer.d.ts +7 -6
  147. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  148. package/dist/types/src/components/Comments.stories.d.ts +5 -1
  149. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  151. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  152. package/dist/types/src/components/CommentsThreadContainer.d.ts +8 -8
  153. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  154. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  155. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  156. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  157. package/dist/types/src/components/MessageContainer.d.ts +4 -3
  158. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  159. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  160. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +5 -1
  161. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +5 -1
  163. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  165. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  166. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  167. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  168. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  169. package/dist/types/src/components/index.d.ts +3 -3
  170. package/dist/types/src/components/index.d.ts.map +1 -1
  171. package/dist/types/src/components/testing.d.ts +3 -3
  172. package/dist/types/src/components/testing.d.ts.map +1 -1
  173. package/dist/types/src/extensions/threads.d.ts +7 -2
  174. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  175. package/dist/types/src/functions/create-proposals.d.ts +13 -0
  176. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  177. package/dist/types/src/functions/index.d.ts +2 -0
  178. package/dist/types/src/functions/index.d.ts.map +1 -0
  179. package/dist/types/src/hooks/analytics.d.ts +2 -3
  180. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  181. package/dist/types/src/hooks/index.d.ts +2 -2
  182. package/dist/types/src/hooks/index.d.ts.map +1 -1
  183. package/dist/types/src/index.d.ts +1 -1
  184. package/dist/types/src/index.d.ts.map +1 -1
  185. package/dist/types/src/meta.d.ts +2 -2
  186. package/dist/types/src/meta.d.ts.map +1 -1
  187. package/dist/types/src/testing/stories.d.ts +2 -1
  188. package/dist/types/src/testing/stories.d.ts.map +1 -1
  189. package/dist/types/src/translations.d.ts +76 -6
  190. package/dist/types/src/translations.d.ts.map +1 -1
  191. package/dist/types/src/types/Channel.d.ts +695 -0
  192. package/dist/types/src/types/Channel.d.ts.map +1 -0
  193. package/dist/types/src/types/capabilities.d.ts +23 -0
  194. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  195. package/dist/types/src/types/index.d.ts +2 -1
  196. package/dist/types/src/types/index.d.ts.map +1 -1
  197. package/dist/types/src/types/types.d.ts +3217 -446
  198. package/dist/types/src/types/types.d.ts.map +1 -1
  199. package/dist/types/tsconfig.tsbuildinfo +1 -1
  200. package/package.json +88 -65
  201. package/src/ThreadPlugin.tsx +75 -102
  202. package/src/blueprints/index.ts +5 -0
  203. package/src/blueprints/thread-blueprint.ts +32 -0
  204. package/src/calls/call-manager.ts +76 -52
  205. package/src/calls/call-swarm-synchronizer.ts +2 -2
  206. package/src/calls/media-manager.ts +10 -7
  207. package/src/calls/util/calls-service.ts +1 -1
  208. package/src/calls/util/stub-media-streams.ts +2 -2
  209. package/src/calls/util/task-scheduling.ts +4 -4
  210. package/src/calls-service.stories.tsx +1 -1
  211. package/src/capabilities/app-graph-builder/app-graph-builder.ts +202 -0
  212. package/src/capabilities/app-graph-builder/index.ts +7 -0
  213. package/src/capabilities/blueprint-definition/blueprint-definition.ts +24 -0
  214. package/src/capabilities/blueprint-definition/index.ts +7 -0
  215. package/src/capabilities/call-manager/call-manager.ts +26 -0
  216. package/src/capabilities/call-manager/index.ts +7 -0
  217. package/src/capabilities/index.ts +10 -13
  218. package/src/capabilities/markdown/index.ts +7 -0
  219. package/src/capabilities/markdown/markdown.ts +83 -0
  220. package/src/capabilities/operation-resolver/index.ts +7 -0
  221. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  222. package/src/capabilities/react-root/index.ts +7 -0
  223. package/src/capabilities/react-root/react-root.tsx +20 -0
  224. package/src/capabilities/react-surface/index.ts +7 -0
  225. package/src/capabilities/react-surface/react-surface.tsx +98 -0
  226. package/src/capabilities/repair/index.ts +7 -0
  227. package/src/capabilities/repair/repair.ts +51 -0
  228. package/src/capabilities/settings/index.ts +7 -0
  229. package/src/capabilities/settings/settings.ts +34 -0
  230. package/src/capabilities/state/index.ts +7 -0
  231. package/src/capabilities/state/state.ts +22 -0
  232. package/src/components/Call/Call.tsx +8 -4
  233. package/src/components/Call/Toolbar.tsx +34 -25
  234. package/src/components/CallDebugPanel.tsx +12 -14
  235. package/src/components/CallSidebar.tsx +5 -3
  236. package/src/components/ChannelContainer.stories.tsx +13 -12
  237. package/src/components/ChannelContainer.tsx +38 -31
  238. package/src/components/Chat.stories.tsx +14 -19
  239. package/src/components/ChatContainer.tsx +46 -39
  240. package/src/components/Comments.stories.tsx +26 -24
  241. package/src/components/CommentsContainer.tsx +5 -7
  242. package/src/components/CommentsThreadContainer.tsx +39 -35
  243. package/src/components/Lobby/Lobby.tsx +9 -7
  244. package/src/components/Media/AudioStream.tsx +2 -2
  245. package/src/components/Media/VideoObject.stories.tsx +1 -1
  246. package/src/components/Media/VideoObject.tsx +2 -2
  247. package/src/components/MessageContainer.tsx +59 -28
  248. package/src/components/Participant/Participant.tsx +32 -19
  249. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +1 -1
  250. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  251. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +2 -2
  252. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
  253. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +6 -3
  254. package/src/components/ThreadCompanion.tsx +194 -0
  255. package/src/components/ThreadSettings.tsx +9 -3
  256. package/src/components/command-extension.ts +2 -2
  257. package/src/components/index.ts +4 -7
  258. package/src/components/testing.ts +7 -9
  259. package/src/extensions/threads.ts +86 -42
  260. package/src/functions/create-proposals.ts +57 -0
  261. package/src/functions/index.ts +5 -0
  262. package/src/hooks/analytics.ts +21 -21
  263. package/src/hooks/index.ts +3 -2
  264. package/src/index.ts +1 -1
  265. package/src/meta.ts +8 -3
  266. package/src/testing/stories.ts +17 -15
  267. package/src/translations.ts +6 -3
  268. package/src/types/Channel.ts +30 -0
  269. package/src/types/capabilities.ts +34 -0
  270. package/src/types/index.ts +2 -1
  271. package/src/types/types.ts +167 -88
  272. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  273. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  274. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  275. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  276. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  277. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  279. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  281. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  282. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  283. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  284. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  285. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  286. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  287. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  288. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  289. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  290. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  292. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  294. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  295. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  296. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  297. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  298. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  299. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  300. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  301. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  302. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  303. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  304. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  305. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  306. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  307. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  308. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  309. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  310. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  311. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  312. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  313. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  314. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  315. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  316. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  318. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  320. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  322. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  324. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  326. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  328. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  330. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  331. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  332. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  333. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  334. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  335. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  336. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  337. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  338. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  339. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  340. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  341. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  342. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  343. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  344. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  345. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  346. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  347. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  348. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  349. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  350. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  351. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  352. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  353. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  354. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  355. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  356. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  357. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  358. package/dist/types/src/capabilities/settings.d.ts +0 -4
  359. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  360. package/dist/types/src/capabilities/state.d.ts +0 -7
  361. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  362. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  363. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  364. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  365. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  366. package/dist/types/src/types/schema.d.ts +0 -179
  367. package/dist/types/src/types/schema.d.ts.map +0 -1
  368. package/src/capabilities/app-graph-builder.ts +0 -184
  369. package/src/capabilities/call-manager.ts +0 -20
  370. package/src/capabilities/capabilities.ts +0 -33
  371. package/src/capabilities/intent-resolver.ts +0 -348
  372. package/src/capabilities/markdown.ts +0 -69
  373. package/src/capabilities/react-root.tsx +0 -17
  374. package/src/capabilities/react-surface.tsx +0 -89
  375. package/src/capabilities/settings.ts +0 -19
  376. package/src/capabilities/state.ts +0 -26
  377. package/src/capabilities/toolkit.ts +0 -82
  378. package/src/components/ThreadComplementary.tsx +0 -181
  379. package/src/types/schema.ts +0 -33
  380. /package/dist/lib/browser/{ChannelContainer-BGDGZHV4.mjs.map → blueprints/index.mjs.map} +0 -0
  381. /package/dist/lib/browser/{ChatContainer-75KJZ4XR.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  382. /package/dist/lib/node-esm/{ChannelContainer-OXC6BTU7.mjs.map → blueprints/index.mjs.map} +0 -0
  383. /package/dist/lib/node-esm/{ChatContainer-SH6LTFQL.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;
@@ -5,29 +5,29 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { contributes } from '@dxos/app-framework';
8
+ import { Capability } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { ClientCapabilities } from '@dxos/plugin-client';
11
- import { Query, useQuery, useSpace } from '@dxos/react-client/echo';
12
- import { withTheme } from '@dxos/react-ui/testing';
13
- import { DataType } from '@dxos/schema';
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';
14
13
  import { render } from '@dxos/storybook-utils';
14
+ import { Message, Thread } from '@dxos/types';
15
15
 
16
16
  import { createThreadPlugins } from '../testing';
17
17
  import { translations } from '../translations';
18
- import { ChannelType, ThreadType } from '../types';
18
+ import { Channel } from '../types';
19
19
 
20
20
  import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
21
21
 
22
22
  // TODO(wittjosiah): Channel doesn't render full height.
23
23
  const DefaultStory = ({ roomId }: ChannelContainerProps) => {
24
- const space = useSpace();
25
- const [channel] = useQuery(space, Query.type(ChannelType));
24
+ const db = useDatabase();
25
+ const [channel] = useQuery(db, Query.type(Channel.Channel));
26
26
  if (!channel) {
27
27
  return null;
28
28
  }
29
29
 
30
- return <ChannelContainer channel={channel} roomId={roomId} />;
30
+ return <ChannelContainer subject={channel} roomId={roomId} />;
31
31
  };
32
32
 
33
33
  const meta = {
@@ -35,14 +35,14 @@ const meta = {
35
35
  component: ChannelContainer,
36
36
  render: render(DefaultStory),
37
37
  decorators: [
38
- withTheme,
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
44
  ],
44
45
  parameters: {
45
- layout: 'column',
46
46
  translations,
47
47
  },
48
48
  } satisfies Meta<typeof ChannelContainer>;
@@ -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,7 +118,7 @@ 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
124
  <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
@@ -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
  );