@dxos/plugin-thread 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (289) hide show
  1. package/dist/lib/browser/ChannelContainer-MX5ABVGC.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-7F5Y6GXJ.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-FHAOPO57.mjs → app-graph-builder-HNYLII5E.mjs} +31 -32
  4. package/dist/lib/browser/app-graph-builder-HNYLII5E.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs +104 -0
  6. package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs.map +7 -0
  7. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs → call-manager-MAXQLMMS.mjs} +7 -7
  8. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs.map → call-manager-MAXQLMMS.mjs.map} +1 -1
  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-J26C57ZY.mjs → chunk-BQWQFTWT.mjs} +165 -101
  12. package/dist/lib/browser/chunk-BQWQFTWT.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  14. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-H63NDV62.mjs → chunk-FR6MEAZI.mjs} +18 -17
  16. package/dist/lib/browser/chunk-FR6MEAZI.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-TQJYDFBU.mjs → chunk-INQVAYPN.mjs} +40 -37
  18. package/dist/lib/browser/chunk-INQVAYPN.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-KEXJGF2R.mjs → chunk-ISCHODBV.mjs} +53 -3
  20. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
  22. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-2P3GVRHP.mjs → chunk-KOBXMDCI.mjs} +68 -67
  24. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-NMJEVD36.mjs +168 -0
  26. package/dist/lib/browser/chunk-NMJEVD36.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-OOUDK7Q7.mjs +23 -0
  28. package/dist/lib/browser/chunk-OOUDK7Q7.mjs.map +7 -0
  29. package/dist/lib/browser/{chunk-TUSBPMNU.mjs → chunk-ZCW3NSDZ.mjs} +274 -374
  30. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +42 -42
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-IB5GYU2D.mjs → intent-resolver-BOUT4WGY.mjs} +32 -99
  34. package/dist/lib/browser/intent-resolver-BOUT4WGY.mjs.map +7 -0
  35. package/dist/lib/browser/{markdown-Z677YORA.mjs → markdown-74EUSQGV.mjs} +24 -22
  36. package/dist/lib/browser/markdown-74EUSQGV.mjs.map +7 -0
  37. package/dist/lib/browser/meta.json +1 -1
  38. package/dist/lib/browser/react-root-BVG7B2LW.mjs +28 -0
  39. package/dist/lib/browser/react-root-BVG7B2LW.mjs.map +7 -0
  40. package/dist/lib/browser/{react-surface-X2VB6P37.mjs → react-surface-BCD5ODQ6.mjs} +37 -36
  41. package/dist/lib/browser/react-surface-BCD5ODQ6.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-GRKEID73.mjs → settings-LGQUZITB.mjs} +5 -5
  43. package/dist/lib/browser/{settings-GRKEID73.mjs.map → settings-LGQUZITB.mjs.map} +1 -1
  44. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-36REWXO5.mjs} +5 -5
  45. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-36REWXO5.mjs.map} +1 -1
  46. package/dist/lib/browser/types/index.mjs +7 -9
  47. package/dist/lib/node-esm/ChannelContainer-2JJJ3IDK.mjs +17 -0
  48. package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs → ChatContainer-C526R4DI.mjs} +6 -6
  49. package/dist/lib/node-esm/{app-graph-builder-XEYWX5FC.mjs → app-graph-builder-SOCKP4ST.mjs} +31 -32
  50. package/dist/lib/node-esm/app-graph-builder-SOCKP4ST.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs +105 -0
  52. package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs.map +7 -0
  53. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs → call-manager-LC4OS2KD.mjs} +7 -7
  54. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs.map → call-manager-LC4OS2KD.mjs.map} +1 -1
  55. package/dist/lib/node-esm/chunk-5DLH4MWN.mjs +25 -0
  56. package/dist/lib/node-esm/chunk-5DLH4MWN.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-JR7KESLL.mjs → chunk-7KZWZS2U.mjs} +274 -374
  58. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-CCE5LHBE.mjs → chunk-JF7THR7F.mjs} +40 -37
  62. package/dist/lib/node-esm/chunk-JF7THR7F.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-NNKKNW57.mjs → chunk-JJW6YMLC.mjs} +165 -101
  64. package/dist/lib/node-esm/chunk-JJW6YMLC.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs → chunk-PZH2EDU5.mjs} +68 -67
  66. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-TJKM5JZT.mjs +169 -0
  68. package/dist/lib/node-esm/chunk-TJKM5JZT.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-UHZQTPXU.mjs → chunk-TWKGDFCS.mjs} +18 -17
  70. package/dist/lib/node-esm/chunk-TWKGDFCS.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-S3D7DTBF.mjs → chunk-VBI32FGI.mjs} +53 -3
  72. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
  74. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
  76. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
  77. package/dist/lib/node-esm/index.mjs +42 -42
  78. package/dist/lib/node-esm/index.mjs.map +3 -3
  79. package/dist/lib/node-esm/{intent-resolver-VIMI5VLH.mjs → intent-resolver-45PLIFCJ.mjs} +32 -99
  80. package/dist/lib/node-esm/intent-resolver-45PLIFCJ.mjs.map +7 -0
  81. package/dist/lib/node-esm/{markdown-FL4IXLRP.mjs → markdown-566XXB55.mjs} +24 -22
  82. package/dist/lib/node-esm/markdown-566XXB55.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/react-root-DCY6DKLC.mjs +29 -0
  85. package/dist/lib/node-esm/react-root-DCY6DKLC.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-OLN3XNND.mjs → react-surface-WZH7OAO3.mjs} +37 -36
  87. package/dist/lib/node-esm/react-surface-WZH7OAO3.mjs.map +7 -0
  88. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs → settings-WKLJSP6R.mjs} +5 -5
  89. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs.map → settings-WKLJSP6R.mjs.map} +1 -1
  90. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-X3W67GTL.mjs} +5 -5
  91. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-X3W67GTL.mjs.map} +1 -1
  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/media-manager.d.ts.map +1 -1
  96. package/dist/types/src/calls/types.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/calls-service.d.ts +2 -0
  98. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  99. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +0 -1
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  104. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  106. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/index.d.ts +1 -1
  108. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  112. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  113. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  114. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  115. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  116. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  117. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/ChannelContainer.stories.d.ts +75 -9
  119. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Chat.stories.d.ts +75 -7
  121. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  123. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  124. package/dist/types/src/components/Comments.stories.d.ts +4 -3
  125. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  127. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  128. package/dist/types/src/components/CommentsThreadContainer.d.ts +8 -8
  129. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  130. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  131. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  132. package/dist/types/src/components/Media/VideoObject.stories.d.ts +5 -3
  133. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/MessageContainer.d.ts +2 -2
  135. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +5 -3
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +5 -3
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  142. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  143. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  144. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  145. package/dist/types/src/components/index.d.ts +3 -3
  146. package/dist/types/src/components/index.d.ts.map +1 -1
  147. package/dist/types/src/components/testing.d.ts +3 -3
  148. package/dist/types/src/components/testing.d.ts.map +1 -1
  149. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  150. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  151. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  152. package/dist/types/src/functions/index.d.ts +2 -0
  153. package/dist/types/src/functions/index.d.ts.map +1 -0
  154. package/dist/types/src/hooks/analytics.d.ts +2 -2
  155. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  156. package/dist/types/src/hooks/index.d.ts +2 -2
  157. package/dist/types/src/hooks/index.d.ts.map +1 -1
  158. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  159. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  160. package/dist/types/src/meta.d.ts +1 -2
  161. package/dist/types/src/meta.d.ts.map +1 -1
  162. package/dist/types/src/testing/stories.d.ts.map +1 -1
  163. package/dist/types/src/translations.d.ts +74 -7
  164. package/dist/types/src/translations.d.ts.map +1 -1
  165. package/dist/types/src/types/Channel.d.ts +16 -0
  166. package/dist/types/src/types/Channel.d.ts.map +1 -0
  167. package/dist/types/src/types/{schema.d.ts → Thread.d.ts} +18 -28
  168. package/dist/types/src/types/Thread.d.ts.map +1 -0
  169. package/dist/types/src/types/index.d.ts +2 -1
  170. package/dist/types/src/types/index.d.ts.map +1 -1
  171. package/dist/types/src/types/types.d.ts +31 -117
  172. package/dist/types/src/types/types.d.ts.map +1 -1
  173. package/dist/types/tsconfig.tsbuildinfo +1 -1
  174. package/package.json +64 -60
  175. package/src/ThreadPlugin.tsx +139 -132
  176. package/src/calls/call-manager.ts +1 -1
  177. package/src/calls/media-manager.ts +11 -7
  178. package/src/calls/types.ts +7 -3
  179. package/src/calls/util/calls-service.ts +12 -7
  180. package/src/calls/util/stub-media-streams.ts +61 -3
  181. package/src/calls-service.stories.tsx +2 -5
  182. package/src/capabilities/app-graph-builder.ts +41 -30
  183. package/src/capabilities/blueprint-definition.ts +38 -0
  184. package/src/capabilities/capabilities.ts +7 -7
  185. package/src/capabilities/index.ts +1 -1
  186. package/src/capabilities/intent-resolver.ts +22 -60
  187. package/src/capabilities/markdown.ts +5 -3
  188. package/src/capabilities/react-root.tsx +2 -2
  189. package/src/capabilities/react-surface.tsx +24 -23
  190. package/src/components/Call/Call.tsx +1 -1
  191. package/src/components/Call/Toolbar.tsx +9 -9
  192. package/src/components/CallDebugPanel.tsx +112 -55
  193. package/src/components/CallSidebar.tsx +1 -1
  194. package/src/components/ChannelContainer.stories.tsx +10 -10
  195. package/src/components/ChannelContainer.tsx +19 -15
  196. package/src/components/Chat.stories.tsx +14 -19
  197. package/src/components/ChatContainer.tsx +30 -21
  198. package/src/components/Comments.stories.tsx +12 -17
  199. package/src/components/CommentsContainer.tsx +6 -7
  200. package/src/components/CommentsThreadContainer.tsx +32 -27
  201. package/src/components/Lobby/Lobby.tsx +1 -1
  202. package/src/components/Media/VideoObject.stories.tsx +12 -7
  203. package/src/components/Media/VideoObject.tsx +1 -1
  204. package/src/components/MessageContainer.tsx +6 -6
  205. package/src/components/Participant/Participant.tsx +1 -1
  206. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
  207. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
  208. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -5
  209. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  210. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
  211. package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +41 -34
  212. package/src/components/ThreadSettings.tsx +4 -5
  213. package/src/components/index.ts +4 -4
  214. package/src/components/testing.ts +8 -8
  215. package/src/extensions/threads.ts +25 -16
  216. package/src/functions/create-proposals.ts +58 -0
  217. package/src/functions/index.ts +5 -0
  218. package/src/hooks/analytics.ts +4 -7
  219. package/src/hooks/index.ts +3 -2
  220. package/src/hooks/useVideoStreamTrack.tsx +1 -1
  221. package/src/meta.ts +9 -5
  222. package/src/testing/stories.ts +3 -6
  223. package/src/translations.ts +6 -4
  224. package/src/types/Channel.ts +27 -0
  225. package/src/types/Thread.ts +26 -0
  226. package/src/types/index.ts +2 -1
  227. package/src/types/types.ts +19 -27
  228. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  229. package/src/util.ts +1 -1
  230. package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +0 -16
  231. package/dist/lib/browser/ChatContainer-42ALOWUA.mjs +0 -15
  232. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-2I277V52.mjs +0 -23
  234. package/dist/lib/browser/chunk-2I277V52.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-2P3GVRHP.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  237. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  239. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-H63NDV62.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-J26C57ZY.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +0 -7
  244. package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
  245. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
  246. package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +0 -7
  247. package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +0 -7
  248. package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +0 -7
  249. package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
  250. package/dist/lib/browser/react-root-PTTTW2MO.mjs +0 -28
  251. package/dist/lib/browser/react-root-PTTTW2MO.mjs.map +0 -7
  252. package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +0 -7
  253. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +0 -80
  254. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +0 -7
  255. package/dist/lib/node-esm/ChannelContainer-D5E2S6AI.mjs +0 -17
  256. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-CTZ75IFK.mjs.map +0 -7
  260. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  261. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +0 -7
  264. package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
  265. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +0 -7
  266. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  267. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  268. package/dist/lib/node-esm/chunk-S3D7DTBF.mjs.map +0 -7
  269. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +0 -7
  270. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +0 -25
  271. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs.map +0 -7
  272. package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +0 -7
  273. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
  274. package/dist/lib/node-esm/react-root-2HHRRUME.mjs +0 -29
  275. package/dist/lib/node-esm/react-root-2HHRRUME.mjs.map +0 -7
  276. package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +0 -7
  277. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +0 -81
  278. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +0 -7
  279. package/dist/types/src/capabilities/toolkit.d.ts +0 -5
  280. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  281. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  282. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  283. package/dist/types/src/types/schema.d.ts.map +0 -1
  284. package/src/capabilities/toolkit.ts +0 -78
  285. package/src/types/schema.ts +0 -33
  286. /package/dist/lib/browser/{ChannelContainer-GHDNEZT2.mjs.map → ChannelContainer-MX5ABVGC.mjs.map} +0 -0
  287. /package/dist/lib/browser/{ChatContainer-42ALOWUA.mjs.map → ChatContainer-7F5Y6GXJ.mjs.map} +0 -0
  288. /package/dist/lib/node-esm/{ChannelContainer-D5E2S6AI.mjs.map → ChannelContainer-2JJJ3IDK.mjs.map} +0 -0
  289. /package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs.map → ChatContainer-C526R4DI.mjs.map} +0 -0
