@dxos/plugin-thread 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (472) hide show
  1. package/dist/lib/browser/add-message-VPPFFLFL.mjs +97 -0
  2. package/dist/lib/browser/add-message-VPPFFLFL.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-MESW3R4Q.mjs +61 -0
  7. package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-VPM44Z35.mjs +259 -0
  9. package/dist/lib/browser/chunk-VPM44Z35.mjs.map +7 -0
  10. package/dist/lib/browser/create-OQKG4S47.mjs +55 -0
  11. package/dist/lib/browser/create-OQKG4S47.mjs.map +7 -0
  12. package/dist/lib/browser/create-channel-EF67LCS6.mjs +21 -0
  13. package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +7 -0
  14. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +28 -0
  15. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +7 -0
  16. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs +57 -0
  17. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +7 -0
  18. package/dist/lib/browser/delete-FSFVU6ZA.mjs +59 -0
  19. package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +7 -0
  20. package/dist/lib/browser/delete-message-XL5M5J33.mjs +64 -0
  21. package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +2253 -221
  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-VYS2JGVT.mjs +25 -0
  26. package/dist/lib/browser/on-create-space-VYS2JGVT.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-2ZGMKUSD.mjs +33 -0
  30. package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +7 -0
  31. package/dist/lib/browser/restore-message-OYEGWPII.mjs +42 -0
  32. package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +7 -0
  33. package/dist/lib/browser/select-VG2XLULE.mjs +26 -0
  34. package/dist/lib/browser/select-VG2XLULE.mjs.map +7 -0
  35. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs +45 -0
  36. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +8 -12
  38. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +98 -0
  39. package/dist/lib/node-esm/add-message-XWKHLNS6.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-HSLMI22Q.mjs +11 -0
  43. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +260 -0
  44. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +62 -0
  46. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-6ZOFMMYA.mjs +56 -0
  48. package/dist/lib/node-esm/create-6ZOFMMYA.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +22 -0
  50. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +29 -0
  52. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +58 -0
  54. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-WRODXR3E.mjs +60 -0
  56. package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +65 -0
  58. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +2253 -221
  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-XDY2YXPV.mjs +26 -0
  63. package/dist/lib/node-esm/on-create-space-XDY2YXPV.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-T3QA7TSL.mjs +34 -0
  67. package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +43 -0
  69. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +7 -0
  70. package/dist/lib/node-esm/select-Q4UDWJJF.mjs +27 -0
  71. package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +7 -0
  72. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +46 -0
  73. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +7 -0
  74. package/dist/lib/node-esm/types/index.mjs +8 -12
  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 +2 -2
  86. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  87. package/dist/types/src/calls/types.d.ts.map +1 -1
  88. package/dist/types/src/calls/util/calls-service.d.ts +4 -2
  89. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  90. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  91. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  92. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  93. package/dist/types/src/calls-service.stories.d.ts +10 -9
  94. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  96. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  98. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/call-manager.d.ts +3 -2
  100. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/index.d.ts +13 -13
  102. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  104. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  106. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  108. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  110. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/settings.d.ts +5 -2
  112. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/state.d.ts +5 -5
  114. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  116. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  117. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  118. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  119. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  120. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  121. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  122. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  123. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  125. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  126. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  127. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  128. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  130. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  132. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  134. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  135. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  136. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  137. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  138. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  140. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +160 -5
  141. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  143. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  144. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  145. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  146. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  148. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  149. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  150. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  151. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  152. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  153. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  154. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  155. package/dist/types/src/components/index.d.ts +4 -9
  156. package/dist/types/src/components/index.d.ts.map +1 -1
  157. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
  158. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  159. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  160. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  161. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  162. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  163. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  164. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  165. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  166. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  167. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  168. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  169. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  170. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  171. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +16 -0
  172. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  173. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  174. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  175. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  176. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  177. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  178. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  179. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  180. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  181. package/dist/types/src/containers/index.d.ts +7 -0
  182. package/dist/types/src/containers/index.d.ts.map +1 -0
  183. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  184. package/dist/types/src/extensions/command.d.ts.map +1 -0
  185. package/dist/types/src/extensions/index.d.ts +1 -0
  186. package/dist/types/src/extensions/index.d.ts.map +1 -1
  187. package/dist/types/src/extensions/threads.d.ts +8 -3
  188. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  189. package/dist/types/src/hooks/analytics.d.ts +2 -3
  190. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  191. package/dist/types/src/hooks/index.d.ts +2 -1
  192. package/dist/types/src/hooks/index.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  194. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  195. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  196. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  197. package/dist/types/src/index.d.ts +1 -1
  198. package/dist/types/src/index.d.ts.map +1 -1
  199. package/dist/types/src/meta.d.ts +3 -4
  200. package/dist/types/src/meta.d.ts.map +1 -1
  201. package/dist/types/src/operations/add-message.d.ts +5 -0
  202. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  203. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  204. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  205. package/dist/types/src/operations/create-channel.d.ts +5 -0
  206. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  207. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  208. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  209. package/dist/types/src/operations/create.d.ts +5 -0
  210. package/dist/types/src/operations/create.d.ts.map +1 -0
  211. package/dist/types/src/operations/definitions.d.ts +2804 -0
  212. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  213. package/dist/types/src/operations/delete-message.d.ts +5 -0
  214. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  215. package/dist/types/src/operations/delete.d.ts +5 -0
  216. package/dist/types/src/operations/delete.d.ts.map +1 -0
  217. package/dist/types/src/operations/index.d.ts +4 -0
  218. package/dist/types/src/operations/index.d.ts.map +1 -0
  219. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  220. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  221. package/dist/types/src/operations/restore-message.d.ts +5 -0
  222. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  223. package/dist/types/src/operations/restore.d.ts +5 -0
  224. package/dist/types/src/operations/restore.d.ts.map +1 -0
  225. package/dist/types/src/operations/select.d.ts +5 -0
  226. package/dist/types/src/operations/select.d.ts.map +1 -0
  227. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  228. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  229. package/dist/types/src/testing/data.d.ts +5 -0
  230. package/dist/types/src/testing/data.d.ts.map +1 -0
  231. package/dist/types/src/testing/stories.d.ts +2 -1
  232. package/dist/types/src/testing/stories.d.ts.map +1 -1
  233. package/dist/types/src/translations.d.ts +142 -72
  234. package/dist/types/src/translations.d.ts.map +1 -1
  235. package/dist/types/src/types/Channel.d.ts +715 -0
  236. package/dist/types/src/types/Channel.d.ts.map +1 -0
  237. package/dist/types/src/types/Settings.d.ts +5 -0
  238. package/dist/types/src/types/Settings.d.ts.map +1 -0
  239. package/dist/types/src/types/capabilities.d.ts +24 -0
  240. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  241. package/dist/types/src/types/index.d.ts +2 -1
  242. package/dist/types/src/types/index.d.ts.map +1 -1
  243. package/dist/types/src/types/types.d.ts +4 -374
  244. package/dist/types/src/types/types.d.ts.map +1 -1
  245. package/dist/types/src/util.d.ts.map +1 -1
  246. package/dist/types/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +112 -67
  248. package/src/ThreadPlugin.tsx +108 -132
  249. package/src/blueprints/index.ts +5 -0
  250. package/src/blueprints/thread-blueprint.ts +37 -0
  251. package/src/calls/call-manager.ts +77 -53
  252. package/src/calls/call-swarm-synchronizer.ts +2 -2
  253. package/src/calls/media-manager.ts +65 -36
  254. package/src/calls/types.ts +7 -3
  255. package/src/calls/util/calls-service.ts +62 -13
  256. package/src/calls/util/stub-media-streams.ts +62 -5
  257. package/src/calls/util/task-scheduling.ts +4 -4
  258. package/src/calls-service.stories.tsx +79 -65
  259. package/src/capabilities/app-graph-builder.ts +175 -163
  260. package/src/capabilities/blueprint-definition.ts +17 -0
  261. package/src/capabilities/call-manager.ts +19 -12
  262. package/src/capabilities/index.ts +15 -11
  263. package/src/capabilities/markdown.ts +50 -37
  264. package/src/capabilities/operation-handler.ts +16 -0
  265. package/src/capabilities/react-root.tsx +12 -9
  266. package/src/capabilities/react-surface.tsx +80 -78
  267. package/src/capabilities/settings.ts +28 -12
  268. package/src/capabilities/state.ts +14 -18
  269. package/src/capabilities/undo-mappings.ts +46 -0
  270. package/src/components/Call/Call.tsx +11 -7
  271. package/src/components/Call/Toolbar.tsx +61 -44
  272. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +93 -0
  273. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  274. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +66 -62
  275. package/src/components/CommentsPanel/index.ts +6 -0
  276. package/src/components/Lobby/Lobby.tsx +15 -12
  277. package/src/components/Media/AudioStream.tsx +2 -2
  278. package/src/components/Media/VideoObject.stories.tsx +37 -31
  279. package/src/components/Media/VideoObject.tsx +1 -1
  280. package/src/components/MessagePanel/MessagePanel.tsx +222 -0
  281. package/src/components/MessagePanel/index.ts +5 -0
  282. package/src/components/Participant/Participant.tsx +35 -15
  283. package/src/components/Participant/ParticipantGrid.tsx +0 -1
  284. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +48 -48
  285. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  286. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +12 -9
  287. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +9 -11
  288. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  289. package/src/components/ResponsiveGrid/index.ts +1 -1
  290. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +31 -0
  291. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  292. package/src/components/ThreadSettings/index.ts +5 -0
  293. package/src/components/index.ts +5 -12
  294. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +173 -0
  295. package/src/containers/CallDebugPanel/index.ts +5 -0
  296. package/src/containers/CallSidebar/CallSidebar.tsx +18 -0
  297. package/src/containers/CallSidebar/index.ts +5 -0
  298. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +61 -0
  299. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +93 -71
  300. package/src/containers/ChannelContainer/index.ts +5 -0
  301. package/src/containers/ChatContainer/ChatContainer.stories.tsx +87 -0
  302. package/src/containers/ChatContainer/ChatContainer.tsx +131 -0
  303. package/src/containers/ChatContainer/index.ts +8 -0
  304. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +217 -0
  305. package/src/containers/ThreadCompanion/index.ts +5 -0
  306. package/src/containers/index.ts +11 -0
  307. package/src/{components/command-extension.ts → extensions/command.ts} +6 -3
  308. package/src/extensions/index.ts +1 -0
  309. package/src/extensions/threads.ts +87 -42
  310. package/src/hooks/analytics.ts +22 -21
  311. package/src/hooks/index.ts +3 -1
  312. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  313. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  314. package/src/index.ts +1 -1
  315. package/src/meta.ts +11 -7
  316. package/src/operations/add-message.ts +81 -0
  317. package/src/operations/create-channel-thread.ts +26 -0
  318. package/src/operations/create-channel.ts +20 -0
  319. package/src/operations/create-proposals.ts +49 -0
  320. package/src/operations/create.ts +48 -0
  321. package/src/operations/definitions.ts +177 -0
  322. package/src/operations/delete-message.ts +53 -0
  323. package/src/operations/delete.ts +63 -0
  324. package/src/operations/index.ts +22 -0
  325. package/src/operations/on-create-space.ts +27 -0
  326. package/src/operations/restore-message.ts +38 -0
  327. package/src/operations/restore.ts +38 -0
  328. package/src/operations/select.ts +24 -0
  329. package/src/operations/toggle-resolved.ts +41 -0
  330. package/src/testing/data.ts +49 -0
  331. package/src/testing/stories.ts +18 -21
  332. package/src/translations.ts +74 -73
  333. package/src/types/Channel.ts +37 -0
  334. package/src/types/Settings.ts +10 -0
  335. package/src/types/capabilities.ts +36 -0
  336. package/src/types/index.ts +2 -1
  337. package/src/types/types.ts +5 -100
  338. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  339. package/src/util.ts +2 -2
  340. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  341. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  342. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs +0 -171
  343. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  344. package/dist/lib/browser/call-manager-XRRCAVLI.mjs +0 -24
  345. package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +0 -7
  346. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  347. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  348. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  349. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  351. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  353. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  355. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-GERVMFQW.mjs +0 -31
  357. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  359. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-JGKMMI65.mjs +0 -56
  361. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-TUFWPOVS.mjs +0 -1698
  363. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-X5PIP5YR.mjs +0 -149
  365. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  366. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs +0 -984
  367. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  368. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs +0 -369
  369. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  370. package/dist/lib/browser/markdown-WZSXCEZJ.mjs +0 -169
  371. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  372. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  373. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  374. package/dist/lib/browser/react-surface-PYAMIADB.mjs +0 -109
  375. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  376. package/dist/lib/browser/settings-AC6YSASL.mjs +0 -22
  377. package/dist/lib/browser/settings-AC6YSASL.mjs.map +0 -7
  378. package/dist/lib/browser/state-2T4KDWBX.mjs +0 -34
  379. package/dist/lib/browser/state-2T4KDWBX.mjs.map +0 -7
  380. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  381. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs.map +0 -7
  382. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  383. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs.map +0 -7
  384. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs +0 -172
  385. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  386. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs +0 -25
  387. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-4TME3BR4.mjs +0 -1699
  389. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-57XR3LEF.mjs +0 -33
  391. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  393. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  395. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  397. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  399. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs +0 -58
  401. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-SED3O2XO.mjs +0 -150
  403. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  405. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  407. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs +0 -985
  409. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  410. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs +0 -370
  411. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  412. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs +0 -170
  413. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  414. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  415. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  416. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs +0 -110
  417. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  418. package/dist/lib/node-esm/settings-N52O7MLS.mjs +0 -23
  419. package/dist/lib/node-esm/settings-N52O7MLS.mjs.map +0 -7
  420. package/dist/lib/node-esm/state-62TQKQVB.mjs +0 -35
  421. package/dist/lib/node-esm/state-62TQKQVB.mjs.map +0 -7
  422. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  423. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  424. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  425. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  426. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  427. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  428. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  429. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  430. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  431. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  432. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  433. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  434. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  435. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  436. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  437. package/dist/types/src/components/Comments.stories.d.ts +0 -6
  438. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  439. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  440. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  441. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  442. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  443. package/dist/types/src/components/MessageContainer.d.ts +0 -11
  444. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  445. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  446. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
  447. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  448. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  449. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  450. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  451. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  452. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  453. package/dist/types/src/components/testing.d.ts +0 -4
  454. package/dist/types/src/components/testing.d.ts.map +0 -1
  455. package/dist/types/src/types/schema.d.ts +0 -164
  456. package/dist/types/src/types/schema.d.ts.map +0 -1
  457. package/src/capabilities/capabilities.ts +0 -33
  458. package/src/capabilities/intent-resolver.ts +0 -315
  459. package/src/components/CallDebugPanel.tsx +0 -115
  460. package/src/components/CallSidebar.tsx +0 -18
  461. package/src/components/ChannelContainer.stories.tsx +0 -59
  462. package/src/components/Chat.stories.tsx +0 -89
  463. package/src/components/ChatContainer.tsx +0 -142
  464. package/src/components/Comments.stories.tsx +0 -93
  465. package/src/components/CommentsContainer.tsx +0 -72
  466. package/src/components/MessageContainer.tsx +0 -152
  467. package/src/components/ThreadComplementary.tsx +0 -151
  468. package/src/components/ThreadSettings.tsx +0 -17
  469. package/src/components/testing.ts +0 -29
  470. package/src/types/schema.ts +0 -33
  471. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  472. /package/dist/lib/{browser/ChatContainer-PVT3DUZJ.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,180 +2,192 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe } from 'effect';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Option from 'effect/Option';
