@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
@@ -0,0 +1,75 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { Filter, Obj, Query } from '@dxos/echo';
9
+ import { type Space, useMembers, useQuery } from '@dxos/react-client/echo';
10
+ import { useIdentity } from '@dxos/react-client/halo';
11
+ import { type Channel, Message } from '@dxos/types';
12
+ import { composable, composableProps } from '@dxos/ui-theme';
13
+
14
+ import { Chat } from '#components';
15
+ import { useStatus } from '#hooks';
16
+ import { ThreadOperation } from '#types';
17
+
18
+ export type ChannelChatProps = {
19
+ space: Space;
20
+ channel: Channel.Channel;
21
+ };
22
+
23
+ /**
24
+ * Channel chat: composer pinned to the bottom of the panel, messages scrolling
25
+ * above it (newest at the bottom). Threading via `Message.threadId` is
26
+ * intentionally not reconstructed in this round.
27
+ *
28
+ * Externally-synced channels (any Channel carrying foreign-key `Obj.Meta`,
29
+ * e.g. Slack/Discord-sourced rooms) render read-only — the composer is
30
+ * suppressed because there's no local-write path back to the source.
31
+ */
32
+ export const ChannelChat = composable<HTMLDivElement, ChannelChatProps>(
33
+ ({ space, channel, ...props }, forwardedRef) => {
34
+ const identity = useIdentity()!;
35
+ const members = useMembers(space.id);
36
+ const id = Obj.getDXN(channel).toString();
37
+ const activity = useStatus(space, id);
38
+ const { invokePromise } = useOperationInvoker();
39
+
40
+ const feed = channel.feed?.target;
41
+ const messages = useQuery(
42
+ space.db,
43
+ feed ? Query.select(Filter.type(Message.Message)).from(feed) : Query.select(Filter.nothing()),
44
+ );
45
+
46
+ const readOnly = Obj.getMeta(channel).keys.length > 0;
47
+
48
+ const handleSend = (text: string) => {
49
+ if (readOnly) {
50
+ return false;
51
+ }
52
+ void invokePromise(ThreadOperation.AppendChannelMessage, {
53
+ channel,
54
+ sender: { identityDid: identity.did },
55
+ text,
56
+ });
57
+ return true;
58
+ };
59
+
60
+ return (
61
+ <Chat
62
+ {...composableProps(props)}
63
+ id={id}
64
+ identity={identity}
65
+ members={members}
66
+ messages={messages}
67
+ activity={activity}
68
+ onSend={handleSend}
69
+ orientation='bottom'
70
+ readOnly={readOnly}
71
+ ref={forwardedRef}
72
+ />
73
+ );
74
+ },
75
+ );
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { ChannelChat } from './ChannelChat';
6
+
7
+ export { ChannelChat };
8
+ export default ChannelChat;
@@ -3,27 +3,34 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
  import React from 'react';
7
8
 
8
9
  import { Capability } from '@dxos/app-framework';
9
10
  import { withPluginManager } from '@dxos/app-framework/testing';
10
11
  import { AppCapabilities } from '@dxos/app-toolkit';
11
- import { Query, useDatabase, useQuery } from '@dxos/react-client/echo';
12
+ import { Feed, Query } from '@dxos/echo';
13
+ import { createFeedServiceLayer } from '@dxos/echo-db';
14
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
15
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
16
+ import { SpacePlugin } from '@dxos/plugin-space/plugin';
17
+ import { corePlugins } from '@dxos/plugin-testing';
18
+ import { Config } from '@dxos/react-client';
19
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
12
20
  import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
13
- import { Message, Thread } from '@dxos/types';
21
+ import { Channel, Message, Thread } from '@dxos/types';
14
22
 
15
- import { createThreadPlugins } from '#testing';
16
- import { Channel } from '#types';
23
+ import { translations } from '#translations';
17
24
 
18
- import { translations } from '../../translations';
25
+ import { ThreadPlugin } from '../../ThreadPlugin';
19
26
  import { ChannelContainer, type ChannelContainerProps } from './ChannelContainer';
20
27
 
