@dxos/plugin-thread 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (482) hide show
  1. package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs +182 -0
  2. package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs.map +7 -0
  3. package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs +33 -0
  4. package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs.map +7 -0
  5. package/dist/lib/browser/ChannelContainer-EPYG4QAC.mjs +15 -0
  6. package/dist/lib/browser/ChatContainer-2243UD2M.mjs +14 -0
  7. package/dist/lib/browser/ThreadCompanion-2CMLJH76.mjs +204 -0
  8. package/dist/lib/browser/ThreadCompanion-2CMLJH76.mjs.map +7 -0
  9. package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs +20 -0
  10. package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs.map +7 -0
  11. package/dist/lib/browser/app-graph-builder-5LCAM746.mjs +191 -0
  12. package/dist/lib/browser/app-graph-builder-5LCAM746.mjs.map +7 -0
  13. package/dist/lib/browser/blueprint-definition-42M2EJ2Y.mjs +17 -0
  14. package/dist/lib/browser/blueprint-definition-42M2EJ2Y.mjs.map +7 -0
  15. package/dist/lib/browser/blueprints/index.mjs +8 -0
  16. package/dist/lib/browser/call-manager-2PRP4QVZ.mjs +27 -0
  17. package/dist/lib/browser/call-manager-2PRP4QVZ.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  19. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ERK254BS.mjs} +381 -240
  21. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-G6FJBSXX.mjs +1123 -0
  23. package/dist/lib/browser/chunk-G6FJBSXX.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-HDLDMR54.mjs} +85 -50
  25. package/dist/lib/browser/chunk-HDLDMR54.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
  27. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/lib/browser/chunk-LUK4UNFA.mjs +20 -0
  30. package/dist/lib/browser/chunk-LUK4UNFA.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-PDHCY236.mjs +223 -0
  32. package/dist/lib/browser/chunk-PDHCY236.mjs.map +7 -0
  33. package/dist/lib/browser/chunk-PL5LIVP4.mjs +105 -0
  34. package/dist/lib/browser/chunk-PL5LIVP4.mjs.map +7 -0
  35. package/dist/lib/browser/chunk-U32R23JO.mjs +277 -0
  36. package/dist/lib/browser/chunk-U32R23JO.mjs.map +7 -0
  37. package/dist/lib/browser/chunk-UVUCB7QO.mjs +125 -0
  38. package/dist/lib/browser/chunk-UVUCB7QO.mjs.map +7 -0
  39. package/dist/lib/browser/index.mjs +143 -137
  40. package/dist/lib/browser/index.mjs.map +4 -4
  41. package/dist/lib/browser/markdown-GRRPCZHJ.mjs +210 -0
  42. package/dist/lib/browser/markdown-GRRPCZHJ.mjs.map +7 -0
  43. package/dist/lib/browser/meta.json +1 -1
  44. package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs +442 -0
  45. package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs.map +7 -0
  46. package/dist/lib/browser/react-root-7UFFPPRD.mjs +26 -0
  47. package/dist/lib/browser/react-root-7UFFPPRD.mjs.map +7 -0
  48. package/dist/lib/browser/react-surface-TIHBSZPD.mjs +113 -0
  49. package/dist/lib/browser/react-surface-TIHBSZPD.mjs.map +7 -0
  50. package/dist/lib/browser/repair-TBU45SBG.mjs +40 -0
  51. package/dist/lib/browser/repair-TBU45SBG.mjs.map +7 -0
  52. package/dist/lib/browser/settings-Y75FG6XR.mjs +35 -0
  53. package/dist/lib/browser/settings-Y75FG6XR.mjs.map +7 -0
  54. package/dist/lib/browser/state-OBTMMEUZ.mjs +25 -0
  55. package/dist/lib/browser/state-OBTMMEUZ.mjs.map +7 -0
  56. package/dist/lib/browser/types/index.mjs +11 -12
  57. package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs +183 -0
  58. package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs.map +7 -0
  59. package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs +34 -0
  60. package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs.map +7 -0
  61. package/dist/lib/node-esm/ChannelContainer-NU4LSLB4.mjs +16 -0
  62. package/dist/lib/node-esm/ChannelContainer-NU4LSLB4.mjs.map +7 -0
  63. package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs +15 -0
  64. package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs.map +7 -0
  65. package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs +205 -0
  66. package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs.map +7 -0
  67. package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs +21 -0
  68. package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs.map +7 -0
  69. package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs +192 -0
  70. package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs.map +7 -0
  71. package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs +18 -0
  72. package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs.map +7 -0
  73. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  74. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  75. package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs +28 -0
  76. package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-6K5ACCGB.mjs +107 -0
  78. package/dist/lib/node-esm/chunk-6K5ACCGB.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-7SZBKQUU.mjs +224 -0
  80. package/dist/lib/node-esm/chunk-7SZBKQUU.mjs.map +7 -0
  81. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  82. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  83. package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs +22 -0
  84. package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs.map +7 -0
  85. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  86. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  87. package/dist/lib/node-esm/chunk-IQUV7DR6.mjs +1124 -0
  88. package/dist/lib/node-esm/chunk-IQUV7DR6.mjs.map +7 -0
  89. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-QP3KQOPQ.mjs} +381 -240
  90. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  91. package/dist/lib/node-esm/chunk-QYAVWNVM.mjs +278 -0
  92. package/dist/lib/node-esm/chunk-QYAVWNVM.mjs.map +7 -0
  93. package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs +126 -0
  94. package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs.map +7 -0
  95. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
  96. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  97. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-YN2Y7GPW.mjs} +85 -50
  98. package/dist/lib/node-esm/chunk-YN2Y7GPW.mjs.map +7 -0
  99. package/dist/lib/node-esm/index.mjs +143 -137
  100. package/dist/lib/node-esm/index.mjs.map +4 -4
  101. package/dist/lib/node-esm/markdown-WHWUESF7.mjs +211 -0
  102. package/dist/lib/node-esm/markdown-WHWUESF7.mjs.map +7 -0
  103. package/dist/lib/node-esm/meta.json +1 -1
  104. package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs +443 -0
  105. package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs.map +7 -0
  106. package/dist/lib/node-esm/react-root-D7CWS5XP.mjs +27 -0
  107. package/dist/lib/node-esm/react-root-D7CWS5XP.mjs.map +7 -0
  108. package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs +114 -0
  109. package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs.map +7 -0
  110. package/dist/lib/node-esm/repair-7JEKRNR3.mjs +41 -0
  111. package/dist/lib/node-esm/repair-7JEKRNR3.mjs.map +7 -0
  112. package/dist/lib/node-esm/settings-W4JN2YKJ.mjs +36 -0
  113. package/dist/lib/node-esm/settings-W4JN2YKJ.mjs.map +7 -0
  114. package/dist/lib/node-esm/state-7UWCSIWQ.mjs +26 -0
  115. package/dist/lib/node-esm/state-7UWCSIWQ.mjs.map +7 -0
  116. package/dist/lib/node-esm/types/index.mjs +11 -12
  117. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  118. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  119. package/dist/types/src/blueprints/index.d.ts +2 -0
  120. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  121. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  122. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  123. package/dist/types/src/calls/call-manager.d.ts +40 -30
  124. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  125. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  126. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  127. package/dist/types/src/calls/media-manager.d.ts +2 -2
  128. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  129. package/dist/types/src/calls/types.d.ts +1 -1
  130. package/dist/types/src/calls/types.d.ts.map +1 -1
  131. package/dist/types/src/calls/util/calls-service.d.ts +5 -3
  132. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  133. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  134. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  135. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  136. package/dist/types/src/calls-service.stories.d.ts +10 -9
  137. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  138. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  139. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  141. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  142. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
  143. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  144. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  145. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  146. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  147. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  148. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  149. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  150. package/dist/types/src/capabilities/index.d.ts +10 -15
  151. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  152. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  153. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  154. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  155. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  156. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  157. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  158. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  159. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  160. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  161. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  162. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  163. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  164. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  165. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  166. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  167. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  168. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  169. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  170. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  171. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  172. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  173. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  174. package/dist/types/src/capabilities/settings/settings.d.ts +6 -0
  175. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  176. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  177. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  178. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  179. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  180. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  181. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  182. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  183. package/dist/types/src/components/Comments.stories.d.ts +160 -4
  184. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  186. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  187. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  188. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  189. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  190. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  191. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  192. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  193. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  194. package/dist/types/src/components/MessageContainer.d.ts +7 -3
  195. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  196. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  197. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  198. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +159 -3
  199. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +161 -4
  201. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  202. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  203. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  204. package/dist/types/src/components/index.d.ts +0 -6
  205. package/dist/types/src/components/index.d.ts.map +1 -1
  206. package/dist/types/src/components/testing.d.ts +3 -2
  207. package/dist/types/src/components/testing.d.ts.map +1 -1
  208. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
  209. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  210. package/dist/types/src/containers/CallDebugPanel/index.d.ts +3 -0
  211. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  212. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  213. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  214. package/dist/types/src/containers/CallSidebar/index.d.ts +3 -0
  215. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  216. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  217. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  218. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +164 -0
  219. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  220. package/dist/types/src/containers/ChannelContainer/index.d.ts +3 -0
  221. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  222. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +17 -0
  223. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  224. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +164 -0
  225. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  226. package/dist/types/src/containers/ChatContainer/index.d.ts +3 -0
  227. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  228. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +5 -0
  229. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  230. package/dist/types/src/containers/ThreadCompanion/index.d.ts +3 -0
  231. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  232. package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts +8 -0
  233. package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  234. package/dist/types/src/containers/ThreadSettings/index.d.ts +3 -0
  235. package/dist/types/src/containers/ThreadSettings/index.d.ts.map +1 -0
  236. package/dist/types/src/containers/index.d.ts +8 -0
  237. package/dist/types/src/containers/index.d.ts.map +1 -0
  238. package/dist/types/src/extensions/threads.d.ts +8 -3
  239. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  240. package/dist/types/src/functions/create-proposals.d.ts +13 -0
  241. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  242. package/dist/types/src/functions/index.d.ts +14 -0
  243. package/dist/types/src/functions/index.d.ts.map +1 -0
  244. package/dist/types/src/hooks/analytics.d.ts +2 -3
  245. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  246. package/dist/types/src/hooks/index.d.ts +2 -1
  247. package/dist/types/src/hooks/index.d.ts.map +1 -1
  248. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  249. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  250. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  251. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  252. package/dist/types/src/index.d.ts +1 -1
  253. package/dist/types/src/index.d.ts.map +1 -1
  254. package/dist/types/src/meta.d.ts +3 -4
  255. package/dist/types/src/meta.d.ts.map +1 -1
  256. package/dist/types/src/testing/stories.d.ts +2 -1
  257. package/dist/types/src/testing/stories.d.ts.map +1 -1
  258. package/dist/types/src/translations.d.ts +79 -7
  259. package/dist/types/src/translations.d.ts.map +1 -1
  260. package/dist/types/src/types/Channel.d.ts +711 -0
  261. package/dist/types/src/types/Channel.d.ts.map +1 -0
  262. package/dist/types/src/types/capabilities.d.ts +23 -0
  263. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  264. package/dist/types/src/types/index.d.ts +2 -1
  265. package/dist/types/src/types/index.d.ts.map +1 -1
  266. package/dist/types/src/types/types.d.ts +3300 -365
  267. package/dist/types/src/types/types.d.ts.map +1 -1
  268. package/dist/types/tsconfig.tsbuildinfo +1 -1
  269. package/package.json +93 -66
  270. package/src/ThreadPlugin.tsx +97 -130
  271. package/src/blueprints/index.ts +5 -0
  272. package/src/blueprints/thread-blueprint.ts +40 -0
  273. package/src/calls/call-manager.ts +78 -54
  274. package/src/calls/call-swarm-synchronizer.ts +3 -3
  275. package/src/calls/media-manager.ts +67 -38
  276. package/src/calls/types.ts +8 -4
  277. package/src/calls/util/calls-service.ts +66 -15
  278. package/src/calls/util/stub-media-streams.ts +64 -7
  279. package/src/calls/util/task-scheduling.ts +4 -4
  280. package/src/calls-service.stories.tsx +79 -66
  281. package/src/capabilities/app-graph-builder/app-graph-builder.ts +202 -0
  282. package/src/capabilities/app-graph-builder/index.ts +7 -0
  283. package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
  284. package/src/capabilities/blueprint-definition/index.ts +7 -0
  285. package/src/capabilities/call-manager/call-manager.ts +26 -0
  286. package/src/capabilities/call-manager/index.ts +7 -0
  287. package/src/capabilities/index.ts +10 -12
  288. package/src/capabilities/markdown/index.ts +7 -0
  289. package/src/capabilities/markdown/markdown.ts +82 -0
  290. package/src/capabilities/operation-resolver/index.ts +7 -0
  291. package/src/capabilities/operation-resolver/operation-resolver.ts +399 -0
  292. package/src/capabilities/react-root/index.ts +7 -0
  293. package/src/capabilities/react-root/react-root.tsx +20 -0
  294. package/src/capabilities/react-surface/index.ts +7 -0
  295. package/src/capabilities/react-surface/react-surface.tsx +98 -0
  296. package/src/capabilities/repair/index.ts +7 -0
  297. package/src/capabilities/repair/repair.ts +55 -0
  298. package/src/capabilities/settings/index.ts +7 -0
  299. package/src/capabilities/settings/settings.ts +34 -0
  300. package/src/capabilities/state/index.ts +7 -0
  301. package/src/capabilities/state/state.ts +22 -0
  302. package/src/components/Call/Call.tsx +11 -6
  303. package/src/components/Call/Toolbar.tsx +40 -33
  304. package/src/components/Comments.stories.tsx +55 -53
  305. package/src/components/CommentsContainer.tsx +16 -16
  306. package/src/components/CommentsThreadContainer.tsx +50 -45
  307. package/src/components/Lobby/Lobby.tsx +10 -8
  308. package/src/components/Media/AudioStream.tsx +2 -2
  309. package/src/components/Media/VideoObject.stories.tsx +36 -28
  310. package/src/components/Media/VideoObject.tsx +1 -1
  311. package/src/components/MessageContainer.tsx +98 -33
  312. package/src/components/Participant/Participant.tsx +34 -15
  313. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  314. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +9 -9
  315. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +1 -1
  316. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
  317. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +2 -2
  318. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -6
  319. package/src/components/command-extension.ts +7 -4
  320. package/src/components/index.ts +0 -10
  321. package/src/components/testing.ts +26 -6
  322. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +172 -0
  323. package/src/containers/CallDebugPanel/index.ts +7 -0
  324. package/src/containers/CallSidebar/CallSidebar.tsx +17 -0
  325. package/src/containers/CallSidebar/index.ts +7 -0
  326. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +60 -0
  327. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +76 -59
  328. package/src/containers/ChannelContainer/index.ts +7 -0
  329. package/src/containers/ChatContainer/ChatContainer.stories.tsx +88 -0
  330. package/src/{components → containers/ChatContainer}/ChatContainer.tsx +58 -50
  331. package/src/containers/ChatContainer/index.ts +7 -0
  332. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +197 -0
  333. package/src/containers/ThreadCompanion/index.ts +7 -0
  334. package/src/containers/ThreadSettings/ThreadSettings.tsx +22 -0
  335. package/src/containers/ThreadSettings/index.ts +7 -0
  336. package/src/containers/index.ts +12 -0
  337. package/src/extensions/threads.ts +88 -44
  338. package/src/functions/create-proposals.ts +57 -0
  339. package/src/functions/index.ts +9 -0
  340. package/src/hooks/analytics.ts +22 -21
  341. package/src/hooks/index.ts +3 -1
  342. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  343. package/src/hooks/useDebugMode.ts +1 -1
  344. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  345. package/src/index.ts +1 -1
  346. package/src/meta.ts +11 -7
  347. package/src/testing/stories.ts +18 -16
  348. package/src/translations.ts +9 -4
  349. package/src/types/Channel.ts +30 -0
  350. package/src/types/capabilities.ts +34 -0
  351. package/src/types/index.ts +2 -1
  352. package/src/types/types.ts +170 -82
  353. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  354. package/src/typings.d.ts +8 -0
  355. package/src/util.ts +1 -1
  356. package/dist/lib/browser/ChannelContainer-IY2UIRLF.mjs +0 -16
  357. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  358. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs +0 -171
  359. package/dist/lib/browser/app-graph-builder-N7BE5TYW.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-4OYAYON2.mjs +0 -21
  363. package/dist/lib/browser/chunk-4OYAYON2.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  365. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  366. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  367. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  368. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  369. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  370. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  371. package/dist/lib/browser/chunk-KWPRNHTK.mjs +0 -984
  372. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  373. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  374. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  375. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  376. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-XLPJXUKO.mjs +0 -367
  378. package/dist/lib/browser/chunk-XLPJXUKO.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  380. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs +0 -369
  381. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  382. package/dist/lib/browser/markdown-GEXBVJYN.mjs +0 -169
  383. package/dist/lib/browser/markdown-GEXBVJYN.mjs.map +0 -7
  384. package/dist/lib/browser/react-root-X4UIVGTX.mjs +0 -28
  385. package/dist/lib/browser/react-root-X4UIVGTX.mjs.map +0 -7
  386. package/dist/lib/browser/react-surface-YCYEFBPM.mjs +0 -109
  387. package/dist/lib/browser/react-surface-YCYEFBPM.mjs.map +0 -7
  388. package/dist/lib/browser/settings-E32MTL7A.mjs +0 -22
  389. package/dist/lib/browser/settings-E32MTL7A.mjs.map +0 -7
  390. package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
  391. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  392. package/dist/lib/node-esm/ChannelContainer-DET6T5N2.mjs +0 -17
  393. package/dist/lib/node-esm/ChatContainer-IQUWU426.mjs +0 -16
  394. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs +0 -172
  395. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  396. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
  397. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  399. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  400. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  401. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  403. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs +0 -985
  405. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  407. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-GW37AAM4.mjs +0 -23
  409. package/dist/lib/node-esm/chunk-GW37AAM4.mjs.map +0 -7
  410. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  411. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs +0 -368
  412. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs.map +0 -7
  413. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  414. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  415. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  416. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs +0 -370
  417. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  418. package/dist/lib/node-esm/markdown-LIJZDK2J.mjs +0 -170
  419. package/dist/lib/node-esm/markdown-LIJZDK2J.mjs.map +0 -7
  420. package/dist/lib/node-esm/react-root-M7J6PZVW.mjs +0 -29
  421. package/dist/lib/node-esm/react-root-M7J6PZVW.mjs.map +0 -7
  422. package/dist/lib/node-esm/react-surface-IRSEKM42.mjs +0 -110
  423. package/dist/lib/node-esm/react-surface-IRSEKM42.mjs.map +0 -7
  424. package/dist/lib/node-esm/settings-SJ24YG7M.mjs +0 -23
  425. package/dist/lib/node-esm/settings-SJ24YG7M.mjs.map +0 -7
  426. package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
  427. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  428. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  429. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  430. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  431. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  432. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  433. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  434. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  435. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  436. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  437. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  438. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  439. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  440. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  441. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  442. package/dist/types/src/capabilities/settings.d.ts +0 -4
  443. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  444. package/dist/types/src/capabilities/state.d.ts +0 -7
  445. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  446. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  447. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  448. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  449. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  450. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  451. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  452. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  453. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  454. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  455. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  456. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  457. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  458. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  459. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  460. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  461. package/dist/types/src/types/schema.d.ts +0 -162
  462. package/dist/types/src/types/schema.d.ts.map +0 -1
  463. package/src/capabilities/app-graph-builder.ts +0 -180
  464. package/src/capabilities/call-manager.ts +0 -19
  465. package/src/capabilities/capabilities.ts +0 -33
  466. package/src/capabilities/intent-resolver.ts +0 -314
  467. package/src/capabilities/markdown.ts +0 -68
  468. package/src/capabilities/react-root.tsx +0 -17
  469. package/src/capabilities/react-surface.tsx +0 -88
  470. package/src/capabilities/settings.ts +0 -19
  471. package/src/capabilities/state.ts +0 -25
  472. package/src/components/CallDebugPanel.tsx +0 -115
  473. package/src/components/CallSidebar.tsx +0 -17
  474. package/src/components/ChannelContainer.stories.tsx +0 -58
  475. package/src/components/Chat.stories.tsx +0 -88
  476. package/src/components/ThreadComplementary.tsx +0 -151
  477. package/src/components/ThreadSettings.tsx +0 -17
  478. package/src/types/schema.ts +0 -33
  479. /package/dist/lib/browser/{ChannelContainer-IY2UIRLF.mjs.map → ChannelContainer-EPYG4QAC.mjs.map} +0 -0
  480. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-2243UD2M.mjs.map} +0 -0
  481. /package/dist/lib/{node-esm/ChannelContainer-DET6T5N2.mjs.map → browser/blueprints/index.mjs.map} +0 -0
  482. /package/dist/lib/{node-esm/ChatContainer-IQUWU426.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -4,65 +4,77 @@
4
4
 
5
5
  import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
- import { computed, effect } from '@preact/signals-core';
7
+ import { type Atom, type Registry } from '@effect-atom/atom-react';
8
8
 
9
- import { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
10
9
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
- import { type DocumentType } from '@dxos/plugin-markdown/types';
12
- import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
13
- import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
14
- import { AnchoredTo } from '@dxos/schema';
10
+ import { createDocAccessor, getTextInRange } from '@dxos/echo-db';
11
+ import { type OperationInvoker } from '@dxos/operation';
12
+ import { type Markdown } from '@dxos/plugin-markdown/types';
13
+ import { AnchoredTo, Thread } from '@dxos/types';
14
+ import { comments, createExternalCommentSync } from '@dxos/ui-editor';
15
15
 
16
- import { ThreadAction, ThreadType, type ThreadState } from '../types';
16
+ import { ThreadOperation, type ThreadState } from '../types';
17
17
 
18
18
  // TODO(burdon): Factor out.
19
- const getName = (doc: DocumentType, anchor: string): string | undefined => {
19
+ const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
20
20
  if (doc.content) {
21
21
  const [start, end] = anchor.split(':');
22
22
  return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);
23
23
  }
24
24
  };
25
25
 
26
+ export type ThreadStore = {
27
+ registry: Registry.Registry;
28
+ stateAtom: Atom.Writable<ThreadState>;
29
+ };
30
+
26
31
  /**
27
32
  * Construct plugins.
28
33
  */
29
- export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {
30
- const space = doc && getSpace(doc);
31
- if (!doc || !space || !dispatch) {
34
+ export const threads = (
35
+ store: ThreadStore,
36
+ doc?: Markdown.Document,
37
+ invokePromise?: OperationInvoker.OperationInvoker['invokePromise'],
38
+ ): Extension => {
39
+ const db = doc && Obj.getDatabase(doc);
40
+ if (!doc || !db || !invokePromise) {
32
41
  // Include no-op comments extension here to ensure that the facets are always present when they are expected.
33
42
  // TODO(wittjosiah): The Editor should only look for these facets when comments are available.
34
43
  return [comments()];
35
44
  }
36
45
 
37
- const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo));
38
- const unsubscribe = query.subscribe();
46
+ const { registry, stateAtom } = store;
47
+ const objectId = Obj.getDXN(doc).toString();
48
+ const query = db.query(Query.select(Filter.id(doc.id)).targetOf(AnchoredTo.AnchoredTo));
39
49
 
40
- const anchors = computed(() =>
41
- query.objects
50
+ // Get current anchors by combining query results with store drafts.
51
+ const getAnchors = () =>
52
+ query.results
42
53
  .filter((anchor) => {
43
54
  const thread = Relation.getSource(anchor);
44
- return Obj.instanceOf(ThreadType, thread) && thread.status !== 'resolved';
55
+ return Obj.instanceOf(Thread.Thread, thread) && thread.status !== 'resolved';
45
56
  })
46
- .concat(state.drafts[fullyQualifiedId(doc)] ?? []),
47
- );
57
+ .concat(registry.get(stateAtom).drafts[objectId] ?? []);
48
58
 
49
59
  return [
50
60
  EditorView.domEventHandlers({
51
61
  destroy: () => {
52
- unsubscribe();
62
+ // Note: cleanup functions for subscriptions are handled by createExternalCommentSync.
53
63
  },
54
64
  }),
55
65
 
56
66
  EditorView.updateListener.of((update) => {
57
67
  if (update.docChanged) {
58
- anchors.value.forEach((anchor) => {
68
+ getAnchors().forEach((anchor) => {
59
69
  if (anchor.anchor) {
60
70
  // Only update if the name has changed, otherwise this will cause an infinite loop.
61
71
  // Skip if the name is empty; this means comment text was deleted, but thread name should remain.
62
72
  const name = getName(doc, anchor.anchor);
63
- const thread = Relation.getSource(anchor) as ThreadType;
73
+ const thread = Relation.getSource(anchor) as Thread.Thread;
64
74
  if (name && name !== thread.name) {
65
- thread.name = name;
75
+ Obj.change(thread, (t) => {
76
+ t.name = name;
77
+ });
66
78
  }
67
79
  }
68
80
  });
@@ -70,55 +82,87 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
70
82
  }),
71
83
 
72
84
  createExternalCommentSync(
73
- fullyQualifiedId(doc),
74
- (sink) => effect(() => sink()),
85
+ objectId,
86
+ (sink) => {
87
+ // Subscribe to both query changes and store state changes.
88
+ const unsubQuery = query.subscribe(sink);
89
+ const unsubStore = registry.subscribe(stateAtom, sink);
90
+ return () => {
91
+ unsubQuery();
92
+ unsubStore();
93
+ };
94
+ },
75
95
  () =>
76
- anchors.value
96
+ getAnchors()
77
97
  .filter((anchor) => anchor.anchor)
78
- .map((anchor) => ({ id: fullyQualifiedId(Relation.getSource(anchor)), cursor: anchor.anchor })),
98
+ .map((anchor) => ({
99
+ id: Obj.getDXN(Relation.getSource(anchor)).toString(),
100
+ cursor: anchor.anchor,
101
+ })),
79
102
  ),
80
103
 
81
104
  comments({
82
- id: fullyQualifiedId(doc),
105
+ id: objectId,
83
106
  onCreate: ({ cursor }) => {
84
107
  const name = getName(doc, cursor);
85
- void dispatch(createIntent(ThreadAction.Create, { anchor: cursor, name, subject: doc }));
108
+ void invokePromise(ThreadOperation.Create, {
109
+ anchor: cursor,
110
+ name,
111
+ subject: doc,
112
+ });
86
113
  },
87
114
  onDelete: ({ id }) => {
88
- const draft = state.drafts[fullyQualifiedId(doc)];
89
- if (draft) {
90
- const index = draft.findIndex((thread) => fullyQualifiedId(thread) === id);
115
+ const drafts = registry.get(stateAtom).drafts[objectId];
116
+ if (drafts) {
117
+ const index = drafts.findIndex((draft) => Relation.getDXN(draft).toString() === id);
91
118
  if (index !== -1) {
92
- draft.splice(index, 1);
119
+ const current = registry.get(stateAtom);
120
+ registry.set(stateAtom, {
121
+ ...current,
122
+ drafts: {
123
+ ...current.drafts,
124
+ [objectId]: current.drafts[objectId]?.filter((_, i) => i !== index),
125
+ },
126
+ });
93
127
  }
94
128
  }
95
129
 
96
- const thread = query.objects.find((object) => getSource(object).id === id);
130
+ const thread = query.results.find((object) => Relation.getSource(object).id === id);
97
131
  if (thread) {
98
- thread.anchor = undefined;
132
+ Relation.change(thread, (t) => {
133
+ t.anchor = undefined;
134
+ });
99
135
  }
100
136
  },
101
137
  onUpdate: ({ id, cursor }) => {
102
- const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);
138
+ const draft = registry.get(stateAtom).drafts[objectId]?.find((d) => Relation.getDXN(d).toString() === id);
103
139
  if (draft) {
104
- const thread = Relation.getSource(draft) as ThreadType;
105
- thread.name = getName(doc, cursor);
106
- draft.anchor = cursor;
140
+ const thread = Relation.getSource(draft) as Thread.Thread;
141
+ Obj.change(thread, (t) => {
142
+ t.name = getName(doc, cursor);
143
+ });
144
+ Relation.change(draft, (d) => {
145
+ d.anchor = cursor;
146
+ });
107
147
  }
108
148
 
109
- const relation = query.objects.find((object) => getSource(object).id === id);
149
+ const relation = query.results.find((object) => Relation.getSource(object).id === id);
110
150
  if (relation) {
111
- const thread = getSource(relation);
112
- if (Obj.instanceOf(ThreadType, thread)) {
113
- thread.name = getName(doc, cursor);
114
- relation.anchor = cursor;
151
+ const thread = Relation.getSource(relation);
152
+ if (Obj.instanceOf(Thread.Thread, thread)) {
153
+ Obj.change(thread, (t) => {
154
+ t.name = getName(doc, cursor);
155
+ });
156
+ Relation.change(relation, (r) => {
157
+ r.anchor = cursor;
158
+ });
115
159
  }
116
160
  }
117
161
  },
118
162
  onSelect: ({ selection }) => {
119
163
  const current = selection.current ?? selection.closest;
120
164
  if (current) {
121
- void dispatch(createIntent(ThreadAction.Select, { current }));
165
+ void invokePromise(ThreadOperation.Select, { current });
122
166
  }
123
167
  },
124
168
  }),
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Array from 'effect/Array';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Function from 'effect/Function';
8
+ import * as Schema from 'effect/Schema';
9
+
10
+ import { computeDiffsWithCursors } from '@dxos/assistant';
11
+ import { Database, Obj, Ref, Relation } from '@dxos/echo';
12
+ import { createDocAccessor } from '@dxos/echo-db';
13
+ import { defineFunction } from '@dxos/functions';
14
+ import { Markdown } from '@dxos/plugin-markdown/types';
15
+ import { AnchoredTo, Message, Thread } from '@dxos/types';
16
+
17
+ export default defineFunction({
18
+ key: 'dxos.org/function/thread/create-proposals',
19
+ name: 'Create Proposals',
20
+ description: 'Proposes a set of changes to a document.',
21
+ inputSchema: Schema.Struct({
22
+ doc: Ref.Ref(Markdown.Document).annotations({
23
+ description: 'The ID of the document.',
24
+ }),
25
+ diffs: Schema.Array(Schema.String).annotations({
26
+ description: 'The diffs to propose for the document.',
27
+ }),
28
+ }),
29
+ outputSchema: Schema.Void,
30
+ handler: Effect.fn(function* ({ data: { doc, diffs: _diffs } }) {
31
+ const object = yield* Database.load(doc);
32
+ const content = yield* Effect.promise(() => object.content.load());
33
+ const accessor = createDocAccessor(content, ['content']);
34
+
35
+ yield* Function.pipe(
36
+ computeDiffsWithCursors(accessor, _diffs),
37
+ Array.map(
38
+ Effect.fnUntraced(function* ({ cursor, text }) {
39
+ const proposal = Obj.make(Message.Message, {
40
+ created: new Date().toISOString(),
41
+ sender: { role: 'assistant' },
42
+ blocks: [{ _tag: 'proposal', text }],
43
+ });
44
+ const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
45
+ const relation = Relation.make(AnchoredTo.AnchoredTo, {
46
+ [Relation.Source]: thread,
47
+ [Relation.Target]: object,
48
+ anchor: cursor,
49
+ });
50
+ yield* Database.add(thread);
51
+ yield* Database.add(relation);
52
+ }),
53
+ ),
54
+ Effect.allWith({ concurrency: 'unbounded' }),
55
+ );
56
+ }),
57
+ });
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import CreateProposals from './create-proposals';
6
+
7
+ export const ThreadFunctions = {
8
+ CreateProposals,
9
+ };
@@ -4,37 +4,38 @@
4
4
 
5
5
  import { useCallback } from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
- import { type Live } from '@dxos/live-object';
9
- import { ObservabilityAction } from '@dxos/plugin-observability/types';
10
- import { getSpace } from '@dxos/react-client/echo';
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { Obj } from '@dxos/echo';
9
+ import { ObservabilityOperation } from '@dxos/plugin-observability/types';
11
10
  import { useOnTransition } from '@dxos/react-ui';
12
- import { type DataType } from '@dxos/schema';
11
+ import { type ContentBlock } from '@dxos/types';
13
12
 
14
13
  export const useOnEditAnalytics = (
15
- message: Live<any>,
16
- textBlock: DataType.MessageBlock.Text | undefined,
14
+ message: any | undefined,
15
+ textBlock: ContentBlock.Text | undefined,
17
16
  editing: boolean,
18
17
  ) => {
19
- const { dispatchPromise: dispatch } = useIntentDispatcher();
18
+ const { invokePromise } = useOperationInvoker();
20
19
 
21
20
  const onEdit = useCallback(() => {
22
- const space = getSpace(message);
23
- if (!space || !textBlock) {
21
+ if (!message || !textBlock) {
24
22
  return;
25
23
  }
26
24
 
27
- void dispatch(
28
- createIntent(ObservabilityAction.SendEvent, {
29
- name: 'threads.message.update',
30
- properties: {
31
- spaceId: space.id,
32
- messageId: message.id,
33
- messageLength: textBlock?.text.length,
34
- },
35
- }),
36
- );
37
- }, [dispatch, message, textBlock]);
25
+ const db = Obj.getDatabase(message);
26
+ if (!db) {
27
+ return;
28
+ }
29
+
30
+ void invokePromise(ObservabilityOperation.SendEvent, {
31
+ name: 'threads.message.update',
32
+ properties: {
33
+ spaceId: db.spaceId,
34
+ messageId: message.id,
35
+ messageLength: textBlock?.text.length,
36
+ },
37
+ });
38
+ }, [invokePromise, message, textBlock]);
38
39
 
39
40
  useOnTransition(editing, true, false, onEdit);
40
41
  };
@@ -3,7 +3,9 @@
3
3
  //
4
4
 
5
5
  export * from './analytics';
6
+
7
+ export * from './useBlackCanvasStreamTrack';
6
8
  export * from './useDebugMode';
9
+ export * from './useInaudibleAudioStreamTrack';
7
10
  export * from './useStatus';
8
11
  export * from './useVideoStreamTrack';
9
- export * from './useInaudibleAudioStreamTrack';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import { scheduleTask } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
9
+
10
+ import { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';
11
+
12
+ export const useBlackCanvasStreamTrack = () => {
13
+ const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
14
+ useEffect(() => {
15
+ const ctx = new Context();
16
+ scheduleTask(ctx, async () => {
17
+ const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });
18
+ setBlackCanvasStreamTrack(blackCanvasStreamTrack);
19
+ });
20
+
21
+ return () => {
22
+ void ctx.dispose();
23
+ };
24
+ }, []);
25
+
26
+ return blackCanvasStreamTrack;
27
+ };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useState, useEffect } from 'react';
5
+ import { useEffect, useState } from 'react';
6
6
 
7
7
  // TODO(burdon): Standardize across plugins/composer.
8
8
  export const useDebugMode = () => {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { type RefObject, useEffect, useRef, useState } from 'react';
6
6
 
7
- export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement>, videoSrc: string) => {
7
+ export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement | null>, videoSrc: string) => {
8
8
  // Get video stream track.
9
9
  const [videoStreamTrack, setVideoStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
10
10
  const hadRun = useRef(false);
@@ -15,13 +15,16 @@ export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement>, v
15
15
  }
16
16
  hadRun.current = true;
17
17
  videoElement.current.addEventListener('playing', () => {
18
+ if (videoStreamTrack) {
19
+ return;
20
+ }
18
21
  const stream = (videoElement.current as any).captureStream();
19
22
  const track = stream.getTracks()[0];
20
- if (track) {
23
+ if (track && !videoStreamTrack) {
21
24
  setVideoStreamTrack(track);
22
25
  }
23
26
  stream.onaddtrack = (event: MediaStreamTrackEvent) => {
24
- if (event.track.kind === 'video') {
27
+ if (event.track.kind === 'video' && !videoStreamTrack) {
25
28
  setVideoStreamTrack(event.track);
26
29
  }
27
30
  };
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { ThreadCapabilities } from './capabilities';
5
+ export { ThreadCapabilities } from './types';
6
6
  export * from './calls';
7
7
  export * from './hooks';
8
8
  export * from './meta';
package/src/meta.ts CHANGED
@@ -2,16 +2,20 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
6
-
7
- export const THREAD_PLUGIN = 'dxos.org/plugin/thread';
8
- export const THREAD_ITEM = `${THREAD_PLUGIN}/item`;
5
+ import { type Plugin } from '@dxos/app-framework';
6
+ import { trim } from '@dxos/util';
9
7
 
10
8
  // TODO(wittjosiah): Needs screenshots.
11
- export const meta: PluginMeta = {
12
- id: THREAD_PLUGIN,
9
+ export const meta: Plugin.Meta = {
10
+ id: 'dxos.org/plugin/thread',
13
11
  name: 'Chat',
14
- description: 'Chat via text, voice, and video in channels or create comment threads on objects.',
12
+ description: trim`
13
+ Multi-modal communication platform supporting text chat, voice, and video conferencing.
14
+ Create threaded conversations and add contextual comments directly on any workspace object.
15
+ `,
15
16
  icon: 'ph--video-conference--regular',
17
+ iconHue: 'rose',
16
18
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread',
17
19
  };
20
+
21
+ export const THREAD_ITEM = `${meta.id}/item`;
@@ -2,30 +2,32 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
6
- import { Obj } from '@dxos/echo';
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { OperationPlugin, type Plugin } from '@dxos/app-framework';
7
8
  import { ClientPlugin } from '@dxos/plugin-client';
8
9
  import { GraphPlugin } from '@dxos/plugin-graph';
10
+ import { SettingsPlugin } from '@dxos/plugin-settings';
9
11
  import { SpacePlugin } from '@dxos/plugin-space';
10
12
  import { ThemePlugin } from '@dxos/plugin-theme';
11
13
  import { Config } from '@dxos/react-client';
12
- import { Ref } from '@dxos/react-client/echo';
13
- import { defaultTx } from '@dxos/react-ui-theme';
14
+ import { defaultTx } from '@dxos/ui-theme';
14
15
 
15
16
  import { ThreadPlugin } from '../ThreadPlugin';
16
- import { ChannelType, ThreadType } from '../types';
17
+ import { Channel } from '../types';
17
18
 
18
- export const createThreadPlugins = async () => [
19
+ export const createThreadPlugins = async (): Promise<Array<Plugin.Plugin>> => [
19
20
  ThemePlugin({ tx: defaultTx }),
20
21
  ClientPlugin({
21
- onClientInitialized: async (_, client) => {
22
- await client.halo.createIdentity({ displayName: 'Test User' });
23
- },
24
- onSpacesReady: async (_, client) => {
25
- await client.spaces.default.waitUntilReady();
26
- const thread = Obj.make(ThreadType, { messages: [] });
27
- client.spaces.default.db.add(Obj.make(ChannelType, { defaultThread: Ref.make(thread), threads: [] }));
28
- },
22
+ onClientInitialized: ({ client }) =>
23
+ Effect.gen(function* () {
24
+ yield* Effect.promise(() => client.halo.createIdentity({ displayName: 'Test User' }));
25
+ }),
26
+ onSpacesReady: ({ client }) =>
27
+ Effect.gen(function* () {
28
+ yield* Effect.promise(() => client.spaces.default.waitUntilReady());
29
+ client.spaces.default.db.add(Channel.make());
30
+ }),
29
31
  config: new Config({
30
32
  runtime: {
31
33
  client: {
@@ -46,8 +48,8 @@ export const createThreadPlugins = async () => [
46
48
  },
47
49
  }),
48
50
  }),
49
- SpacePlugin(),
50
- IntentPlugin(),
51
+ SpacePlugin({}),
52
+ OperationPlugin(),
51
53
  SettingsPlugin(),
52
54
  GraphPlugin(),
53
55
  ThreadPlugin(),
@@ -2,15 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Type } from '@dxos/echo';
5
6
  import { type Resource } from '@dxos/react-ui';
6
7
 
7
8
  import { meta } from './meta';
8
- import { ChannelType } from './types';
9
+ import { Channel } from './types';
9
10
 
10
11
  export const translations = [
11
12
  {
12
13
  'en-US': {
13
- [ChannelType.typename]: {
14
+ [Type.getTypename(Channel.Channel)]: {
14
15
  'typename label': 'Channel',
15
16
  'typename label_zero': 'Channels',
16
17
  'typename label_one': 'Channel',
@@ -18,6 +19,7 @@ export const translations = [
18
19
  'object name placeholder': 'New channel',
19
20
  'rename object label': 'Rename channel',
20
21
  'delete object label': 'Delete channel',
22
+ 'object deleted label': 'Channel deleted',
21
23
  },
22
24
  [meta.id]: {
23
25
  'plugin name': 'Chat',
@@ -44,10 +46,12 @@ export const translations = [
44
46
  'save message label': 'Save',
45
47
  'edit message label': 'Edit',
46
48
  'delete message label': 'Delete message',
49
+ 'accept proposal label': 'Accept proposal',
47
50
  'open comments panel label': 'Show Comments',
48
51
  'comments label': 'Comments',
49
52
  'show all label': 'All comments',
50
53
  'show unresolved label': 'Unresolved comments',
54
+ 'add comment label': 'Add comment',
51
55
 
52
56
  'channel companion label': 'Channel',
53
57
  'call panel label': 'Active Call',
@@ -58,9 +62,10 @@ export const translations = [
58
62
  'set display name label': 'Continue',
59
63
 
60
64
  'call tab label': 'Call',
61
- 'meeting status title': 'Meeting',
65
+ 'meeting status title': 'Calls',
62
66
  'share meeting link label': 'Share meeting',
63
- 'show webrtc stats title': 'Detailed WebRTC Stats',
67
+ 'show webrtc stats title': 'WebRTC Stats',
68
+ 'show calls history title': 'Service History',
64
69
 
65
70
  'meeting summary label': 'Summary',
66
71
  'summarize label': 'Summarize',
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { Obj, Ref, Type } from '@dxos/echo';
8
+ import { FormInputAnnotation } from '@dxos/echo/internal';
9
+ import { Thread } from '@dxos/types';
10
+
11
+ export const Channel = Schema.Struct({
12
+ name: Schema.optional(Schema.String),
13
+ defaultThread: Ref.Ref(Thread.Thread).pipe(FormInputAnnotation.set(false)),
14
+ // TODO(wittjosiah): Should be an "ordered collection".
15
+ threads: Ref.Ref(Thread.Thread).pipe(Schema.Array, FormInputAnnotation.set(false)),
16
+ }).pipe(
17
+ Type.object({
18
+ typename: 'dxos.org/type/Channel',
19
+ version: '0.1.0',
20
+ }),
21
+ );
22
+
23
+ export interface Channel extends Schema.Schema.Type<typeof Channel> {}
24
+
25
+ export const make = (props: Pick<Obj.MakeProps<typeof Channel>, 'name'> = {}) =>
26
+ Obj.make(Channel, {
27
+ ...props,
28
+ defaultThread: Ref.make(Obj.make(Thread.Thread, { messages: [], status: 'active' })),
29
+ threads: [],
30
+ });
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom } from '@effect-atom/atom-react';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+
9
+ import { type CallManager, type CallState, type MediaState } from '../calls';
10
+ import { meta } from '../meta';
11
+ import { type Channel, type ThreadSettingsProps, type ThreadState, type ViewStore } from '../types';
12
+
13
+ export namespace ThreadCapabilities {
14
+ export const Settings = Capability.make<Atom.Writable<ThreadSettingsProps>>(`${meta.id}/capability/settings`);
15
+ export const CallManager = Capability.make<CallManager>(`${meta.id}/capability/call-manager`);
16
+
17
+ // TODO(burdon): Better way to define specific extensions for meeting companions.
18
+ // TODO(burdon): This brings in deps from ../calls; how should we manage/minimize explicit type exposure to other plugins?
19
+ // TODO(wittjosiah): These callbacks could be intents once we support broadcast.
20
+ export type CallProperties = {
21
+ onJoin: (state: { channel?: Channel.Channel; roomId?: string }) => Promise<void>;
22
+ onLeave: (roomId?: string) => Promise<void>;
23
+ onCallStateUpdated: (callState: CallState) => Promise<void>;
24
+ onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => Promise<void>;
25
+ };
26
+
27
+ export const CallExtension = Capability.make<CallProperties>(`${meta.id}/capability/call-extension`);
28
+
29
+ /** Thread state (drafts, toolbar state, current selection). */
30
+ export const State = Capability.make<Atom.Writable<ThreadState>>(`${meta.id}/capability/state`);
31
+
32
+ /** Per-subject view state (e.g., showResolvedThreads). */
33
+ export const ViewState = Capability.make<Atom.Writable<ViewStore>>(`${meta.id}/capability/view-state`);
34
+ }
@@ -2,5 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './schema';
5
+ export * from './capabilities';
6
+ export * as Channel from './Channel';
6
7
  export * from './types';