7
8
 
8
- import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
+ import { Capability } from '@dxos/app-framework';
10
+ import { AppCapabilities, AppNode } from '@dxos/app-toolkit';
9
11
  import { Obj } from '@dxos/echo';
10
- import { AttentionCapabilities } from '@dxos/plugin-attention';
11
- import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
12
- import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
13
- import { fullyQualifiedId } from '@dxos/react-client/echo';
12
+ import { Operation } from '@dxos/operation';
13
+ import { AttentionCapabilities } from '@dxos/plugin-attention/types';
14
+ import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
15
+ import { linkedSegment } from '@dxos/react-ui-attention';
16
+ import { type SelectionManager, type SelectionMode, defaultSelection } from '@dxos/react-ui-attention';
14
17
 
15
- import { THREAD_PLUGIN, meta } from '../meta';
16
- import { ChannelType, ThreadAction } from '../types';
17
- import { getAnchor } from '../util';
18
+ import { meta } from '#meta';
19
+ import { ThreadOperation } from '#operations';
20
+ import { Channel, ThreadCapabilities, type ThreadState } from '#types';
18
21
 
19
- import { ThreadCapabilities } from './capabilities';
22
+ import { getAnchor } from '../util';
20
23
 
21
- export default (context: PluginContext) => {
22
- const resolve = (typename: string) =>
23
- context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
24
+ type CommentDisabledParams = {
25
+ stateAtom: Atom.Atom<Atom.Writable<ThreadState>[]>;
26
+ selectionManager: SelectionManager;
27
+ objectId: string;
28
+ commentsType: string;
29
+ selectionMode: SelectionMode | undefined;
30
+ };
24
31
 
25
- return contributes(Capabilities.AppGraphBuilder, [
26
- createExtension({
27
- id: `${THREAD_PLUGIN}/active-call`,
28
- connector: (node) =>
29
- Rx.make((get) =>
30
- pipe(
31
- get(node),
32
- Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
33
- Option.map((node) => {
34
- const [call] = get(context.capabilities(ThreadCapabilities.CallManager));
35
- return get(
36
- rxFromSignal(() =>
37
- call?.joined
38
- ? [
39
- {
40
- id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,
41
- type: DECK_COMPANION_TYPE,
42
- data: null,
43
- properties: {
44
- label: ['call panel label', { ns: THREAD_PLUGIN }],
45
- icon: 'ph--video-conference--regular',
46
- position: 'hoist',
47
- disposition: 'hidden',
48
- },
49
- },
50
- ]
51
- : [],
52
- ),
53
- );
54
- }),
55
- Option.getOrElse(() => []),
56
- ),
57
- ),
32
+ /**
33
+ * Atom family to derive whether the comment button should be disabled.
34
+ * Uses a composite key to ensure proper caching.
35
+ */
36
+ const commentDisabledFamily = Atom.family(
37
+ ({ stateAtom, selectionManager, objectId, commentsType, selectionMode }: CommentDisabledParams) =>
38
+ Atom.make((get) => {
39
+ const stateAtoms = get(stateAtom);
40
+ const state = stateAtoms[0] ? get(stateAtoms[0]) : undefined;
41
+ const toolbar = state?.toolbar ?? {};
42
+ const selectionState = get(selectionManager.state);
43
+ const selection =
44
+ selectionState.selections[objectId] ?? (selectionMode ? defaultSelection(selectionMode) : undefined);
45
+ const anchor = getAnchor(selection);
46
+ const invalidSelection = !anchor;
47
+ const overlappingComment = toolbar[objectId];
48
+ return (commentsType === 'anchored' && invalidSelection) || overlappingComment;
58
49
  }),
59
- // TODO(wittjosiah): The channel shouldn't become the companion during a call.
60
- // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
61
- createExtension({
62
- id: `${THREAD_PLUGIN}/channel-chat-companion`,
63
- connector: (node) => {
64
- return Rx.make((get) => {
65
- return pipe(
66
- get(node),
67
- Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),
68
- Option.map((channel) => {
69
- const callManager = context.getCapability(ThreadCapabilities.CallManager);
70
- const joined = get(
71
- rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),
72
- );
73
- if (!joined) {
74
- return [];
75
- }
50
+ );
51
+
52
+ /** Match ECHO objects that are NOT Channels (i.e. objects that can have comments). */
53
+ const whenCommentableObject = NodeMatcher.whenAll(
54
+ NodeMatcher.whenEchoObjectMatches,
55
+ NodeMatcher.whenNot(NodeMatcher.whenEchoTypeMatches(Channel.Channel)),
56
+ );
76
57
 
77
- return [
78
- {
79
- id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,
80
- type: PLANK_COMPANION_TYPE,
81
- data: 'chat',
82
- properties: {
83
- label: ['channel companion label', { ns: THREAD_PLUGIN }],
84
- icon: 'ph--hash--regular',
58
+ // TODO(wittjosiah): Highlight active calls in L1.
59
+ // Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
60
+ export default Capability.makeModule(
61
+ Effect.fnUntraced(function* () {
62
+ const capabilities = yield* Capability.Service;
63
+
64
+ const resolve = (typename: string) =>
65
+ capabilities.getAll(AppCapabilities.Metadata).find(({ id }: { id: string }) => id === typename)?.metadata ?? {};
66
+
67
+ const extensions = yield* Effect.all([
68
+ GraphBuilder.createExtension({
69
+ id: 'active-call',
70
+ match: NodeMatcher.whenRoot,
71
+ connector: (node, get) => {
72
+ const callManagerAtom = capabilities.atom(ThreadCapabilities.CallManager);
73
+ const [call] = get(callManagerAtom);
74
+ if (!call) {
75
+ return Effect.succeed([]);
76
+ }
77
+ // Use derived joinedAtom for efficient subscription.
78
+ const joined = get(call.joinedAtom);
79
+ return Effect.succeed(
80
+ joined
81
+ ? [
82
+ AppNode.makeDeckCompanion({
83
+ id: 'active-call',
84
+ label: ['call-panel.label', { ns: meta.id }],
85
+ icon: 'ph--video-conference--regular',
86
+ data: null,
85
87
  position: 'hoist',
86
- disposition: 'hidden',
87
- },
88
- },
89
- ];
90
- }),
91
- Option.getOrElse(() => []),
88
+ }),
89
+ ]
90
+ : [],
92
91
  );
93
- });
94
- },
95
- }),
96
- createExtension({
97
- id: `${meta.id}/comments-companion`,
98
- connector: (node) =>
99
- Rx.make((get) =>
100
- pipe(
101
- get(node),
102
- Option.flatMap((node) => {
103
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
104
- return Option.none();
105
- }
106
- const metadata = resolve(Obj.getTypename(node.data)!);
107
- return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();
92
+ },
93
+ }),
94
+ GraphBuilder.createTypeExtension({
95
+ id: 'channel-chat-companion',
96
+ type: Channel.Channel,
97
+ connector: (channel, get) => {
98
+ const callManager = capabilities.get(ThreadCapabilities.CallManager);
99
+ // Use derived atoms for efficient subscription.
100
+ const joined = get(callManager.joinedAtom);
101
+ const roomId = get(callManager.roomIdAtom);
102
+ const isActive = joined && roomId === Obj.getDXN(channel).toString();
103
+ if (!isActive) {
104
+ return Effect.succeed([]);
105
+ }
106
+
107
+ return Effect.succeed([
108
+ AppNode.makeCompanion({
109
+ id: 'chat',
110
+ label: ['channel-companion.label', { ns: meta.id }],
111
+ icon: 'ph--hash--regular',
112
+ data: 'chat',
113
+ position: 'hoist',
108
114
  }),
109
- Option.map((node) => [
110
- {
111
- id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),
112
- type: PLANK_COMPANION_TYPE,
113
- data: 'comments',
114
- properties: {
115
- label: ['comments label', { ns: meta.id }],
116
- icon: 'ph--chat-text--regular',
117
- disposition: 'hidden',
118
- position: 'hoist',
119
- },
120
- },
121
- ]),
122
- Option.getOrElse(() => []),
123
- ),
124
- ),
125
- }),
126
- createExtension({
127
- id: `${meta.id}/comment-toolbar`,
128
- actions: (node) =>
129
- Rx.make((get) =>
130
- pipe(
131
- get(node),
132
- Option.flatMap((node) => {
133
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
134
- return Option.none();
135
- }
136
- const metadata = resolve(Obj.getTypename(node.data)!);
137
- return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();
115
+ ]);
116
+ },
117
+ }),
118
+ GraphBuilder.createExtension({
119
+ id: 'comments-companion',
120
+ match: (node) => {
121
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
122
+ return Option.none();
123
+ }
124
+ const metadata = resolve(Obj.getTypename(node.data)!);
125
+ return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();
126
+ },
127
+ connector: () =>
128
+ Effect.succeed([
129
+ AppNode.makeCompanion({
130
+ id: linkedSegment('comments'),
131
+ label: ['comments.label', { ns: meta.id }],
132
+ icon: 'ph--chat-text--regular',
133
+ data: 'comments',
134
+ position: 'hoist',
138
135
  }),
139
- Option.map((object) => {
140
- const selectionManager = context.getCapability(AttentionCapabilities.Selection);
141
- const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
142
- const disabled = get(
143
- rxFromSignal(() => {
144
- const metadata = resolve(Obj.getTypename(object)!);
145
- const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);
146
- const anchor = getAnchor(selection);
147
- const invalidSelection = !anchor;
148
- const overlappingComment = toolbar[fullyQualifiedId(object)];
149
- return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;
150
- }),
151
- );
136
+ ]),
137
+ }),
138
+ GraphBuilder.createExtension({
139
+ id: 'comment-toolbar',
140
+ match: (node) => {
141
+ if (!Obj.isObject(node.data) || Option.isNone(whenCommentableObject(node))) {
142
+ return Option.none();
143
+ }
144
+ const metadata = resolve(Obj.getTypename(node.data)!);
145
+ return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();
146
+ },
147
+ actions: (matched, get) => {
148
+ const object = matched.data;
149
+ const objectDxn = Obj.getDXN(object).toString();
150
+ const stateAtom = capabilities.atom(ThreadCapabilities.State);
151
+ const selectionManager = capabilities.get(AttentionCapabilities.Selection);
152
+ const metadata = resolve(Obj.getTypename(object)!);
152
153
 
153
- return [
154
- {
155
- id: `${fullyQualifiedId(object)}/comment`,
156
- data: () => {
157
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
158
- const metadata = resolve(Obj.getTypename(object)!);
159
- const selection = selectionManager.getSelection(fullyQualifiedId(object));
160
- // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.
161
- // Requires all components which support selection (e.g. table/kanban) to support anchored comments.
162
- const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
163
- const name = metadata.getAnchorLabel?.(object, anchor);
164
- void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));
165
- },
166
- properties: {
167
- label: ['add comment label', { ns: meta.id }],
168
- icon: 'ph--chat-text--regular',
169
- disposition: 'toolbar',
170
- disabled,
171
- testId: 'thread.comment.add',
172
- },
173
- },
174
- ];
154
+ const disabled = get(
155
+ commentDisabledFamily({
156
+ stateAtom,
157
+ selectionManager,
158
+ objectId: objectDxn,
159
+ commentsType: metadata.comments as string,
160
+ selectionMode: metadata.selectionMode,
175
161
  }),
176
- Option.getOrElse(() => []),
177
- ),
178
- ),
179
- }),
180
- ]);
181
- };
162
+ );
163
+
164
+ return Effect.succeed([
165
+ {
166
+ id: 'comment',
167
+ data: Effect.fnUntraced(function* () {
168
+ const metadata = resolve(Obj.getTypename(object)!);
169
+ const selection = selectionManager.getSelection(objectDxn);
170
+ const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
171
+ const name = metadata.getAnchorLabel?.(object, anchor);
172
+ yield* Operation.invoke(ThreadOperation.Create, {
173
+ anchor,
174
+ name,
175
+ subject: object,
176
+ });
177
+ }),
178
+ properties: {
179
+ label: ['add-comment.label', { ns: meta.id }],
180
+ icon: 'ph--chat-text--regular',
181
+ disposition: 'toolbar',
182
+ disabled,
183
+ testId: 'thread.comment.add',
184
+ },
185
+ },
186
+ ]);
187
+ },
188
+ }),
189
+ ]);
190
+
191
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
192
+ }),
193
+ );
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities } from '@dxos/app-toolkit';
9
+
10
+ import { ThreadBlueprint } from '#blueprints';
11
+
12
+ const blueprintDefinition = Capability.makeModule<
13
+ [],
14
+ Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[]
15
+ >(() => Effect.succeed([Capability.contributes(AppCapabilities.BlueprintDefinition, ThreadBlueprint)]));
16
+
17
+ export default blueprintDefinition;
@@ -2,19 +2,26 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginContext, contributes } from '@dxos/app-framework';
6
- import { ClientCapabilities } from '@dxos/plugin-client';
5
+ import * as Effect from 'effect/Effect';
7
6
 
