@dxos/plugin-thread 0.8.4-main.2e9d522 → 0.8.4-main.548089c

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