@dxos/plugin-thread 0.8.4-main.ae835ea → 0.8.4-main.bcb3aa67d6

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 (456) hide show
  1. package/dist/lib/browser/add-message-RNUQFJTH.mjs +97 -0
  2. package/dist/lib/browser/add-message-RNUQFJTH.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +37 -0
  4. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-BHQ62SKT.mjs +259 -0
  6. package/dist/lib/browser/chunk-BHQ62SKT.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-H32XEGIV.mjs +61 -0
  8. package/dist/lib/browser/chunk-H32XEGIV.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  10. package/dist/lib/browser/create-UWYTS35R.mjs +55 -0
  11. package/dist/lib/browser/create-UWYTS35R.mjs.map +7 -0
  12. package/dist/lib/browser/create-channel-7RX3G7QV.mjs +21 -0
  13. package/dist/lib/browser/create-channel-7RX3G7QV.mjs.map +7 -0
  14. package/dist/lib/browser/create-channel-thread-ZA7IVGTL.mjs +28 -0
  15. package/dist/lib/browser/create-channel-thread-ZA7IVGTL.mjs.map +7 -0
  16. package/dist/lib/browser/create-proposals-74FZ3XTC.mjs +57 -0
  17. package/dist/lib/browser/create-proposals-74FZ3XTC.mjs.map +7 -0
  18. package/dist/lib/browser/delete-SJBDYXW3.mjs +59 -0
  19. package/dist/lib/browser/delete-SJBDYXW3.mjs.map +7 -0
  20. package/dist/lib/browser/delete-message-AHSDDYXK.mjs +64 -0
  21. package/dist/lib/browser/delete-message-AHSDDYXK.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +2250 -229
  23. package/dist/lib/browser/index.mjs.map +4 -4
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/on-create-space-YNZHJSZ5.mjs +25 -0
  26. package/dist/lib/browser/on-create-space-YNZHJSZ5.mjs.map +7 -0
  27. package/dist/lib/browser/operations/index.mjs +14 -0
  28. package/dist/lib/browser/operations/index.mjs.map +7 -0
  29. package/dist/lib/browser/restore-X2K3ZKFD.mjs +33 -0
  30. package/dist/lib/browser/restore-X2K3ZKFD.mjs.map +7 -0
  31. package/dist/lib/browser/restore-message-EHSQSLM3.mjs +42 -0
  32. package/dist/lib/browser/restore-message-EHSQSLM3.mjs.map +7 -0
  33. package/dist/lib/browser/select-GKW3QALS.mjs +26 -0
  34. package/dist/lib/browser/select-GKW3QALS.mjs.map +7 -0
  35. package/dist/lib/browser/toggle-resolved-Y5KJLQO3.mjs +45 -0
  36. package/dist/lib/browser/toggle-resolved-Y5KJLQO3.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +6 -8
  38. package/dist/lib/node-esm/add-message-R3XLXRZ5.mjs +98 -0
  39. package/dist/lib/node-esm/add-message-R3XLXRZ5.mjs.map +7 -0
  40. package/dist/lib/node-esm/blueprints/index.mjs +38 -0
  41. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  42. package/dist/lib/node-esm/chunk-BAKHDRSB.mjs +260 -0
  43. package/dist/lib/node-esm/chunk-BAKHDRSB.mjs.map +7 -0
  44. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  45. package/dist/lib/node-esm/chunk-M6EZRL5B.mjs +62 -0
  46. package/dist/lib/node-esm/chunk-M6EZRL5B.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-SKEKGLSD.mjs +56 -0
  48. package/dist/lib/node-esm/create-SKEKGLSD.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-channel-4UICXKGI.mjs +22 -0
  50. package/dist/lib/node-esm/create-channel-4UICXKGI.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-channel-thread-EWDR3J44.mjs +29 -0
  52. package/dist/lib/node-esm/create-channel-thread-EWDR3J44.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-proposals-SASCDSNZ.mjs +58 -0
  54. package/dist/lib/node-esm/create-proposals-SASCDSNZ.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-IGQXPUHX.mjs +60 -0
  56. package/dist/lib/node-esm/delete-IGQXPUHX.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-message-IEJYQNZY.mjs +65 -0
  58. package/dist/lib/node-esm/delete-message-IEJYQNZY.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +2250 -229
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/meta.json +1 -1
  62. package/dist/lib/node-esm/on-create-space-UGALNIWK.mjs +26 -0
  63. package/dist/lib/node-esm/on-create-space-UGALNIWK.mjs.map +7 -0
  64. package/dist/lib/node-esm/operations/index.mjs +15 -0
  65. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  66. package/dist/lib/node-esm/restore-4EAMGSOF.mjs +34 -0
  67. package/dist/lib/node-esm/restore-4EAMGSOF.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-message-2Z6KR3RJ.mjs +43 -0
  69. package/dist/lib/node-esm/restore-message-2Z6KR3RJ.mjs.map +7 -0
  70. package/dist/lib/node-esm/select-MLVUUPYK.mjs +27 -0
  71. package/dist/lib/node-esm/select-MLVUUPYK.mjs.map +7 -0
  72. package/dist/lib/node-esm/toggle-resolved-Y2FRSWZ3.mjs +46 -0
  73. package/dist/lib/node-esm/toggle-resolved-Y2FRSWZ3.mjs.map +7 -0
  74. package/dist/lib/node-esm/types/index.mjs +6 -8
  75. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  76. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  77. package/dist/types/src/blueprints/index.d.ts +2 -0
  78. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  79. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  80. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  81. package/dist/types/src/calls/call-manager.d.ts +40 -30
  82. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  83. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  84. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  85. package/dist/types/src/calls/media-manager.d.ts +1 -1
  86. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  87. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  88. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  89. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  90. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  91. package/dist/types/src/calls-service.stories.d.ts +2 -2
  92. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  96. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/call-manager.d.ts +3 -2
  98. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/index.d.ts +13 -14
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  102. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  104. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  106. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  108. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/settings.d.ts +4 -2
  110. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/state.d.ts +5 -5
  112. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  114. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  115. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  116. package/dist/types/src/components/Call/Toolbar.d.ts +1 -1
  117. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  118. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  119. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  120. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  121. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  123. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  124. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  125. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  126. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  127. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  128. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  129. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  130. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  131. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  132. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  133. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  134. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -140
  135. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  137. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  138. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  139. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  140. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  141. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  142. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  143. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  144. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  145. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  146. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/ThreadSettings/index.d.ts +3 -0
  148. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  149. package/dist/types/src/components/index.d.ts +4 -9
  150. package/dist/types/src/components/index.d.ts.map +1 -1
  151. package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
  152. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  153. package/dist/types/src/containers/CallDebugPanel/index.d.ts +3 -0
  154. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  155. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  156. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  157. package/dist/types/src/containers/CallSidebar/index.d.ts +3 -0
  158. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  159. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  160. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  161. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  162. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  163. package/dist/types/src/containers/ChannelContainer/index.d.ts +3 -0
  164. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  165. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +20 -0
  166. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  167. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  168. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  169. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  170. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  171. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  172. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  173. package/dist/types/src/containers/ThreadCompanion/index.d.ts +3 -0
  174. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  175. package/dist/types/src/containers/index.d.ts +7 -0
  176. package/dist/types/src/containers/index.d.ts.map +1 -0
  177. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  178. package/dist/types/src/extensions/command.d.ts.map +1 -0
  179. package/dist/types/src/extensions/index.d.ts +1 -0
  180. package/dist/types/src/extensions/index.d.ts.map +1 -1
  181. package/dist/types/src/extensions/threads.d.ts +8 -3
  182. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  183. package/dist/types/src/hooks/analytics.d.ts +2 -3
  184. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  185. package/dist/types/src/hooks/index.d.ts +2 -2
  186. package/dist/types/src/hooks/index.d.ts.map +1 -1
  187. package/dist/types/src/index.d.ts +1 -1
  188. package/dist/types/src/index.d.ts.map +1 -1
  189. package/dist/types/src/meta.d.ts +2 -2
  190. package/dist/types/src/meta.d.ts.map +1 -1
  191. package/dist/types/src/operations/add-message.d.ts +5 -0
  192. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  193. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  194. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  195. package/dist/types/src/operations/create-channel.d.ts +5 -0
  196. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  197. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  198. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  199. package/dist/types/src/operations/create.d.ts +5 -0
  200. package/dist/types/src/operations/create.d.ts.map +1 -0
  201. package/dist/types/src/operations/definitions.d.ts +2789 -0
  202. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  203. package/dist/types/src/operations/delete-message.d.ts +5 -0
  204. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  205. package/dist/types/src/operations/delete.d.ts +5 -0
  206. package/dist/types/src/operations/delete.d.ts.map +1 -0
  207. package/dist/types/src/operations/index.d.ts +4 -0
  208. package/dist/types/src/operations/index.d.ts.map +1 -0
  209. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  210. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  211. package/dist/types/src/operations/restore-message.d.ts +5 -0
  212. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  213. package/dist/types/src/operations/restore.d.ts +5 -0
  214. package/dist/types/src/operations/restore.d.ts.map +1 -0
  215. package/dist/types/src/operations/select.d.ts +5 -0
  216. package/dist/types/src/operations/select.d.ts.map +1 -0
  217. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  218. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  219. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +2 -2
  220. package/dist/types/src/testing/data.d.ts.map +1 -0
  221. package/dist/types/src/testing/stories.d.ts +2 -1
  222. package/dist/types/src/testing/stories.d.ts.map +1 -1
  223. package/dist/types/src/translations.d.ts +140 -138
  224. package/dist/types/src/translations.d.ts.map +1 -1
  225. package/dist/types/src/types/Channel.d.ts +707 -12
  226. package/dist/types/src/types/Channel.d.ts.map +1 -1
  227. package/dist/types/src/types/Settings.d.ts +4 -0
  228. package/dist/types/src/types/Settings.d.ts.map +1 -0
  229. package/dist/types/src/types/capabilities.d.ts +23 -0
  230. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  231. package/dist/types/src/types/index.d.ts +1 -1
  232. package/dist/types/src/types/index.d.ts.map +1 -1
  233. package/dist/types/src/types/types.d.ts +3 -443
  234. package/dist/types/src/types/types.d.ts.map +1 -1
  235. package/dist/types/tsconfig.tsbuildinfo +1 -1
  236. package/package.json +108 -65
  237. package/src/ThreadPlugin.tsx +78 -112
  238. package/src/blueprints/index.ts +5 -0
  239. package/src/blueprints/thread-blueprint.ts +37 -0
  240. package/src/calls/call-manager.ts +76 -52
  241. package/src/calls/call-swarm-synchronizer.ts +2 -2
  242. package/src/calls/media-manager.ts +10 -7
  243. package/src/calls/util/calls-service.ts +1 -1
  244. package/src/calls/util/stub-media-streams.ts +2 -2
  245. package/src/calls/util/task-scheduling.ts +4 -4
  246. package/src/calls-service.stories.tsx +8 -8
  247. package/src/capabilities/app-graph-builder.ts +171 -165
  248. package/src/capabilities/blueprint-definition.ts +17 -0
  249. package/src/capabilities/call-manager.ts +18 -12
  250. package/src/capabilities/index.ts +15 -12
  251. package/src/capabilities/markdown.ts +49 -37
  252. package/src/capabilities/operation-handler.ts +16 -0
  253. package/src/capabilities/react-root.tsx +12 -9
  254. package/src/capabilities/react-surface.tsx +83 -77
  255. package/src/capabilities/settings.ts +27 -12
  256. package/src/capabilities/state.ts +14 -18
  257. package/src/capabilities/undo-mappings.ts +46 -0
  258. package/src/components/Call/Call.tsx +10 -6
  259. package/src/components/Call/Toolbar.tsx +57 -40
  260. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  261. package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +19 -20
  262. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +43 -45
  263. package/src/components/CommentsPanel/index.ts +6 -0
  264. package/src/components/Lobby/Lobby.tsx +14 -12
  265. package/src/components/Media/AudioStream.tsx +2 -2
  266. package/src/components/Media/VideoObject.stories.tsx +6 -6
  267. package/src/components/Media/VideoObject.tsx +1 -1
  268. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +71 -40
  269. package/src/components/MessagePanel/index.ts +5 -0
  270. package/src/components/Participant/Participant.tsx +32 -19
  271. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +5 -5
  272. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  273. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +12 -9
  274. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +7 -7
  275. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  276. package/src/components/ResponsiveGrid/index.ts +1 -1
  277. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  278. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  279. package/src/components/ThreadSettings/index.ts +7 -0
  280. package/src/components/index.ts +5 -12
  281. package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +14 -16
  282. package/src/containers/CallDebugPanel/index.ts +7 -0
  283. package/src/containers/CallSidebar/CallSidebar.tsx +17 -0
  284. package/src/containers/CallSidebar/index.ts +7 -0
  285. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +59 -0
  286. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +94 -76
  287. package/src/containers/ChannelContainer/index.ts +7 -0
  288. package/src/{components/Chat.stories.tsx → containers/ChatContainer/ChatContainer.stories.tsx} +21 -19
  289. package/src/containers/ChatContainer/ChatContainer.tsx +130 -0
  290. package/src/containers/ChatContainer/index.ts +8 -0
  291. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +217 -0
  292. package/src/containers/ThreadCompanion/index.ts +7 -0
  293. package/src/containers/index.ts +11 -0
  294. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  295. package/src/extensions/index.ts +1 -0
  296. package/src/extensions/threads.ts +83 -38
  297. package/src/hooks/analytics.ts +22 -21
  298. package/src/hooks/index.ts +3 -2
  299. package/src/index.ts +1 -1
  300. package/src/meta.ts +4 -4
  301. package/src/operations/add-message.ts +82 -0
  302. package/src/operations/create-channel-thread.ts +26 -0
  303. package/src/operations/create-channel.ts +21 -0
  304. package/src/operations/create-proposals.ts +49 -0
  305. package/src/operations/create.ts +49 -0
  306. package/src/operations/definitions.ts +177 -0
  307. package/src/operations/delete-message.ts +53 -0
  308. package/src/operations/delete.ts +64 -0
  309. package/src/operations/index.ts +22 -0
  310. package/src/operations/on-create-space.ts +27 -0
  311. package/src/operations/restore-message.ts +38 -0
  312. package/src/operations/restore.ts +38 -0
  313. package/src/operations/select.ts +25 -0
  314. package/src/operations/toggle-resolved.ts +41 -0
  315. package/src/{components/testing.ts → testing/data.ts} +3 -5
  316. package/src/testing/stories.ts +16 -17
  317. package/src/translations.ts +72 -74
  318. package/src/types/Channel.ts +21 -11
  319. package/src/types/Settings.ts +10 -0
  320. package/src/types/capabilities.ts +35 -0
  321. package/src/types/index.ts +1 -1
  322. package/src/types/types.ts +4 -108
  323. package/src/util.ts +1 -1
  324. package/dist/lib/browser/ChannelContainer-SVV4ZX5T.mjs +0 -16
  325. package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +0 -15
  326. package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs +0 -171
  327. package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +0 -7
  328. package/dist/lib/browser/call-manager-P3MYR2JS.mjs +0 -24
  329. package/dist/lib/browser/call-manager-P3MYR2JS.mjs.map +0 -7
  330. package/dist/lib/browser/chunk-6CUDBEYP.mjs +0 -377
  331. package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +0 -7
  332. package/dist/lib/browser/chunk-BBTXGRIR.mjs +0 -18
  333. package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +0 -7
  334. package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
  335. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-DJOUMWEL.mjs +0 -988
  337. package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +0 -7
  338. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  339. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-IQSXEHOW.mjs +0 -618
  341. package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +0 -7
  342. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +0 -27
  343. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +0 -7
  344. package/dist/lib/browser/chunk-L6F2AG6W.mjs +0 -23
  345. package/dist/lib/browser/chunk-L6F2AG6W.mjs.map +0 -7
  346. package/dist/lib/browser/chunk-US5ZQYC3.mjs +0 -1793
  347. package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +0 -7
  348. package/dist/lib/browser/chunk-UTSLSZED.mjs +0 -178
  349. package/dist/lib/browser/chunk-UTSLSZED.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  351. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  352. package/dist/lib/browser/intent-resolver-5POQTZ24.mjs +0 -419
  353. package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +0 -7
  354. package/dist/lib/browser/markdown-L7LDNF56.mjs +0 -169
  355. package/dist/lib/browser/markdown-L7LDNF56.mjs.map +0 -7
  356. package/dist/lib/browser/react-root-RCJLK4EP.mjs +0 -28
  357. package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +0 -7
  358. package/dist/lib/browser/react-surface-IC576W2W.mjs +0 -109
  359. package/dist/lib/browser/react-surface-IC576W2W.mjs.map +0 -7
  360. package/dist/lib/browser/settings-5FYGBOGI.mjs +0 -22
  361. package/dist/lib/browser/settings-5FYGBOGI.mjs.map +0 -7
  362. package/dist/lib/browser/state-36REWXO5.mjs +0 -34
  363. package/dist/lib/browser/state-36REWXO5.mjs.map +0 -7
  364. package/dist/lib/browser/toolkit-PXASLYEQ.mjs +0 -74
  365. package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +0 -7
  366. package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +0 -17
  367. package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs.map +0 -7
  368. package/dist/lib/node-esm/ChatContainer-MFKPXMIK.mjs +0 -16
  369. package/dist/lib/node-esm/ChatContainer-MFKPXMIK.mjs.map +0 -7
  370. package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs +0 -172
  371. package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +0 -7
  372. package/dist/lib/node-esm/call-manager-FCEFP7EJ.mjs +0 -25
  373. package/dist/lib/node-esm/call-manager-FCEFP7EJ.mjs.map +0 -7
  374. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  375. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  376. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  377. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  378. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  379. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  380. package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs +0 -25
  381. package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs.map +0 -7
  382. package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs +0 -1794
  383. package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +0 -7
  384. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs +0 -378
  385. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs +0 -619
  387. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-QCQAAU6J.mjs +0 -989
  389. package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-TYLLHI46.mjs +0 -179
  391. package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +0 -28
  393. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +0 -19
  395. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +0 -7
  396. package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs +0 -420
  397. package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +0 -7
  398. package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs +0 -170
  399. package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +0 -7
  400. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +0 -29
  401. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +0 -7
  402. package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs +0 -110
  403. package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +0 -7
  404. package/dist/lib/node-esm/settings-EOBQUZSW.mjs +0 -23
  405. package/dist/lib/node-esm/settings-EOBQUZSW.mjs.map +0 -7
  406. package/dist/lib/node-esm/state-X3W67GTL.mjs +0 -35
  407. package/dist/lib/node-esm/state-X3W67GTL.mjs.map +0 -7
  408. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +0 -75
  409. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +0 -7
  410. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  411. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  412. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  413. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  414. package/dist/types/src/capabilities/toolkit.d.ts +0 -24
  415. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  416. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  417. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  418. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  419. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  420. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -160
  421. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  422. package/dist/types/src/components/Chat.stories.d.ts +0 -160
  423. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  424. package/dist/types/src/components/ChatContainer.d.ts +0 -18
  425. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  426. package/dist/types/src/components/Comments.stories.d.ts +0 -158
  427. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  428. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  429. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  430. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  431. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  432. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  433. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  434. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  435. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  436. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  437. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  438. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  439. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  440. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  441. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  442. package/dist/types/src/components/testing.d.ts.map +0 -1
  443. package/dist/types/src/types/Thread.d.ts +0 -167
  444. package/dist/types/src/types/Thread.d.ts.map +0 -1
  445. package/src/capabilities/capabilities.ts +0 -33
  446. package/src/capabilities/intent-resolver.ts +0 -344
  447. package/src/capabilities/toolkit.ts +0 -85
  448. package/src/components/CallSidebar.tsx +0 -18
  449. package/src/components/ChannelContainer.stories.tsx +0 -59
  450. package/src/components/ChatContainer.tsx +0 -154
  451. package/src/components/Comments.stories.tsx +0 -91
  452. package/src/components/ThreadComplementary.tsx +0 -181
  453. package/src/components/ThreadSettings.tsx +0 -16
  454. package/src/types/Thread.ts +0 -26
  455. /package/dist/lib/browser/{ChannelContainer-SVV4ZX5T.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  456. /package/dist/lib/{browser/ChatContainer-ALFWQ65B.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,88 +2,94 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
5
7
  import React from 'react';
6
8
 
7
- import { Capabilities, contributes, createSurface, useCapability } from '@dxos/app-framework';
9
+ import { Capabilities, Capability } from '@dxos/app-framework';
10
+ import { Surface, useCapability, useSettingsState } from '@dxos/app-framework/ui';
11
+ import { AppCapabilities } from '@dxos/app-toolkit';
8
12
  import { Obj, type Ref } from '@dxos/echo';
9
- import { SettingsStore } from '@dxos/local-storage';
10
13
  import { getSpace } from '@dxos/react-client/echo';
14
+ import { Thread } from '@dxos/types';
11
15
 
12
- import {
13
- CallDebugPanel,
14
- CallSidebar,
15
- ChannelContainer,
16
- ChatContainer,
17
- ThreadComplementary,
18
- ThreadSettings,
19
- } from '../components';
20
- import { meta } from '../meta';
21
- import { Channel, Thread, type ThreadSettingsProps } from '../types';
16
+ import { ThreadSettings } from '#components';
17
+ import { CallDebugPanel, CallSidebar, ChannelContainer, ChatContainer, ThreadCompanion } from '#containers';
18
+ import { meta } from '#meta';
19
+ import { Channel, ThreadCapabilities, type Settings } from '#types';
22
20
 
23
- import { ThreadCapabilities } from './capabilities';
21
+ export default Capability.makeModule(() =>
22
+ Effect.succeed(
23
+ Capability.contributes(Capabilities.ReactSurface, [
24
+ Surface.create({
25
+ id: `${meta.id}.channel`,
26
+ role: 'article',
27
+ filter: (data): data is { attendableId: string; subject: Channel.Channel } =>
28
+ typeof data.attendableId === 'string' && Obj.instanceOf(Channel.Channel, data.subject),
29
+ component: ({ data: { subject, attendableId }, role }) => (
30
+ <ChannelContainer role={role} subject={subject} attendableId={attendableId} />
31
+ ),
32
+ }),
33
+ Surface.create({
34
+ id: `${meta.id}.chat-companion`,
35
+ role: 'article',
36
+ filter: (data): data is { companionTo: Channel.Channel; subject: 'chat' } =>
37
+ Obj.instanceOf(Channel.Channel, data.companionTo) && data.subject === 'chat',
38
+ component: ({ data: { companionTo: channel } }) => {
39
+ const space = getSpace(channel);
40
+ const thread = channel.defaultThread.target;
41
+ if (!space || !thread) {
42
+ return null;
43
+ }
24
44
 
25
- export default () =>
26
- contributes(Capabilities.ReactSurface, [
27
- createSurface({
28
- id: `${meta.id}/channel`,
29
- role: 'article',
30
- filter: (data): data is { subject: Channel.Channel } => Obj.instanceOf(Channel.Channel, data.subject),
31
- component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
32
- }),
33
- createSurface({
34
- id: `${meta.id}/chat-companion`,
35
- role: 'article',
36
- filter: (data): data is { companionTo: Channel.Channel; subject: 'chat' } =>
37
- Obj.instanceOf(Channel.Channel, data.companionTo) && data.subject === 'chat',
38
- component: ({ data: { companionTo: channel } }) => {
39
- const space = getSpace(channel);
40
- const thread = channel.defaultThread.target;
41
- if (!space || !thread) {
42
- return null;
43
- }
45
+ return <ChatContainer thread={thread} space={space} />;
46
+ },
47
+ }),
48
+ Surface.create({
49
+ id: `${meta.id}.thread`,
50
+ role: 'article',
51
+ filter: (data): data is { subject: Thread.Thread } => Obj.instanceOf(Thread.Thread, data.subject),
52
+ component: ({ data: { subject } }) => {
53
+ const space = getSpace(subject);
54
+ if (!space || !subject) {
55
+ return null;
56
+ }
44
57
 
45
- return <ChatContainer thread={thread} space={space} />;
46
- },
47
- }),
48
- createSurface({
49
- id: `${meta.id}/thread`,
50
- role: 'article',
51
- filter: (data): data is { subject: Thread.Thread } => Obj.instanceOf(Thread.Thread, data.subject),
52
- component: ({ data: { subject: thread } }) => {
53
- const space = getSpace(thread);
54
- if (!space || !thread) {
55
- return null;
56
- }
57
-
58
- return <ChatContainer thread={thread} space={space} />;
59
- },
60
- }),
61
- createSurface({
62
- id: `${meta.id}/comments`,
63
- role: 'article',
64
- filter: (data): data is { companionTo: { threads: Ref.Ref<Thread.Thread>[] } } =>
65
- data.subject === 'comments' && Obj.isObject(data.companionTo),
66
- // TODO(wittjosiah): This isn't scrolling properly in a plank.
67
- component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
68
- }),
69
- createSurface({
70
- id: `${meta.id}/plugin-settings`,
71
- role: 'article',
72
- filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
73
- data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
74
- component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
75
- }),
76
- createSurface({
77
- id: `${meta.id}/assistant`,
78
- role: 'deck-companion--active-call',
79
- component: () => <CallSidebar />,
80
- }),
81
- createSurface({
82
- id: `${meta.id}/devtools-overview`,
83
- role: 'devtools-overview',
84
- component: () => {
85
- const call = useCapability(ThreadCapabilities.CallManager);
86
- return <CallDebugPanel state={call.state} />;
87
- },
88
- }),
89
- ]);
58
+ return <ChatContainer thread={subject} space={space} />;
59
+ },
60
+ }),
61
+ Surface.create({
62
+ id: `${meta.id}.comments`,
63
+ role: 'article',
64
+ filter: (data): data is { attendableId?: string; companionTo: { threads: Ref.Ref<Thread.Thread>[] } } =>
65
+ data.subject === 'comments' && Obj.isObject(data.companionTo),
66
+ // TODO(wittjosiah): This isn't scrolling properly in a plank.
67
+ component: ({ data }) => <ThreadCompanion attendableId={data.attendableId} subject={data.companionTo} />,
68
+ }),
69
+ Surface.create({
70
+ id: `${meta.id}.plugin-settings`,
71
+ role: 'article',
72
+ filter: (data): data is { subject: AppCapabilities.Settings } =>
73
+ AppCapabilities.isSettings(data.subject) && data.subject.prefix === meta.id,
74
+ component: ({ data: { subject } }) => {
75
+ const { settings, updateSettings } = useSettingsState<Settings.Settings>(subject.atom);
76
+ return <ThreadSettings settings={settings} onSettingsChange={updateSettings} />;
77
+ },
78
+ }),
79
+ Surface.create({
80
+ id: `${meta.id}.assistant`,
81
+ role: 'deck-companion--active-call',
82
+ component: () => <CallSidebar />,
83
+ }),
84
+ Surface.create({
85
+ id: `${meta.id}.devtools-overview`,
86
+ role: 'devtools-overview',
87
+ component: () => {
88
+ const call = useCapability(ThreadCapabilities.CallManager);
89
+ const state = useAtomValue(call.stateAtom);
90
+ return <CallDebugPanel state={state} />;
91
+ },
92
+ }),
93
+ ]),
94
+ ),
95
+ );
@@ -2,18 +2,33 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes } from '@dxos/app-framework';
6
- import { live } from '@dxos/live-object';
5
+ import * as Effect from 'effect/Effect';
7
6
 
8
- import { meta } from '../meta';
9
- import { type ThreadSettingsProps, ThreadSettingsSchema } from '../types';
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities } from '@dxos/app-toolkit';
9
+ import { createKvsStore } from '@dxos/effect';
10
10
 