8
- import { CallManager } from '../calls';
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { ClientCapabilities } from '@dxos/plugin-client/types';
9
+
10
+ import { ThreadCapabilities } from '#types';
9
11
 
10
- import { ThreadCapabilities } from './capabilities';
12
+ import { CallManager } from '../calls';
11
13
 
12
- export default async (context: PluginContext) => {
13
- const client = context.getCapability(ClientCapabilities.Client);
14
- const callManager = new CallManager(client);
15
- await callManager.open();
14
+ export default Capability.makeModule(
15
+ Effect.fnUntraced(function* () {
16
+ const client = yield* Capability.get(ClientCapabilities.Client);
17
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
18
+ const callManager = new CallManager(client, registry);
19
+ yield* Effect.tryPromise(() => callManager.open());
16
20
 
17
- return contributes(ThreadCapabilities.CallManager, callManager, () => {
18
- void callManager.close();
19
- });
20
- };
21
+ return Capability.contributes(ThreadCapabilities.CallManager, callManager, () =>
22
+ Effect.sync(() => {
23
+ void callManager.close();
24
+ }),
25
+ );
26
+ }),
27
+ );
@@ -2,15 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from '@dxos/app-framework';
5
+ import { Capability } from '@dxos/app-framework';
6
+ import { OperationHandlerSet } from '@dxos/operation';
6
7
 
