@dxos/plugin-thread 0.8.4-main.422d1c7879 → 0.8.4-main.4f23b4e393

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/neutral/CallDebugPanel-CXWTCS7A.mjs +172 -0
  2. package/dist/lib/neutral/CallDebugPanel-CXWTCS7A.mjs.map +7 -0
  3. package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs +25 -0
  4. package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-6YTD5HWL.mjs +10 -0
  6. package/dist/lib/neutral/ChannelContainer-XHBF2NCK.mjs +9 -0
  7. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs +208 -0
  8. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs.map +7 -0
  9. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
  10. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs +89 -0
  12. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  14. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs +15 -0
  16. package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs.map +7 -0
  17. package/dist/lib/{browser/add-message-VPPFFLFL.mjs → neutral/add-message-HV5R66K4.mjs} +12 -22
  18. package/dist/lib/neutral/add-message-HV5R66K4.mjs.map +7 -0
  19. package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs +173 -0
  20. package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs.map +7 -0
  21. package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs +40 -0
  22. package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs.map +7 -0
  23. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  24. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  25. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  26. package/dist/lib/neutral/call-manager-JFA4DLWR.mjs +24 -0
  27. package/dist/lib/neutral/call-manager-JFA4DLWR.mjs.map +7 -0
  28. package/dist/lib/neutral/capabilities/index.mjs +29 -0
  29. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-44D7D4ZX.mjs +20 -0
  31. package/dist/lib/neutral/chunk-44D7D4ZX.mjs.map +7 -0
  32. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +5 -6
  33. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-CROE4U4O.mjs +100 -0
  35. package/dist/lib/neutral/chunk-CROE4U4O.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-D5LGFCUY.mjs +55 -0
  37. package/dist/lib/neutral/chunk-D5LGFCUY.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-FWSMZWBO.mjs +178 -0
  39. package/dist/lib/neutral/chunk-FWSMZWBO.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
  41. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-KRXHIW4P.mjs +164 -0
  43. package/dist/lib/neutral/chunk-KRXHIW4P.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-MXJYXUS2.mjs +8 -0
  45. package/dist/lib/neutral/chunk-MXJYXUS2.mjs.map +7 -0
  46. package/dist/lib/{browser/chunk-VPM44Z35.mjs → neutral/chunk-OZRSYMYO.mjs} +101 -85
  47. package/dist/lib/neutral/chunk-OZRSYMYO.mjs.map +7 -0
  48. package/dist/lib/{browser/index.mjs → neutral/chunk-PZ7WTAA2.mjs} +88 -900
  49. package/dist/lib/neutral/chunk-PZ7WTAA2.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-S2AKEA2K.mjs +202 -0
  51. package/dist/lib/neutral/chunk-S2AKEA2K.mjs.map +7 -0
  52. package/dist/lib/neutral/components/index.mjs +1230 -0
  53. package/dist/lib/neutral/components/index.mjs.map +7 -0
  54. package/dist/lib/neutral/containers/index.mjs +19 -0
  55. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  56. package/dist/lib/{browser/create-UGT7V733.mjs → neutral/create-C3CICN35.mjs} +8 -11
  57. package/dist/lib/neutral/create-C3CICN35.mjs.map +7 -0
  58. package/dist/lib/neutral/create-channel-UEQESOFT.mjs +19 -0
  59. package/dist/lib/neutral/create-channel-UEQESOFT.mjs.map +7 -0
  60. package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
  61. package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
  62. package/dist/lib/{browser/create-proposals-CMK7S7VS.mjs → neutral/create-proposals-OZ4NCBBS.mjs} +5 -6
  63. package/dist/lib/neutral/create-proposals-OZ4NCBBS.mjs.map +7 -0
  64. package/dist/lib/{browser/delete-FSFVU6ZA.mjs → neutral/delete-AVFYFWMY.mjs} +8 -10
  65. package/dist/lib/neutral/delete-AVFYFWMY.mjs.map +7 -0
  66. package/dist/lib/{browser/delete-message-XL5M5J33.mjs → neutral/delete-message-EV2MKRTB.mjs} +9 -19
  67. package/dist/lib/neutral/delete-message-EV2MKRTB.mjs.map +7 -0
  68. package/dist/lib/neutral/hooks/index.mjs +19 -0
  69. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  70. package/dist/lib/neutral/index.mjs +68 -0
  71. package/dist/lib/neutral/index.mjs.map +7 -0
  72. package/dist/lib/neutral/markdown-BUORNCPG.mjs +83 -0
  73. package/dist/lib/neutral/markdown-BUORNCPG.mjs.map +7 -0
  74. package/dist/lib/neutral/meta.json +1 -0
  75. package/dist/lib/neutral/meta.mjs +10 -0
  76. package/dist/lib/neutral/meta.mjs.map +7 -0
  77. package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs +23 -0
  78. package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs.map +7 -0
  79. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  80. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  81. package/dist/lib/neutral/operations/index.mjs +8 -0
  82. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  83. package/dist/lib/neutral/plugin.mjs +16 -0
  84. package/dist/lib/neutral/plugin.mjs.map +7 -0
  85. package/dist/lib/neutral/react-root-VMMNUSSL.mjs +18 -0
  86. package/dist/lib/neutral/react-root-VMMNUSSL.mjs.map +7 -0
  87. package/dist/lib/neutral/react-surface-WPSVOTVG.mjs +94 -0
  88. package/dist/lib/neutral/react-surface-WPSVOTVG.mjs.map +7 -0
  89. package/dist/lib/{browser/restore-2ZGMKUSD.mjs → neutral/restore-MGLYOJ3Y.mjs} +6 -7
  90. package/dist/lib/neutral/restore-MGLYOJ3Y.mjs.map +7 -0
  91. package/dist/lib/{browser/restore-message-OYEGWPII.mjs → neutral/restore-message-ZIOA2MQJ.mjs} +8 -17
  92. package/dist/lib/neutral/restore-message-ZIOA2MQJ.mjs.map +7 -0
  93. package/dist/lib/{browser/select-VG2XLULE.mjs → neutral/select-CVCGBDHA.mjs} +7 -9
  94. package/dist/lib/neutral/select-CVCGBDHA.mjs.map +7 -0
  95. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  96. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  97. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  98. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  99. package/dist/lib/neutral/testing/index.mjs +58 -0
  100. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  101. package/dist/lib/{browser/toggle-resolved-MM6YC5BU.mjs → neutral/toggle-resolved-ZM4BHON5.mjs} +8 -17
  102. package/dist/lib/neutral/toggle-resolved-ZM4BHON5.mjs.map +7 -0
  103. package/dist/lib/neutral/translations.mjs +90 -0
  104. package/dist/lib/neutral/translations.mjs.map +7 -0
  105. package/dist/lib/neutral/types/index.mjs +12 -0
  106. package/dist/lib/neutral/types/index.mjs.map +7 -0
  107. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  108. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  109. package/dist/types/src/ThreadPlugin.d.ts +1 -0
  110. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  111. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  112. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  113. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  114. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts +2 -2
  116. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
  117. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  118. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  119. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  120. package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
  121. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
  122. package/dist/types/src/calls/types.d.ts.map +1 -1
  123. package/dist/types/src/calls/util/audio.d.ts.map +1 -1
  124. package/dist/types/src/calls/util/calls-service.d.ts +2 -2
  125. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  126. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
  127. package/dist/types/src/calls/util/media.d.ts.map +1 -1
  128. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  129. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  130. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  131. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
  133. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  134. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  135. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  136. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/index.d.ts +9 -3
  138. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  139. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  140. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  141. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  143. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  145. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
  147. package/dist/types/src/components/Call/Call.d.ts +32 -4
  148. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  149. package/dist/types/src/components/Call/Toolbar.d.ts +5 -5
  150. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  151. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  152. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  153. package/dist/types/src/components/Chat/index.d.ts +2 -0
  154. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  155. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -1
  156. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +70 -70
  157. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
  159. package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
  160. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  161. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  162. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  163. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -1
  165. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  166. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  167. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +70 -70
  168. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  169. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  170. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -1
  171. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +70 -70
  172. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
  174. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +70 -70
  175. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/index.d.ts +1 -0
  177. package/dist/types/src/components/index.d.ts.map +1 -1
  178. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -1
  179. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  180. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  181. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  182. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +1 -1
  184. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -1
  185. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +70 -70
  186. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -1
  187. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -1
  188. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  189. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  190. package/dist/types/src/containers/{ChatContainer/ChatContainer.stories.d.ts → ThreadContainer/ThreadContainer.stories.d.ts} +71 -71
  191. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  192. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  193. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  194. package/dist/types/src/containers/index.d.ts +2 -1
  195. package/dist/types/src/containers/index.d.ts.map +1 -1
  196. package/dist/types/src/extensions/threads.d.ts +3 -3
  197. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  198. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  199. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  200. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  201. package/dist/types/src/index.d.ts +2 -2
  202. package/dist/types/src/index.d.ts.map +1 -1
  203. package/dist/types/src/operations/add-message.d.ts +3 -3
  204. package/dist/types/src/operations/add-message.d.ts.map +1 -1
  205. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  206. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  207. package/dist/types/src/operations/create-channel.d.ts +3 -3
  208. package/dist/types/src/operations/create-channel.d.ts.map +1 -1
  209. package/dist/types/src/operations/create-proposals.d.ts +3 -3
  210. package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
  211. package/dist/types/src/operations/create.d.ts +3 -3
  212. package/dist/types/src/operations/create.d.ts.map +1 -1
  213. package/dist/types/src/operations/delete-message.d.ts +3 -3
  214. package/dist/types/src/operations/delete-message.d.ts.map +1 -1
  215. package/dist/types/src/operations/delete.d.ts +3 -3
  216. package/dist/types/src/operations/delete.d.ts.map +1 -1
  217. package/dist/types/src/operations/index.d.ts +1 -2
  218. package/dist/types/src/operations/index.d.ts.map +1 -1
  219. package/dist/types/src/operations/on-create-space.d.ts +3 -3
  220. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  221. package/dist/types/src/operations/restore-message.d.ts +3 -3
  222. package/dist/types/src/operations/restore-message.d.ts.map +1 -1
  223. package/dist/types/src/operations/restore.d.ts +3 -3
  224. package/dist/types/src/operations/restore.d.ts.map +1 -1
  225. package/dist/types/src/operations/select.d.ts +3 -3
  226. package/dist/types/src/operations/select.d.ts.map +1 -1
  227. package/dist/types/src/operations/toggle-resolved.d.ts +3 -3
  228. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
  229. package/dist/types/src/plugin.d.ts +4 -0
  230. package/dist/types/src/plugin.d.ts.map +1 -0
  231. package/dist/types/src/testing/data.d.ts.map +1 -1
  232. package/dist/types/src/testing/index.d.ts +1 -1
  233. package/dist/types/src/testing/index.d.ts.map +1 -1
  234. package/dist/types/src/translations.d.ts +70 -70
  235. package/dist/types/src/translations.d.ts.map +1 -1
  236. package/dist/types/src/types/ThreadCapabilities.d.ts +26 -0
  237. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  238. package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +864 -1673
  239. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  240. package/dist/types/src/types/index.d.ts +3 -2
  241. package/dist/types/src/types/index.d.ts.map +1 -1
  242. package/dist/types/src/types/types.d.ts +1 -1
  243. package/dist/types/src/types/types.d.ts.map +1 -1
  244. package/dist/types/src/util.d.ts +6 -3
  245. package/dist/types/src/util.d.ts.map +1 -1
  246. package/dist/types/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +124 -86
  248. package/src/ThreadPlugin.node.ts +39 -0
  249. package/src/ThreadPlugin.test.ts +37 -0
  250. package/src/ThreadPlugin.tsx +13 -57
  251. package/src/blueprints/thread-blueprint.ts +3 -4
  252. package/src/calls/util/calls-service.ts +3 -1
  253. package/src/calls/util/stub-media-streams.ts +3 -1
  254. package/src/capabilities/app-graph-builder.ts +21 -19
  255. package/src/capabilities/blueprint-definition.ts +2 -0
  256. package/src/capabilities/call-manager.ts +1 -1
  257. package/src/capabilities/create-object.ts +29 -0
  258. package/src/capabilities/index.ts +3 -1
  259. package/src/capabilities/markdown.ts +6 -2
  260. package/src/capabilities/operation-handler.ts +1 -1
  261. package/src/capabilities/react-surface.tsx +13 -7
  262. package/src/capabilities/settings.ts +1 -3
  263. package/src/capabilities/undo-mappings.ts +1 -1
  264. package/src/components/Call/Call.tsx +5 -5
  265. package/src/components/Call/Toolbar.tsx +1 -1
  266. package/src/components/Chat/Chat.tsx +258 -0
  267. package/src/components/Chat/index.ts +5 -0
  268. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +6 -4
  269. package/src/components/CommentsPanel/CommentsPanel.tsx +4 -4
  270. package/src/components/CommentsPanel/CommentsThread.tsx +2 -3
  271. package/src/components/Lobby/Lobby.tsx +5 -4
  272. package/src/components/MessagePanel/MessagePanel.tsx +8 -9
  273. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +2 -1
  274. package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +2 -1
  275. package/src/components/ResponsiveGrid/ResponsivePanel.tsx +3 -5
  276. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +2 -1
  277. package/src/components/index.ts +1 -0
  278. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  279. package/src/containers/ChannelChat/index.ts +8 -0
  280. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +54 -10
  281. package/src/containers/ChannelContainer/ChannelContainer.tsx +4 -4
  282. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +10 -12
  283. package/src/containers/{ChatContainer/ChatContainer.stories.tsx → ThreadContainer/ThreadContainer.stories.tsx} +10 -11
  284. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  285. package/src/containers/ThreadContainer/index.ts +8 -0
  286. package/src/containers/index.ts +2 -1
  287. package/src/extensions/command.ts +1 -1
  288. package/src/extensions/threads.ts +9 -9
  289. package/src/hooks/analytics.ts +1 -1
  290. package/src/index.ts +4 -3
  291. package/src/operations/add-message.ts +7 -7
  292. package/src/operations/append-channel-message.ts +37 -0
  293. package/src/operations/create-channel.ts +4 -4
  294. package/src/operations/create-proposals.ts +3 -3
  295. package/src/operations/create.ts +4 -4
  296. package/src/operations/delete-message.ts +6 -6
  297. package/src/operations/delete.ts +4 -4
  298. package/src/operations/index.ts +2 -4
  299. package/src/operations/on-create-space.ts +4 -4
  300. package/src/operations/restore-message.ts +5 -5
  301. package/src/operations/restore.ts +4 -4
  302. package/src/operations/select.ts +3 -3
  303. package/src/operations/toggle-resolved.ts +5 -5
  304. package/src/plugin.ts +11 -0
  305. package/src/testing/index.ts +1 -1
  306. package/src/translations.ts +1 -1
  307. package/src/types/ThreadCapabilities.ts +41 -0
  308. package/src/{operations/definitions.ts → types/ThreadOperation.ts} +14 -13
  309. package/src/types/index.ts +4 -2
  310. package/src/types/types.ts +0 -2
  311. package/src/util.ts +36 -4
  312. package/dist/lib/browser/add-message-VPPFFLFL.mjs.map +0 -7
  313. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-MESW3R4Q.mjs +0 -61
  315. package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-VPM44Z35.mjs.map +0 -7
  317. package/dist/lib/browser/create-UGT7V733.mjs.map +0 -7
  318. package/dist/lib/browser/create-channel-EF67LCS6.mjs +0 -21
  319. package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +0 -7
  320. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +0 -28
  321. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +0 -7
  322. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +0 -7
  323. package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +0 -7
  324. package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +0 -7
  325. package/dist/lib/browser/index.mjs.map +0 -7
  326. package/dist/lib/browser/meta.json +0 -1
  327. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs +0 -25
  328. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs.map +0 -7
  329. package/dist/lib/browser/operations/index.mjs +0 -14
  330. package/dist/lib/browser/operations/index.mjs.map +0 -7
  331. package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +0 -7
  332. package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +0 -7
  333. package/dist/lib/browser/select-VG2XLULE.mjs.map +0 -7
  334. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +0 -7
  335. package/dist/lib/browser/types/index.mjs +0 -12
  336. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +0 -98
  337. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs.map +0 -7
  338. package/dist/lib/node-esm/blueprints/index.mjs +0 -38
  339. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  341. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +0 -260
  342. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +0 -62
  344. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +0 -7
  345. package/dist/lib/node-esm/create-XAYNDVU2.mjs +0 -56
  346. package/dist/lib/node-esm/create-XAYNDVU2.mjs.map +0 -7
  347. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +0 -22
  348. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +0 -7
  349. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +0 -29
  350. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +0 -7
  351. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +0 -58
  352. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +0 -7
  353. package/dist/lib/node-esm/delete-WRODXR3E.mjs +0 -60
  354. package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +0 -7
  355. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +0 -65
  356. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +0 -7
  357. package/dist/lib/node-esm/index.mjs +0 -2335
  358. package/dist/lib/node-esm/index.mjs.map +0 -7
  359. package/dist/lib/node-esm/meta.json +0 -1
  360. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs +0 -26
  361. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs.map +0 -7
  362. package/dist/lib/node-esm/operations/index.mjs +0 -15
  363. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  364. package/dist/lib/node-esm/restore-T3QA7TSL.mjs +0 -34
  365. package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +0 -7
  366. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +0 -43
  367. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +0 -7
  368. package/dist/lib/node-esm/select-Q4UDWJJF.mjs +0 -27
  369. package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +0 -7
  370. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +0 -46
  371. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +0 -7
  372. package/dist/lib/node-esm/types/index.mjs +0 -13
  373. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +0 -16
  374. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
  375. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +0 -1
  376. package/dist/types/src/containers/ChatContainer/index.d.ts +0 -4
  377. package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
  378. package/dist/types/src/operations/create-channel-thread.d.ts +0 -5
  379. package/dist/types/src/operations/create-channel-thread.d.ts.map +0 -1
  380. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  381. package/dist/types/src/testing/stories.d.ts +0 -3
  382. package/dist/types/src/testing/stories.d.ts.map +0 -1
  383. package/dist/types/src/types/Channel.d.ts +0 -715
  384. package/dist/types/src/types/Channel.d.ts.map +0 -1
  385. package/dist/types/src/types/capabilities.d.ts +0 -24
  386. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  387. package/src/containers/ChatContainer/ChatContainer.tsx +0 -131
  388. package/src/containers/ChatContainer/index.ts +0 -8
  389. package/src/operations/create-channel-thread.ts +0 -26
  390. package/src/testing/stories.ts +0 -51
  391. package/src/types/Channel.ts +0 -37
  392. package/src/types/capabilities.ts +0 -36
  393. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-6YTD5HWL.mjs.map} +0 -0
  394. /package/dist/lib/{browser/types/index.mjs.map → neutral/ChannelContainer-XHBF2NCK.mjs.map} +0 -0
  395. /package/dist/lib/{node-esm/types → neutral/blueprints}/index.mjs.map +0 -0
  396. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  397. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -28,7 +28,9 @@ export default Capability.makeModule(
28
28
  return threads({ registry, stateAtom }, doc, invokePromise);
29
29
  },