@@ -40,26 +40,84 @@ export const createBlackCanvasStreamTrack = async ({
40
40
  return track;
41
41
  };
42
42
 
43
+ let audioContextStartedPreviously = false;
44
+ const userGestureEvents = [
45
+ 'click',
46
+ 'contextmenu',
47
+ 'auxclick',
48
+ 'dblclick',
49
+ 'mousedown',
50
+ 'mouseup',
51
+ 'pointerup',
52
+ 'touchend',
53
+ 'keydown',
54
+ 'keyup',
55
+ ];
56
+
43
57
  /**
44
58
  * Creates an inaudible audio stream track.
45
59
  * We need this to have audio track available when audio is disabled.
46
60
  */
47
61
  export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {
48
62
  const audioContext = new window.AudioContext();
63
+
49
64
  const oscillator = audioContext.createOscillator();
50
65
  oscillator.type = 'triangle';
51
- // roughly sounds like a box fan
52
66
  oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
53
67
 
54
68
  const gainNode = audioContext.createGain();
55
- gainNode.gain.setValueAtTime(0.01, audioContext.currentTime);
69
+ gainNode.gain.setValueAtTime(0, audioContext.currentTime);
56
70
  oscillator.connect(gainNode);
57
71
 
58
72
  const destination = audioContext.createMediaStreamDestination();
59
73
  gainNode.connect(destination);
60
- oscillator.start();
74
+
75
+ let oscillatorStarted = false;
76
+ const ensureOscillatorStarted = () => {
77
+ if (oscillatorStarted) return;
78
+ oscillator.start();
79
+ oscillatorStarted = true;
80
+ };
81
+
82
+ const stateChangeHandler = () => {
83
+ if (audioContext.state === 'running') {
84
+ audioContextStartedPreviously = true;
85
+ ensureOscillatorStarted();
86
+ }
87
+
88
+ if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {
89
+ resumeAudioContext();
90
+ }
91
+ };
92
+
93
+ audioContext.addEventListener('statechange', stateChangeHandler);
94
+
95
+ const resumeAudioContext = () => {
96
+ void audioContext.resume().then(() => {
97
+ cleanUpUserGestureListeners();
98
+ });
99
+ };
100
+
101
+ const cleanUpUserGestureListeners = () => {
102
+ userGestureEvents.forEach((gesture) => {
103
+ document.removeEventListener(gesture, resumeAudioContext, {
104
+ capture: true,
105
+ });
106
+ });
107
+ };
108
+
109
+ if (audioContextStartedPreviously) {
110
+ resumeAudioContext();
111
+ } else {
112
+ userGestureEvents.forEach((gesture) => {
113
+ document.addEventListener(gesture, resumeAudioContext, {
114
+ capture: true,
115
+ });
116
+ });
117
+ }
61
118
 
62
119
  ctx.onDispose(async () => {
120
+ cleanUpUserGestureListeners();
63
121
  oscillator.disconnect();
64
122
  oscillator.stop();
65
123
  await audioContext.close();
@@ -2,8 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
7
 
@@ -14,8 +12,8 @@ import { log } from '@dxos/log';
14
12
  import { Config, useConfig } from '@dxos/react-client';
15
13
  import { withClientProvider } from '@dxos/react-client/testing';
16
14
  import { Button } from '@dxos/react-ui';
15
+ import { withTheme } from '@dxos/react-ui/testing';
17
16
  import { Json } from '@dxos/react-ui-syntax-highlighter';
18
- import { withLayout, withTheme } from '@dxos/storybook-utils';
19
17
 
20
18
  const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
21
19
 
@@ -177,6 +175,7 @@ const meta = {
177
175
  title: 'plugins/plugin-thread/calls-service',
178
176
  render: DefaultStory,
179
177
  decorators: [
178
+ withTheme,
180
179
  withClientProvider({
181
180
  config: new Config({
182
181
  runtime: {
@@ -186,8 +185,6 @@ const meta = {
186
185
  },
187
186
  }),
188
187
  }),
189
- withTheme,
190
- withLayout(),
191
188
  ],
192
189
  parameters: {
193
190
  layout: 'centered',
@@ -2,18 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe } from 'effect';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
7
8
 
8
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
12
  import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
12
- import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
13
- import { fullyQualifiedId } from '@dxos/react-client/echo';
13
+ import { ROOT_ID, atomFromSignal, createExtension } from '@dxos/plugin-graph';
14
14
 
15
- import { THREAD_PLUGIN, meta } from '../meta';
16
- import { ChannelType, ThreadAction } from '../types';
15
+ import { meta } from '../meta';
16
+ import { Channel, ThreadAction } from '../types';
17
17
  import { getAnchor } from '../util';
18
18
 
19
19
  import { ThreadCapabilities } from './capabilities';
@@ -26,16 +26,16 @@ export default (context: PluginContext) => {
26
26
 
27
27
  return contributes(Capabilities.AppGraphBuilder, [
28
28
  createExtension({
29
- id: `${THREAD_PLUGIN}/active-call`,
29
+ id: `${meta.id}/active-call`,
30
30
  connector: (node) =>
31
- Rx.make((get) =>
32
- pipe(
31
+ Atom.make((get) =>
32
+ Function.pipe(
33
33
  get(node),
34
34
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
35
35
  Option.map((node) => {
36
36
  const [call] = get(context.capabilities(ThreadCapabilities.CallManager));
37
37
  return get(
38
- rxFromSignal(() =>
38
+ atomFromSignal(() =>
39
39
  call?.joined
40
40
  ? [
41
41
  {
@@ -43,7 +43,7 @@ export default (context: PluginContext) => {
43
43
  type: DECK_COMPANION_TYPE,
44
44
  data: null,
45
45
  properties: {
46
- label: ['call panel label', { ns: THREAD_PLUGIN }],
46
+ label: ['call panel label', { ns: meta.id }],
47
47
  icon: 'ph--video-conference--regular',
48
48
  position: 'hoist',
49
49
  disposition: 'hidden',
@@ -61,16 +61,18 @@ export default (context: PluginContext) => {
61
61
  // TODO(wittjosiah): The channel shouldn't become the companion during a call.
62
62
  // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
63
63
  createExtension({
64
- id: `${THREAD_PLUGIN}/channel-chat-companion`,
64
+ id: `${meta.id}/channel-chat-companion`,
65
65
  connector: (node) => {
66
- return Rx.make((get) => {
67
- return pipe(
66
+ return Atom.make((get) => {
67
+ return Function.pipe(
68
68
  get(node),
69
- Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),
69
+ Option.flatMap((node) =>
70
+ Obj.instanceOf(Channel.Channel, node.data) ? Option.some(node.data) : Option.none(),
71
+ ),
70
72
  Option.map((channel) => {
71
73
  const callManager = context.getCapability(ThreadCapabilities.CallManager);
72
74
  const joined = get(
73
- rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),
75
+ atomFromSignal(() => callManager.joined && callManager.roomId === Obj.getDXN(channel).toString()),
74
76
  );
75
77
  if (!joined) {
76
78
  return [];
@@ -78,11 +80,11 @@ export default (context: PluginContext) => {
78
80
 
79
81
  return [
80
82
  {
81
- id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,
83
+ id: `${Obj.getDXN(channel).toString()}${ATTENDABLE_PATH_SEPARATOR}chat`,
82
84
  type: PLANK_COMPANION_TYPE,
83
85
  data: 'chat',
84
86
  properties: {
85
- label: ['channel companion label', { ns: THREAD_PLUGIN }],
87
+ label: ['channel companion label', { ns: meta.id }],
86
88
  icon: 'ph--hash--regular',
87
89
  position: 'hoist',
88
90
  disposition: 'hidden',
@@ -98,11 +100,11 @@ export default (context: PluginContext) => {
98
100
  createExtension({
99
101
  id: `${meta.id}/comments-companion`,
100
102
  connector: (node) =>
101
- Rx.make((get) =>
102
- pipe(
103
+ Atom.make((get) =>
104
+ Function.pipe(
103
105
  get(node),
104
106
  Option.flatMap((node) => {
105
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
107
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
106
108
  return Option.none();
107
109
  }
108
110
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -128,11 +130,11 @@ export default (context: PluginContext) => {
128
130
  createExtension({
129
131
  id: `${meta.id}/comment-toolbar`,
130
132
  actions: (node) =>
131
- Rx.make((get) =>
132
- pipe(
133
+ Atom.make((get) =>
134
+ Function.pipe(
133
135
  get(node),
134
136
  Option.flatMap((node) => {
135
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
137
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
136
138
  return Option.none();
137
139
  }
138
140
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -142,28 +144,37 @@ export default (context: PluginContext) => {
142
144
  const selectionManager = context.getCapability(AttentionCapabilities.Selection);
143
145
  const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
144
146
  const disabled = get(
145
- rxFromSignal(() => {
147
+ atomFromSignal(() => {
146
148
  const metadata = resolve(Obj.getTypename(object)!);
147
- const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);
149
+ const selection = selectionManager.getSelection(
150
+ Obj.getDXN(object).toString(),
151
+ metadata.selectionMode,
152
+ );
148
153
  const anchor = getAnchor(selection);
149
154
  const invalidSelection = !anchor;
150
- const overlappingComment = toolbar[fullyQualifiedId(object)];
155
+ const overlappingComment = toolbar[Obj.getDXN(object).toString()];
151
156
  return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;
152
157
  }),
153
158
  );
154
159
 
155
160
  return [
156
161
  {
157
- id: `${fullyQualifiedId(object)}/comment`,
162
+ id: `${Obj.getDXN(object).toString()}/comment`,
158
163
  data: () => {
159
164
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
160
165
  const metadata = resolve(Obj.getTypename(object)!);
161
- const selection = selectionManager.getSelection(fullyQualifiedId(object));
166
+ const selection = selectionManager.getSelection(Obj.getDXN(object).toString());
162
167
  // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.
163
168
  // Requires all components which support selection (e.g. table/kanban) to support anchored comments.
164
169
  const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
165
170
  const name = metadata.getAnchorLabel?.(object, anchor);
166
- void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));
171
+ void dispatch(
172
+ createIntent(ThreadAction.Create, {
173
+ anchor,
174
+ name,
175
+ subject: object,
176
+ }),
177
+ );
167
178
  },
168
179
  properties: {
169
180
  label: ['add comment label', { ns: meta.id }],
@@ -0,0 +1,38 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capabilities, type Capability, contributes } from '@dxos/app-framework';
6
+ import { Blueprint, Template } from '@dxos/blueprints';
7
+ import { type FunctionDefinition } from '@dxos/functions';
8
+ import { trim } from '@dxos/util';
9
+
10
+ import { createProposals } from '../functions';
11
+
12
+ const functions: FunctionDefinition[] = [createProposals];
13
+
14
+ export const ASSISTANT_BLUEPRINT_KEY = 'dxos.org/blueprint/thread';
15
+
16
+ export default (): Capability<any>[] => [
17
+ contributes(Capabilities.Functions, functions),
18
+ contributes(
19
+ Capabilities.BlueprintDefinition,
20
+ Blueprint.make({
21
+ key: ASSISTANT_BLUEPRINT_KEY,
22
+ name: 'Thread',
23
+ tools: Blueprint.toolDefinitions({ functions }),
24
+ instructions: Template.make({
25
+ // TODO(wittjosiah): Move example to function input schema annotation.
26
+ source: trim`
27
+ You can update markdown documents via proposals.
28
+ For each diff, respond with the smallest possible matching span.
29
+ For example:
30
+ - "There is a tyop in this sentence."
31
+ + "There is a typo in this sentence."
32
+ - "This id goof."
33
+ + "This is good."
34
+ `,
35
+ }),
36
+ }),
37
+ ),
38
+ ];
@@ -6,28 +6,28 @@ import { defineCapability } from '@dxos/app-framework';
6
6
  import { type DeepReadonly } from '@dxos/util';
7
7
 
8
8
  import { type CallManager, type CallState, type MediaState } from '../calls';
9
- import { THREAD_PLUGIN } from '../meta';
10
- import { type ChannelType, type ThreadState, type ViewState } from '../types';
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
  }
@@ -5,6 +5,7 @@
5
5
  import { lazy } from '@dxos/app-framework';
6
6
 
7
7
  export const AppGraphBuilder = lazy(() => import('./app-graph-builder'));
8
+ export const BlueprintDefinition = lazy(() => import('./blueprint-definition'));
8
9
  export const CallManager = lazy(() => import('./call-manager'));
9
10
  export const IntentResolver = lazy(() => import('./intent-resolver'));
10
11
  export const Markdown = lazy(() => import('./markdown'));
@@ -12,6 +13,5 @@ export const ReactRoot = lazy(() => import('./react-root'));
12
13
  export const ReactSurface = lazy(() => import('./react-surface'));
13
14
  export const ThreadSettings = lazy(() => import('./settings'));
14
15
  export const ThreadState = lazy(() => import('./state'));
15
- export const Toolkit = lazy(() => import('./toolkit'));
16
16
 
17
17
  export * from './capabilities';
@@ -2,7 +2,7 @@
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
7
  import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
8
8
  import { sleep } from '@dxos/async';
@@ -11,23 +11,23 @@ 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 { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
15
- import { AnchoredTo, DataType } from '@dxos/schema';
14
+ import { Ref, getSpace } from '@dxos/react-client/echo';
15
+ import { AnchoredTo, Message } from '@dxos/types';
16
16
 
17
- import { THREAD_PLUGIN } from '../meta';
18
- import { ChannelType, ThreadAction, ThreadType } from '../types';
17
+ import { meta } from '../meta';
18
+ import { Channel, Thread, ThreadAction } from '../types';
19
19
 
20
20
  import { ThreadCapabilities } from './capabilities';
21
21
 
22
22
  export default (context: PluginContext) =>
23
23
  contributes(Capabilities.IntentResolver, [
24
24
  createResolver({
25
- intent: ThreadAction.OnSpaceCreated,
25
+ intent: ThreadAction.onCreateSpace,
26
26
  resolve: ({ space, rootCollection }) =>
27
27
  Effect.gen(function* () {
28
28
  const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
29
29
  const { object: collection } = yield* dispatch(
30
- createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
30
+ createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(Channel.Channel) }),
31
31
  );
32
32
  rootCollection.objects.push(Ref.make(collection));
33
33
 
@@ -41,18 +41,14 @@ export default (context: PluginContext) =>
41
41
  intent: ThreadAction.CreateChannel,
42
42
  resolve: ({ name }) => ({
43
43
  data: {
44
- object: Obj.make(ChannelType, {
45
- name,
46
- defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),
47
- threads: [],
48
- }),
44
+ object: Channel.make({ name }),
49
45
  },
50
46
  }),
51
47
  }),
52
48
  createResolver({
53
49
  intent: ThreadAction.CreateChannelThread,
54
50
  resolve: ({ channel }) => {
55
- const thread = Obj.make(ThreadType, { messages: [], status: 'active' });
51
+ const thread = Thread.make({ status: 'active' });
56
52
  channel.threads.push(Ref.make(thread));
57
53
  return {
58
54
  data: {
@@ -69,9 +65,9 @@ export default (context: PluginContext) =>
69
65
  invariant(space, 'Space not found');
70
66
 
71
67
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
72
- const subjectId = fullyQualifiedId(subject);
73
- const thread = Obj.make(ThreadType, { name, messages: [], status: 'staged' });
74
- const anchor = Relation.make(AnchoredTo, {
68
+ const subjectId = Obj.getDXN(subject).toString();
69
+ const thread = Thread.make({ name });
70
+ const anchor = Relation.make(AnchoredTo.AnchoredTo, {
75
71
  [Relation.Source]: thread,
76
72
  [Relation.Target]: subject,
77
73
  anchor: _anchor,
@@ -86,41 +82,7 @@ export default (context: PluginContext) =>
86
82
 
87
83
  return {
88
84
  intents: [
89
- createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
90
- createIntent(DeckAction.ChangeCompanion, {
91
- primary: subjectId,
92
- companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
93
- }),
94
- ],
95
- };
96
- },
97
- }),
98
- createResolver({
99
- intent: ThreadAction.AddProposal,
100
- resolve: ({ text, anchor, sender, subject }) => {
101
- console.log('add-proposal', text, anchor, sender, subject);
102
- const space = getSpace(subject);
103
- invariant(space, 'Space not found');
104
-
105
- const subjectId = fullyQualifiedId(subject);
106
- const proposal = Obj.make(DataType.Message, {
107
- created: new Date().toISOString(),
108
- sender,
109
- blocks: [{ _tag: 'proposal', text }],
110
- });
111
- const thread = Obj.make(ThreadType, { name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
112
-
113
- return {
114
- intents: [
115
- createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }),
116
- createIntent(SpaceAction.AddRelation, {
117
- space,
118
- schema: AnchoredTo,
119
- source: thread,
120
- target: subject,
121
- fields: { anchor },
122
- }),
123
- createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
85
+ createIntent(ThreadAction.Select, { current: Obj.getDXN(thread).toString() }),
124
86
  createIntent(DeckAction.ChangeCompanion, {
125
87
  primary: subjectId,
126
88
  companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
@@ -165,9 +127,9 @@ export default (context: PluginContext) =>
165
127
  createResolver({
166
128
  intent: ThreadAction.Delete,
167
129
  resolve: async ({ subject, anchor, thread: _thread }, undo) => {
168
- const thread = _thread ?? (Relation.getSource(anchor) as ThreadType);
130
+ const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
169
131
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
170
- const subjectId = fullyQualifiedId(subject);
132
+ const subjectId = Obj.getDXN(subject).toString();
171
133
  const draft = state.drafts[subjectId];
172
134
  if (draft) {
173
135
  // Check if we're deleting a draft; if so, remo ve it.
@@ -191,7 +153,7 @@ export default (context: PluginContext) =>
191
153
 
192
154
  return {
193
155
  undoable: {
194
- message: ['thread deleted label', { ns: THREAD_PLUGIN }],
156
+ message: ['thread deleted label', { ns: meta.id }],
195
157
  data: { thread, anchor },
196
158
  },
197
159
  intents: [
@@ -227,13 +189,13 @@ export default (context: PluginContext) =>
227
189
  createResolver({
228
190
  intent: ThreadAction.AddMessage,
229
191
  resolve: ({ anchor, subject, sender, text }) => {
230
- const thread = Relation.getSource(anchor) as ThreadType;
192
+ const thread = Relation.getSource(anchor) as Thread.Thread;
231
193
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
232
- const subjectId = fullyQualifiedId(subject);
194
+ const subjectId = Obj.getDXN(subject).toString();
233
195
  const space = getSpace(subject);
234
196
  invariant(space, 'Space not found');
235
197
 
236
- const message = Obj.make(DataType.Message, {
198
+ const message = Obj.make(Message.Message, {
237
199
  created: new Date().toISOString(),
238
200
  sender,
239
201
  blocks: [{ _tag: 'text', text }],
@@ -253,7 +215,7 @@ export default (context: PluginContext) =>
253
215
  intents.push(
254
216
  createIntent(SpaceAction.AddRelation, {
255
217
  space,
256
- schema: AnchoredTo,
218
+ schema: AnchoredTo.AnchoredTo,
257
219
  source: thread,
258
220
  target: subject,
259
221
  fields: { anchor: draft.anchor },
@@ -289,7 +251,7 @@ export default (context: PluginContext) =>
289
251
  createResolver({
290
252
  intent: ThreadAction.DeleteMessage,
291
253
  resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
292
- const thread = Relation.getSource(anchor) as ThreadType;
254
+ const thread = Relation.getSource(anchor) as Thread.Thread;
293
255
  const space = getSpace(subject);
294
256
  invariant(space, 'Space not found');
295
257
 
@@ -311,7 +273,7 @@ export default (context: PluginContext) =>
311
273
 
312
274
  return {
313
275
  undoable: {
314
- message: ['message deleted label', { ns: THREAD_PLUGIN }],
276
+ message: ['message deleted label', { ns: meta.id }],
315
277
  data: { message, messageIndex },
316
278
  },
317
279
  intents: [
@@ -5,9 +5,9 @@
5
5
  import { EditorView } from '@codemirror/view';
6
6
 
7
7
  import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
8
+ import { Obj } from '@dxos/echo';
8
9
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
9
10
  import { MarkdownCapabilities } from '@dxos/plugin-markdown';
10
- import { fullyQualifiedId } from '@dxos/react-client/echo';
11
11
  import { type EditorState, commentClickedEffect, commentsState, overlap } from '@dxos/react-ui-editor';
12
12
 
13
13
  import { threads } from '../extensions';
@@ -22,17 +22,19 @@ export default (context: PluginContext) =>
22
22
  return threads(state, doc, dispatch);
23
23
  },
24
24
  ({ document: doc }) => {
25
+ if (!doc) return [];
25
26
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
26
27
 
27
28
  return EditorView.updateListener.of((update) => {
28
29
  if (update.docChanged || update.selectionSet) {
29
- state.toolbar[fullyQualifiedId(doc)] = selectionOverlapsComment(update.state);
30
+ state.toolbar[Obj.getDXN(doc).toString()] = selectionOverlapsComment(update.state);
30
31
  }
31
32
  });
32
33
  },
33
34
  ({ document: doc }) => {
35
+ if (!doc) return [];
34
36
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
35
- const id = fullyQualifiedId(doc);
37
+ const id = Obj.getDXN(doc).toString();
36
38
 
37
39
  return EditorView.updateListener.of((update) => {
38
40
  update.transactions.forEach((transaction) => {
@@ -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
  };