7
- export const AppGraphBuilder = lazy(() => import('./app-graph-builder'));
8
- export const CallManager = lazy(() => import('./call-manager'));
9
- export const IntentResolver = lazy(() => import('./intent-resolver'));
10
- export const Markdown = lazy(() => import('./markdown'));
11
- export const ReactRoot = lazy(() => import('./react-root'));
12
- export const ReactSurface = lazy(() => import('./react-surface'));
13
- export const ThreadSettings = lazy(() => import('./settings'));
14
- export const ThreadState = lazy(() => import('./state'));
15
-
16
- export * from './capabilities';
8
+ export const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));
9
+ export const BlueprintDefinition = Capability.lazy('BlueprintDefinition', () => import('./blueprint-definition'));
10
+ export const CallManager = Capability.lazy('CallManager', () => import('./call-manager'));
11
+ export const Markdown = Capability.lazy('Markdown', () => import('./markdown'));
12
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
13
+ 'OperationHandler',
14
+ () => import('./operation-handler'),
15
+ );
16
+ export const ReactRoot = Capability.lazy('ReactRoot', () => import('./react-root'));
17
+ export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
18
+ export const ThreadSettings = Capability.lazy('ThreadSettings', () => import('./settings'));
19
+ export const ThreadState = Capability.lazy('ThreadState', () => import('./state'));
20
+ export const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));
@@ -3,53 +3,66 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
+ import * as Effect from 'effect/Effect';
6
7
 