11
- export default () => {
12
- const settings = live<ThreadSettingsProps>({});
11
+ import { meta } from '#meta';
12
+ import { Settings } from '#types';
13
+ import { ThreadCapabilities } from '../types/capabilities';
13
14
 
14
- return contributes(Capabilities.Settings, {
15
- prefix: meta.id,
16
- schema: ThreadSettingsSchema,
17
- value: settings,
18
- });
19
- };
15
+ export default Capability.makeModule(() =>
16
+ Effect.sync(() => {
17
+ const settingsAtom = createKvsStore({
18
+ key: meta.id,
19
+ schema: Settings.Settings,
20
+ defaultValue: () => ({}),
21
+ });
22
+
23
+ return [
24
+ // Expose atom directly for programmatic access.
25
+ Capability.contributes(ThreadCapabilities.Settings, settingsAtom),
26
+ // Contribute to common settings for UI discovery.
27
+ Capability.contributes(AppCapabilities.Settings, {
28
+ prefix: meta.id,
29
+ schema: Settings.Settings,
30
+ atom: settingsAtom,
31
+ }),
32
+ ];
33
+ }),
34
+ );
@@ -2,25 +2,21 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes } from '@dxos/app-framework';
6
- import { live } from '@dxos/live-object';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
7
 
8
- import { type ThreadState, type ViewStore } from '../types';
8
+ import { Capability } from '@dxos/app-framework';
9
9
 