21
28
  // TODO(wittjosiah): Channel doesn't render full height.
22
29
  const DefaultStory = ({ roomId }: ChannelContainerProps) => {
23
- const db = useDatabase();
24
- const [channel] = useQuery(db, Query.type(Channel.Channel));
30
+ const [space] = useSpaces();
31
+ const [channel] = useQuery(space?.db, Query.type(Channel.Channel));
25
32
  if (!channel) {
26
- return <Loading data={{ db: !!db, channel: !!channel }} />;
33
+ return <Loading data={{ channel }} />;
27
34
  }
28
35
 
29
36
  return <ChannelContainer subject={channel} attendableId='story' roomId={roomId} role='article' />;
@@ -37,8 +44,45 @@ const meta = {
37
44
  withTheme(),
38
45
  withLayout({ layout: 'column' }),
39
46
  withPluginManager({
40
- plugins: [...(await createThreadPlugins())],
41
- capabilities: [Capability.contributes(AppCapabilities.Schema, [Channel.Channel, Thread.Thread, Message.Message])],
47
+ capabilities: [
48
+ Capability.contributes(AppCapabilities.Schema, [Channel.Channel, Feed.Feed, Thread.Thread, Message.Message]),
49
+ ],
50
+ plugins: [
51
+ ...corePlugins(),
52
+ ClientPlugin({
53
+ types: [Channel.Channel, Feed.Feed, Thread.Thread, Message.Message],
54
+ config: new Config({
55
+ runtime: {
56
+ services: {
57
+ edge: {
58
+ url: 'https://edge.dxos.workers.dev/',
59
+ },
60
+ iceProviders: [
61
+ {
62
+ urls: 'https://edge.dxos.workers.dev/ice',
63
+ },
64
+ ],
65
+ },
66
+ },
67
+ }),
68
+ onClientInitialized: ({ client }) =>
69
+ Effect.gen(function* () {
70
+ const { personalSpace } = yield* initializeIdentity(client);
71
+ const channel = personalSpace.db.add(Channel.make({ name: 'general' }));
72
+ const feed = yield* Effect.promise(() => channel.feed.load());
73
+ const seed = [
74
+ Message.make({ sender: { role: 'user' }, blocks: [{ _tag: 'text', text: 'Hello, channel.' }] }),
75
+ Message.make({
76
+ sender: { role: 'user' },
77
+ blocks: [{ _tag: 'text', text: 'Messages are stored in the feed.' }],
78
+ }),
79
+ ];
80
+ yield* Feed.append(feed, seed).pipe(Effect.provide(createFeedServiceLayer(personalSpace.queues)));
81
+ }),
82
+ }),
83
+ SpacePlugin({}),
84
+ ThreadPlugin(),
85
+ ],
42
86
  }),
43
87
  ],
44
88
  parameters: {
@@ -17,14 +17,14 @@ import { Button, ElevationProvider, Input, Panel, useTranslation } from '@dxos/r
17
17
  import { Settings } from '@dxos/react-ui-form';
18
18
  import { Menu, MenuRootProps, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
19
19
  import { useSoundEffect } from '@dxos/react-ui-sfx';
20
+ import { type Channel } from '@dxos/types';
20
21
  import { composable, composableProps } from '@dxos/ui-theme';
21
22
 
22
23
  import { Call } from '#components';
23
24
  import { meta } from '#meta';
24
25
  import { ThreadCapabilities } from '#types';
25
- import { type Channel } from '#types';
26
26
 
27
- import { ChatContainer } from '../ChatContainer';
27
+ import { ChannelChat } from '../ChannelChat';
28
28
 
29
29
  export type ChannelContainerProps = AppSurface.ObjectArticleProps<
30
30
  Channel.Channel | undefined,
@@ -140,14 +140,14 @@ export const ChannelContainer = ({
140
140
  );
141
141
  }
142
142
 
143
- if (channel && channel.defaultThread.target && space) {
143
+ if (channel && space) {
144
144
  return (
145
145
  <Panel.Root classNames='dx-document'>
146
146
  <Panel.Toolbar asChild>
147
147
  <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
148
148
  </Panel.Toolbar>
149
149
  <Panel.Content asChild>
150
- <ChatContainer space={space} thread={channel.defaultThread.target} />
150
+ <ChannelChat space={space} channel={channel} />
151
151
  </Panel.Content>
152
152
  </Panel.Root>
153
153
  );
@@ -6,11 +6,11 @@ import { useAtomValue } from '@effect-atom/atom-react';
6
6
  import React, { useCallback, useMemo } from 'react';
7
7
 
8
8
  import { Capabilities } from '@dxos/app-framework';
9
- import { useCapabilities, useCapability, useOperationInvoker, usePluginManager } from '@dxos/app-framework/ui';
9
+ import { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';
10
10
  import { AppCapabilities, CollaborationOperation, LayoutOperation } from '@dxos/app-toolkit';
11
11
  import { type AppSurface } from '@dxos/app-toolkit/ui';
12
- import { Filter, Obj, Query, Relation } from '@dxos/echo';
13
- import { Ref, useQuery } from '@dxos/react-client/echo';
12
+ import { Filter, Obj, Query, Ref, Relation } from '@dxos/echo';
13
+ import { useQuery } from '@dxos/react-client/echo';
14
14
  import { useIdentity } from '@dxos/react-client/halo';
15
15
  import { Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';
16
16
  import { getParentId, useAttention } from '@dxos/react-ui-attention';
@@ -19,7 +19,7 @@ import { AnchoredTo, Thread } from '@dxos/types';
19
19
 
20
20
  import { CommentsPanel, type CommentsPanelProps } from '#components';
21
21
  import { meta } from '#meta';
22
- import { ThreadOperation } from '#operations';
22
+ import { ThreadOperation } from '#types';
23
23
  import { ThreadCapabilities, type ViewState } from '#types';
24
24
 
25
25
  const initialViewState: ViewState = { showResolvedThreads: false };
@@ -33,7 +33,6 @@ export type ThreadCompanionProps = AppSurface.ObjectArticleProps<
33
33
 
34
34
  export const ThreadCompanion = ({ attendableId, subject }: ThreadCompanionProps) => {
35
35
  const { t } = useTranslation(meta.id);
36
- const manager = usePluginManager();
37
36
  const { invokePromise } = useOperationInvoker();
38
37
  const identity = useIdentity();
39
38
  const subjectId = Obj.getDXN(subject).toString();
@@ -66,6 +65,7 @@ export const ThreadCompanion = ({ attendableId, subject }: ThreadCompanionProps)
66
65
  [registry, viewStoreAtom, subjectId],
67
66
  );
68
67
 
68
+ const commentConfigs = useCapabilities(AppCapabilities.CommentConfig);
69
69
  const anchorSorts = useCapabilities(AppCapabilities.AnchorSort);
70
70
  const sort = useMemo(
71
71
  () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,
@@ -93,14 +93,12 @@ export const ThreadCompanion = ({ attendableId, subject }: ThreadCompanionProps)
93
93
  // Scroll plank into view (deck handler).
94
94
  void invokePromise(LayoutOperation.ScrollIntoView, { subject: parentId });
95
95
 
96
- // Scroll within content to anchor (metadata-driven, per typename).
96
+ // Scroll within content to anchor (comment config per typename).
97
97
  if (anchor.anchor && parentId) {
98
98
  const typename = Obj.getTypename(subject);
99
- const metadata = manager.capabilities
100
- .getAll(AppCapabilities.Metadata)
101
- .find(({ id }) => id === typename)?.metadata;
102
- if (metadata?.scrollToAnchor) {
103
- void invokePromise(metadata.scrollToAnchor, {
99
+ const commentConfig = commentConfigs.find(({ id }) => id === typename);
100
+ if (commentConfig?.scrollToAnchor) {
101
+ void invokePromise(commentConfig.scrollToAnchor, {
104
102
  subject: parentId,
105
103
  cursor: anchor.anchor,
106
104
  ref: threadId,
@@ -109,7 +107,7 @@ export const ThreadCompanion = ({ attendableId, subject }: ThreadCompanionProps)
109
107
  }
110
108
  }
111
109
  },
112
- [state.current, invokePromise, registry, stateAtom, parentId, subject, manager],
110
+ [state.current, invokePromise, registry, stateAtom, parentId, subject, commentConfigs],
113
111
  );
114
112
 
115
113
  const handleComment = useCallback(
@@ -19,10 +19,9 @@ import { Thread as ThreadComponent } from '@dxos/react-ui-thread';
19
19
  import { withLayout, Loading } from '@dxos/react-ui/testing';
20
20
  import { Message, Thread } from '@dxos/types';
21
21
 
22
- import { Channel } from '#types';
22
+ import { translations } from '#translations';
23
23
 
24
- import { translations } from '../../translations';
25
- import { ChatContainer } from './ChatContainer';
24
+ import { ThreadContainer } from './ThreadContainer';
26
25
 
27
26
  random.seed(1);
28
27
 
@@ -30,26 +29,26 @@ const DefaultStory = () => {
30
29
  const client = useClient();
31
30
  const identity = useIdentity();
32
31
  const [space, setSpace] = useState<Space>();
33
- const [channel, setChannel] = useState<Channel.Channel | null>();
32
+ const [thread, setThread] = useState<Thread.Thread | null>();
34
33
 
35
34
  useAsyncEffect(async () => {
36
35
  if (identity) {
37
36
  const space = await client.spaces.create();
38
- const channel = space.db.add(Channel.make());
37
+ const thread = space.db.add(Thread.make({ status: 'active' }));
39
38
  setSpace(space);
40
- setChannel(channel);
39
+ setThread(thread);
41
40
  }
42
41
  }, [identity]);
43
42
 
44
- if (!identity || !channel || !space || !channel.defaultThread.target) {
45
- return <Loading data={{ identity: !!identity, space: !!space, channel: !!channel }} />;
43
+ if (!identity || !thread || !space) {
44
+ return <Loading data={{ identity: !!identity, space: !!space, thread: !!thread }} />;
46
45
  }
47
46
 
48
- return <ChatContainer space={space} thread={channel.defaultThread.target} />;
47
+ return <ThreadContainer space={space} thread={thread} />;
49
48
  };
50
49
 
51
50
  const meta = {
52
- title: 'plugins/plugin-thread/containers/ChatContainer',
51
+ title: 'plugins/plugin-thread/containers/ThreadContainer',
53
52
  component: ThreadComponent.Root as any,
54
53
  render: DefaultStory,
55
54
  decorators: [
@@ -71,7 +70,7 @@ const meta = {
71
70
  }),
72
71
  withClientProvider({
73
72
  createSpace: true,
74
- types: [Thread.Thread, Channel.Channel, Message.Message],
73
+ types: [Thread.Thread, Message.Message],
75
74
  }),
76
75
  ],
77
76
  parameters: {
@@ -0,0 +1,75 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { Obj, Ref } from '@dxos/echo';
8
+ import { type Space, useMembers } from '@dxos/react-client/echo';
9
+ import { useIdentity } from '@dxos/react-client/halo';
10
+ import { type ThemedClassName } from '@dxos/react-ui';
11
+ import { type ThreadRootProps } from '@dxos/react-ui-thread';
12
+ import { Message, type Thread } from '@dxos/types';
13
+ import { composable, composableProps } from '@dxos/ui-theme';
14
+ import { isNonNullable } from '@dxos/util';
15
+
16
+ import { Chat } from '#components';
17
+ import { useStatus } from '#hooks';
18
+
19
+ export type ThreadContainerProps = ThemedClassName<
20
+ {
21
+ space: Space;
22
+ thread: Thread.Thread;
23
+ context?: Obj.Unknown;
24
+ autoFocusTextbox?: boolean;
25
+ } & Pick<ThreadRootProps, 'current'>
26
+ >;
27
+
28
+ /**
29
+ * Renders an AutoMerge {@link Thread} as a chat: appends new messages by pushing
30
+ * onto `thread.messages`. Used for comment threads and the meeting in-call chat.
31
+ */
32
+ export const ThreadContainer = composable<HTMLDivElement, ThreadContainerProps>(
33
+ ({ space, thread, context, autoFocusTextbox, current, ...props }, forwardedRef) => {
34
+ const id = Obj.getDXN(thread).toString();
35
+ const identity = useIdentity()!;
36
+ const members = useMembers(space?.id);
37
+ const activity = useStatus(space, id);
38
+
39
+ const messages = useMemo(
40
+ () => thread.messages.map((message) => message.target).filter(isNonNullable),
41
+ [thread.messages],
42
+ );
43
+
44
+ const handleSend = (text: string) => {
45
+ Obj.update(thread, (thread) => {
46
+ thread.messages.push(
47
+ Ref.make(
48
+ Obj.make(Message.Message, {
49
+ created: new Date().toISOString(),
50
+ sender: { identityDid: identity.did },
51
+ blocks: [{ _tag: 'text', text }],
52
+ properties: context ? { context: Ref.make(context) } : undefined,
53
+ }),
54
+ ),
55
+ );
56
+ });
57
+ return true;
58
+ };
59
+
60
+ return (
61
+ <Chat
62
+ {...composableProps(props)}
63
+ id={id}
64
+ identity={identity}
65
+ members={members}
66
+ messages={messages}
67
+ activity={activity}
68
+ onSend={handleSend}
69
+ autoFocusTextbox={autoFocusTextbox}
70
+ current={current}
71
+ ref={forwardedRef}
72
+ />
73
+ );
74
+ },
75
+ );
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { ThreadContainer } from './ThreadContainer';
6
+
7
+ export { ThreadContainer };
8
+ export default ThreadContainer;
@@ -6,6 +6,7 @@ import { type ComponentType, lazy } from 'react';
6
6
 
7
7
  export const CallDebugPanel: ComponentType<any> = lazy(() => import('./CallDebugPanel'));
8
8
  export const CallSidebar: ComponentType<any> = lazy(() => import('./CallSidebar'));
9
+ export const ChannelChat: ComponentType<any> = lazy(() => import('./ChannelChat'));
9
10
  export const ChannelContainer: ComponentType<any> = lazy(() => import('./ChannelContainer'));
10
- export const ChatContainer: ComponentType<any> = lazy(() => import('./ChatContainer'));
11
+ export const ThreadContainer: ComponentType<any> = lazy(() => import('./ThreadContainer'));
11
12
  export const ThreadCompanion: ComponentType<any> = lazy(() => import('./ThreadCompanion'));
@@ -29,7 +29,7 @@ const parser = StreamLanguage.define<{ count: number }>({
29
29
  const styles = HighlightStyle.define([
30
30
  {
31
31
  tag: tags.tagName,
32
- class: mx('dx-tag dx-tag--indigo text-base-surface-text font-medium'),
32
+ class: mx('dx-tag dx-tag--indigo text-base-foreground font-medium'),
33
33
  },
34
34
  ]);
35
35
 
@@ -8,12 +8,12 @@ import { type Atom, type Registry } from '@effect-atom/atom-react';
8
8
 
9
9
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
10
10
  import { createDocAccessor, getTextInRange } from '@dxos/echo-db';
11
- import { type OperationInvoker } from '@dxos/operation';
12
- import { type Markdown } from '@dxos/plugin-markdown/types';
11
+ import { OperationInvoker } from '@dxos/operation';
12
+ import { type Markdown } from '@dxos/plugin-markdown';
13
13
  import { AnchoredTo, Thread } from '@dxos/types';
14
14
  import { comments, createExternalCommentSync } from '@dxos/ui-editor';
15
15
 
16
- import { ThreadOperation } from '#operations';
16
+ import { ThreadOperation } from '#types';
17
17
  import { type ThreadState } from '#types';
18
18
 
19
19
  // TODO(burdon): Factor out.
@@ -73,7 +73,7 @@ export const threads = (
73
73
  const name = getName(doc, anchor.anchor);
74
74
  const thread = Relation.getSource(anchor) as Thread.Thread;
75
75
  if (name && name !== thread.name) {
76
- Obj.change(thread, (thread) => {
76
+ Obj.update(thread, (thread) => {
77
77
  thread.name = name;
78
78
  });
79
79
  }
@@ -130,7 +130,7 @@ export const threads = (
130
130
 
131
131
  const thread = query.results.find((object) => Relation.getSource(object).id === id);
132
132
  if (thread) {
133
- Relation.change(thread, (thread) => {
133
+ Relation.update(thread, (thread) => {
134
134
  thread.anchor = undefined;
135
135
  });
136
136
  }
@@ -139,10 +139,10 @@ export const threads = (
139
139
  const draft = registry.get(stateAtom).drafts[objectId]?.find((d) => Relation.getDXN(d).toString() === id);
140
140
  if (draft) {
141
141
  const thread = Relation.getSource(draft) as Thread.Thread;
142
- Obj.change(thread, (thread) => {
142
+ Obj.update(thread, (thread) => {
143
143
  thread.name = getName(doc, cursor);
144
144
  });
145
- Relation.change(draft, (draft) => {
145
+ Relation.update(draft, (draft) => {
146
146
  draft.anchor = cursor;
147
147
  });
148
148
  }
@@ -151,10 +151,10 @@ export const threads = (
151
151
  if (relation) {
152
152
  const thread = Relation.getSource(relation);
153
153
  if (Obj.instanceOf(Thread.Thread, thread)) {
154
- Obj.change(thread, (thread) => {
154
+ Obj.update(thread, (thread) => {
155
155
  thread.name = getName(doc, cursor);
156
156
  });
157
- Relation.change(relation, (relation) => {
157
+ Relation.update(relation, (relation) => {
158
158
  relation.anchor = cursor;
159
159
  });
160
160
  }
@@ -6,7 +6,7 @@ import { useCallback } from 'react';
6
6
 
7
7
  import { useOperationInvoker } from '@dxos/app-framework/ui';
8
8
  import { Obj } from '@dxos/echo';
9
- import { ObservabilityOperation } from '@dxos/plugin-observability/operations';
9
+ import { ObservabilityOperation } from '@dxos/plugin-observability';
10
10
  import { useOnTransition } from '@dxos/react-ui';
11
11
  import { type ContentBlock } from '@dxos/types';
12
12
 
package/src/index.ts CHANGED
@@ -2,9 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { ThreadCapabilities } from './types';
5
+ export * from './blueprints';
6
6
  export * from './calls';
7
+ // TODO(wittjosiah): Hooks should not be exported from the plugin package at all.
8
+ // Either refactor callers to not need them or factor them out to a shared package.
7
9
  export * from './hooks';
8
10
  export * from './meta';
9
-
10
- export * from './ThreadPlugin';
11
+ export * from './types';
@@ -5,17 +5,17 @@
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { Operation } from '@dxos/compute';
8
9
  import { Obj, Ref, Relation } from '@dxos/echo';
9
10
  import { invariant } from '@dxos/invariant';
10
- import { Operation } from '@dxos/operation';
11
- import { ObservabilityOperation } from '@dxos/plugin-observability/operations';
12
- import { SpaceOperation } from '@dxos/plugin-space/operations';
11
+ import { ObservabilityOperation } from '@dxos/plugin-observability';
12
+ import { SpaceOperation } from '@dxos/plugin-space';
13
13
  import { AnchoredTo, Message, Thread } from '@dxos/types';
14
14
 
15
15
  import { ThreadCapabilities } from '../types';
16
- import { AddMessage } from './definitions';
16
+ import { ThreadOperation } from '../types';
17
17
 
18
- const handler: Operation.WithHandler<typeof AddMessage> = AddMessage.pipe(
18
+ const handler: Operation.WithHandler<typeof ThreadOperation.AddMessage> = ThreadOperation.AddMessage.pipe(
19
19
  Operation.withHandler(
20
20
  Effect.fnUntraced(function* ({ anchor, subject, sender, text }) {
21
21
  const registry = yield* Capability.get(Capabilities.AtomRegistry);
@@ -30,14 +30,14 @@ const handler: Operation.WithHandler<typeof AddMessage> = AddMessage.pipe(
30
30
  sender,
31
31
  blocks: [{ _tag: 'text', text }],
32
32
  });
33
- Obj.change(thread, (thread) => {
33
+ Obj.update(thread, (thread) => {
34
34
  thread.messages.push(Ref.make(message));
35
35
  });
36
36
 
37
37
  const state = registry.get(stateAtom);
38
38
  const draft = state.drafts[subjectId]?.find((a: { id: string }) => a.id === anchor.id);
39
39
  if (draft) {
40
- Obj.change(thread, (thread) => {
40
+ Obj.update(thread, (thread) => {
41
41
  thread.status = 'active';
42
42
  });
43
43
  registry.set(stateAtom, {
@@ -0,0 +1,37 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { Operation } from '@dxos/compute';
9
+ import { Database, Feed, Obj } from '@dxos/echo';
10
+ import { createFeedServiceLayer } from '@dxos/echo-db';
11
+ import { invariant } from '@dxos/invariant';
12
+ import { ClientCapabilities } from '@dxos/plugin-client';
13
+ import { Message } from '@dxos/types';
14
+
15
+ import { ThreadOperation } from '../types';
16
+
17
+ const handler: Operation.WithHandler<typeof ThreadOperation.AppendChannelMessage> =
18
+ ThreadOperation.AppendChannelMessage.pipe(
19
+ Operation.withHandler(
20
+ Effect.fnUntraced(function* ({ channel, sender, text }) {
21
+ const db = Obj.getDatabase(channel);
22
+ invariant(db, 'Database not found');
23
+ const client = yield* Capability.get(ClientCapabilities.Client);
24
+ const space = client.spaces.get(db.spaceId);
25
+ invariant(space, 'Space not found');
26
+
27
+ const feed = yield* Database.load(channel.feed);
28
+ const message = Message.make({
29
+ sender,
30
+ blocks: [{ _tag: 'text', text }],
31
+ });
32
+ yield* Feed.append(feed, [message]).pipe(Effect.provide(createFeedServiceLayer(space.queues)));
33
+ }),
34
+ ),
35
+ );
36
+
37
+ export default handler;
@@ -4,12 +4,12 @@
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
- import { Operation } from '@dxos/operation';
7
+ import { Operation } from '@dxos/compute';
8
+ import { Channel } from '@dxos/types';
8
9
 
9
- import { Channel } from '../types';
10
- import { CreateChannel } from './definitions';
10
+ import { ThreadOperation } from '../types';
11
11
 
12
- const handler: Operation.WithHandler<typeof CreateChannel> = CreateChannel.pipe(
12
+ const handler: Operation.WithHandler<typeof ThreadOperation.CreateChannel> = ThreadOperation.CreateChannel.pipe(
13
13
  Operation.withHandler((input) =>
14
14
  Effect.sync(() => ({
15
15
  object: Channel.make({ name: input.name }),
@@ -7,14 +7,14 @@ import * as Effect from 'effect/Effect';
7
7
  import * as Function from 'effect/Function';
8
8
 
9
9
  import { computeDiffsWithCursors } from '@dxos/assistant';
10
+ import { Operation } from '@dxos/compute';
10
11
  import { Database, Obj, Ref, Relation } from '@dxos/echo';
11
12
  import { createDocAccessor } from '@dxos/echo-db';
12
- import { Operation } from '@dxos/operation';
13
13
  import { AnchoredTo, Message, Thread } from '@dxos/types';
14
14
 
15
- import { CreateProposals } from './definitions';
15
+ import { ThreadOperation } from '../types';
16
16
 
17
- const handler: Operation.WithHandler<typeof CreateProposals> = CreateProposals.pipe(
17
+ const handler: Operation.WithHandler<typeof ThreadOperation.CreateProposals> = ThreadOperation.CreateProposals.pipe(
18
18
  Operation.withHandler(
19
19
  Effect.fn(function* ({ doc, diffs }) {
20
20
  const object = yield* Database.load(doc);