7
- import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
8
- import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { DeckOperation } from '@dxos/plugin-deck/operations';
9
10
  import { MarkdownCapabilities } from '@dxos/plugin-markdown';
10
- import { fullyQualifiedId } from '@dxos/react-client/echo';
11
- import { type EditorState, commentClickedEffect, commentsState, overlap } from '@dxos/react-ui-editor';
11
+ import { linkedSegment } from '@dxos/react-ui-attention';
12
+ import { type EditorState, commentClickedEffect, commentsState, documentId, overlap } from '@dxos/ui-editor';
13
+
14
+ import { ThreadCapabilities } from '#types';
12
15
 
13
16
  import { threads } from '../extensions';
14
17
 
15
- import { ThreadCapabilities } from './capabilities';
18
+ export default Capability.makeModule(
19
+ Effect.fnUntraced(function* () {
20
+ // Get context for lazy capability access in callbacks.
21
+ const capabilities = yield* Capability.Service;
16
22
 
17
- export default (context: PluginContext) =>
18
- contributes(MarkdownCapabilities.Extensions, [
19
- ({ document: doc }) => {
20
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
21
- const { state } = context.getCapability(ThreadCapabilities.MutableState);
22
- return threads(state, doc, dispatch);
23
- },
24
- ({ document: doc }) => {
25
- const { state } = context.getCapability(ThreadCapabilities.MutableState);
23
+ return Capability.contributes(MarkdownCapabilities.Extensions, [
24
+ ({ document: doc }) => {
25
+ const { invokePromise } = capabilities.get(Capabilities.OperationInvoker);
26
+ const registry = capabilities.get(Capabilities.AtomRegistry);
27
+ const stateAtom = capabilities.get(ThreadCapabilities.State);
28
+ return threads({ registry, stateAtom }, doc, invokePromise);
29
+ },
30
+ ({ document: doc }) => {
31
+ if (!doc) return [];
32
+ const registry = capabilities.get(Capabilities.AtomRegistry);
33
+ const stateAtom = capabilities.get(ThreadCapabilities.State);
26
34
 
27
- return EditorView.updateListener.of((update) => {
28
- if (update.docChanged || update.selectionSet) {
29
- state.toolbar[fullyQualifiedId(doc)] = selectionOverlapsComment(update.state);
30
- }
31
- });
32
- },
33
- ({ document: doc }) => {
34
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
35
- const id = fullyQualifiedId(doc);
35
+ return EditorView.updateListener.of((update) => {
36
+ if (update.docChanged || update.selectionSet) {
37
+ const id = update.state.facet(documentId);
38
+ const overlaps = selectionOverlapsComment(update.state);
39
+ const current = registry.get(stateAtom);
40
+ registry.set(stateAtom, {
41
+ ...current,
42
+ toolbar: { ...current.toolbar, [id]: overlaps },
43
+ });
44
+ }
45
+ });
46
+ },
47
+ ({ document: doc }) => {
48
+ if (!doc) return [];
49
+ const { invokePromise } = capabilities.get(Capabilities.OperationInvoker);
36
50
 
37
- return EditorView.updateListener.of((update) => {
38
- update.transactions.forEach((transaction) => {
39
- transaction.effects.forEach(async (effect) => {
40
- if (effect.is(commentClickedEffect)) {
41
- void dispatch(
42
- createIntent(DeckAction.ChangeCompanion, {
43
- primary: id,
44
- companion: `${id}${ATTENDABLE_PATH_SEPARATOR}comments`,
45
- }),
46
- );
47
- }
51
+ return EditorView.updateListener.of((update) => {
52
+ update.transactions.forEach((transaction) => {
53
+ transaction.effects.forEach(async (effect) => {
54
+ if (effect.is(commentClickedEffect)) {
55
+ void invokePromise(DeckOperation.ChangeCompanion, {
56
+ companion: linkedSegment('comments'),
57
+ });
58
+ }
59
+ });
48
60
  });
49
61
  });
50
- });
51
- },
52
- ]);
62
+ },
63
+ ]);
64
+ }),
65
+ );
53
66
 
54
67
  const selectionOverlapsComment = (state: EditorState): boolean => {
55
68
  // May not be defined if thread plugin not installed.
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import type { OperationHandlerSet } from '@dxos/operation';
9
+
10
+ import { ThreadOperationHandlerSet } from '#operations';
11
+
12
+ export default Capability.makeModule<OperationHandlerSet.OperationHandlerSet>(
13
+ Effect.fnUntraced(function* () {
14
+ return Capability.contributes(Capabilities.OperationHandler, ThreadOperationHandlerSet);
15
+ }),
16
+ );
@@ -2,16 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import * as Effect from 'effect/Effect';
5
6
  import React from 'react';
6
7
 
7
- import { Capabilities, contributes } from '@dxos/app-framework';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
9
 
9
- import { Call } from '../components';
10
- import { THREAD_PLUGIN } from '../meta';
10
+ import { Call } from '#components';
11
+ import { meta } from '#meta';
11
12
 
12
- export default () => {
13
- return contributes(Capabilities.ReactRoot, {
14
- id: THREAD_PLUGIN,
15
- root: () => <Call.Audio />,
16
- });
17
- };
13
+ export default Capability.makeModule(() =>
14
+ Effect.sync(() => {
15
+ return Capability.contributes(Capabilities.ReactRoot, {
16
+ id: meta.id,
17
+ root: () => <Call.Audio />,
18
+ });
19
+ }),
20
+ );