10
- import { ThreadCapabilities } from './capabilities';
10
+ import { ThreadCapabilities, type ThreadState, type ViewStore } from '#types';
11
11
 
12
- const initialViewState = { showResolvedThreads: false };
12
+ export default Capability.makeModule(
13
+ Effect.fnUntraced(function* () {
14
+ const stateAtom = Atom.make<ThreadState>({ toolbar: {}, drafts: {} }).pipe(Atom.keepAlive);
15
+ const viewStoreAtom = Atom.make<ViewStore>({}).pipe(Atom.keepAlive);
13
16
 
14
- export default () => {
15
- const state = live<ThreadState>({ toolbar: {}, drafts: {} });
16
- const viewStore = live<ViewStore>({});
17
-
18
- const getViewState = (subjectId: string) => {
19
- if (!viewStore[subjectId]) {
20
- viewStore[subjectId] = { ...initialViewState };
21
- }
22
- return viewStore[subjectId];
23
- };
24
-
25
- return contributes(ThreadCapabilities.State, { state, getViewState });
26
- };
17
+ return [
18
+ Capability.contributes(ThreadCapabilities.State, stateAtom),
19
+ Capability.contributes(ThreadCapabilities.ViewState, viewStoreAtom),
20
+ ];
21
+ }),
22
+ );
@@ -0,0 +1,46 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability, UndoMapping } from '@dxos/app-framework';
8
+
9
+ import { meta } from '#meta';
10
+ import { ThreadOperation } from '#operations';
11
+
12
+ export default Capability.makeModule(
13
+ Effect.fnUntraced(function* () {
14
+ return Capability.contributes(Capabilities.UndoMapping, [
15
+ UndoMapping.make({
16
+ operation: ThreadOperation.Delete,
17
+ inverse: ThreadOperation.Restore,
18
+ deriveContext: (_input, output) => {
19
+ if (!output.thread || !output.anchor) {
20
+ return;
21
+ }
22
+ return {
23
+ thread: output.thread,
24
+ anchor: output.anchor,
25
+ };
26
+ },
27
+ message: ['thread-deleted.label', { ns: meta.id }],
28
+ }),
29
+ UndoMapping.make({
30
+ operation: ThreadOperation.DeleteMessage,
31
+ inverse: ThreadOperation.RestoreMessage,
32
+ deriveContext: (input, output) => {
33
+ if (!output.message || output.messageIndex === undefined) {
34
+ return;
35
+ }
36
+ return {
37
+ anchor: input.anchor,
38
+ message: output.message,
39
+ messageIndex: output.messageIndex,
40
+ };
41
+ },
42
+ message: ['message-deleted.label', { ns: meta.id }],
43
+ }),
44
+ ]);
45
+ }),
46
+ );
@@ -2,13 +2,14 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React, { type FC, type PropsWithChildren } from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/ui';
8
9
  import { type ThemedClassName } from '@dxos/react-ui';
