@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d

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 (304) hide show
  1. package/dist/lib/browser/ChannelContainer-JI3ZRZ5S.mjs +17 -0
  2. package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +16 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-URVQHGMR.mjs} +32 -32
  4. package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +101 -0
  6. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +7 -0
  7. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-4YFT4XA6.mjs} +8 -7
  8. package/dist/lib/{node-esm/call-manager-EI7FXRAU.mjs.map → browser/call-manager-4YFT4XA6.mjs.map} +1 -1
  9. package/dist/lib/browser/chunk-6LWKNZUV.mjs +377 -0
  10. package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CBUNHCOE.mjs +23 -0
  12. package/dist/lib/browser/chunk-CBUNHCOE.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-CFC7LEPD.mjs +18 -0
  14. package/dist/lib/browser/chunk-CFC7LEPD.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  16. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-F36NHPJG.mjs} +47 -42
  18. package/dist/lib/browser/chunk-F36NHPJG.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-ISCHODBV.mjs} +54 -4
  20. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-KOBXMDCI.mjs} +74 -41
  23. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-QM34EZQK.mjs +20 -0
  25. package/dist/lib/browser/chunk-QM34EZQK.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-R5UOPOO7.mjs +142 -0
  27. package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-VIRD2QSK.mjs +611 -0
  29. package/dist/lib/browser/chunk-VIRD2QSK.mjs.map +7 -0
  30. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCW3NSDZ.mjs} +256 -161
  31. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
  32. package/dist/lib/browser/index.mjs +48 -38
  33. package/dist/lib/browser/index.mjs.map +3 -3
  34. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-YR6W4CRP.mjs} +33 -51
  35. package/dist/lib/browser/intent-resolver-YR6W4CRP.mjs.map +7 -0
  36. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-GSOBOXA7.mjs} +26 -24
  37. package/dist/lib/browser/markdown-GSOBOXA7.mjs.map +7 -0
  38. package/dist/lib/browser/meta.json +1 -1
  39. package/dist/lib/browser/react-root-RAWRPF7Z.mjs +29 -0
  40. package/dist/lib/browser/react-root-RAWRPF7Z.mjs.map +7 -0
  41. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-GOEFSXQ6.mjs} +38 -36
  42. package/dist/lib/browser/react-surface-GOEFSXQ6.mjs.map +7 -0
  43. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-JN2HHORY.mjs} +6 -5
  44. package/dist/lib/{node-esm/settings-N52O7MLS.mjs.map → browser/settings-JN2HHORY.mjs.map} +1 -1
  45. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-UYPLBGZJ.mjs} +6 -5
  46. package/dist/lib/{node-esm/state-62TQKQVB.mjs.map → browser/state-UYPLBGZJ.mjs.map} +1 -1
  47. package/dist/lib/browser/types/index.mjs +7 -10
  48. package/dist/lib/node-esm/ChannelContainer-RQY4PR4F.mjs +18 -0
  49. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +17 -0
  50. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs.map +7 -0
  51. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-2IH5RPR7.mjs} +32 -32
  52. package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +7 -0
  53. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +102 -0
  54. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +7 -0
  55. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-UMUXEYH5.mjs} +8 -7
  56. package/dist/lib/{browser/call-manager-XRRCAVLI.mjs.map → node-esm/call-manager-UMUXEYH5.mjs.map} +1 -1
  57. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +22 -0
  58. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-7KZWZS2U.mjs} +256 -161
  60. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  62. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs +25 -0
  66. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs +143 -0
  68. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-PZH2EDU5.mjs} +74 -41
  70. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs +612 -0
  72. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +19 -0
  74. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-VBI32FGI.mjs} +54 -4
  76. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  77. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-Y3F2SGNH.mjs} +47 -42
  78. package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs +378 -0
  80. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +7 -0
  81. package/dist/lib/node-esm/index.mjs +48 -38
  82. package/dist/lib/node-esm/index.mjs.map +3 -3
  83. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-SJFABEE7.mjs} +33 -51
  84. package/dist/lib/node-esm/intent-resolver-SJFABEE7.mjs.map +7 -0
  85. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-GG5566TL.mjs} +26 -24
  86. package/dist/lib/node-esm/markdown-GG5566TL.mjs.map +7 -0
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/react-root-K5OGECUS.mjs +30 -0
  89. package/dist/lib/node-esm/react-root-K5OGECUS.mjs.map +7 -0
  90. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-5QDQD7MN.mjs} +38 -36
  91. package/dist/lib/node-esm/react-surface-5QDQD7MN.mjs.map +7 -0
  92. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-VSPM3BIM.mjs} +6 -5
  93. package/dist/lib/{browser/settings-AC6YSASL.mjs.map → node-esm/settings-VSPM3BIM.mjs.map} +1 -1
  94. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-XNWOLBNE.mjs} +6 -5
  95. package/dist/lib/{browser/state-2T4KDWBX.mjs.map → node-esm/state-XNWOLBNE.mjs.map} +1 -1
  96. package/dist/lib/node-esm/types/index.mjs +7 -10
  97. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  98. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  99. package/dist/types/src/calls/media-manager.d.ts +1 -1
  100. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  101. package/dist/types/src/calls/types.d.ts.map +1 -1
  102. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  103. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  104. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  105. package/dist/types/src/calls-service.stories.d.ts +10 -9
  106. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  108. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  110. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  112. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  113. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/index.d.ts +11 -10
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  117. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  119. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  121. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  122. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  123. package/dist/types/src/capabilities/settings.d.ts +1 -1
  124. package/dist/types/src/capabilities/state.d.ts +2 -2
  125. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  126. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  127. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  128. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  130. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  131. package/dist/types/src/components/ChannelContainer.stories.d.ts +155 -5
  132. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Chat.stories.d.ts +158 -5
  134. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  136. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  137. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  138. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  140. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  141. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  142. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  144. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  145. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  146. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/MessageContainer.d.ts +6 -3
  148. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  149. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  150. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  151. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  153. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  155. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  156. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  157. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  158. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  159. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  160. package/dist/types/src/components/index.d.ts +3 -3
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/components/testing.d.ts +3 -2
  163. package/dist/types/src/components/testing.d.ts.map +1 -1
  164. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  165. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  166. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  167. package/dist/types/src/functions/index.d.ts +2 -0
  168. package/dist/types/src/functions/index.d.ts.map +1 -0
  169. package/dist/types/src/hooks/analytics.d.ts +2 -2
  170. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  171. package/dist/types/src/hooks/index.d.ts +2 -1
  172. package/dist/types/src/hooks/index.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  174. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  175. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  176. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  177. package/dist/types/src/meta.d.ts +1 -2
  178. package/dist/types/src/meta.d.ts.map +1 -1
  179. package/dist/types/src/testing/stories.d.ts.map +1 -1
  180. package/dist/types/src/translations.d.ts +75 -7
  181. package/dist/types/src/translations.d.ts.map +1 -1
  182. package/dist/types/src/types/Channel.d.ts +16 -0
  183. package/dist/types/src/types/Channel.d.ts.map +1 -0
  184. package/dist/types/src/types/index.d.ts +1 -1
  185. package/dist/types/src/types/index.d.ts.map +1 -1
  186. package/dist/types/src/types/types.d.ts +206 -210
  187. package/dist/types/src/types/types.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +65 -59
  190. package/src/ThreadPlugin.tsx +139 -125
  191. package/src/calls/call-manager.ts +1 -1
  192. package/src/calls/media-manager.ts +64 -35
  193. package/src/calls/types.ts +7 -3
  194. package/src/calls/util/calls-service.ts +61 -11
  195. package/src/calls/util/stub-media-streams.ts +62 -5
  196. package/src/calls-service.stories.tsx +76 -63
  197. package/src/capabilities/app-graph-builder.ts +43 -30
  198. package/src/capabilities/blueprint-definition.ts +38 -0
  199. package/src/capabilities/capabilities.ts +7 -7
  200. package/src/capabilities/index.ts +1 -0
  201. package/src/capabilities/intent-resolver.ts +23 -30
  202. package/src/capabilities/markdown.ts +5 -3
  203. package/src/capabilities/react-root.tsx +2 -2
  204. package/src/capabilities/react-surface.tsx +25 -23
  205. package/src/components/Call/Call.tsx +1 -1
  206. package/src/components/Call/Toolbar.tsx +9 -9
  207. package/src/components/CallDebugPanel.tsx +112 -55
  208. package/src/components/CallSidebar.tsx +1 -1
  209. package/src/components/ChannelContainer.stories.tsx +13 -13
  210. package/src/components/ChannelContainer.tsx +19 -15
  211. package/src/components/Chat.stories.tsx +30 -34
  212. package/src/components/ChatContainer.tsx +32 -21
  213. package/src/components/Comments.stories.tsx +36 -39
  214. package/src/components/CommentsContainer.tsx +5 -7
  215. package/src/components/CommentsThreadContainer.tsx +38 -33
  216. package/src/components/Lobby/Lobby.tsx +1 -1
  217. package/src/components/Media/VideoObject.stories.tsx +35 -28
  218. package/src/components/Media/VideoObject.tsx +1 -1
  219. package/src/components/MessageContainer.tsx +45 -12
  220. package/src/components/Participant/Participant.tsx +14 -8
  221. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  222. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
  223. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -41
  224. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  225. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
  226. package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +72 -35
  227. package/src/components/ThreadSettings.tsx +6 -7
  228. package/src/components/command-extension.ts +4 -1
  229. package/src/components/index.ts +4 -4
  230. package/src/components/testing.ts +26 -6
  231. package/src/extensions/threads.ts +26 -17
  232. package/src/functions/create-proposals.ts +56 -0
  233. package/src/functions/index.ts +5 -0
  234. package/src/hooks/analytics.ts +4 -7
  235. package/src/hooks/index.ts +3 -1
  236. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  237. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  238. package/src/meta.ts +9 -5
  239. package/src/testing/stories.ts +3 -6
  240. package/src/translations.ts +7 -4
  241. package/src/types/Channel.ts +26 -0
  242. package/src/types/index.ts +1 -1
  243. package/src/types/types.ts +27 -28
  244. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  245. package/src/util.ts +1 -1
  246. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  247. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  248. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  250. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  252. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  254. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  255. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  256. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  258. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  261. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  266. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  267. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  268. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  269. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  270. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  271. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  272. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  273. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  274. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  277. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  279. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  280. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  281. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  283. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  287. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  289. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  291. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  292. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  293. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  294. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  295. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  296. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  297. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  298. package/dist/types/src/types/schema.d.ts +0 -164
  299. package/dist/types/src/types/schema.d.ts.map +0 -1
  300. package/src/types/schema.ts +0 -33
  301. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-JI3ZRZ5S.mjs.map} +0 -0
  302. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-6FVFME3R.mjs.map} +0 -0
  303. /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
  304. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChannelContainer-RQY4PR4F.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 video from '../testing/video.mp4?raw';
