@dxos/plugin-thread 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (491) hide show
  1. package/dist/lib/browser/add-message-OC4QB4I2.mjs +89 -0
  2. package/dist/lib/browser/add-message-OC4QB4I2.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-J5LGTIGS.mjs +10 -0
  6. package/dist/lib/browser/chunk-J67QAUIW.mjs +61 -0
  7. package/dist/lib/browser/chunk-J67QAUIW.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-KCMJ7H7F.mjs +259 -0
  9. package/dist/lib/browser/chunk-KCMJ7H7F.mjs.map +7 -0
  10. package/dist/lib/browser/create-IUWQEW74.mjs +55 -0
  11. package/dist/lib/browser/create-IUWQEW74.mjs.map +7 -0
  12. package/dist/lib/browser/create-channel-CBC5WEFG.mjs +21 -0
  13. package/dist/lib/browser/create-channel-CBC5WEFG.mjs.map +7 -0
  14. package/dist/lib/browser/create-channel-thread-JJ5LQ3OZ.mjs +28 -0
  15. package/dist/lib/browser/create-channel-thread-JJ5LQ3OZ.mjs.map +7 -0
  16. package/dist/lib/browser/create-proposals-RHLVRJZ4.mjs +57 -0
  17. package/dist/lib/browser/create-proposals-RHLVRJZ4.mjs.map +7 -0
  18. package/dist/lib/browser/delete-PVIEGTTY.mjs +59 -0
  19. package/dist/lib/browser/delete-PVIEGTTY.mjs.map +7 -0
  20. package/dist/lib/browser/delete-message-TLVRPLJF.mjs +56 -0
  21. package/dist/lib/browser/delete-message-TLVRPLJF.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +1875 -241
  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-KRTKYRFU.mjs +25 -0
  26. package/dist/lib/browser/on-create-space-KRTKYRFU.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-AVE55SJF.mjs +33 -0
  30. package/dist/lib/browser/restore-AVE55SJF.mjs.map +7 -0
  31. package/dist/lib/browser/restore-message-F57RMGDJ.mjs +34 -0
  32. package/dist/lib/browser/restore-message-F57RMGDJ.mjs.map +7 -0
  33. package/dist/lib/browser/select-BJDZJI64.mjs +26 -0
  34. package/dist/lib/browser/select-BJDZJI64.mjs.map +7 -0
  35. package/dist/lib/browser/toggle-resolved-HQE5P7BV.mjs +37 -0
  36. package/dist/lib/browser/toggle-resolved-HQE5P7BV.mjs.map +7 -0
  37. package/dist/lib/browser/translations.mjs +90 -0
  38. package/dist/lib/browser/translations.mjs.map +7 -0
  39. package/dist/lib/browser/types/index.mjs +8 -12
  40. package/dist/lib/node-esm/add-message-HJXNAILW.mjs +90 -0
  41. package/dist/lib/node-esm/add-message-HJXNAILW.mjs.map +7 -0
  42. package/dist/lib/node-esm/blueprints/index.mjs +38 -0
  43. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  44. package/dist/lib/node-esm/chunk-2Q6V7NGK.mjs +62 -0
  45. package/dist/lib/node-esm/chunk-2Q6V7NGK.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-4KRVIOPC.mjs +260 -0
  47. package/dist/lib/node-esm/chunk-4KRVIOPC.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  49. package/dist/lib/node-esm/create-NALJT67D.mjs +56 -0
  50. package/dist/lib/node-esm/create-NALJT67D.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-channel-CS2EAYJF.mjs +22 -0
  52. package/dist/lib/node-esm/create-channel-CS2EAYJF.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-channel-thread-KZZFZDTU.mjs +29 -0
  54. package/dist/lib/node-esm/create-channel-thread-KZZFZDTU.mjs.map +7 -0
  55. package/dist/lib/node-esm/create-proposals-AFAYZQBI.mjs +58 -0
  56. package/dist/lib/node-esm/create-proposals-AFAYZQBI.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-HQJVZY7Q.mjs +60 -0
  58. package/dist/lib/node-esm/delete-HQJVZY7Q.mjs.map +7 -0
  59. package/dist/lib/node-esm/delete-message-VVPEYLV4.mjs +57 -0
  60. package/dist/lib/node-esm/delete-message-VVPEYLV4.mjs.map +7 -0
  61. package/dist/lib/node-esm/index.mjs +1875 -241
  62. package/dist/lib/node-esm/index.mjs.map +4 -4
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/on-create-space-2UX7Z5EQ.mjs +26 -0
  65. package/dist/lib/node-esm/on-create-space-2UX7Z5EQ.mjs.map +7 -0
  66. package/dist/lib/node-esm/operations/index.mjs +15 -0
  67. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-FMIWJR5T.mjs +34 -0
  69. package/dist/lib/node-esm/restore-FMIWJR5T.mjs.map +7 -0
  70. package/dist/lib/node-esm/restore-message-3L7AMQMG.mjs +35 -0
  71. package/dist/lib/node-esm/restore-message-3L7AMQMG.mjs.map +7 -0
  72. package/dist/lib/node-esm/select-VCAFISBK.mjs +27 -0
  73. package/dist/lib/node-esm/select-VCAFISBK.mjs.map +7 -0
  74. package/dist/lib/node-esm/toggle-resolved-JDZZ257P.mjs +38 -0
  75. package/dist/lib/node-esm/toggle-resolved-JDZZ257P.mjs.map +7 -0
  76. package/dist/lib/node-esm/translations.mjs +91 -0
  77. package/dist/lib/node-esm/translations.mjs.map +7 -0
  78. package/dist/lib/node-esm/types/index.mjs +8 -12
  79. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  80. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  81. package/dist/types/src/blueprints/index.d.ts +2 -0
  82. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  83. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  84. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  85. package/dist/types/src/calls/call-manager.d.ts +40 -30
  86. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  87. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  88. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  89. package/dist/types/src/calls/media-manager.d.ts +2 -2
  90. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  91. package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
  92. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
  93. package/dist/types/src/calls/types.d.ts +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/audio.d.ts.map +1 -1
  96. package/dist/types/src/calls/util/calls-service.d.ts +7 -5
  97. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
  99. package/dist/types/src/calls/util/media.d.ts.map +1 -1
  100. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  101. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  102. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  103. package/dist/types/src/calls-service.stories.d.ts +10 -9
  104. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  108. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/call-manager.d.ts +3 -2
  110. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/index.d.ts +13 -13
  112. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  114. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  116. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  118. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  120. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/settings.d.ts +5 -2
  122. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  123. package/dist/types/src/capabilities/state.d.ts +5 -5
  124. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  125. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  126. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  127. package/dist/types/src/components/Call/Call.d.ts +32 -4
  128. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  129. package/dist/types/src/components/Call/Toolbar.d.ts +6 -6
  130. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  131. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  132. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  133. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  134. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  135. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  136. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  137. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  138. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  139. package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
  140. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  141. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  142. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  143. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  144. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  145. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  146. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  147. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  148. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  149. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  150. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  151. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  152. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +160 -5
  153. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  155. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  156. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  157. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  158. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  160. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  161. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  162. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  163. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  164. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  165. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  166. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  167. package/dist/types/src/components/index.d.ts +4 -9
  168. package/dist/types/src/components/index.d.ts.map +1 -1
  169. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
  170. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  171. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  172. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  173. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  174. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  175. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  176. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  177. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  178. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  179. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  180. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  181. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  182. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +16 -0
  184. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  185. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  186. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  187. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  188. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  189. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  190. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  191. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  192. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  193. package/dist/types/src/containers/index.d.ts +7 -0
  194. package/dist/types/src/containers/index.d.ts.map +1 -0
  195. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  196. package/dist/types/src/extensions/command.d.ts.map +1 -0
  197. package/dist/types/src/extensions/index.d.ts +1 -0
  198. package/dist/types/src/extensions/index.d.ts.map +1 -1
  199. package/dist/types/src/extensions/threads.d.ts +9 -4
  200. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  201. package/dist/types/src/hooks/analytics.d.ts +2 -3
  202. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  203. package/dist/types/src/hooks/index.d.ts +2 -1
  204. package/dist/types/src/hooks/index.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  206. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  207. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  208. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  209. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  210. package/dist/types/src/index.d.ts +1 -1
  211. package/dist/types/src/index.d.ts.map +1 -1
  212. package/dist/types/src/meta.d.ts +3 -4
  213. package/dist/types/src/meta.d.ts.map +1 -1
  214. package/dist/types/src/operations/add-message.d.ts +5 -0
  215. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  216. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  217. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  218. package/dist/types/src/operations/create-channel.d.ts +5 -0
  219. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  220. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  221. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  222. package/dist/types/src/operations/create.d.ts +5 -0
  223. package/dist/types/src/operations/create.d.ts.map +1 -0
  224. package/dist/types/src/operations/definitions.d.ts +2804 -0
  225. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  226. package/dist/types/src/operations/delete-message.d.ts +5 -0
  227. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  228. package/dist/types/src/operations/delete.d.ts +5 -0
  229. package/dist/types/src/operations/delete.d.ts.map +1 -0
  230. package/dist/types/src/operations/index.d.ts +4 -0
  231. package/dist/types/src/operations/index.d.ts.map +1 -0
  232. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  233. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  234. package/dist/types/src/operations/restore-message.d.ts +5 -0
  235. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  236. package/dist/types/src/operations/restore.d.ts +5 -0
  237. package/dist/types/src/operations/restore.d.ts.map +1 -0
  238. package/dist/types/src/operations/select.d.ts +5 -0
  239. package/dist/types/src/operations/select.d.ts.map +1 -0
  240. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  241. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  242. package/dist/types/src/testing/data.d.ts +5 -0
  243. package/dist/types/src/testing/data.d.ts.map +1 -0
  244. package/dist/types/src/testing/index.d.ts +1 -1
  245. package/dist/types/src/testing/index.d.ts.map +1 -1
  246. package/dist/types/src/translations.d.ts +142 -70
  247. package/dist/types/src/translations.d.ts.map +1 -1
  248. package/dist/types/src/types/Channel.d.ts +715 -0
  249. package/dist/types/src/types/Channel.d.ts.map +1 -0
  250. package/dist/types/src/types/Settings.d.ts +5 -0
  251. package/dist/types/src/types/Settings.d.ts.map +1 -0
  252. package/dist/types/src/types/capabilities.d.ts +24 -0
  253. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  254. package/dist/types/src/types/index.d.ts +2 -1
  255. package/dist/types/src/types/index.d.ts.map +1 -1
  256. package/dist/types/src/types/types.d.ts +4 -326
  257. package/dist/types/src/types/types.d.ts.map +1 -1
  258. package/dist/types/src/util.d.ts +17 -2
  259. package/dist/types/src/util.d.ts.map +1 -1
  260. package/dist/types/tsconfig.tsbuildinfo +1 -1
  261. package/package.json +113 -74
  262. package/src/ThreadPlugin.tsx +109 -149
  263. package/src/blueprints/index.ts +5 -0
  264. package/src/blueprints/thread-blueprint.ts +36 -0
  265. package/src/calls/call-manager.ts +78 -54
  266. package/src/calls/call-swarm-synchronizer.ts +3 -3
  267. package/src/calls/media-manager.ts +67 -38
  268. package/src/calls/types.ts +8 -4
  269. package/src/calls/util/calls-service.ts +67 -15
  270. package/src/calls/util/stub-media-streams.ts +66 -7
  271. package/src/calls/util/task-scheduling.ts +4 -4
  272. package/src/calls-service.stories.tsx +82 -68
  273. package/src/capabilities/app-graph-builder.ts +175 -162
  274. package/src/capabilities/blueprint-definition.ts +17 -0
  275. package/src/capabilities/call-manager.ts +19 -11
  276. package/src/capabilities/index.ts +15 -11
  277. package/src/capabilities/markdown.ts +55 -37
  278. package/src/capabilities/operation-handler.ts +16 -0
  279. package/src/capabilities/react-root.tsx +12 -9
  280. package/src/capabilities/react-surface.tsx +80 -77
  281. package/src/capabilities/settings.ts +28 -12
  282. package/src/capabilities/state.ts +14 -17
  283. package/src/capabilities/undo-mappings.ts +46 -0
  284. package/src/components/Call/Call.tsx +17 -12
  285. package/src/components/Call/Toolbar.tsx +62 -45
  286. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +95 -0
  287. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  288. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +66 -61
  289. package/src/components/CommentsPanel/index.ts +6 -0
  290. package/src/components/Lobby/Lobby.tsx +21 -17
  291. package/src/components/Media/AudioStream.tsx +2 -2
  292. package/src/components/Media/VideoObject.stories.tsx +37 -30
  293. package/src/components/Media/VideoObject.tsx +1 -1
  294. package/src/components/MessagePanel/MessagePanel.tsx +222 -0
  295. package/src/components/MessagePanel/index.ts +5 -0
  296. package/src/components/Participant/Participant.tsx +35 -15
  297. package/src/components/Participant/ParticipantGrid.tsx +1 -1
  298. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +51 -49
  299. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
  300. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +14 -11
  301. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +12 -12
  302. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  303. package/src/components/ResponsiveGrid/index.ts +1 -1
  304. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  305. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  306. package/src/components/ThreadSettings/index.ts +5 -0
  307. package/src/components/index.ts +5 -12
  308. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +173 -0
  309. package/src/containers/CallDebugPanel/index.ts +5 -0
  310. package/src/containers/CallSidebar/CallSidebar.tsx +18 -0
  311. package/src/containers/CallSidebar/index.ts +5 -0
  312. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +93 -0
  313. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +97 -74
  314. package/src/containers/ChannelContainer/index.ts +5 -0
  315. package/src/containers/ChatContainer/ChatContainer.stories.tsx +87 -0
  316. package/src/containers/ChatContainer/ChatContainer.tsx +126 -0
  317. package/src/containers/ChatContainer/index.ts +8 -0
  318. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +217 -0
  319. package/src/containers/ThreadCompanion/index.ts +5 -0
  320. package/src/containers/index.ts +11 -0
  321. package/src/{components/command-extension.ts → extensions/command.ts} +7 -4
  322. package/src/extensions/index.ts +1 -0
  323. package/src/extensions/threads.ts +89 -44
  324. package/src/hooks/analytics.ts +22 -21
  325. package/src/hooks/index.ts +3 -1
  326. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  327. package/src/hooks/useDebugMode.ts +1 -1
  328. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  329. package/src/index.ts +1 -1
  330. package/src/meta.ts +11 -7
  331. package/src/operations/add-message.ts +81 -0
  332. package/src/operations/create-channel-thread.ts +26 -0
  333. package/src/operations/create-channel.ts +20 -0
  334. package/src/operations/create-proposals.ts +49 -0
  335. package/src/operations/create.ts +48 -0
  336. package/src/operations/definitions.ts +177 -0
  337. package/src/operations/delete-message.ts +53 -0
  338. package/src/operations/delete.ts +63 -0
  339. package/src/operations/index.ts +22 -0
  340. package/src/operations/on-create-space.ts +27 -0
  341. package/src/operations/restore-message.ts +38 -0
  342. package/src/operations/restore.ts +38 -0
  343. package/src/operations/select.ts +24 -0
  344. package/src/operations/toggle-resolved.ts +41 -0
  345. package/src/testing/data.ts +49 -0
  346. package/src/testing/index.ts +1 -1
  347. package/src/translations.ts +74 -71
  348. package/src/types/Channel.ts +37 -0
  349. package/src/types/Settings.ts +10 -0
  350. package/src/types/capabilities.ts +36 -0
  351. package/src/types/index.ts +2 -1
  352. package/src/types/types.ts +5 -91
  353. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  354. package/src/typings.d.ts +8 -0
  355. package/src/util.ts +2 -2
  356. package/dist/lib/browser/ChannelContainer-5YH4FTBL.mjs +0 -16
  357. package/dist/lib/browser/ChatContainer-2UYQ23KO.mjs +0 -15
  358. package/dist/lib/browser/app-graph-builder-Q5V3KXE3.mjs +0 -171
  359. package/dist/lib/browser/app-graph-builder-Q5V3KXE3.mjs.map +0 -7
  360. package/dist/lib/browser/call-manager-NIPDYUVD.mjs +0 -24
  361. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-5ZVJ4GAS.mjs +0 -21
  363. package/dist/lib/browser/chunk-5ZVJ4GAS.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-6NSMBO3B.mjs +0 -56
  365. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  366. package/dist/lib/browser/chunk-ERWASUQK.mjs +0 -149
  367. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  368. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  369. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  370. package/dist/lib/browser/chunk-GERVMFQW.mjs +0 -31
  371. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  372. package/dist/lib/browser/chunk-JVIKVYTI.mjs +0 -128
  373. package/dist/lib/browser/chunk-JVIKVYTI.mjs.map +0 -7
  374. package/dist/lib/browser/chunk-LCJD3NOB.mjs +0 -984
  375. package/dist/lib/browser/chunk-LCJD3NOB.mjs.map +0 -7
  376. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  377. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  378. package/dist/lib/browser/chunk-NCSFNWBZ.mjs +0 -479
  379. package/dist/lib/browser/chunk-NCSFNWBZ.mjs.map +0 -7
  380. package/dist/lib/browser/chunk-YD57K2SL.mjs +0 -367
  381. package/dist/lib/browser/chunk-YD57K2SL.mjs.map +0 -7
  382. package/dist/lib/browser/chunk-ZE7KWN36.mjs +0 -1669
  383. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  384. package/dist/lib/browser/intent-resolver-MWE6XLPY.mjs +0 -353
  385. package/dist/lib/browser/intent-resolver-MWE6XLPY.mjs.map +0 -7
  386. package/dist/lib/browser/markdown-ZO34G7RM.mjs +0 -169
  387. package/dist/lib/browser/markdown-ZO34G7RM.mjs.map +0 -7
  388. package/dist/lib/browser/react-root-YNDNPODD.mjs +0 -28
  389. package/dist/lib/browser/react-root-YNDNPODD.mjs.map +0 -7
  390. package/dist/lib/browser/react-surface-2AXRNTCA.mjs +0 -109
  391. package/dist/lib/browser/react-surface-2AXRNTCA.mjs.map +0 -7
  392. package/dist/lib/browser/settings-XZGPZNAU.mjs +0 -22
  393. package/dist/lib/browser/settings-XZGPZNAU.mjs.map +0 -7
  394. package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
  395. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  396. package/dist/lib/node-esm/ChannelContainer-O2LZKMRM.mjs +0 -17
  397. package/dist/lib/node-esm/ChannelContainer-O2LZKMRM.mjs.map +0 -7
  398. package/dist/lib/node-esm/ChatContainer-6N35MP5J.mjs +0 -16
  399. package/dist/lib/node-esm/ChatContainer-6N35MP5J.mjs.map +0 -7
  400. package/dist/lib/node-esm/app-graph-builder-GAKBZNU3.mjs +0 -172
  401. package/dist/lib/node-esm/app-graph-builder-GAKBZNU3.mjs.map +0 -7
  402. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
  403. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-25ABSYP2.mjs +0 -150
  405. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-3X3YKRM2.mjs +0 -129
  407. package/dist/lib/node-esm/chunk-3X3YKRM2.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-57XR3LEF.mjs +0 -33
  409. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  410. package/dist/lib/node-esm/chunk-5UQ4KKDE.mjs +0 -985
  411. package/dist/lib/node-esm/chunk-5UQ4KKDE.mjs.map +0 -7
  412. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  413. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  414. package/dist/lib/node-esm/chunk-A6QLTZCY.mjs +0 -480
  415. package/dist/lib/node-esm/chunk-A6QLTZCY.mjs.map +0 -7
  416. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  417. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  418. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs +0 -1670
  419. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  420. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs +0 -58
  421. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  422. package/dist/lib/node-esm/chunk-RGTWAVEE.mjs +0 -368
  423. package/dist/lib/node-esm/chunk-RGTWAVEE.mjs.map +0 -7
  424. package/dist/lib/node-esm/chunk-X62X3VOK.mjs +0 -23
  425. package/dist/lib/node-esm/chunk-X62X3VOK.mjs.map +0 -7
  426. package/dist/lib/node-esm/intent-resolver-B6PNTMPY.mjs +0 -354
  427. package/dist/lib/node-esm/intent-resolver-B6PNTMPY.mjs.map +0 -7
  428. package/dist/lib/node-esm/markdown-ZJUFV2TA.mjs +0 -170
  429. package/dist/lib/node-esm/markdown-ZJUFV2TA.mjs.map +0 -7
  430. package/dist/lib/node-esm/react-root-ZUVVTKWG.mjs +0 -29
  431. package/dist/lib/node-esm/react-root-ZUVVTKWG.mjs.map +0 -7
  432. package/dist/lib/node-esm/react-surface-OMEZTOU6.mjs +0 -110
  433. package/dist/lib/node-esm/react-surface-OMEZTOU6.mjs.map +0 -7
  434. package/dist/lib/node-esm/settings-XECBSD6Q.mjs +0 -23
  435. package/dist/lib/node-esm/settings-XECBSD6Q.mjs.map +0 -7
  436. package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
  437. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  438. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  439. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  440. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  441. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  442. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  443. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  444. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  445. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  446. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  447. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  448. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  449. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  450. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  451. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  452. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  453. package/dist/types/src/components/Comments.stories.d.ts +0 -6
  454. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  455. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  456. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  457. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  458. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  459. package/dist/types/src/components/MessageContainer.d.ts +0 -11
  460. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  461. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  462. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
  463. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  464. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  465. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  466. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  467. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  468. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  469. package/dist/types/src/components/testing.d.ts +0 -4
  470. package/dist/types/src/components/testing.d.ts.map +0 -1
  471. package/dist/types/src/testing/stories.d.ts +0 -2
  472. package/dist/types/src/testing/stories.d.ts.map +0 -1
  473. package/dist/types/src/types/schema.d.ts +0 -133
  474. package/dist/types/src/types/schema.d.ts.map +0 -1
  475. package/src/capabilities/capabilities.ts +0 -33
  476. package/src/capabilities/intent-resolver.ts +0 -296
  477. package/src/components/CallDebugPanel.tsx +0 -115
  478. package/src/components/CallSidebar.tsx +0 -17
  479. package/src/components/ChannelContainer.stories.tsx +0 -58
  480. package/src/components/Chat.stories.tsx +0 -88
  481. package/src/components/ChatContainer.tsx +0 -141
  482. package/src/components/Comments.stories.tsx +0 -92
  483. package/src/components/CommentsContainer.tsx +0 -71
  484. package/src/components/MessageContainer.tsx +0 -151
  485. package/src/components/ThreadComplementary.tsx +0 -151
  486. package/src/components/ThreadSettings.tsx +0 -17
  487. package/src/components/testing.ts +0 -29
  488. package/src/testing/stories.ts +0 -54
  489. package/src/types/schema.ts +0 -33
  490. /package/dist/lib/browser/{ChannelContainer-5YH4FTBL.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  491. /package/dist/lib/{browser/ChatContainer-2UYQ23KO.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,87 +2,90 @@
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';
8
- import { Obj, type Ref } from '@dxos/echo';
9
- import { SettingsStore } from '@dxos/local-storage';
9
+ import { Capabilities, Capability } from '@dxos/app-framework';
10
+ import { Surface, useCapability, useSettingsState } from '@dxos/app-framework/ui';
11
+ import { AppSurface } from '@dxos/app-toolkit/ui';
10
12
  import { getSpace } from '@dxos/react-client/echo';
13
+ import { Thread } from '@dxos/types';
11
14
 
12
- import { ThreadCapabilities } from './capabilities';
13
- import {
14
- CallSidebar,
15
- CallDebugPanel,
16
- ChannelContainer,
17
- ThreadComplementary,
18
- ThreadSettings,
19
- ChatContainer,
20
- } from '../components';
21
- import { THREAD_PLUGIN } from '../meta';
22
- import { ChannelType, ThreadType, type ThreadSettingsProps } from '../types';
15
+ import { ThreadSettings } from '#components';
16
+ import { CallDebugPanel, CallSidebar, ChannelContainer, ChatContainer, ThreadCompanion } from '#containers';
17
+ import { meta } from '#meta';
18
+ import { Channel, ThreadCapabilities, type Settings } from '#types';
23
19
 
24
- export default () =>
25
- contributes(Capabilities.ReactSurface, [
26
- createSurface({
27
- id: `${THREAD_PLUGIN}/channel`,
28
- role: 'article',
29
- filter: (data): data is { subject: ChannelType } => Obj.instanceOf(ChannelType, data.subject),
30
- component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
31
- }),
32
- createSurface({
33
- id: `${THREAD_PLUGIN}/chat-companion`,
34
- role: 'article',
35
- filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>
36
- Obj.instanceOf(ChannelType, data.companionTo) && data.subject === 'chat',
37
- component: ({ data: { companionTo: channel } }) => {
38
- const space = getSpace(channel);
39
- const thread = channel.defaultThread.target;
40
- if (!space || !thread) {
41
- return null;
42
- }
20
+ export default Capability.makeModule(() =>
21
+ Effect.succeed(
22
+ Capability.contributes(Capabilities.ReactSurface, [
23
+ Surface.create({
24
+ id: 'channel',
25
+ filter: AppSurface.object(AppSurface.Article, Channel.Channel),
26
+ component: ({ data: { subject, attendableId }, role }) => (
27
+ <ChannelContainer role={role} subject={subject} attendableId={attendableId} />
28
+ ),
29
+ }),
30
+ Surface.create({
31
+ id: 'chat-companion',
32
+ filter: AppSurface.allOf(
33
+ AppSurface.literal(AppSurface.Article, 'chat'),
34
+ AppSurface.companion(AppSurface.Article, Channel.Channel),
35
+ ),
36
+ component: ({ data: { companionTo: channel } }) => {
37
+ const space = getSpace(channel);
38
+ const thread = channel.defaultThread.target;
39
+ if (!space || !thread) {
40
+ return null;
41
+ }
43
42
 
44
- return <ChatContainer thread={thread} space={space} />;
45
- },
46
- }),
47
- createSurface({
48
- id: `${THREAD_PLUGIN}/thread`,
49
- role: 'article',
50
- filter: (data): data is { subject: ThreadType } => Obj.instanceOf(ThreadType, data.subject),
51
- component: ({ data: { subject: thread } }) => {
52
- const space = getSpace(thread);
53
- if (!space || !thread) {
54
- return null;
55
- }
43
+ return <ChatContainer thread={thread} space={space} />;
44
+ },
45
+ }),
46
+ Surface.create({
47
+ id: 'thread',
48
+ filter: AppSurface.object(AppSurface.Article, Thread.Thread),
49
+ component: ({ data: { subject } }) => {
50
+ const space = getSpace(subject);
51
+ if (!space || !subject) {
52
+ return null;
53
+ }
56
54
 
57
- return <ChatContainer thread={thread} space={space} />;
58
- },
59
- }),
60
- createSurface({
61
- id: `${THREAD_PLUGIN}/comments`,
62
- role: 'article',
63
- filter: (data): data is { companionTo: { threads: Ref.Ref<ThreadType>[] } } =>
64
- data.subject === 'comments' && Obj.isObject(data.companionTo),
65
- // TODO(wittjosiah): This isn't scrolling properly in a plank.
66
- component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
67
- }),
68
- createSurface({
69
- id: `${THREAD_PLUGIN}/plugin-settings`,
70
- role: 'article',
71
- filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
72
- data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
73
- component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
74
- }),
75
- createSurface({
76
- id: `${THREAD_PLUGIN}/assistant`,
77
- role: 'deck-companion--active-call',
78
- component: () => <CallSidebar />,
79
- }),
80
- createSurface({
81
- id: `${THREAD_PLUGIN}/devtools-overview`,
82
- role: 'devtools-overview',
83
- component: () => {
84
- const call = useCapability(ThreadCapabilities.CallManager);
85
- return <CallDebugPanel state={call.state} />;
86
- },
87
- }),
88
- ]);
55
+ return <ChatContainer thread={subject} space={space} />;
56
+ },
57
+ }),
58
+ Surface.create({
59
+ id: 'comments',
60
+ filter: AppSurface.allOf(
61
+ AppSurface.literal(AppSurface.Article, 'comments'),
62
+ AppSurface.companion(AppSurface.Article),
63
+ ),
64
+ // TODO(wittjosiah): This isn't scrolling properly in a plank.
65
+ component: ({ data }) => <ThreadCompanion attendableId={data.attendableId} subject={data.companionTo} />,
66
+ }),
67
+ Surface.create({
68
+ id: 'plugin-settings',
69
+ filter: AppSurface.settings(AppSurface.Article, meta.id),
70
+ component: ({ data: { subject } }) => {
71
+ const { settings, updateSettings } = useSettingsState<Settings.Settings>(subject.atom);
72
+ return <ThreadSettings settings={settings} onSettingsChange={updateSettings} />;
73
+ },
74
+ }),
75
+ Surface.create({
76
+ id: 'assistant',
77
+ role: 'deck-companion--active-call',
78
+ component: () => <CallSidebar />,
79
+ }),
80
+ Surface.create({
81
+ id: 'devtools-overview',
82
+ role: 'devtools-overview',
83
+ component: () => {
84
+ const call = useCapability(ThreadCapabilities.CallManager);
85
+ const state = useAtomValue(call.stateAtom);
86
+ return <CallDebugPanel state={state} />;
87
+ },
88
+ }),
89
+ ]),
90
+ ),
91
+ );
@@ -2,18 +2,34 @@
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
13
 
14
- return contributes(Capabilities.Settings, {
15
- prefix: meta.id,
16
- schema: ThreadSettingsSchema,
17
- value: settings,
18
- });
19
- };
14
+ import { ThreadCapabilities } from '../types/capabilities';
15
+
16
+ export default Capability.makeModule(() =>
17
+ Effect.sync(() => {
18
+ const settingsAtom = createKvsStore({
19
+ key: meta.id,
20
+ schema: Settings.Settings,
21
+ defaultValue: () => ({}),
22
+ });
23
+
24
+ return [
25
+ // Expose atom directly for programmatic access.
26
+ Capability.contributes(ThreadCapabilities.Settings, settingsAtom),
27
+ // Contribute to common settings for UI discovery.
28
+ Capability.contributes(AppCapabilities.Settings, {
29
+ prefix: meta.id,
30
+ schema: Settings.Settings,
31
+ atom: settingsAtom,
32
+ }),
33
+ ];
34
+ }),
35
+ );
@@ -2,24 +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 { ThreadCapabilities } from './capabilities';
9
- import { type ThreadState, type ViewStore } from '../types';
8
+ import { Capability } from '@dxos/app-framework';
10
9
 
11
- const initialViewState = { showResolvedThreads: false };
10
+ import { ThreadCapabilities, type ThreadState, type ViewStore } from '#types';
12
11
 
13
- export default () => {
14
- const state = live<ThreadState>({ toolbar: {}, drafts: {} });
15
- const viewStore = live<ViewStore>({});
12
+ export default Capability.makeModule(
13
+ Effect.fnUntraced(function* () {
14
+ const stateAtom = Atom.make<ThreadState>({ toolbar: {}, drafts: {} }).pipe(Atom.keepAlive);
15
+ const viewStoreAtom = Atom.make<ViewStore>({}).pipe(Atom.keepAlive);
16
16
 
17
- const getViewState = (subjectId: string) => {
18
- if (!viewStore[subjectId]) {
19
- viewStore[subjectId] = { ...initialViewState };
20
- }
21
- return viewStore[subjectId];
22
- };
23
-
24
- return contributes(ThreadCapabilities.State, { state, getViewState });
25
- };
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,16 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type PropsWithChildren, type FC } from 'react';
5
+ import { useAtomValue } from '@effect-atom/atom-react';
6
+ import React, { 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 { Toolbar, type ToolbarProps } from './Toolbar';
11
- import { ThreadCapabilities } from '../../capabilities';
12
- import { useDebugMode } from '../../hooks';
11
+ import { useDebugMode } from '#hooks';
12
+ import { ThreadCapabilities } from '#types';
13
+
13
14
  import { AudioStream } from '../Media';
14
15
  import { ParticipantGrid } from '../Participant';
16
+ import { Toolbar, type ToolbarProps } from './Toolbar';
15
17
 
16
18
  //
17
19
  // Root
@@ -19,8 +21,8 @@ import { ParticipantGrid } from '../Participant';
19
21
 
20
22
  type CallRootProps = PropsWithChildren<ThemedClassName>;
21
23
 
22
- const CallRoot: FC<CallRootProps> = ({ children }) => {
23
- return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;
24
+ const CallRoot = ({ children }: CallRootProps) => {
25
+ return <div className='relative dx-container flex flex-col'>{children}</div>;
24
26
  };
25
27
 
26
28
  CallRoot.displayName = 'CallRoot';
@@ -31,10 +33,11 @@ CallRoot.displayName = 'CallRoot';
31
33
 
32
34
  type CallAudioProps = {};
33
35
 
34
- const CallAudio: FC<CallAudioProps> = () => {
36
+ const CallAudio = (_props: CallAudioProps) => {
35
37
  const call = useCapability(ThreadCapabilities.CallManager);
38
+ const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
36
39
 
37
- return <AudioStream tracks={call.audioTracksToPlay} />;
40
+ return <AudioStream tracks={audioTracksToPlay} />;
38
41
  };
39
42
 
40
43
  CallAudio.displayName = 'CallAudio';
@@ -47,13 +50,15 @@ type CallGridProps = {
47
50
  fullscreen?: boolean;
48
51
  };
49
52
 
50
- const CallGrid: FC<CallGridProps> = ({ fullscreen }) => {
53
+ const CallGrid = ({ fullscreen }: CallGridProps) => {
51
54
  const debug = useDebugMode();
52
55
  const call = useCapability(ThreadCapabilities.CallManager);
56
+ const self = useAtomValue(call.selfAtom);
57
+ const users = useAtomValue(call.usersAtom);
53
58
 
54
59
  return (
55
60
  <div className='grid grow p-4 dark:bg-neutral-900'>
56
- <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />
61
+ <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />
57
62
  </div>
58
63
  );
59
64
  };
@@ -66,7 +71,7 @@ CallGrid.displayName = 'CallGrid';
66
71
 
67
72
  type CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;
68
73
 
69
- const CallToolbar: FC<CallToolbarProps> = (props) => {
74
+ const CallToolbar = (props: CallToolbarProps) => {
70
75
  return (
71
76
  <div className='absolute bottom-0 left-0 right-0 flex justify-center'>
72
77
  <Toolbar isInRoom {...props} />
@@ -2,28 +2,31 @@
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 { useNode, useActions } from '@dxos/plugin-graph';
9
- import { fullyQualifiedId } from '@dxos/react-client/echo';
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';
12
+ import { useActions, useNode } from '@dxos/plugin-graph';
10
13
  import {
11
14
  Icon,
12
15
  IconButton,
13
16
  type IconButtonProps,
17
+ Toolbar as NaturalToolbar,
14
18
  type ThemedClassName,
15
- Toolbar as NativeToolbar,
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 ChannelType } 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
- channel?: ChannelType;
29
+ channel?: Channel.Channel;
27
30
  participants?: number;
28
31
  autoHideControls?: boolean;
29
32
  isInRoom?: boolean;
@@ -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
- <NativeToolbar.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
- )) || <NativeToolbar.Separator variant='gap' />}
104
+ )) || <NaturalToolbar.Separator variant='gap' />}
99
105
 
100
- {call.joined && (
106
+ {joined && (
101
107
  <>
102
108
  <ToggleButton
103
109
  disabled={!canSharescreen}
@@ -105,53 +111,64 @@ 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
- </NativeToolbar.Root>
171
+ </NaturalToolbar.Root>
155
172
  </div>
156
173
  );
157
174
  };
@@ -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}