9
10
 
10
- import { ThreadCapabilities } from '../../capabilities';
11
- import { useDebugMode } from '../../hooks';
11
+ import { useDebugMode } from '#hooks';
12
+ import { ThreadCapabilities } from '#types';
12
13
  import { AudioStream } from '../Media';
13
14
  import { ParticipantGrid } from '../Participant';
14
15
 
@@ -21,7 +22,7 @@ import { Toolbar, type ToolbarProps } from './Toolbar';
21
22
  type CallRootProps = PropsWithChildren<ThemedClassName>;
22
23
 
23
24
  const CallRoot: FC<CallRootProps> = ({ children }) => {
24
- return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;
25
+ return <div className='relative dx-container flex flex-col'>{children}</div>;
25
26
  };
26
27
 
27
28
  CallRoot.displayName = 'CallRoot';
@@ -34,8 +35,9 @@ type CallAudioProps = {};
34
35
 
35
36
  const CallAudio: FC<CallAudioProps> = () => {
36
37
  const call = useCapability(ThreadCapabilities.CallManager);
38
+ const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
37
39
 
38
- return <AudioStream tracks={call.audioTracksToPlay} />;
40
+ return <AudioStream tracks={audioTracksToPlay} />;
39
41
  };
40
42
 
41
43
  CallAudio.displayName = 'CallAudio';