30
30
  ({ document: doc }) => {
31
- if (!doc) return [];
31
+ if (!doc) {
32
+ return [];
33
+ }
32
34
  const registry = capabilities.get(Capabilities.AtomRegistry);
33
35
  const stateAtom = capabilities.get(ThreadCapabilities.State);
34
36
 
@@ -45,7 +47,9 @@ export default Capability.makeModule(
45
47
  });
46
48
  },
47
49
  ({ document: doc }) => {
48
- if (!doc) return [];
50
+ if (!doc) {
51
+ return [];
52
+ }
49
53
  const { invokePromise } = capabilities.get(Capabilities.OperationInvoker);
50
54
 
51
55
  return EditorView.updateListener.of((update) => {
@@ -5,7 +5,7 @@
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, Capability } from '@dxos/app-framework';
8
- import type { OperationHandlerSet } from '@dxos/operation';
8
+ import type { OperationHandlerSet } from '@dxos/compute';
9
9
 
10
10
  import { ThreadOperationHandlerSet } from '#operations';
11
11
 
@@ -10,12 +10,19 @@ import { Capabilities, Capability } from '@dxos/app-framework';
10
10
  import { Surface, useCapability, useSettingsState } from '@dxos/app-framework/ui';
11
11
  import { AppSurface } from '@dxos/app-toolkit/ui';
12
12
  import { getSpace } from '@dxos/react-client/echo';
13
- import { Thread } from '@dxos/types';
13
+ import { Channel, Thread } from '@dxos/types';
14
14
 
15
15
  import { ThreadSettings } from '#components';
16
- import { CallDebugPanel, CallSidebar, ChannelContainer, ChatContainer, ThreadCompanion } from '#containers';
16
+ import {
17
+ CallDebugPanel,
18
+ CallSidebar,
19
+ ChannelChat,
20
+ ChannelContainer,
21
+ ThreadCompanion,
22
+ ThreadContainer,
23
+ } from '#containers';
17
24
  import { meta } from '#meta';
18
- import { Channel, ThreadCapabilities, type Settings } from '#types';
25
+ import { ThreadCapabilities, type Settings } from '#types';
19
26
 
20
27
  export default Capability.makeModule(() =>
21
28
  Effect.succeed(
@@ -35,12 +42,11 @@ export default Capability.makeModule(() =>
35
42
  ),
36
43
  component: ({ data: { companionTo: channel } }) => {
37
44
  const space = getSpace(channel);
38
- const thread = channel.defaultThread.target;
39
- if (!space || !thread) {
45
+ if (!space) {
40
46
  return null;
41
47
  }
42
48
 
43
- return <ChatContainer thread={thread} space={space} />;
49
+ return <ChannelChat channel={channel} space={space} />;
44
50
  },
45
51
  }),
46
52
  Surface.create({
@@ -52,7 +58,7 @@ export default Capability.makeModule(() =>
52
58
  return null;
53
59
  }
54
60
 
55
- return <ChatContainer thread={subject} space={space} />;
61
+ return <ThreadContainer thread={subject} space={space} />;
56
62
  },
57
63
  }),
58
64
  Surface.create({
@@ -9,9 +9,7 @@ import { AppCapabilities } from '@dxos/app-toolkit';
9
9
  import { createKvsStore } from '@dxos/effect';
10
10
 
11
11
  import { meta } from '#meta';
12
- import { Settings } from '#types';
13
-
14
- import { ThreadCapabilities } from '../types/capabilities';
12
+ import { Settings, ThreadCapabilities } from '#types';
15
13
 
16
14
  export default Capability.makeModule(() =>
17
15
  Effect.sync(() => {
@@ -7,7 +7,7 @@ import * as Effect from 'effect/Effect';
7
7
  import { Capabilities, Capability, UndoMapping } from '@dxos/app-framework';
8
8
 
9
9
  import { meta } from '#meta';
10
- import { ThreadOperation } from '#operations';
10
+ import { ThreadOperation } from '#types';
11
11
 
12
12
  export default Capability.makeModule(
13
13
  Effect.fnUntraced(function* () {
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { useAtomValue } from '@effect-atom/atom-react';
6
- import React, { type FC, type PropsWithChildren } from 'react';
6
+ import React, { type PropsWithChildren } from 'react';
7
7
 
8
8
  import { useCapability } from '@dxos/app-framework/ui';
9
9
  import { type ThemedClassName } from '@dxos/react-ui';
@@ -21,7 +21,7 @@ import { Toolbar, type ToolbarProps } from './Toolbar';
21
21
 
22
22
  type CallRootProps = PropsWithChildren<ThemedClassName>;
23
23
 
24
- const CallRoot: FC<CallRootProps> = ({ children }) => {
24
+ const CallRoot = ({ children }: CallRootProps) => {
25
25
  return <div className='relative dx-container flex flex-col'>{children}</div>;
26
26
  };
27
27
 
@@ -33,7 +33,7 @@ CallRoot.displayName = 'CallRoot';
33
33
 
34
34
  type CallAudioProps = {};
35
35
 
36
- const CallAudio: FC<CallAudioProps> = () => {
36
+ const CallAudio = (_props: CallAudioProps) => {
37
37
  const call = useCapability(ThreadCapabilities.CallManager);
38
38
  const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
39
39
 
@@ -50,7 +50,7 @@ type CallGridProps = {
50
50
  fullscreen?: boolean;
51
51
  };
52
52
 
53
- const CallGrid: FC<CallGridProps> = ({ fullscreen }) => {
53
+ const CallGrid = ({ fullscreen }: CallGridProps) => {
54
54
  const debug = useDebugMode();
55
55
  const call = useCapability(ThreadCapabilities.CallManager);
56
56
  const self = useAtomValue(call.selfAtom);
@@ -71,7 +71,7 @@ CallGrid.displayName = 'CallGrid';
71
71
 
72
72
  type CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;
73
73
 
74
- const CallToolbar: FC<CallToolbarProps> = (props) => {
74
+ const CallToolbar = (props: CallToolbarProps) => {
75
75
  return (
76
76
  <div className='absolute bottom-0 left-0 right-0 flex justify-center'>
77
77
  <Toolbar isInRoom {...props} />
@@ -19,11 +19,11 @@ import {
19
19
  toLocalizedString,
20
20
  useTranslation,
21
21
  } from '@dxos/react-ui';
22
+ import { type Channel } from '@dxos/types';
22
23
  import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
23
24
 
24
25
  import { meta } from '#meta';
25
26
  import { ThreadCapabilities } from '#types';
26
- import { type Channel } from '#types';
27
27
 
28
28
  export type ToolbarProps = ThemedClassName<{
29
29
  channel?: Channel.Channel;
@@ -0,0 +1,258 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type RefObject, useLayoutEffect, useMemo, useRef, useState } from 'react';
6
+
7
+ import { type SpaceMember } from '@dxos/react-client/echo';
8
+ import { type Identity } from '@dxos/react-client/halo';
9
+ import { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';
10
+ import {
11
+ type MessageMetadata,
12
+ MessageTextbox,
13
+ Thread as ThreadComponent,
14
+ type ThreadRootProps,
15
+ threadLayout,
16
+ } from '@dxos/react-ui-thread';
17
+ import { type Message } from '@dxos/types';
18
+ import { createBasicExtensions, createThemeExtensions, listener, type Extension } from '@dxos/ui-editor';
19
+ import { composable, composableProps, mx } from '@dxos/ui-theme';
20
+ import { isNonNullable } from '@dxos/util';
21
+
22
+ import { meta } from '#meta';
23
+
24
+ import { command } from '../../extensions';
25
+ import { getMessageMetadata } from '../../util';
26
+ import { MessagePanel } from '../MessagePanel';
27
+
28
+ export type ChatProps = ThemedClassName<
29
+ {
30
+ /** Stable id used for the underlying thread root and message metadata. */
31
+ id: string;
32
+ /** Identity used to attribute outgoing messages in the textbox metadata. */
33
+ identity?: Identity;
34
+ /** Space members for rendering sender names/avatars on incoming messages. */
35
+ members: SpaceMember[];
36
+ /** Messages to render in order. */
37
+ messages: readonly Message.Message[];
38
+ /** Activity indicator (e.g. processing) shown beneath the textbox. */
39
+ activity?: boolean;
40
+ /**
41
+ * Called with the user's textbox content when they press send.
42
+ * Returning `true` signals the message was accepted; the textbox is then cleared.
43
+ */
44
+ onSend: (text: string) => boolean;
45
+ autoFocusTextbox?: boolean;
46
+ /**
47
+ * Where the composer sits relative to the messages.
48
+ * - `'top'` (default) — composer follows the messages at intrinsic height,
49
+ * suitable for inline comment threads.
50
+ * - `'bottom'` — composer pinned to the bottom of the panel, messages
51
+ * scrolling above it. Suitable for full-panel multi-party chat.
52
+ */
53
+ orientation?: ChatOrientation;
54
+ /**
55
+ * When true, hide the composer textbox and activity indicator. Used for
56
+ * channels whose source-of-truth lives elsewhere (e.g. externally-synced
57
+ * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful
58
+ * because there is no local-write path back to the source.
59
+ */
60
+ readOnly?: boolean;
61
+ } & Pick<ThreadRootProps, 'current'>
62
+ >;
63
+
64
+ export type ChatOrientation = 'top' | 'bottom';
65
+
66
+ /**
67
+ * Pure chat UI: scrollable message list + composer textbox + activity indicator.
68
+ * Owns its own UI state (textbox content, scroll position, editor extensions) but
69
+ * does not load data or invoke operations — the caller passes messages and an
70
+ * `onSend` callback. Used by both `ThreadContainer` (AutoMerge `Thread`) and
71
+ * `ChannelContainer`'s feed-backed channel chat.
72
+ */
73
+ export const Chat = composable<HTMLDivElement, ChatProps>(
74
+ (
75
+ {
76
+ id,
77
+ identity,
78
+ members,
79
+ messages,
80
+ activity,
81
+ onSend,
82
+ autoFocusTextbox,
83
+ current,
84
+ orientation = 'top',
85
+ readOnly,
86
+ ...props
87
+ },
88
+ forwardedRef,
89
+ ) => {
90
+ const { t } = useTranslation(meta.id);
91
+ const { themeMode } = useThemeContext();
92
+
93
+ const scrollRef = useRef<HTMLDivElement | null>(null);
94
+ const sentinelRef = useRef<HTMLDivElement | null>(null);
95
+ const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);
96
+
97
+ // Force the editor to remount after a successful send so its content resets.
98
+ const [_count, _setCount] = useState(0);
99
+
100
+ const textboxMetadata = getMessageMetadata(id, identity);
101
+ const messageRef = useRef('');
102
+ const extensions = useMemo(
103
+ () => [
104
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
105
+ createThemeExtensions({ themeMode }),
106
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
107
+ command,
108
+ ],
109
+ [themeMode, _count],
110
+ );
111
+
112
+ const scrollToEnd = (behavior: ScrollBehavior) =>
113
+ setTimeout(() => sentinelRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);
114
+
115
+ useLayoutEffect(() => {
116
+ scrollToEnd('instant');
117
+ }, []);
118
+ // NOTE: Auto-scroll on new messages is intentionally not implemented here. Smooth-scroll
119
+ // animations were causing ResizeObserver feedback loops with CodeMirror/ScrollArea. The
120
+ // proper fix is "scroll only if user is already at the bottom" — deferred to a follow-up.
121
+
122
+ const handleSend = () => {
123
+ const text = messageRef.current;
124
+ if (!text?.length) {
125
+ return false;
126
+ }
127
+
128
+ const accepted = onSend(text);
129
+ if (!accepted) {
130
+ return false;
131
+ }
132
+
133
+ messageRef.current = '';
134
+ setAutoFocus(true);
135
+ scrollToEnd('smooth');
136
+ _setCount((count) => count + 1);
137
+ return true;
138
+ };
139
+
140
+ const filteredMessages = messages.filter(isNonNullable);
141
+ const renderState: ChatRenderState = {
142
+ messages: filteredMessages,
143
+ members,
144
+ activity,
145
+ extensions,
146
+ autoFocus,
147
+ handleSend,
148
+ textboxMetadata,
149
+ scrollRef,
150
+ sentinelRef,
151
+ readOnly,
152
+ };
153
+
154
+ return orientation === 'bottom' ? (
155
+ <ChannelLayout
156
+ {...composableProps(props, { classNames: 'flex flex-col bs-full min-h-0' })}
157
+ id={id}
158
+ ref={forwardedRef}
159
+ state={renderState}
160
+ />
161
+ ) : (
162
+ <ThreadLayout
163
+ {...composableProps(props, { classNames: 'dx-container grid-rows-[1fr_min-content_min-content]' })}
164
+ id={id}
165
+ current={current}
166
+ ref={forwardedRef}
167
+ state={renderState}
168
+ />
169
+ );
170
+ },
171
+ );
172
+
173
+ //
174
+ // Internal layout helpers — share state via the ChatRenderState bag.
175
+ //
176
+
177
+ type ChatRenderState = {
178
+ messages: Message.Message[];
179
+ members: SpaceMember[];
180
+ activity?: boolean;
181
+ extensions: Extension[];
182
+ autoFocus?: boolean;
183
+ handleSend: () => boolean;
184
+ textboxMetadata: MessageMetadata;
185
+ scrollRef: RefObject<HTMLDivElement | null>;
186
+ sentinelRef: RefObject<HTMLDivElement | null>;
187
+ readOnly?: boolean;
188
+ };
189
+
190
+ type LayoutProps = React.HTMLAttributes<HTMLDivElement> & {
191
+ id: string;
192
+ state: ChatRenderState;
193
+ };
194
+
195
+ /** Thread layout — composer follows messages at intrinsic height. */
196
+ const ThreadLayout = React.forwardRef<HTMLDivElement, LayoutProps & Pick<ThreadRootProps, 'current'>>(
197
+ ({ id, current, state, ...props }, ref) => {
198
+ const { t } = useTranslation(meta.id);
199
+ const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } =
200
+ state;
201
+ return (
202
+ <ThreadComponent.Root {...props} id={id} current={current} ref={ref}>
203
+ <ScrollArea.Root classNames='col-span-2' orientation='vertical'>
204
+ <ScrollArea.Viewport ref={sentinelRef}>
205
+ <div className={mx(threadLayout, 'place-self-end')}>
206
+ {messages.map((message) => (
207
+ <MessagePanel key={message.id} message={message} members={members} />
208
+ ))}
209
+ </div>
210
+ </ScrollArea.Viewport>
211
+ </ScrollArea.Root>
212
+ {!readOnly && (
213
+ <>
214
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />
215
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
216
+ </>
217
+ )}
218
+ </ThreadComponent.Root>
219
+ );
220
+ },
221
+ );
222
+
223
+ /** Channel layout — composer pinned to the bottom, messages scroll above it. */
224
+ const ChannelLayout = React.forwardRef<HTMLDivElement, LayoutProps>(({ id, state, ...props }, ref) => {
225
+ const { t } = useTranslation(meta.id);
226
+ const {
227
+ messages,
228
+ members,
229
+ activity,
230
+ extensions,
231
+ autoFocus,
232
+ handleSend,
233
+ textboxMetadata,
234
+ scrollRef,
235
+ sentinelRef,
236
+ readOnly,
237
+ } = state;
238
+ return (
239
+ <div {...props} id={id} ref={ref}>
240
+ <div ref={scrollRef} className='flex-1 min-h-0 overflow-y-auto'>
241
+ {messages.map((message) => (
242
+ <div key={message.id} className='grid grid-cols-[var(--dx-rail-size)_1fr] w-full'>
243
+ <MessagePanel message={message} members={members} />
244
+ </div>
245
+ ))}
246
+ <div ref={sentinelRef} />
247
+ </div>
248
+ {!readOnly && (
249
+ <>
250
+ <div className='shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]'>
251
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />
252
+ </div>
253
+ <div className='shrink-0 px-2 pb-1 text-xs text-description'>{activity ? t('activity.message') : null}</div>
254
+ </>
255
+ )}
256
+ </div>
257
+ );
258
+ });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Chat';
@@ -10,24 +10,26 @@ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
10
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
11
  import { Obj, Query, Relation } from '@dxos/echo';
12
12
  import { TestSchema } from '@dxos/echo/testing';
13
- import { ClientPlugin } from '@dxos/plugin-client';
13
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
14
14
  import { initializeIdentity } from '@dxos/plugin-client/testing';
15
15
  import { random } from '@dxos/random';
16
- import { useDatabase, useQuery } from '@dxos/react-client/echo';
16
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
17
17
  import { useIdentity } from '@dxos/react-client/halo';
18
18
  import { useAsyncEffect } from '@dxos/react-ui';
19
19
  import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
20
20
  import { AnchoredTo, Message, Thread } from '@dxos/types';
21
21
 
22
+ import { translations } from '#translations';
23
+
22
24
  import { createCommentThread, createProposalThread } from '../../testing/data';
23
- import { translations } from '../../translations';
24
25
  import { CommentsPanel } from './CommentsPanel';
25
26
 
26
27
  random.seed(1);
27
28
 
28
29
  const DefaultStory = () => {
29
30
  const identity = useIdentity();
30
- const db = useDatabase();
31
+ const [space] = useSpaces();
32
+ const db = space?.db;
31
33
  const anchors = useQuery(db, Query.type(AnchoredTo.AnchoredTo));
32
34
 
33
35
  useAsyncEffect(async () => {
@@ -41,19 +41,19 @@ export const CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...prop
41
41
 
42
42
  if (filteredAnchors.length === 0) {
43
43
  return (
44
- <div role='none' className='p-form-padding'>
44
+ <div className='p-form-padding'>
45
45
  <Message.Root>
46
- <Message.Title>
46
+ <Message.Content>
47
47
  <Trans
48
48
  {...{
49
49
  t,
50
50
  i18nKey: 'no-comments.message',
51
51
  components: {
52
- commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='w-block' />,
52
+ commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='dx-icon-inline' />,
53
53
  },
54
54
  }}
55
55
  />
56
- </Message.Title>
56
+ </Message.Content>
57
57
  </Message.Root>
58
58
  </div>
59
59
  );
@@ -104,7 +104,6 @@ export const CommentsThread = ({
104
104
  onFocusCapture={handleAttend}
105
105
  >
106
106
  <div
107
- role='none'
108
107
  className={mx(
109
108
  'col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]',
110
109
  hoverableControls,
@@ -118,7 +117,7 @@ export const CommentsThread = ({
118
117
  ) : (
119
118
  <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
120
119
  )}
121
- <div role='none' className={buttonGroupClassNames}>
120
+ <div className={buttonGroupClassNames}>
122
121
  {thread.status === 'staged' && <Tag palette='neutral'>{t('draft.button')}</Tag>}
123
122
  {onResolve && !(thread?.status === 'staged') && (
124
123
  <IconButton
@@ -166,7 +165,7 @@ export const CommentsThread = ({
166
165
 
167
166
  <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
168
167
 
169
- <div role='none' className='h-px -mt-px' ref={threadScrollRef} />
168
+ <div className='h-px -mt-px' ref={threadScrollRef} />
170
169
  </ThreadComponent.Root>
171
170
  );
172
171
  };
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { useAtomValue } from '@effect-atom/atom-react';
6
- import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
6
+ import React, { type PropsWithChildren, useEffect, useState } from 'react';
7
7
 
8
8
  import { useCapability } from '@dxos/app-framework/ui';
9
9
  import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
@@ -26,7 +26,8 @@ const SWARM_PEEK_INTERVAL = 1_000;
26
26
 
27
27
  type LobbyRootProps = PropsWithChildren<ThemedClassName>;
28
28
 
29
- const LobbyRoot: FC<LobbyRootProps> = ({ children }) => {
29
+ // TODO(burdon): Make headless?
30
+ const LobbyRoot = ({ children }: LobbyRootProps) => {
30
31
  return <div className='relative flex flex-col grow overflow-hidden group'>{children}</div>;
31
32
  };
32
33
 
@@ -38,7 +39,7 @@ LobbyRoot.displayName = 'LobbyRoot';
38
39
 
39
40
  type LobbyPreviewProps = {};
40
41
 
41
- const LobbyPreview: FC<LobbyPreviewProps> = () => {
42
+ const LobbyPreview = (_props: LobbyPreviewProps) => {
42
43
  const { t } = useTranslation(meta.id);
43
44
  const call = useCapability(ThreadCapabilities.CallManager);
44
45
  const media = useAtomValue(call.mediaAtom);
@@ -88,7 +89,7 @@ type LobbyToolbarProps = ThemedClassName<
88
89
  } & Pick<ToolbarProps, 'onJoin'>
89
90
  >;
90
91
 
91
- const LobbyToolbar: FC<LobbyToolbarProps> = ({ roomId, ...props }) => {
92
+ const LobbyToolbar = ({ roomId, ...props }: LobbyToolbarProps) => {
92
93
  const call = useCapability(ThreadCapabilities.CallManager);
93
94
  const [count, setCount] = useState<number>(0);
94
95
 
@@ -82,7 +82,10 @@ export const MessagePanel = ({
82
82
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
83
83
  (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),
84
84
  )?.identity;
85
- const messageMetadata = getMessageMetadata(message.id, senderIdentity);
85
+ // Pass `message.sender` as the fallback so externally-synced messages
86
+ // (Slack, etc.) display the source-side sender name instead of "Anonymous"
87
+ // when no DXOS identity matches.
88
+ const messageMetadata = getMessageMetadata(message.id, senderIdentity, message.sender);
86
89
  const userIsAuthor = identity?.did === messageMetadata.authorId;
87
90
  const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
88
91
  const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
@@ -90,14 +93,14 @@ export const MessagePanel = ({
90
93
  return (
91
94
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
92
95
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
93
- <div role='none' className={buttonGroupClassNames}>
96
+ <div className={buttonGroupClassNames}>
94
97
  {userIsAuthor && editable && (
95
98
  <IconButton
96
99
  data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
97
100
  variant='ghost'
98
101
  icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
99
102
  iconOnly
100
- label={t(editing ? 'save message label' : 'edit message label')}
103
+ label={t(editing ? 'save-message.label' : 'edit-message.label')}
101
104
  classNames={[buttonClassNames, hoverableControlItem]}
102
105
  onClick={handleEdit}
103
106
  />
@@ -188,15 +191,11 @@ const TextboxBlock = ({
188
191
  editing && view?.focus();
189
192
  }, [editing, view]);
190
193
 
191
- return <div role='none' ref={parentRef} className='me-4' {...focusAttributes} />;
194
+ return <div ref={parentRef} className='me-4' {...focusAttributes} />;
192
195
  };
193
196
 
194
197
  const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
195
- return (
196
- <div role='none' className='me-4 italic'>
197
- {block.text}
198
- </div>
199
- );
198
+ return <div className='me-4 italic'>{block.text}</div>;
200
199
  };
201
200
 
202
201
  const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {
@@ -8,7 +8,8 @@ import React, { useEffect, useState } from 'react';
8
8
  import { random } from '@dxos/random';
9
9
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
10
10
 
11
- import { translations } from '../../translations';
11
+ import { translations } from '#translations';
12
+
12
13
  import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
13
14
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
14
15
 
@@ -7,7 +7,8 @@ import React from 'react';
7
7
 
8
8
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
9
9
 
10
- import { translations } from '../../translations';
10
+ import { translations } from '#translations';
11
+
11
12
  import { VideoObject as VideoObjectComponent } from '../Media';
12
13
  import { ResponsivePanel } from './ResponsivePanel';
13
14
 
@@ -18,13 +18,11 @@ import { mx } from '@dxos/ui-theme';
18
18
  export const ResponsivePanel = ({ children }: PropsWithChildren) => {
19
19
  return (
20
20
  // Outer container that takes full size of parent.
21
- <div role='none' className='dx-expander relative flex'>
21
+ <div className='dx-expander relative flex'>
22
22
  {/* Absolute positioning layer for centering content. */}
23
- <div role='none' className='absolute inset-0 flex justify-center items-center'>
23
+ <div className='absolute inset-0 flex justify-center items-center'>
24
24
  {/* Content container that maintains given aspect ratio and proper scaling. */}
25
- <div role='none' className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>
26
- {children}
27
- </div>
25
+ <div className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>{children}</div>
28
26
  </div>
29
27
  </div>
30
28
  );
@@ -6,7 +6,8 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
7
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
8
 
9
- import { translations } from '../../translations';
9
+ import { translations } from '#translations';
10
+
10
11
  import { ThreadSettings } from './ThreadSettings';
11
12
 
12
13
  const meta = {
@@ -5,6 +5,7 @@
5
5
  import { type ComponentType, lazy } from 'react';
6
6
 
7
7
  export * from './Call';
8
+ export * from './Chat';
8
9
  export * from './CommentsPanel';
9
10
  export * from './MessagePanel';
10
11