18
+ const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
20
19
 
21
20
  import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
22
- import { useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
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
+ };
@@ -2,38 +2,40 @@
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';
20
20
 
21
+ // TODO(wittjosiah): Highlight active calls in L1.
22
+ // Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
21
23
  export default (context: PluginContext) => {
22
24
  const resolve = (typename: string) =>
23
25
  context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
24
26
 
25
27
  return contributes(Capabilities.AppGraphBuilder, [
26
28
  createExtension({
27
- id: `${THREAD_PLUGIN}/active-call`,
29
+ id: `${meta.id}/active-call`,
28
30
  connector: (node) =>
29
- Rx.make((get) =>
30
- pipe(
31
+ Atom.make((get) =>
32
+ Function.pipe(
31
33
  get(node),
32
34
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
33
35
  Option.map((node) => {
34
36
  const [call] = get(context.capabilities(ThreadCapabilities.CallManager));
35
37
  return get(
36
- rxFromSignal(() =>
38
+ atomFromSignal(() =>
37
39
  call?.joined
38
40
  ? [
39
41
  {
@@ -41,7 +43,7 @@ export default (context: PluginContext) => {
41
43
  type: DECK_COMPANION_TYPE,
42
44
  data: null,
43
45
  properties: {
44
- label: ['call panel label', { ns: THREAD_PLUGIN }],
46
+ label: ['call panel label', { ns: meta.id }],
45
47
  icon: 'ph--video-conference--regular',
46
48
  position: 'hoist',
47
49
  disposition: 'hidden',
@@ -59,16 +61,18 @@ export default (context: PluginContext) => {
59
61
  // TODO(wittjosiah): The channel shouldn't become the companion during a call.
60
62
  // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
61
63
  createExtension({
62
- id: `${THREAD_PLUGIN}/channel-chat-companion`,
64
+ id: `${meta.id}/channel-chat-companion`,
63
65
  connector: (node) => {
64
- return Rx.make((get) => {
65
- return pipe(
66
+ return Atom.make((get) => {
67
+ return Function.pipe(
66
68
  get(node),
67
- 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
+ ),
68
72
  Option.map((channel) => {
69
73
  const callManager = context.getCapability(ThreadCapabilities.CallManager);
70
74
  const joined = get(
71
- rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),
75
+ atomFromSignal(() => callManager.joined && callManager.roomId === Obj.getDXN(channel).toString()),
72
76
  );
73
77
  if (!joined) {
74
78
  return [];
@@ -76,11 +80,11 @@ export default (context: PluginContext) => {
76
80
 
77
81
  return [
78
82
  {
79
- id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,
83
+ id: `${Obj.getDXN(channel).toString()}${ATTENDABLE_PATH_SEPARATOR}chat`,
80
84
  type: PLANK_COMPANION_TYPE,
81
85
  data: 'chat',
82
86
  properties: {
83
- label: ['channel companion label', { ns: THREAD_PLUGIN }],
87
+ label: ['channel companion label', { ns: meta.id }],
84
88
  icon: 'ph--hash--regular',
85
89
  position: 'hoist',
86
90
  disposition: 'hidden',
@@ -96,11 +100,11 @@ export default (context: PluginContext) => {
96
100
  createExtension({
97
101
  id: `${meta.id}/comments-companion`,
98
102
  connector: (node) =>
99
- Rx.make((get) =>
100
- pipe(
103
+ Atom.make((get) =>
104
+ Function.pipe(
101
105
  get(node),
102
106
  Option.flatMap((node) => {
103
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
107
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
104
108
  return Option.none();
105
109
  }
106
110
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -126,11 +130,11 @@ export default (context: PluginContext) => {
126
130
  createExtension({
127
131
  id: `${meta.id}/comment-toolbar`,
128
132
  actions: (node) =>
129
- Rx.make((get) =>
130
- pipe(
133
+ Atom.make((get) =>
134
+ Function.pipe(
131
135
  get(node),
132
136
  Option.flatMap((node) => {
133
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
137
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
134
138
  return Option.none();
135
139
  }
136
140
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -140,28 +144,37 @@ export default (context: PluginContext) => {
140
144
  const selectionManager = context.getCapability(AttentionCapabilities.Selection);
141
145
  const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
142
146
  const disabled = get(
143
- rxFromSignal(() => {
147
+ atomFromSignal(() => {
144
148
  const metadata = resolve(Obj.getTypename(object)!);
145
- const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);
149
+ const selection = selectionManager.getSelection(
150
+ Obj.getDXN(object).toString(),
151
+ metadata.selectionMode,
152
+ );
146
153
  const anchor = getAnchor(selection);
147
154
  const invalidSelection = !anchor;
148
- const overlappingComment = toolbar[fullyQualifiedId(object)];
155
+ const overlappingComment = toolbar[Obj.getDXN(object).toString()];
149
156
  return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;
150
157
  }),
151
158
  );
152
159
 
153
160
  return [
154
161
  {
155
- id: `${fullyQualifiedId(object)}/comment`,
162
+ id: `${Obj.getDXN(object).toString()}/comment`,
156
163
  data: () => {
157
164
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
158
165
  const metadata = resolve(Obj.getTypename(object)!);
159
- const selection = selectionManager.getSelection(fullyQualifiedId(object));
166
+ const selection = selectionManager.getSelection(Obj.getDXN(object).toString());
160
167
  // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.
161
168
  // Requires all components which support selection (e.g. table/kanban) to support anchored comments.
162
169
  const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
163
170
  const name = metadata.getAnchorLabel?.(object, anchor);
164
- 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
+ );
165
178
  },
166
179
  properties: {
167
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'));
@@ -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, Thread } 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, 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: {
@@ -65,13 +61,10 @@ export default (context: PluginContext) =>
65
61
  createResolver({
66
62
  intent: ThreadAction.Create,
67
63
  resolve: ({ name, anchor: _anchor, subject }) => {
68
- const space = getSpace(subject);
69
- invariant(space, 'Space not found');
70
-
71
64
  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, {
65
+ const subjectId = Obj.getDXN(subject).toString();
66
+ const thread = Thread.make({ name });
67
+ const anchor = Relation.make(AnchoredTo.AnchoredTo, {
75
68
  [Relation.Source]: thread,
76
69
  [Relation.Target]: subject,
77
70
  anchor: _anchor,
@@ -86,7 +79,7 @@ export default (context: PluginContext) =>
86
79
 
87
80
  return {
88
81
  intents: [
89
- createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
82
+ createIntent(ThreadAction.Select, { current: Obj.getDXN(thread).toString() }),
90
83
  createIntent(DeckAction.ChangeCompanion, {
91
84
  primary: subjectId,
92
85
  companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
@@ -131,9 +124,9 @@ export default (context: PluginContext) =>
131
124
  createResolver({
132
125
  intent: ThreadAction.Delete,
133
126
  resolve: async ({ subject, anchor, thread: _thread }, undo) => {
134
- const thread = _thread ?? (Relation.getSource(anchor) as ThreadType);
127
+ const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
135
128
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
136
- const subjectId = fullyQualifiedId(subject);
129
+ const subjectId = Obj.getDXN(subject).toString();
137
130
  const draft = state.drafts[subjectId];
138
131
  if (draft) {
139
132
  // Check if we're deleting a draft; if so, remo ve it.
@@ -157,7 +150,7 @@ export default (context: PluginContext) =>
157
150
 
158
151
  return {
159
152
  undoable: {
160
- message: ['thread deleted label', { ns: THREAD_PLUGIN }],
153
+ message: ['thread deleted label', { ns: meta.id }],
161
154
  data: { thread, anchor },
162
155
  },
163
156
  intents: [
@@ -193,14 +186,13 @@ export default (context: PluginContext) =>
193
186
  createResolver({
194
187
  intent: ThreadAction.AddMessage,
195
188
  resolve: ({ anchor, subject, sender, text }) => {
196
- const thread = Relation.getSource(anchor) as ThreadType;
189
+ const thread = Relation.getSource(anchor) as Thread.Thread;
197
190
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
198
- const subjectId = fullyQualifiedId(subject);
191
+ const subjectId = Obj.getDXN(subject).toString();
199
192
  const space = getSpace(subject);
200
193
  invariant(space, 'Space not found');
201
- const intents = [];
202
194
 
203
- const message = Obj.make(DataType.Message, {
195
+ const message = Obj.make(Message.Message, {
204
196
  created: new Date().toISOString(),
205
197
  sender,
206
198
  blocks: [{ _tag: 'text', text }],
@@ -209,6 +201,7 @@ export default (context: PluginContext) =>
209
201
  });
210
202
  thread.messages.push(Ref.make(message));
211
203
 
204
+ const intents = [];
212
205
  const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
213
206
  if (draft) {
214
207
  // Move draft to document.
@@ -219,7 +212,7 @@ export default (context: PluginContext) =>
219
212
  intents.push(
220
213
  createIntent(SpaceAction.AddRelation, {
221
214
  space,
222
- schema: AnchoredTo,
215
+ schema: AnchoredTo.AnchoredTo,
223
216
  source: thread,
224
217
  target: subject,
225
218
  fields: { anchor: draft.anchor },
@@ -255,7 +248,7 @@ export default (context: PluginContext) =>
255
248
  createResolver({
256
249
  intent: ThreadAction.DeleteMessage,
257
250
  resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
258
- const thread = Relation.getSource(anchor) as ThreadType;
251
+ const thread = Relation.getSource(anchor) as Thread.Thread;
259
252
  const space = getSpace(subject);
260
253
  invariant(space, 'Space not found');
261
254
 
@@ -277,7 +270,7 @@ export default (context: PluginContext) =>
277
270
 
278
271
  return {
279
272
  undoable: {
280
- message: ['message deleted label', { ns: THREAD_PLUGIN }],
273
+ message: ['message deleted label', { ns: meta.id }],
281
274
  data: { message, messageIndex },
282
275
  },
283
276
  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) => {