@@ -51,10 +53,12 @@ type CallGridProps = {
51
53
  const CallGrid: FC<CallGridProps> = ({ fullscreen }) => {
52
54
  const debug = useDebugMode();
53
55
  const call = useCapability(ThreadCapabilities.CallManager);
56
+ const self = useAtomValue(call.selfAtom);
57
+ const users = useAtomValue(call.usersAtom);
54
58
 
55
59
  return (
56
60
  <div className='grid grow p-4 dark:bg-neutral-900'>
57
- <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />
61
+ <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />
58
62
  </div>
59
63
  );
60
64
  };
@@ -2,11 +2,14 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React from 'react';
6
7
 
7
- import { useAppGraph, useCapability } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/ui';
9
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
10
+ import { Obj } from '@dxos/echo';
11
+ import { Node, useActionRunner } from '@dxos/plugin-graph';
8
12
  import { useActions, useNode } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
10
13
  import {
11
14
  Icon,
12
15
  IconButton,
@@ -16,11 +19,11 @@ import {
16
19
  toLocalizedString,
17
20
  useTranslation,
18
21
  } from '@dxos/react-ui';
19
- import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
22
+ import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
20
23
 
21
- import { ThreadCapabilities } from '../../capabilities';
22
- import { meta } from '../../meta';
23
- import { type Channel } from '../../types';
24
+ import { meta } from '#meta';
25
+ import { ThreadCapabilities } from '#types';
26
+ import { type Channel } from '#types';
24
27
 
25
28
  export type ToolbarProps = ThemedClassName<{
26
29
  channel?: Channel.Channel;
@@ -42,62 +45,65 @@ export const Toolbar = ({
42
45
  }: ToolbarProps) => {
43
46
  const { t } = useTranslation(meta.id);
44
47
  const { graph } = useAppGraph();
48
+ const runAction = useActionRunner();
45
49
  const call = useCapability(ThreadCapabilities.CallManager);
50
+ const media = useAtomValue(call.mediaAtom);
51
+ const joined = useAtomValue(call.joinedAtom);
52
+ const raisedHand = useAtomValue(call.raisedHandAtom);
46
53
 
47
54
  // Channel app graph node.
48
- const node = useNode(graph, channel && fullyQualifiedId(channel));
55
+ const node = useNode(graph, channel && Obj.getDXN(channel).toString());
49
56
  const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');
50
57
 
51
58
  // Screen sharing.
52
- const isScreensharing = call.media.screenshareTrack !== undefined;
59
+ const isScreensharing = media.screenshareTrack !== undefined;
53
60
  const canSharescreen =
54
61
  typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;
55
62
 
56
63
  // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
57
64
  return (
58
65
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
59
- <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
66
+ <NaturalToolbar.Root classNames={['p-2 bg-modal-surface rounded-md shadow-md', classNames]}>
60
67
  <ToggleButton
61
- active={call.media.audioEnabled}
68
+ active={media.audioEnabled}
62
69
  state={{
63
70
  on: {
64
71
  icon: 'ph--microphone--regular',
65
- label: t('mic off'),
72
+ label: t('mic-off.button'),
66
73
  onClick: () => call.turnAudioOff(),
67
- classNames: 'bg-callActive',
74
+ classNames: 'bg-call-active',
68
75
  },
69
76
  off: {
70
77
  icon: 'ph--microphone-slash--duotone',
71
- label: t('mic on'),
78
+ label: t('mic-on.button'),
72
79
  onClick: () => call.turnAudioOn(),
73
- classNames: [call.joined && 'bg-callAlert'],
74
80
  },
75
81
  }}
76
82
  />
77
83
  <ToggleButton
78
- active={call.media.videoEnabled}
84
+ active={media.videoEnabled}
79
85
  state={{
80
86
  on: {
81
87
  icon: 'ph--video-camera--regular',
82
- label: t('camera off'),
88
+ label: t('camera-off.button'),
83
89
  onClick: () => call.turnVideoOff(),
84
90
  },
85
91
  off: {
86
92
  icon: 'ph--video-camera-slash--duotone',
87
- label: t('camera on'),
93
+ label: t('camera-on.button'),
88
94
  onClick: () => call.turnVideoOn(),
89
95
  },
90
96
  }}
91
97
  />
92
98
 
93
99
  {(participants !== undefined && (
94
- <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>
95
- <Icon icon='ph--users--regular' size={4} />
100
+ <div className='flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued'>
101
+ <Icon icon='ph--users--regular' />
96
102
  <div>{participants}</div>
97
103
  </div>
98
104
  )) || <NaturalToolbar.Separator variant='gap' />}
99
105
 
100
- {call.joined && (
106
+ {joined && (
101
107
  <>
102
108
  <ToggleButton
103
109
  disabled={!canSharescreen}
@@ -105,51 +111,62 @@ export const Toolbar = ({
105
111
  state={{
106
112
  on: {
107
113
  icon: 'ph--monitor--regular',
108
- label: t('screenshare off'),
114
+ label: t('screenshare-off.button'),
109
115
  onClick: () => call.turnScreenshareOff(),
110
116
  },
111
117
  off: {
112
118
  icon: 'ph--monitor-arrow-up--duotone',
113
- label: t('screenshare on'),
119
+ label: t('screenshare-on.button'),
114
120
  onClick: () => call.turnScreenshareOn(),
115
121
  },
116
122
  }}
117
123
  />
118
124
 
119
125
  {/* Companion actions. */}
120
- {actions.map((action) => (
121
- <IconButton
122
- key={action.id}
123
- {...defaultButtonProps}
124
- icon={action.properties.icon}
125
- label={toLocalizedString(action.properties.label, t)}
126
- classNames={action.properties.classNames}
127
- onClick={() => action.data({ node })}
128
- />
129
- ))}
126
+ {actions
127
+ .filter((action): action is Node.Action => Node.isAction(action))
128
+ .map((action) => (
129
+ <IconButton
130
+ key={action.id}
131
+ {...defaultButtonProps}
132
+ icon={action.properties.icon}
133
+ label={toLocalizedString(action.properties.label, t)}
134
+ classNames={action.properties.classNames}
135
+ onClick={() => node && void runAction(action, { parent: node })}
136
+ />
137
+ ))}
130
138
 
131
139
  <ToggleButton
132
- active={call.raisedHand}
140
+ active={raisedHand}
133
141
  state={{
134
142
  on: {
135
143
  icon: 'ph--hand-waving--regular',
136
- label: t('lower hand'),
144
+ label: t('lower-hand.button'),
137
145
  onClick: () => call.setRaisedHand(false),
138
- classNames: [call.joined && 'bg-callAlert'],
139
146
  },
140
147
  off: {
141
148
  icon: 'ph--hand-palm--duotone',
142
- label: t('raise hand'),
149
+ label: t('raise-hand.button'),
143
150
  onClick: () => call.setRaisedHand(true),
144
151
  },
145
152
  }}
146
153
  />
147
154
  </>
148
155
  )}
149
- {call.joined ? (
150
- <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />
156
+ {joined ? (
157
+ <IconButton
158
+ variant='destructive'
159
+ icon='ph--phone-x--regular'
160
+ label={t('leave-call.button')}
161
+ onClick={onLeave}
162
+ />
151
163
  ) : (
152
- <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
164
+ <IconButton
165
+ variant='primary'
166
+ icon='ph--phone-incoming--regular'
167
+ label={t('join-call.button')}
168
+ onClick={onJoin}
169
+ />
153
170
  )}
154
171
  </NaturalToolbar.Root>
155
172
  </div>
@@ -174,7 +191,7 @@ const defaultButtonProps: Partial<IconButtonProps> = {
174
191
  const ToggleButton = ({ active, state }: ToolbarButtonProps) => (
175
192
  <IconButton
176
193
  {...defaultButtonProps}
177
- classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}
194
+ classNames={[active ? (state.on.classNames ?? 'bg-call-active') : state.off.classNames]}
178
195
  icon={active ? state.on.icon : state.off.icon}
179
196
  label={active ? state.on.label : state.off.label}
180
197
  onClick={active ? state.on.onClick : state.off.onClick}
@@ -0,0 +1,94 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React from 'react';
8
+
9
+ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
10
+ import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { Obj, Query, Relation } from '@dxos/echo';
12
+ import { TestSchema } from '@dxos/echo/testing';
13
+ import { ClientPlugin } from '@dxos/plugin-client';
14
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
15
+ import { faker } from '@dxos/random';
16
+ import { useDatabase, useQuery } from '@dxos/react-client/echo';
17
+ import { useIdentity } from '@dxos/react-client/halo';
18
+ import { useAsyncEffect } from '@dxos/react-ui';
19
+ import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
20
+ import { AnchoredTo, Message, Thread } from '@dxos/types';
21
+
22
+ import { translations } from '../../translations';
23
+
24
+ import { CommentsPanel } from './CommentsPanel';
25
+ import { createCommentThread, createProposalThread } from '../../testing/data';
26
+
27
+ faker.seed(1);
28
+
29
+ const DefaultStory = () => {
30
+ const identity = useIdentity();
31
+ const db = useDatabase();
32
+ const anchors = useQuery(db, Query.type(AnchoredTo.AnchoredTo));
33
+
34
+ useAsyncEffect(async () => {
35
+ if (identity && db) {
36
+ const object = db.add(Obj.make(TestSchema.Expando, {}));
37
+ const thread1 = db.add(createCommentThread(identity));
38
+ const thread2 = db.add(createProposalThread(identity));
39
+ db.add(
40
+ Relation.make(AnchoredTo.AnchoredTo, {
41
+ [Relation.Source]: thread1,
42
+ [Relation.Target]: object,
43
+ anchor: 'test',
44
+ }),
45
+ );
46
+ db.add(
47
+ Relation.make(AnchoredTo.AnchoredTo, {
48
+ [Relation.Source]: thread2,
49
+ [Relation.Target]: object,
50
+ anchor: 'test',
51
+ }),
52
+ );
53
+ }
54
+ }, [identity, db]);
55
+
56
+ if (!identity || !db || !anchors) {
57
+ return <Loading data={{ identity: !!identity, db: !!db, anchors: !!anchors }} />;
58
+ }
59
+
60
+ return <CommentsPanel anchors={anchors} onThreadDelete={console.log} onAcceptProposal={console.log} />;
61
+ };
62
+
63
+ const meta = {
64
+ title: 'plugins/plugin-thread/components/Comments',
65
+ render: DefaultStory,
66
+ decorators: [
67
+ withTheme(),
68
+ withLayout({ layout: 'column' }),
69
+ // TODO(wittjosiah): This shouldn't depend on app framework (use withClientProvider instead).
70
+ // Currently this is required due to useOnEditAnalytics.
71
+ withPluginManager({
72
+ plugins: [
73
+ OperationPlugin(),
74
+ RuntimePlugin(),
75
+ ClientPlugin({
76
+ types: [Message.Message, Thread.Thread, AnchoredTo.AnchoredTo],
77
+ onClientInitialized: ({ client }) =>
78
+ Effect.gen(function* () {
79
+ yield* initializeIdentity(client);
80
+ }),
81
+ }),
82
+ ],
83
+ }),
84
+ ],
85
+ parameters: {
86
+ translations,
87
+ },
88
+ } satisfies Meta<typeof DefaultStory>;
89
+
90
+ export default meta;
91
+
92
+ type Story = StoryObj<typeof meta>;
93
+
94
+ export const Default: Story = {};