@dxos/plugin-thread 0.8.4-main.67995b8 → 0.8.4-main.ae835ea

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 (302) hide show
  1. package/dist/lib/browser/ChannelContainer-SVV4ZX5T.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-ACBXRBOS.mjs} +22 -22
  4. package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-P3MYR2JS.mjs} +7 -7
  6. package/dist/lib/browser/call-manager-P3MYR2JS.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-6CUDBEYP.mjs +377 -0
  8. package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BBTXGRIR.mjs +18 -0
  10. package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  12. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-DJOUMWEL.mjs} +242 -238
  14. package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-HDEQRBOC.mjs} +38 -6
  16. package/dist/lib/{node-esm/chunk-25ABSYP2.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
  17. package/dist/lib/browser/chunk-IQSXEHOW.mjs +618 -0
  18. package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
  20. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-L6F2AG6W.mjs +23 -0
  22. package/dist/lib/browser/{chunk-FR7KJPNY.mjs.map → chunk-L6F2AG6W.mjs.map} +3 -3
  23. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-US5ZQYC3.mjs} +310 -186
  24. package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-UTSLSZED.mjs +178 -0
  26. package/dist/lib/browser/chunk-UTSLSZED.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-XYUJXHYV.mjs} +55 -5
  28. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +35 -24
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-5POQTZ24.mjs} +83 -33
  32. package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
  33. package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-L7LDNF56.mjs} +10 -10
  34. package/dist/lib/browser/markdown-L7LDNF56.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-RCJLK4EP.mjs +28 -0
  37. package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-IC576W2W.mjs} +27 -27
  39. package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
  40. package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-5FYGBOGI.mjs} +5 -5
  41. package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
  42. package/dist/lib/browser/{state-H6CYONWE.mjs → state-36REWXO5.mjs} +5 -5
  43. package/dist/lib/browser/state-36REWXO5.mjs.map +7 -0
  44. package/dist/lib/browser/toolkit-PXASLYEQ.mjs +74 -0
  45. package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +7 -0
  46. package/dist/lib/browser/types/index.mjs +7 -9
  47. package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +17 -0
  48. package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
  49. package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-JXD7KY3G.mjs} +22 -22
  50. package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
  51. package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
  52. package/dist/lib/node-esm/call-manager-FCEFP7EJ.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-2MMJF7DW.mjs} +38 -6
  54. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-2V3WSLUZ.mjs} +55 -5
  56. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  58. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs +25 -0
  60. package/dist/lib/node-esm/{chunk-2CXOK2TD.mjs.map → chunk-AFDO2SUZ.mjs.map} +3 -3
  61. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-KGYDYYKJ.mjs} +310 -186
  62. package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs +378 -0
  64. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs +619 -0
  66. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-QCQAAU6J.mjs} +242 -238
  68. package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-TYLLHI46.mjs +179 -0
  70. package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
  72. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
  74. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
  75. package/dist/lib/node-esm/index.mjs +35 -24
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-63NV3XD2.mjs} +83 -33
  78. package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
  79. package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-ZQW7MI5U.mjs} +10 -10
  80. package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +7 -0
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +29 -0
  83. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +7 -0
  84. package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-O4LGTAZ3.mjs} +27 -27
  85. package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +7 -0
  86. package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-EOBQUZSW.mjs} +5 -5
  87. package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-X3W67GTL.mjs} +5 -5
  89. package/dist/lib/node-esm/state-X3W67GTL.mjs.map +7 -0
  90. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +75 -0
  91. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +7 -0
  92. package/dist/lib/node-esm/types/index.mjs +7 -9
  93. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  94. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  95. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  96. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  97. package/dist/types/src/calls/media-manager.d.ts +1 -1
  98. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  99. package/dist/types/src/calls/types.d.ts +1 -1
  100. package/dist/types/src/calls/types.d.ts.map +1 -1
  101. package/dist/types/src/calls/util/calls-service.d.ts +4 -2
  102. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  103. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  104. package/dist/types/src/calls-service.stories.d.ts +10 -9
  105. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  109. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/capabilities.d.ts +3 -3
  111. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/index.d.ts +11 -10
  113. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  115. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  117. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  119. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  120. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/settings.d.ts +1 -1
  122. package/dist/types/src/capabilities/state.d.ts +2 -2
  123. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  124. package/dist/types/src/capabilities/toolkit.d.ts +24 -0
  125. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  126. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  127. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  128. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  129. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  130. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  131. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  132. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  133. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  134. package/dist/types/src/components/ChannelContainer.stories.d.ts +155 -5
  135. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/Chat.stories.d.ts +158 -5
  137. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  139. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  140. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  141. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  144. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  146. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  147. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  148. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  149. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  151. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  152. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  153. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  155. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  157. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  159. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  160. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  161. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  162. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  163. package/dist/types/src/components/index.d.ts +1 -1
  164. package/dist/types/src/components/index.d.ts.map +1 -1
  165. package/dist/types/src/components/testing.d.ts +3 -2
  166. package/dist/types/src/components/testing.d.ts.map +1 -1
  167. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  168. package/dist/types/src/hooks/index.d.ts +1 -0
  169. package/dist/types/src/hooks/index.d.ts.map +1 -1
  170. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  171. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  172. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  173. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  174. package/dist/types/src/meta.d.ts +1 -2
  175. package/dist/types/src/meta.d.ts.map +1 -1
  176. package/dist/types/src/testing/stories.d.ts.map +1 -1
  177. package/dist/types/src/translations.d.ts +74 -6
  178. package/dist/types/src/translations.d.ts.map +1 -1
  179. package/dist/types/src/types/Channel.d.ts +16 -0
  180. package/dist/types/src/types/Channel.d.ts.map +1 -0
  181. package/dist/types/src/types/Thread.d.ts +167 -0
  182. package/dist/types/src/types/Thread.d.ts.map +1 -0
  183. package/dist/types/src/types/index.d.ts +2 -1
  184. package/dist/types/src/types/index.d.ts.map +1 -1
  185. package/dist/types/src/types/types.d.ts +278 -206
  186. package/dist/types/src/types/types.d.ts.map +1 -1
  187. package/dist/types/tsconfig.tsbuildinfo +1 -1
  188. package/package.json +64 -62
  189. package/src/ThreadPlugin.tsx +136 -126
  190. package/src/calls/call-manager.ts +2 -2
  191. package/src/calls/call-swarm-synchronizer.ts +1 -1
  192. package/src/calls/media-manager.ts +60 -34
  193. package/src/calls/types.ts +8 -4
  194. package/src/calls/util/calls-service.ts +65 -14
  195. package/src/calls/util/stub-media-streams.ts +62 -5
  196. package/src/calls-service.stories.tsx +78 -65
  197. package/src/capabilities/app-graph-builder.ts +24 -18
  198. package/src/capabilities/call-manager.ts +3 -2
  199. package/src/capabilities/capabilities.ts +8 -8
  200. package/src/capabilities/index.ts +1 -0
  201. package/src/capabilities/intent-resolver.ts +50 -20
  202. package/src/capabilities/markdown.ts +4 -3
  203. package/src/capabilities/react-root.tsx +2 -2
  204. package/src/capabilities/react-surface.tsx +19 -18
  205. package/src/capabilities/state.ts +2 -1
  206. package/src/capabilities/toolkit.ts +85 -0
  207. package/src/components/Call/Call.tsx +3 -2
  208. package/src/components/Call/Toolbar.tsx +7 -7
  209. package/src/components/CallDebugPanel.tsx +108 -49
  210. package/src/components/CallSidebar.tsx +2 -1
  211. package/src/components/ChannelContainer.stories.tsx +14 -13
  212. package/src/components/ChannelContainer.tsx +20 -16
  213. package/src/components/Chat.stories.tsx +32 -35
  214. package/src/components/ChatContainer.tsx +33 -20
  215. package/src/components/Comments.stories.tsx +38 -39
  216. package/src/components/CommentsContainer.tsx +4 -3
  217. package/src/components/CommentsThreadContainer.tsx +28 -21
  218. package/src/components/Lobby/Lobby.tsx +1 -1
  219. package/src/components/Media/VideoObject.stories.tsx +36 -28
  220. package/src/components/MessageContainer.tsx +43 -9
  221. package/src/components/Participant/Participant.tsx +13 -7
  222. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  223. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
  224. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +44 -42
  225. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  226. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  227. package/src/components/ThreadComplementary.tsx +42 -12
  228. package/src/components/ThreadSettings.tsx +6 -7
  229. package/src/components/command-extension.ts +5 -2
  230. package/src/components/testing.ts +25 -3
  231. package/src/extensions/threads.ts +7 -7
  232. package/src/hooks/index.ts +1 -0
  233. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  234. package/src/hooks/useDebugMode.ts +1 -1
  235. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  236. package/src/meta.ts +9 -5
  237. package/src/testing/stories.ts +5 -8
  238. package/src/translations.ts +6 -3
  239. package/src/types/Channel.ts +27 -0
  240. package/src/types/Thread.ts +26 -0
  241. package/src/types/index.ts +2 -1
  242. package/src/types/types.ts +30 -20
  243. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  244. package/src/typings.d.ts +8 -0
  245. package/src/util.ts +1 -1
  246. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  247. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  248. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  249. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  251. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  255. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  257. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  258. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  261. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  262. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  264. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  266. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  267. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  268. package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
  269. package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
  270. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  271. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  272. package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
  273. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  274. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  276. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  277. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  279. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  280. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  281. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  283. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  285. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  289. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  290. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  291. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  292. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
  293. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
  294. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  295. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  296. package/dist/types/src/types/schema.d.ts +0 -162
  297. package/dist/types/src/types/schema.d.ts.map +0 -1
  298. package/src/types/schema.ts +0 -33
  299. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
  300. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
  301. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
  302. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
