@dxos/plugin-thread 0.8.3-staging.0fa589b → 0.8.4-main.2e9d522

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 (247) hide show
  1. package/dist/lib/browser/ChannelContainer-IY2UIRLF.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs → app-graph-builder-N7BE5TYW.mjs} +6 -6
  4. package/dist/lib/browser/{call-manager-APQAZWHT.mjs → call-manager-NIPDYUVD.mjs} +6 -5
  5. package/dist/lib/browser/chunk-4OYAYON2.mjs +21 -0
  6. package/dist/lib/browser/chunk-6NSMBO3B.mjs +56 -0
  7. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-5P5BH5GE.mjs → chunk-ERWASUQK.mjs} +66 -5
  9. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-IIUTBDVB.mjs → chunk-EV4JWI7L.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-AEXWNS6Z.mjs → chunk-GCLD5ESP.mjs} +14 -5
  12. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-GERVMFQW.mjs} +2 -2
  14. package/dist/lib/browser/{chunk-XZKBN3NS.mjs → chunk-KWPRNHTK.mjs} +32 -31
  15. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-R5MDLUPC.mjs → chunk-LGSDKXPF.mjs} +3 -3
  17. package/dist/lib/browser/chunk-VUWC4IJM.mjs +479 -0
  18. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-XLPJXUKO.mjs +367 -0
  20. package/dist/lib/browser/chunk-XLPJXUKO.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-ZE7KWN36.mjs} +85 -124
  22. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +35 -41
  24. package/dist/lib/browser/index.mjs.map +3 -3
  25. package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs → intent-resolver-JFGLZ6VI.mjs} +30 -14
  26. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +7 -0
  27. package/dist/lib/browser/{markdown-TE5SWWNJ.mjs → markdown-GEXBVJYN.mjs} +7 -7
  28. package/dist/lib/browser/meta.json +1 -1
  29. package/dist/lib/browser/react-root-X4UIVGTX.mjs +28 -0
  30. package/dist/lib/browser/{react-surface-VXUJKSOG.mjs → react-surface-YCYEFBPM.mjs} +12 -11
  31. package/dist/lib/browser/{settings-RB2RSLXV.mjs → settings-E32MTL7A.mjs} +4 -4
  32. package/dist/lib/browser/{state-RKL5MSDP.mjs → state-H6CYONWE.mjs} +4 -4
  33. package/dist/lib/browser/types/index.mjs +2 -2
  34. package/dist/lib/node-esm/ChannelContainer-DET6T5N2.mjs +17 -0
  35. package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs → ChatContainer-IQUWU426.mjs} +6 -5
  36. package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs → app-graph-builder-VCW76Z6V.mjs} +6 -6
  37. package/dist/lib/node-esm/{call-manager-UUYXLF4T.mjs → call-manager-D6O5ZJJ4.mjs} +6 -5
  38. package/dist/lib/{browser/call-manager-APQAZWHT.mjs.map → node-esm/call-manager-D6O5ZJJ4.mjs.map} +1 -1
  39. package/dist/lib/node-esm/{chunk-O3V45YJP.mjs → chunk-25ABSYP2.mjs} +65 -5
  40. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +480 -0
  42. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-57XR3LEF.mjs} +2 -2
  44. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs → chunk-75RJ5DJI.mjs} +3 -3
  45. package/dist/lib/node-esm/{chunk-2RNIPFDA.mjs → chunk-C3XFMUAY.mjs} +32 -31
  46. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs → chunk-GRLRWTRU.mjs} +2 -2
  48. package/dist/lib/node-esm/chunk-GW37AAM4.mjs +23 -0
  49. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-IHDNQLLR.mjs} +84 -124
  50. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs +368 -0
  52. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs +58 -0
  54. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs → chunk-TDFHTCZZ.mjs} +14 -5
  56. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +7 -0
  57. package/dist/lib/node-esm/index.mjs +35 -41
  58. package/dist/lib/node-esm/index.mjs.map +3 -3
  59. package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs → intent-resolver-OXGNQ44Y.mjs} +30 -14
  60. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +7 -0
  61. package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs → markdown-LIJZDK2J.mjs} +7 -7
  62. package/dist/lib/node-esm/meta.json +1 -1
  63. package/dist/lib/node-esm/{react-root-RUXOAQNW.mjs → react-root-M7J6PZVW.mjs} +12 -11
  64. package/dist/lib/{browser/react-root-NK3A4VG7.mjs.map → node-esm/react-root-M7J6PZVW.mjs.map} +1 -1
  65. package/dist/lib/node-esm/{react-surface-ELXFYKP6.mjs → react-surface-IRSEKM42.mjs} +12 -11
  66. package/dist/lib/{browser/react-surface-VXUJKSOG.mjs.map → node-esm/react-surface-IRSEKM42.mjs.map} +1 -1
  67. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs → settings-SJ24YG7M.mjs} +4 -4
  68. package/dist/lib/node-esm/{state-6AUTNROZ.mjs → state-D7WNDT3N.mjs} +4 -4
  69. package/dist/lib/node-esm/types/index.mjs +2 -2
  70. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  71. package/dist/types/src/calls/call-manager.d.ts +1 -1
  72. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  73. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  74. package/dist/types/src/calls/util/calls-service.d.ts +4 -1
  75. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  76. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  77. package/dist/types/src/calls-service.stories.d.ts +22 -0
  78. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  80. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  81. package/dist/types/src/components/ChannelContainer.stories.d.ts +2 -2
  82. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/Chat.stories.d.ts +3 -2
  84. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/ChatContainer.d.ts +2 -2
  86. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  87. package/dist/types/src/components/Comments.stories.d.ts +1 -1
  88. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/CommentsContainer.d.ts +4 -4
  90. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  91. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  92. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  93. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  94. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +1 -1
  97. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +1 -1
  99. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/index.d.ts +1 -1
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/hooks/index.d.ts +2 -0
  103. package/dist/types/src/hooks/index.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  105. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  106. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  107. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  108. package/dist/types/src/testing/stories.d.ts.map +1 -1
  109. package/dist/types/src/translations.d.ts +74 -194
  110. package/dist/types/src/translations.d.ts.map +1 -1
  111. package/dist/types/src/types/schema.d.ts +50 -21
  112. package/dist/types/src/types/schema.d.ts.map +1 -1
  113. package/dist/types/src/types/types.d.ts +68 -22
  114. package/dist/types/src/types/types.d.ts.map +1 -1
  115. package/dist/types/src/util.d.ts +17 -2
  116. package/dist/types/src/util.d.ts.map +1 -1
  117. package/dist/types/tsconfig.tsbuildinfo +1 -1
  118. package/package.json +47 -48
  119. package/src/ThreadPlugin.tsx +7 -22
  120. package/src/calls/call-manager.ts +6 -2
  121. package/src/calls/media-manager.ts +11 -4
  122. package/src/calls/util/calls-service.ts +8 -5
  123. package/src/calls/util/stub-media-streams.ts +3 -6
  124. package/src/calls-service.stories.tsx +216 -0
  125. package/src/capabilities/intent-resolver.ts +22 -4
  126. package/src/components/Call/Call.tsx +1 -1
  127. package/src/components/Call/Toolbar.tsx +3 -3
  128. package/src/components/CallDebugPanel.tsx +2 -2
  129. package/src/components/ChannelContainer.stories.tsx +5 -5
  130. package/src/components/ChannelContainer.tsx +6 -5
  131. package/src/components/Chat.stories.tsx +4 -4
  132. package/src/components/ChatContainer.tsx +12 -11
  133. package/src/components/Comments.stories.tsx +22 -15
  134. package/src/components/CommentsContainer.tsx +16 -11
  135. package/src/components/{CommentContainer.tsx → CommentsThreadContainer.tsx} +49 -80
  136. package/src/components/Media/VideoObject.stories.tsx +1 -1
  137. package/src/components/MessageContainer.tsx +29 -45
  138. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +2 -2
  139. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +3 -3
  140. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  141. package/src/components/ThreadComplementary.tsx +2 -2
  142. package/src/components/ThreadSettings.tsx +2 -2
  143. package/src/components/index.ts +1 -1
  144. package/src/components/testing.ts +2 -2
  145. package/src/hooks/index.ts +2 -0
  146. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  147. package/src/hooks/useVideoStreamTrack.tsx +33 -0
  148. package/src/testing/stories.ts +5 -1
  149. package/src/translations.ts +11 -8
  150. package/src/types/types.ts +9 -1
  151. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  152. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  153. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  154. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  155. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  156. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  157. package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
  158. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
  160. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  162. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  163. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  164. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  165. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  166. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  167. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  168. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  169. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  170. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  171. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  172. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  173. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  174. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  175. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  176. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  177. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  178. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  179. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  180. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  181. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  182. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  183. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  184. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  185. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  186. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  187. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  188. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  189. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  190. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  191. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  192. package/dist/lib/node/index.cjs +0 -310
  193. package/dist/lib/node/index.cjs.map +0 -7
  194. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  195. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  196. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  197. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  198. package/dist/lib/node/meta.json +0 -1
  199. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  200. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  201. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  202. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  203. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  204. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  205. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  206. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  207. package/dist/lib/node/types/index.cjs +0 -38
  208. package/dist/lib/node/types/index.cjs.map +0 -7
  209. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  210. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  211. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  212. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  213. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
  214. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  215. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  216. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
  217. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  219. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  220. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  221. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  222. package/dist/types/src/peers.stories.d.ts +0 -11
  223. package/dist/types/src/peers.stories.d.ts.map +0 -1
  224. package/src/peers.stories.tsx +0 -189
  225. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → ChannelContainer-IY2UIRLF.mjs.map} +0 -0
  226. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → ChatContainer-AIGIWAUG.mjs.map} +0 -0
  227. /package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs.map → app-graph-builder-N7BE5TYW.mjs.map} +0 -0
  228. /package/dist/lib/{node-esm/call-manager-UUYXLF4T.mjs.map → browser/call-manager-NIPDYUVD.mjs.map} +0 -0
  229. /package/dist/lib/browser/{chunk-6NBVNXTM.mjs.map → chunk-4OYAYON2.mjs.map} +0 -0
  230. /package/dist/lib/browser/{chunk-IIUTBDVB.mjs.map → chunk-EV4JWI7L.mjs.map} +0 -0
  231. /package/dist/lib/browser/{chunk-JKQUJOTX.mjs.map → chunk-GERVMFQW.mjs.map} +0 -0
  232. /package/dist/lib/browser/{chunk-R5MDLUPC.mjs.map → chunk-LGSDKXPF.mjs.map} +0 -0
  233. /package/dist/lib/browser/{markdown-TE5SWWNJ.mjs.map → markdown-GEXBVJYN.mjs.map} +0 -0
  234. /package/dist/lib/{node-esm/react-root-RUXOAQNW.mjs.map → browser/react-root-X4UIVGTX.mjs.map} +0 -0
  235. /package/dist/lib/{node-esm/react-surface-ELXFYKP6.mjs.map → browser/react-surface-YCYEFBPM.mjs.map} +0 -0
  236. /package/dist/lib/browser/{settings-RB2RSLXV.mjs.map → settings-E32MTL7A.mjs.map} +0 -0
  237. /package/dist/lib/browser/{state-RKL5MSDP.mjs.map → state-H6CYONWE.mjs.map} +0 -0
  238. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → ChannelContainer-DET6T5N2.mjs.map} +0 -0
  239. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → ChatContainer-IQUWU426.mjs.map} +0 -0
  240. /package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs.map → app-graph-builder-VCW76Z6V.mjs.map} +0 -0
  241. /package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs.map → chunk-57XR3LEF.mjs.map} +0 -0
  242. /package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs.map → chunk-75RJ5DJI.mjs.map} +0 -0
  243. /package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs.map → chunk-GRLRWTRU.mjs.map} +0 -0
  244. /package/dist/lib/node-esm/{chunk-O63QJPQX.mjs.map → chunk-GW37AAM4.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs.map → markdown-LIJZDK2J.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{settings-EA7DFSM6.mjs.map → settings-SJ24YG7M.mjs.map} +0 -0
  247. /package/dist/lib/node-esm/{state-6AUTNROZ.mjs.map → state-D7WNDT3N.mjs.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-thread",
3
- "version": "0.8.3-staging.0fa589b",
3
+ "version": "0.8.4-main.2e9d522",
4
4
  "description": "DXOS Threads Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -45,66 +45,65 @@
45
45
  "md5-hex": "5.0.0",
46
46
  "react-resize-detector": "^12.0.2",
47
47
  "wavefile": "^11.0.0",
48
- "@dxos/app-framework": "0.8.3-staging.0fa589b",
49
- "@dxos/async": "0.8.3-staging.0fa589b",
50
- "@dxos/codec-protobuf": "0.8.3-staging.0fa589b",
51
- "@dxos/context": "0.8.3-staging.0fa589b",
52
- "@dxos/display-name": "0.8.3-staging.0fa589b",
53
- "@dxos/echo-schema": "0.8.3-staging.0fa589b",
54
- "@dxos/invariant": "0.8.3-staging.0fa589b",
55
- "@dxos/echo": "0.8.3-staging.0fa589b",
56
- "@dxos/devtools": "0.8.3-staging.0fa589b",
57
- "@dxos/live-object": "0.8.3-staging.0fa589b",
58
- "@dxos/keys": "0.8.3-staging.0fa589b",
59
- "@dxos/log": "0.8.3-staging.0fa589b",
60
- "@dxos/local-storage": "0.8.3-staging.0fa589b",
61
- "@dxos/plugin-client": "0.8.3-staging.0fa589b",
62
- "@dxos/plugin-attention": "0.8.3-staging.0fa589b",
63
- "@dxos/plugin-graph": "0.8.3-staging.0fa589b",
64
- "@dxos/plugin-markdown": "0.8.3-staging.0fa589b",
65
- "@dxos/plugin-deck": "0.8.3-staging.0fa589b",
66
- "@dxos/plugin-observability": "0.8.3-staging.0fa589b",
67
- "@dxos/plugin-space": "0.8.3-staging.0fa589b",
68
- "@dxos/protocols": "0.8.3-staging.0fa589b",
69
- "@dxos/react-client": "0.8.3-staging.0fa589b",
70
- "@dxos/react-ui-dnd": "0.8.3-staging.0fa589b",
71
- "@dxos/react-ui-attention": "0.8.3-staging.0fa589b",
72
- "@dxos/react-ui-form": "0.8.3-staging.0fa589b",
73
- "@dxos/react-ui-editor": "0.8.3-staging.0fa589b",
74
- "@dxos/react-ui-menu": "0.8.3-staging.0fa589b",
75
- "@dxos/react-ui-sfx": "0.8.3-staging.0fa589b",
76
- "@dxos/react-ui-stack": "0.8.3-staging.0fa589b",
77
- "@dxos/react-ui-tabs": "0.8.3-staging.0fa589b",
78
- "@dxos/react-ui-thread": "0.8.3-staging.0fa589b",
79
- "@dxos/schema": "0.8.3-staging.0fa589b",
80
- "@dxos/react-ui-syntax-highlighter": "0.8.3-staging.0fa589b",
81
- "@dxos/util": "0.8.3-staging.0fa589b"
48
+ "@dxos/app-framework": "0.8.4-main.2e9d522",
49
+ "@dxos/async": "0.8.4-main.2e9d522",
50
+ "@dxos/context": "0.8.4-main.2e9d522",
51
+ "@dxos/codec-protobuf": "0.8.4-main.2e9d522",
52
+ "@dxos/debug": "0.8.4-main.2e9d522",
53
+ "@dxos/devtools": "0.8.4-main.2e9d522",
54
+ "@dxos/echo": "0.8.4-main.2e9d522",
55
+ "@dxos/display-name": "0.8.4-main.2e9d522",
56
+ "@dxos/echo-schema": "0.8.4-main.2e9d522",
57
+ "@dxos/invariant": "0.8.4-main.2e9d522",
58
+ "@dxos/keys": "0.8.4-main.2e9d522",
59
+ "@dxos/live-object": "0.8.4-main.2e9d522",
60
+ "@dxos/local-storage": "0.8.4-main.2e9d522",
61
+ "@dxos/log": "0.8.4-main.2e9d522",
62
+ "@dxos/plugin-attention": "0.8.4-main.2e9d522",
63
+ "@dxos/plugin-client": "0.8.4-main.2e9d522",
64
+ "@dxos/plugin-deck": "0.8.4-main.2e9d522",
65
+ "@dxos/plugin-graph": "0.8.4-main.2e9d522",
66
+ "@dxos/plugin-markdown": "0.8.4-main.2e9d522",
67
+ "@dxos/plugin-observability": "0.8.4-main.2e9d522",
68
+ "@dxos/protocols": "0.8.4-main.2e9d522",
69
+ "@dxos/plugin-space": "0.8.4-main.2e9d522",
70
+ "@dxos/react-client": "0.8.4-main.2e9d522",
71
+ "@dxos/react-ui-attention": "0.8.4-main.2e9d522",
72
+ "@dxos/react-ui-dnd": "0.8.4-main.2e9d522",
73
+ "@dxos/react-ui-editor": "0.8.4-main.2e9d522",
74
+ "@dxos/react-ui-form": "0.8.4-main.2e9d522",
75
+ "@dxos/react-ui-menu": "0.8.4-main.2e9d522",
76
+ "@dxos/react-ui-sfx": "0.8.4-main.2e9d522",
77
+ "@dxos/react-ui-stack": "0.8.4-main.2e9d522",
78
+ "@dxos/react-ui-tabs": "0.8.4-main.2e9d522",
79
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.2e9d522",
80
+ "@dxos/react-ui-thread": "0.8.4-main.2e9d522",
81
+ "@dxos/schema": "0.8.4-main.2e9d522",
82
+ "@dxos/util": "0.8.4-main.2e9d522"
82
83
  },
83
84
  "devDependencies": {
84
- "@effect-rx/rx-react": "^0.34.1",
85
- "@effect/platform": "0.80.12",
86
- "@phosphor-icons/react": "^2.1.5",
85
+ "@effect-rx/rx-react": "0.38.0",
86
+ "@effect/platform": "0.89.0",
87
87
  "@types/react": "~18.2.0",
88
88
  "@types/react-dom": "~18.2.0",
89
- "effect": "3.14.21",
89
+ "effect": "3.17.0",
90
90
  "react": "~18.2.0",
91
91
  "react-dom": "~18.2.0",
92
92
  "vite": "5.4.7",
93
- "@dxos/random": "0.8.3-staging.0fa589b",
94
- "@dxos/plugin-theme": "0.8.3-staging.0fa589b",
95
- "@dxos/react-ui": "0.8.3-staging.0fa589b",
96
- "@dxos/storybook-utils": "0.8.3-staging.0fa589b",
97
- "@dxos/react-ui-theme": "0.8.3-staging.0fa589b"
93
+ "@dxos/plugin-theme": "0.8.4-main.2e9d522",
94
+ "@dxos/random": "0.8.4-main.2e9d522",
95
+ "@dxos/react-ui": "0.8.4-main.2e9d522",
96
+ "@dxos/storybook-utils": "0.8.4-main.2e9d522",
97
+ "@dxos/react-ui-theme": "0.8.4-main.2e9d522"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@effect-rx/rx-react": "^0.34.1",
101
- "@effect/platform": "0.80.12",
102
- "@phosphor-icons/react": "^2.1.5",
101
+ "@effect/platform": "^0.80.12",
103
102
  "effect": "^3.13.3",
104
103
  "react": "~18.2.0",
105
104
  "react-dom": "~18.2.0",
106
- "@dxos/react-ui": "0.8.3-staging.0fa589b",
107
- "@dxos/react-ui-theme": "0.8.3-staging.0fa589b"
105
+ "@dxos/react-ui": "0.8.4-main.2e9d522",
106
+ "@dxos/react-ui-theme": "0.8.4-main.2e9d522"
108
107
  },
109
108
  "publishConfig": {
110
109
  "access": "public"
@@ -2,14 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Effect } from 'effect';
6
-
7
5
  import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
8
- import { Ref, Type } from '@dxos/echo';
6
+ import { Ref } from '@dxos/echo';
9
7
  import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
10
8
  import { MarkdownEvents } from '@dxos/plugin-markdown';
11
9
  import { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';
12
- import { CollectionAction, defineObjectForm } from '@dxos/plugin-space/types';
10
+ import { defineObjectForm } from '@dxos/plugin-space/types';
13
11
  import { translations as threadTranslations } from '@dxos/react-ui-thread';
14
12
  import { AnchoredTo, DataType } from '@dxos/schema';
15
13
 
@@ -23,7 +21,7 @@ import {
23
21
  ThreadState,
24
22
  } from './capabilities';
25
23
  import { meta, THREAD_ITEM } from './meta';
26
- import translations from './translations';
24
+ import { translations } from './translations';
27
25
  import { ChannelType, ThreadAction, ThreadType } from './types';
28
26
 
29
27
  // TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.
@@ -124,23 +122,10 @@ export const ThreadPlugin = () =>
124
122
  defineModule({
125
123
  id: `${meta.id}/module/on-space-created`,
126
124
  activatesOn: SpaceEvents.SpaceCreated,
127
- activate: (context) => {
128
- const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
129
- return contributes(SpaceCapabilities.OnSpaceCreated, async ({ space, rootCollection }) => {
130
- const program = Effect.gen(function* () {
131
- const { object: collection } = yield* dispatch(
132
- createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
133
- );
134
- rootCollection.objects.push(Ref.make(collection));
135
-
136
- const { object: channel } = yield* dispatch(
137
- createIntent(ThreadAction.CreateChannel, { name: 'General', spaceId: space.id }),
138
- );
139
- space.db.add(channel);
140
- });
141
- await Effect.runPromise(program);
142
- });
143
- },
125
+ activate: () =>
126
+ contributes(SpaceCapabilities.OnSpaceCreated, ({ space, rootCollection }) =>
127
+ createIntent(ThreadAction.OnSpaceCreated, { space, rootCollection }),
128
+ ),
144
129
  }),
145
130
  defineModule({
146
131
  id: `${meta.id}/module/markdown`,
@@ -88,8 +88,12 @@ export class CallManager extends Resource {
88
88
  }
89
89
 
90
90
  /** @reactive */
91
- get pulledAudioTracks() {
92
- return Object.values(this._state.media.pulledAudioTracks).map((track) => track.track);
91
+ get audioTracksToPlay(): MediaStreamTrack[] {
92
+ return (this._state.call.users ?? [])
93
+ .map((user) => (user.tracks?.audioEnabled ? user.tracks?.audio : undefined))
94
+ .filter(isNonNullable)
95
+ .map((track) => this._state.media.pulledAudioTracks[track as EncodedTrackName]?.track)
96
+ .filter(isNonNullable);
93
97
  }
94
98
 
95
99
  /** @reactive */
@@ -54,6 +54,8 @@ export type MediaManagerParams = {
54
54
  serviceConfig: CallsServiceConfig;
55
55
  };
56
56
 
57
+ const USE_INAUDIBLE_AUDIO = false;
58
+
57
59
  export class MediaManager extends Resource {
58
60
  public readonly stateUpdated = new Event<MediaState>();
59
61
  private readonly _state: MediaState = { pulledVideoStreams: {}, pulledAudioTracks: {} };
@@ -86,8 +88,10 @@ export class MediaManager extends Resource {
86
88
  this._state.videoStream = new MediaStream();
87
89
  this._state.videoStream.addTrack(this._state.videoTrack);
88
90
 
89
- this._inaudibleAudioStreamTrack = await createInaudibleAudioStreamTrack({ ctx: this._ctx });
90
- this._state.audioTrack = this._inaudibleAudioStreamTrack;
91
+ if (USE_INAUDIBLE_AUDIO) {
92
+ this._inaudibleAudioStreamTrack = await createInaudibleAudioStreamTrack({ ctx: this._ctx });
93
+ this._state.audioTrack = this._inaudibleAudioStreamTrack;
94
+ }
91
95
 
92
96
  this._pushTracksTask = new DeferredTask(this._ctx, async () => {
93
97
  await this._pushTracks();
@@ -170,11 +174,14 @@ export class MediaManager extends Resource {
170
174
  async turnAudioOff(): Promise<void> {
171
175
  void this._speakingMonitor?.close();
172
176
  this._speakingMonitor = undefined;
173
- if (this._state.audioTrack !== this._inaudibleAudioStreamTrack) {
177
+ this._state.audioEnabled = false;
178
+ if (USE_INAUDIBLE_AUDIO && this._state.audioTrack !== this._inaudibleAudioStreamTrack) {
174
179
  this._state.audioTrack?.stop();
175
180
  this._state.audioTrack = this._inaudibleAudioStreamTrack;
181
+ } else {
182
+ this._state.audioTrack?.stop();
183
+ this._state.audioTrack = undefined;
176
184
  }
177
- this._state.audioEnabled = false;
178
185
  this.stateUpdated.emit(this._state);
179
186
  this._pushTracksTask!.schedule();
180
187
  }
@@ -73,7 +73,10 @@ export class CallsServicePeer extends Resource {
73
73
  pullTrackDispatcher = new BulkRequestDispatcher<
74
74
  TrackObject,
75
75
  {
76
- trackMap: Map<TrackObject, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
76
+ /**
77
+ * trackName -> { resolvedTrack, mid }
78
+ */
79
+ trackMap: Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
77
80
  }
78
81
  >(32);
79
82
 
@@ -354,14 +357,14 @@ export class CallsServicePeer extends Resource {
354
357
  );
355
358
 
356
359
  if (pulledTrackData && pulledTrackData.mid) {
357
- acc.set(track, {
360
+ acc.set(track.trackName!, {
358
361
  mid: pulledTrackData.mid,
359
362
  resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid),
360
363
  });
361
364
  }
362
365
 
363
366
  return acc;
364
- }, new Map<TrackObject, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
367
+ }, new Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
365
368
 
366
369
  if (newTrackResponse.requiresImmediateRenegotiation) {
367
370
  await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
@@ -392,7 +395,7 @@ export class CallsServicePeer extends Resource {
392
395
  }),
393
396
  )
394
397
  .then(({ trackMap }) => {
395
- const trackInfo = trackMap.get(trackData);
398
+ const trackInfo = trackMap.get(trackData.trackName!);
396
399
  if (trackInfo) {
397
400
  return trackInfo.resolvedTrack
398
401
  .then((track) => {
@@ -401,7 +404,7 @@ export class CallsServicePeer extends Resource {
401
404
  })
402
405
  .catch((err) => log.catch(err));
403
406
  } else {
404
- log.error('missing track info');
407
+ log.warn('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
405
408
  }
406
409
  });
407
410
 
@@ -48,19 +48,16 @@ export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context })
48
48
  const audioContext = new window.AudioContext();
49
49
  const oscillator = audioContext.createOscillator();
50
50
  oscillator.type = 'triangle';
51
-
52
- // set to 0.1 to make inaudible
53
- oscillator.frequency.setValueAtTime(0.1, audioContext.currentTime);
51
+ // roughly sounds like a box fan
52
+ oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
54
53
 
55
54
  const gainNode = audioContext.createGain();
56
55
  // even w/ gain at 0 some packets are sent
57
- gainNode.gain.setValueAtTime(0, audioContext.currentTime);
58
-
56
+ gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);
59
57
  oscillator.connect(gainNode);
60
58
 
61
59
  const destination = audioContext.createMediaStreamDestination();
62
60
  gainNode.connect(destination);
63
-
64
61
  oscillator.start();
65
62
 
66
63
  ctx.onDispose(async () => {
@@ -0,0 +1,216 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
+
9
+ import { scheduleTask, sleep } from '@dxos/async';
10
+ import { Context } from '@dxos/context';
11
+ import { invariant } from '@dxos/invariant';
12
+ import { log } from '@dxos/log';
13
+ import { Config, useConfig } from '@dxos/react-client';
14
+ import { withClientProvider } from '@dxos/react-client/testing';
15
+ import { Button } from '@dxos/react-ui';
16
+ import { Json } from '@dxos/react-ui-syntax-highlighter';
17
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
18
+
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';
23
+
24
+ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
25
+ const config = useConfig();
26
+ const callsConfig = {
27
+ iceServers: config.get('runtime.services.ice'),
28
+ apiBase: `${CALLS_URL}/api/calls`,
29
+ };
30
+ const peerPush = useMemo(() => new CallsServicePeer(callsConfig), []);
31
+ const peerPull = useMemo(() => new CallsServicePeer(callsConfig), []);
32
+ const [metrics, setMetrics] = useState<Record<string, any>>({});
33
+ const trackInfo = useRef<TrackObject | undefined>(undefined);
34
+ const pullCtx = useRef<Context | undefined>(undefined);
35
+ const [pulledTrack, setPulledTrack] = useState<MediaStreamTrack | undefined>(undefined);
36
+ const hadRun = useRef(false);
37
+
38
+ // Push/pull video stream track to cloudflare.
39
+ useEffect(() => {
40
+ if (hadRun.current || !mediaStreamTrack || !peerPush || !peerPull) {
41
+ log.info('not running', { hadRun: hadRun.current, mediaStreamTrack, peerPush, peerPull });
42
+ return;
43
+ }
44
+ hadRun.current = true;
45
+ const ctx = Context.default();
46
+ ctx.onDispose(() => {
47
+ log.info('disposing ctx', { ctx });
48
+ });
49
+ scheduleTask(
50
+ ctx,
51
+ async () => {
52
+ log.info('starting push/pull', { mediaStreamTrack });
53
+ await peerPush.open();
54
+ await peerPull.open();
55
+ ctx.onDispose(() => {
56
+ void peerPush.close();
57
+ void peerPull.close();
58
+ });
59
+
60
+ // Push track to cloudflare.
61
+ performance.mark('push:begin');
62
+ log.info('pushing track', { track: mediaStreamTrack });
63
+ trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack });
64
+ performance.mark('push:end');
65
+ const pushTime = performance.measure('push', 'push:begin', 'push:end').duration;
66
+ log.info('successfully pushed track', { pushTime, trackInfo: trackInfo.current });
67
+ setMetrics((prev) => ({ ...prev, 'time to push track [ms]': Math.round(pushTime) }));
68
+
69
+ // Wait for cloudflare to process the track.
70
+ await sleep(1000);
71
+
72
+ // Pull track from cloudflare.
73
+ performance.mark('pullTrack:begin');
74
+ pullCtx.current = Context.default();
75
+ let retries = 0;
76
+ let pulledTrack: MediaStreamTrack | undefined;
77
+ while (!pulledTrack && retries < 3) {
78
+ retries++;
79
+ log.info('pulling track', {
80
+ trackData: { ...trackInfo.current!, mid: undefined },
81
+ retries,
82
+ pulledTrack,
83
+ });
84
+ pulledTrack = await peerPull.pullTrack({
85
+ trackData: { ...trackInfo.current!, mid: undefined },
86
+ ctx: pullCtx.current,
87
+ });
88
+ await sleep(200);
89
+ }
90
+ invariant(pulledTrack);
91
+ setPulledTrack(pulledTrack);
92
+ performance.mark('pullTrack:end');
93
+ const pullTime = performance.measure('pullTrack', 'pullTrack:begin', 'pullTrack:end').duration;
94
+ setMetrics((prev) => ({ ...prev, 'time to pull track [ms]': Math.round(pullTime) }));
95
+ log.info('successfully pulled track', { pullTime, pulledTrack });
96
+ },
97
+ 1000,
98
+ );
99
+
100
+ return () => {
101
+ void ctx.dispose();
102
+ };
103
+ }, [mediaStreamTrack, peerPush, peerPull]);
104
+
105
+ const rePullTrack = useCallback(async () => {
106
+ performance.mark('rePullVideo:begin');
107
+ invariant(pulledTrack);
108
+ pulledTrack.stop();
109
+ await pullCtx.current!.dispose();
110
+ pullCtx.current = Context.default();
111
+ const newPulledTrack = await peerPull.pullTrack({
112
+ trackData: { ...trackInfo.current!, mid: undefined },
113
+ ctx: pullCtx.current,
114
+ });
115
+ invariant(newPulledTrack);
116
+ setPulledTrack(newPulledTrack);
117
+ performance.mark('rePullVideo:end');
118
+ const rePullTime = performance.measure('rePullVideo', 'rePullVideo:begin', 'rePullVideo:end').duration;
119
+ setMetrics((prev) => ({ ...prev, 'time to re-pull video [ms]': Math.round(rePullTime) }));
120
+ }, [peerPull, trackInfo.current, pullCtx.current, pulledTrack]);
121
+
122
+ return {
123
+ pulledTrack,
124
+ rePullTrack,
125
+ metrics,
126
+ };
127
+ };
128
+
129
+ const meta = {
130
+ title: 'plugins/plugin-thread/calls-service',
131
+ decorators: [
132
+ withClientProvider({
133
+ config: new Config({
134
+ runtime: {
135
+ services: {
136
+ iceProviders: [{ urls: 'https://edge.dxos.workers.dev/ice' }],
137
+ },
138
+ },
139
+ }),
140
+ }),
141
+ withTheme,
142
+ withLayout(),
143
+ ],
144
+ parameters: {
145
+ layout: 'centered',
146
+ },
147
+ };
148
+
149
+ export default meta;
150
+
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]);
176
+
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
+ args: {
199
+ videoSrc: video,
200
+ },
201
+ };
202
+
203
+ export const InaudibleAudioStreamTrack = {
204
+ render: () => {
205
+ const audioStreamTrack = useInaudibleAudioStreamTrack();
206
+
207
+ const { rePullTrack, metrics } = pushAndPullTrack(audioStreamTrack);
208
+
209
+ return (
210
+ <div className='flex flex-col gap-4 items-center'>
211
+ <Json data={metrics} />
212
+ <Button onClick={rePullTrack}>Re-pull audio</Button>
213
+ </div>
214
+ );
215
+ },
216
+ };
@@ -2,13 +2,15 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { Effect } from 'effect';
6
+
5
7
  import { Capabilities, contributes, createIntent, createResolver, type PluginContext } from '@dxos/app-framework';
6
8
  import { sleep } from '@dxos/async';
7
- import { Obj, Relation } from '@dxos/echo';
9
+ import { Obj, Relation, Type } from '@dxos/echo';
8
10
  import { invariant } from '@dxos/invariant';
9
11
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
10
12
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
11
- import { SpaceAction } from '@dxos/plugin-space/types';
13
+ import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
12
14
  import { fullyQualifiedId, getSpace, Ref } from '@dxos/react-client/echo';
13
15
  import { AnchoredTo, DataType } from '@dxos/schema';
14
16
 
@@ -18,6 +20,22 @@ import { ChannelType, ThreadAction, ThreadType } from '../types';
18
20
 
19
21
  export default (context: PluginContext) =>
20
22
  contributes(Capabilities.IntentResolver, [
23
+ createResolver({
24
+ intent: ThreadAction.OnSpaceCreated,
25
+ resolve: ({ space, rootCollection }) =>
26
+ Effect.gen(function* () {
27
+ const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
28
+ const { object: collection } = yield* dispatch(
29
+ createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
30
+ );
31
+ rootCollection.objects.push(Ref.make(collection));
32
+
33
+ const { object: channel } = yield* dispatch(
34
+ createIntent(ThreadAction.CreateChannel, { name: 'General', spaceId: space.id }),
35
+ );
36
+ space.db.add(channel);
37
+ }),
38
+ }),
21
39
  createResolver({
22
40
  intent: ThreadAction.CreateChannel,
23
41
  resolve: ({ name }) => ({
@@ -182,9 +200,9 @@ export default (context: PluginContext) =>
182
200
  const intents = [];
183
201
 
184
202
  const message = Obj.make(DataType.Message, {
185
- sender,
186
203
  created: new Date().toISOString(),
187
- blocks: [{ type: 'text', text }],
204
+ sender,
205
+ blocks: [{ _tag: 'text', text }],
188
206
  // TODO(wittjosiah): Context based on attention.
189
207
  // context: context ? Ref.make(context) : undefined,
190
208
  });
@@ -34,7 +34,7 @@ type CallAudioProps = {};
34
34
  const CallAudio: FC<CallAudioProps> = () => {
35
35
  const call = useCapability(ThreadCapabilities.CallManager);
36
36
 
37
- return <AudioStream tracks={call.pulledAudioTracks} />;
37
+ return <AudioStream tracks={call.audioTracksToPlay} />;
38
38
  };
39
39
 
40
40
  CallAudio.displayName = 'CallAudio';
@@ -19,7 +19,7 @@ import {
19
19
  import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
20
20
 
21
21
  import { ThreadCapabilities } from '../../capabilities';
22
- import { THREAD_PLUGIN } from '../../meta';
22
+ import { meta } from '../../meta';
23
23
  import { type ChannelType } from '../../types';
24
24
 
25
25
  export type ToolbarProps = ThemedClassName<{
@@ -40,7 +40,7 @@ export const Toolbar = ({
40
40
  onJoin,
41
41
  onLeave,
42
42
  }: ToolbarProps) => {
43
- const { t } = useTranslation(THREAD_PLUGIN);
43
+ const { t } = useTranslation(meta.id);
44
44
  const { graph } = useAppGraph();
45
45
  const call = useCapability(ThreadCapabilities.CallManager);
46
46
 
@@ -174,7 +174,7 @@ const defaultButtonProps: Partial<IconButtonProps> = {
174
174
  const ToggleButton = ({ active, state }: ToolbarButtonProps) => (
175
175
  <IconButton
176
176
  {...defaultButtonProps}
177
- classNames={[active ? state.on.classNames ?? 'bg-callActive' : state.off.classNames]}
177
+ classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}
178
178
  icon={active ? state.on.icon : state.off.icon}
179
179
  label={active ? state.on.label : state.off.label}
180
180
  onClick={active ? state.on.onClick : state.off.onClick}
@@ -11,16 +11,16 @@ import { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';
11
11
  import { Json } from '@dxos/react-ui-syntax-highlighter';
12
12
 
13
13
  import { type GlobalState } from '../calls';
14
- import { THREAD_PLUGIN } from '../meta';
14
+ import { meta } from '../meta';
15
15
 
16
16
  export type CallDebugPanelProps = ThemedClassName<{
17
17
  state?: GlobalState;
18
18
  }>;
19
19
 
20
20
  export const CallDebugPanel = ({ state }: CallDebugPanelProps) => {
21
+ const { t } = useTranslation(meta.id);
21
22
  const users = state?.call?.users;
22
23
  const self = state?.call?.self;
23
- const { t } = useTranslation(THREAD_PLUGIN);
24
24
 
25
25
  const [open, setOpen] = useState(false);
26
26
  const handleToggle = () => setOpen(!open);