@@ -2,8 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
7
 
9
8
  import { scheduleTask, sleep } from '@dxos/async';
@@ -13,14 +12,15 @@ import { log } from '@dxos/log';
13
12
  import { Config, useConfig } from '@dxos/react-client';
14
13
  import { withClientProvider } from '@dxos/react-client/testing';
15
14
  import { Button } from '@dxos/react-ui';
15
+ import { withTheme } from '@dxos/react-ui/testing';
16
16
  import { Json } from '@dxos/react-ui-syntax-highlighter';
17
- import { withLayout, withTheme } from '@dxos/storybook-utils';
18
17
 
19
- import { type TrackObject, CallsServicePeer, CALLS_URL } from './calls';
20
- import { useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
21
- // @ts-ignore
22
- import video from '../testing/video.mp4';
18
+ const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
19
+
20
+ import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
21
+ import { useBlackCanvasStreamTrack, useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
23
22
 
23
+ // TODO(burdon): THIS IS TOO COMPLEX FOR A TEST SETUP.
24
24
  const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
25
25
  const config = useConfig();
26
26
  const callsConfig = {
@@ -35,16 +35,18 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
35
35
  const [pulledTrack, setPulledTrack] = useState<MediaStreamTrack | undefined>(undefined);
36
36
  const hadRun = useRef(false);
37
37
 
38
+ const deps: any[] = [];
38
39
  // Push/pull video stream track to cloudflare.
39
40
  useEffect(() => {
40
41
  if (hadRun.current || !mediaStreamTrack || !peerPush || !peerPull) {
41
- log.info('not running', { hadRun: hadRun.current, mediaStreamTrack, peerPush, peerPull });
42
42
  return;
43
43
  }
44
44
  hadRun.current = true;
45
45
  const ctx = Context.default();
46
+ log.info('setting up ctx', { ctx, mediaStreamTrack, peerPush, peerPull });
47
+ deps.push([ctx, mediaStreamTrack, peerPush, peerPull]);
46
48
  ctx.onDispose(() => {
47
- log.info('disposing ctx', { ctx });
49
+ log.info('disposing ctx', {});
48
50
  });
49
51
  scheduleTask(
50
52
  ctx,
@@ -60,15 +62,12 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
60
62
  // Push track to cloudflare.
61
63
  performance.mark('push:begin');
62
64
  log.info('pushing track', { track: mediaStreamTrack });
63
- trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack });
65
+ trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack, ctx: Context.default() });
64
66
  performance.mark('push:end');
65
67
  const pushTime = performance.measure('push', 'push:begin', 'push:end').duration;
66
68
  log.info('successfully pushed track', { pushTime, trackInfo: trackInfo.current });
67
69
  setMetrics((prev) => ({ ...prev, 'time to push track [ms]': Math.round(pushTime) }));
68
70
 
69
- // Wait for cloudflare to process the track.
70
- await sleep(1000);
71
-
72
71
  // Pull track from cloudflare.
73
72
  performance.mark('pullTrack:begin');
74
73
  pullCtx.current = Context.default();
@@ -104,7 +103,10 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
104
103
 
105
104
  const rePullTrack = useCallback(async () => {
106
105
  performance.mark('rePullVideo:begin');
107
- invariant(pulledTrack);
106
+ if (!pulledTrack) {
107
+ log.info('no pulled track, skipping re-pull', { pulledTrack });
108
+ return;
109
+ }
108
110
  pulledTrack.stop();
109
111
  await pullCtx.current!.dispose();
110
112
  pullCtx.current = Context.default();
@@ -123,12 +125,57 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
123
125
  pulledTrack,
124
126
  rePullTrack,
125
127
  metrics,
128
+ pushService: peerPush,
129
+ pullService: peerPull,
126
130
  };
127
131
  };
128
132
 
133
+ type StoryProps = { source: string };
134
+
135
+ const DefaultStory = ({ source }: StoryProps) => {
136
+ const pushVideoElement = useRef<HTMLVideoElement>(null);
137
+ const pullVideoElement = useRef<HTMLVideoElement>(null);
138
+ // Get video stream track.
139
+ const videoStreamTrack = useVideoStreamTrack(pushVideoElement, source);
140
+ const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
141
+ const hadRun = useRef(false);
142
+
143
+ // Push/pull video stream track to cloudflare.
144
+ useEffect(() => {
145
+ if (!pulledTrack || hadRun.current) {
146
+ return;
147
+ }
148
+ hadRun.current = true;
149
+ const ctx = Context.default();
150
+ scheduleTask(ctx, async () => {
151
+ pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
152
+ await pullVideoElement.current!.play();
153
+ });
154
+
155
+ return () => {
156
+ void ctx.dispose();
157
+ };
158
+ }, [pulledTrack]);
159
+
160
+ return (
161
+ <div className='grid grid-rows-3 gap-4 items-center'>
162
+ <video ref={pushVideoElement} muted autoPlay loop />
163
+ <div className='flex flex-col gap-4'>
164
+ <video ref={pullVideoElement} muted />
165
+ <Button disabled={!pulledTrack} onClick={rePullTrack}>
166
+ Re-pull video
167
+ </Button>
168
+ </div>
169
+ <Json data={metrics} />
170
+ </div>
171
+ );
172
+ };
173
+
129
174
  const meta = {
130
175
  title: 'plugins/plugin-thread/calls-service',
176
+ render: DefaultStory,
131
177
  decorators: [
178
+ withTheme,
132
179
  withClientProvider({
133
180
  config: new Config({
134
181
  runtime: {
@@ -138,72 +185,25 @@ const meta = {
138
185
  },
139
186
  }),
140
187
  }),
141
- withTheme,
142
- withLayout(),
143
188
  ],
144
189
  parameters: {
145
190
  layout: 'centered',
146
191
  },
147
- };
192
+ } satisfies Meta<typeof DefaultStory>;
148
193
 
149
194
  export default meta;
150
195
 
151
- export const Default = {
152
- render: ({ videoSrc }: { videoSrc: string }) => {
153
- const pushVideoElement = useRef<HTMLVideoElement>(null);
154
- const pullVideoElement = useRef<HTMLVideoElement>(null);
155
- // Get video stream track.
156
- const videoStreamTrack = useVideoStreamTrack(pushVideoElement, videoSrc);
157
- const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
158
- const hadRun = useRef(false);
159
-
160
- // Push/pull video stream track to cloudflare.
161
- useEffect(() => {
162
- if (!pulledTrack || hadRun.current) {
163
- return;
164
- }
165
- hadRun.current = true;
166
- const ctx = Context.default();
167
- scheduleTask(ctx, async () => {
168
- pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
169
- await pullVideoElement.current!.play();
170
- });
171
-
172
- return () => {
173
- void ctx.dispose();
174
- };
175
- }, [pulledTrack]);
196
+ type Story = StoryObj<typeof meta>;
176
197
 
177
- return (
178
- <div className='grid grid-rows-3 gap-4 items-center'>
179
- <video ref={pushVideoElement} muted autoPlay loop />
180
- <div className='flex flex-col gap-4'>
181
- <video ref={pullVideoElement} muted />
182
- <Button
183
- disabled={
184
- !(
185
- pullVideoElement?.current?.srcObject instanceof MediaStream &&
186
- pullVideoElement.current.srcObject.getTracks()[0]
187
- )
188
- }
189
- onClick={rePullTrack}
190
- >
191
- Re-pull video
192
- </Button>
193
- </div>
194
- <Json data={metrics} />
195
- </div>
196
- );
197
- },
198
+ export const Default: Story = {
198
199
  args: {
199
- videoSrc: video,
200
+ source: testVideo,
200
201
  },
201
202
  };
202
203
 
203
204
  export const InaudibleAudioStreamTrack = {
204
205
  render: () => {
205
206
  const audioStreamTrack = useInaudibleAudioStreamTrack();
206
-
207
207
  const { rePullTrack, metrics } = pushAndPullTrack(audioStreamTrack);
208
208
 
209
209
  return (
@@ -214,3 +214,16 @@ export const InaudibleAudioStreamTrack = {
214
214
  );
215
215
  },
216
216
  };
217
+
218
+ export const BlackVideoStreamTrack = {
219
+ render: () => {
220
+ const videoStreamTrack = useBlackCanvasStreamTrack();
221
+ const { rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
222
+ return (
223
+ <div className='flex flex-col gap-4 items-center'>
224
+ <Json data={metrics} />
225
+ <Button onClick={rePullTrack}>Re-pull audio</Button>
226
+ </div>
227
+ );
228
+ },
229
+ };
@@ -3,30 +3,34 @@
3
3
  //
4
4
 
5
5
  import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe } from 'effect';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
7
8
 
8
- import { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';
9
+ import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
10
  import { Obj } from '@dxos/echo';
10
11
  import { AttentionCapabilities } from '@dxos/plugin-attention';
11
- import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
12
- import { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';
12
+ import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
13
+ import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
13
14
  import { fullyQualifiedId } from '@dxos/react-client/echo';
14
15
 
15
- import { ThreadCapabilities } from './capabilities';
16
- import { meta, THREAD_PLUGIN } from '../meta';
17
- import { ChannelType, ThreadAction } from '../types';
16
+ import { meta } from '../meta';
17
+ import { Channel, ThreadAction } from '../types';
18
18
  import { getAnchor } from '../util';
19
19
 
20
+ import { ThreadCapabilities } from './capabilities';
21
+
22
+ // TODO(wittjosiah): Highlight active calls in L1.
23
+ // Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
20
24
  export default (context: PluginContext) => {
21
25
  const resolve = (typename: string) =>
22
26
  context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
23
27
 
24
28
  return contributes(Capabilities.AppGraphBuilder, [
25
29
  createExtension({
26
- id: `${THREAD_PLUGIN}/active-call`,
30
+ id: `${meta.id}/active-call`,
27
31
  connector: (node) =>
28
32
  Rx.make((get) =>
29
- pipe(
33
+ Function.pipe(
30
34
  get(node),
31
35
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
32
36
  Option.map((node) => {
@@ -40,7 +44,7 @@ export default (context: PluginContext) => {
40
44
  type: DECK_COMPANION_TYPE,
41
45
  data: null,
42
46
  properties: {
43
- label: ['call panel label', { ns: THREAD_PLUGIN }],
47
+ label: ['call panel label', { ns: meta.id }],
44
48
  icon: 'ph--video-conference--regular',
45
49
  position: 'hoist',
46
50
  disposition: 'hidden',
@@ -58,12 +62,14 @@ export default (context: PluginContext) => {
58
62
  // TODO(wittjosiah): The channel shouldn't become the companion during a call.
59
63
  // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
60
64
  createExtension({
61
- id: `${THREAD_PLUGIN}/channel-chat-companion`,
65
+ id: `${meta.id}/channel-chat-companion`,
62
66
  connector: (node) => {
63
67
  return Rx.make((get) => {
64
- return pipe(
68
+ return Function.pipe(
65
69
  get(node),
66
- Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),
70
+ Option.flatMap((node) =>
71
+ Obj.instanceOf(Channel.Channel, node.data) ? Option.some(node.data) : Option.none(),
72
+ ),
67
73
  Option.map((channel) => {
68
74
  const callManager = context.getCapability(ThreadCapabilities.CallManager);
69
75
  const joined = get(
@@ -79,7 +85,7 @@ export default (context: PluginContext) => {
79
85
  type: PLANK_COMPANION_TYPE,
80
86
  data: 'chat',
81
87
  properties: {
82
- label: ['channel companion label', { ns: THREAD_PLUGIN }],
88
+ label: ['channel companion label', { ns: meta.id }],
83
89
  icon: 'ph--hash--regular',
84
90
  position: 'hoist',
85
91
  disposition: 'hidden',
@@ -96,10 +102,10 @@ export default (context: PluginContext) => {
96
102
  id: `${meta.id}/comments-companion`,
97
103
  connector: (node) =>
98
104
  Rx.make((get) =>
99
- pipe(
105
+ Function.pipe(
100
106
  get(node),
101
107
  Option.flatMap((node) => {
102
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
108
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
103
109
  return Option.none();
104
110
  }
105
111
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -126,10 +132,10 @@ export default (context: PluginContext) => {
126
132
  id: `${meta.id}/comment-toolbar`,
127
133
  actions: (node) =>
128
134
  Rx.make((get) =>
129
- pipe(
135
+ Function.pipe(
130
136
  get(node),
131
137
  Option.flatMap((node) => {
132
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
138
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
133
139
  return Option.none();
134
140
  }
135
141
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -2,12 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes, type PluginContext } from '@dxos/app-framework';
5
+ import { type PluginContext, contributes } from '@dxos/app-framework';
6
6
  import { ClientCapabilities } from '@dxos/plugin-client';
7
7
 
8
- import { ThreadCapabilities } from './capabilities';
9
8
  import { CallManager } from '../calls';
10
9
 
10
+ import { ThreadCapabilities } from './capabilities';
11
+
11
12
  export default async (context: PluginContext) => {
12
13
  const client = context.getCapability(ClientCapabilities.Client);
13
14
  const callManager = new CallManager(client);
@@ -5,29 +5,29 @@
5
5
  import { defineCapability } from '@dxos/app-framework';
6
6
  import { type DeepReadonly } from '@dxos/util';
7
7
 
8
- import { type CallState, type MediaState, type CallManager } from '../calls';
9
- import { THREAD_PLUGIN } from '../meta';
10
- import { type ViewState, type ThreadState, type ChannelType } from '../types';
8
+ import { type CallManager, type CallState, type MediaState } from '../calls';
9
+ import { meta } from '../meta';
10
+ import { type Channel, type ThreadState, type ViewState } from '../types';
11
11
 
12
12
  export namespace ThreadCapabilities {
13
- export const CallManager = defineCapability<CallManager>(`${THREAD_PLUGIN}/capability/call-manager`);
13
+ export const CallManager = defineCapability<CallManager>(`${meta.id}/capability/call-manager`);
14
14
 
15
15
  // TODO(burdon): Better way to define specific extensions for meeting companions.
16
16
  // TODO(burdon): This brings in deps from ../calls; how should we manage/minimize explicit type exposure to other plugins?
17
17
  // TODO(wittjosiah): These callbacks could be intents once we support broadcast.
18
18
  export type CallProperties = {
19
- onJoin: (state: { channel?: ChannelType; roomId?: string }) => Promise<void>;
19
+ onJoin: (state: { channel?: Channel.Channel; roomId?: string }) => Promise<void>;
20
20
  onLeave: (roomId?: string) => Promise<void>;
21
21
  onCallStateUpdated: (callState: CallState) => Promise<void>;
22
22
  onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => Promise<void>;
23
23
  };
24
- export const CallExtension = defineCapability<CallProperties>(`${THREAD_PLUGIN}/capability/call-extension`);
24
+ export const CallExtension = defineCapability<CallProperties>(`${meta.id}/capability/call-extension`);
25
25
 
26
26
  type GetViewState = (subjectId: string) => ViewState;
27
27
  export const State = defineCapability<{ state: DeepReadonly<ThreadState>; getViewState: GetViewState }>(
28
- `${THREAD_PLUGIN}/capability/state`,
28
+ `${meta.id}/capability/state`,
29
29
  );
30
30
  export const MutableState = defineCapability<{ state: ThreadState; getViewState: GetViewState }>(
31
- `${THREAD_PLUGIN}/capability/state`,
31
+ `${meta.id}/capability/state`,
32
32
  );
33
33
  }
@@ -12,5 +12,6 @@ export const ReactRoot = lazy(() => import('./react-root'));
12
12
  export const ReactSurface = lazy(() => import('./react-surface'));
13
13
  export const ThreadSettings = lazy(() => import('./settings'));
14
14
  export const ThreadState = lazy(() => import('./state'));
15
+ export const Toolkit = lazy(() => import('./toolkit'));
15
16
 
16
17
  export * from './capabilities';
@@ -2,31 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Effect } from 'effect';
5
+ import * as Effect from 'effect/Effect';
6
6
 
7
- import { Capabilities, contributes, createIntent, createResolver, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
8
8
  import { sleep } from '@dxos/async';
9
9
  import { Obj, Relation, Type } from '@dxos/echo';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
12
12
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
13
13
  import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
14
- import { fullyQualifiedId, getSpace, Ref } from '@dxos/react-client/echo';
14
+ import { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
15
15
  import { AnchoredTo, DataType } from '@dxos/schema';
16
16
 
17
+ import { meta } from '../meta';
18
+ import { Channel, Thread, ThreadAction } from '../types';
19
+
17
20
  import { ThreadCapabilities } from './capabilities';
18
- import { THREAD_PLUGIN } from '../meta';
19
- import { ChannelType, ThreadAction, ThreadType } from '../types';
20
21
 
21
22
  export default (context: PluginContext) =>
22
23
  contributes(Capabilities.IntentResolver, [
23
24
  createResolver({
24
- intent: ThreadAction.OnSpaceCreated,
25
+ intent: ThreadAction.onCreateSpace,
25
26
  resolve: ({ space, rootCollection }) =>
26
27
  Effect.gen(function* () {
27
28
  const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
28
29
  const { object: collection } = yield* dispatch(
29
- createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
30
+ createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(Channel.Channel) }),
30
31
  );
31
32
  rootCollection.objects.push(Ref.make(collection));
32
33
 
@@ -40,18 +41,14 @@ export default (context: PluginContext) =>
40
41
  intent: ThreadAction.CreateChannel,
41
42
  resolve: ({ name }) => ({
42
43
  data: {
43
- object: Obj.make(ChannelType, {
44
- name,
45
- defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),
46
- threads: [],
47
- }),
44
+ object: Channel.make({ name }),
48
45
  },
49
46
  }),
50
47
  }),
51
48
  createResolver({
52
49
  intent: ThreadAction.CreateChannelThread,
53
50
  resolve: ({ channel }) => {
54
- const thread = Obj.make(ThreadType, { messages: [], status: 'active' });
51
+ const thread = Thread.make({ status: 'active' });
55
52
  channel.threads.push(Ref.make(thread));
56
53
  return {
57
54
  data: {
@@ -69,7 +66,7 @@ export default (context: PluginContext) =>
69
66
 
70
67
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
71
68
  const subjectId = fullyQualifiedId(subject);
72
- const thread = Obj.make(ThreadType, { name, messages: [], status: 'staged' });
69
+ const thread = Thread.make({ name });
73
70
  const anchor = Relation.make(AnchoredTo, {
74
71
  [Relation.Source]: thread,
75
72
  [Relation.Target]: subject,
@@ -94,6 +91,39 @@ export default (context: PluginContext) =>
94
91
  };
95
92
  },
96
93
  }),
94
+ createResolver({
95
+ intent: ThreadAction.AddProposal,
96
+ resolve: ({ text, anchor, sender, subject }) => {
97
+ const space = getSpace(subject);
98
+ invariant(space, 'Space not found');
99
+
100
+ const subjectId = fullyQualifiedId(subject);
101
+ const proposal = Obj.make(DataType.Message, {
102
+ created: new Date().toISOString(),
103
+ sender,
104
+ blocks: [{ _tag: 'proposal', text }],
105
+ });
106
+ const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
107
+
108
+ return {
109
+ intents: [
110
+ createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }),
111
+ createIntent(SpaceAction.AddRelation, {
112
+ space,
113
+ schema: AnchoredTo,
114
+ source: thread,
115
+ target: subject,
116
+ fields: { anchor },
117
+ }),
118
+ createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
119
+ createIntent(DeckAction.ChangeCompanion, {
120
+ primary: subjectId,
121
+ companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
122
+ }),
123
+ ],
124
+ };
125
+ },
126
+ }),
97
127
  createResolver({
98
128
  intent: ThreadAction.Select,
99
129
  resolve: ({ current }) => {
@@ -130,7 +160,7 @@ export default (context: PluginContext) =>
130
160
  createResolver({
131
161
  intent: ThreadAction.Delete,
132
162
  resolve: async ({ subject, anchor, thread: _thread }, undo) => {
133
- const thread = _thread ?? (Relation.getSource(anchor) as ThreadType);
163
+ const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
134
164
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
135
165
  const subjectId = fullyQualifiedId(subject);
136
166
  const draft = state.drafts[subjectId];
@@ -156,7 +186,7 @@ export default (context: PluginContext) =>
156
186
 
157
187
  return {
158
188
  undoable: {
159
- message: ['thread deleted label', { ns: THREAD_PLUGIN }],
189
+ message: ['thread deleted label', { ns: meta.id }],
160
190
  data: { thread, anchor },
161
191
  },
162
192
  intents: [
@@ -192,12 +222,11 @@ export default (context: PluginContext) =>
192
222
  createResolver({
193
223
  intent: ThreadAction.AddMessage,
194
224
  resolve: ({ anchor, subject, sender, text }) => {
195
- const thread = Relation.getSource(anchor) as ThreadType;
225
+ const thread = Relation.getSource(anchor) as Thread.Thread;
196
226
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
197
227
  const subjectId = fullyQualifiedId(subject);
198
228
  const space = getSpace(subject);
199
229
  invariant(space, 'Space not found');
200
- const intents = [];
201
230
 
202
231
  const message = Obj.make(DataType.Message, {
203
232
  created: new Date().toISOString(),
@@ -208,6 +237,7 @@ export default (context: PluginContext) =>
208
237
  });
209
238
  thread.messages.push(Ref.make(message));
210
239
 
240
+ const intents = [];
211
241
  const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
212
242
  if (draft) {
213
243
  // Move draft to document.
@@ -254,7 +284,7 @@ export default (context: PluginContext) =>
254
284
  createResolver({
255
285
  intent: ThreadAction.DeleteMessage,
256
286
  resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
257
- const thread = Relation.getSource(anchor) as ThreadType;
287
+ const thread = Relation.getSource(anchor) as Thread.Thread;
258
288
  const space = getSpace(subject);
259
289
  invariant(space, 'Space not found');
260
290
 
@@ -276,7 +306,7 @@ export default (context: PluginContext) =>
276
306
 
277
307
  return {
278
308
  undoable: {
279
- message: ['message deleted label', { ns: THREAD_PLUGIN }],
309
+ message: ['message deleted label', { ns: meta.id }],
280
310
  data: { message, messageIndex },
281
311
  },
282
312
  intents: [
@@ -4,15 +4,16 @@
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
6
 
7
- import { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
8
8
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
9
9
  import { MarkdownCapabilities } from '@dxos/plugin-markdown';
10
10
  import { fullyQualifiedId } from '@dxos/react-client/echo';
11
- import { commentClickedEffect, commentsState, type EditorState, overlap } from '@dxos/react-ui-editor';
11
+ import { type EditorState, commentClickedEffect, commentsState, overlap } from '@dxos/react-ui-editor';
12
12
 
13
- import { ThreadCapabilities } from './capabilities';
14
13
  import { threads } from '../extensions';
15
14
 
15
+ import { ThreadCapabilities } from './capabilities';
16
+
16
17
  export default (context: PluginContext) =>
17
18
  contributes(MarkdownCapabilities.Extensions, [
18
19
  ({ document: doc }) => {
@@ -7,11 +7,11 @@ import React from 'react';
7
7
  import { Capabilities, contributes } from '@dxos/app-framework';
8
8
 
9
9
  import { Call } from '../components';
10
- import { THREAD_PLUGIN } from '../meta';
10
+ import { meta } from '../meta';
11
11
 
12
12
  export default () => {
13
13
  return contributes(Capabilities.ReactRoot, {
14
- id: THREAD_PLUGIN,
14
+ id: meta.id,
15
15
  root: () => <Call.Audio />,
16
16
  });
17
17
  };