@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,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type ComponentType, type FC, useLayoutEffect, useState, useEffect, useMemo, useCallback } from 'react';
5
+ import React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
6
6
  import { useResizeDetector } from 'react-resize-detector';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
@@ -136,13 +136,13 @@ export const ResponsiveGrid = <T extends object = any>({
136
136
  );
137
137
 
138
138
  return (
139
- <div ref={containerRef} className={mx('relative w-full h-full', classNames)}>
139
+ <div ref={containerRef} className={mx('relative is-full bs-full', classNames)}>
140
140
  {/* Placeholder elements to calculate layout. */}
141
141
  <div className='absolute inset-0 flex flex-col grow gap-2'>
142
142
  {/* Pinned item. */}
143
143
  {pinnedItem && (
144
144
  <div
145
- className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'h-full')}
145
+ className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'bs-full')}
146
146
  style={hideGallery ? {} : { height: dividerHeight }}
147
147
  >
148
148
  <SoloItem id={getId(pinnedItem)} debug={debug} />
@@ -157,7 +157,7 @@ export const ResponsiveGrid = <T extends object = any>({
157
157
  style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}
158
158
  >
159
159
  {mainItems.length === 1 && (
160
- <div style={{ width: cellWidth }} className='flex h-full'>
160
+ <div style={{ width: cellWidth }} className='flex bs-full'>
161
161
  <SoloItem id={getId(mainItems[0])} debug={debug} />
162
162
  </div>
163
163
  )}
@@ -176,7 +176,7 @@ export const ResponsiveGrid = <T extends object = any>({
176
176
  key={getId(item)}
177
177
  {...{ 'data-grid-item': getId(item) }}
178
178
  className={mx(
179
- 'aspect-video max-h-full max-w-full w-auto h-auto',
179
+ 'aspect-video max-bs-full max-is-full w-auto h-auto',
180
180
  debug && 'border border-primary-500',
181
181
  )}
182
182
  />
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useEffect, useState, type CSSProperties, type PropsWithChildren } from 'react';
5
+ import React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';
6
6
 
7
- import { Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';
7
+ import { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
8
  import { Waveform } from '@dxos/react-ui-sfx';
9
9
  import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
10
10
 
@@ -76,7 +76,7 @@ export const ResponsiveGridItem = <T extends object = any>({
76
76
  return (
77
77
  <div
78
78
  className={mx(
79
- 'relative w-full h-full group',
79
+ 'relative is-full bs-full group',
80
80
  'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',
81
81
  speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',
82
82
  classNames,
@@ -106,7 +106,10 @@ export const ResponsiveGridItem = <T extends object = any>({
106
106
  {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}
107
107
  {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}
108
108
  <div
109
- className={mx('bg-neutral-800 text-neutral-100 py-0.5 truncate rounded', pinned ? 'px-2' : 'px-1 text-xs')}
109
+ className={mx(
110
+ 'bg-neutral-800 text-neutral-100 plb-0.5 truncate rounded',
111
+ pinned ? 'pli-2' : 'pli-1 text-xs',
112
+ )}
110
113
  >
111
114
  {name}
112
115
  </div>
@@ -4,34 +4,28 @@
4
4
 
5
5
  import React, { useCallback, useMemo } from 'react';
6
6
 
7
- import {
8
- Capabilities,
9
- LayoutAction,
10
- createIntent,
11
- useCapability,
12
- useCapabilities,
13
- useIntentDispatcher,
14
- } from '@dxos/app-framework';
7
+ import { Capabilities, CollaborationActions, LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework/react';
15
9
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
16
- import { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
10
+ import { Ref, getSpace, useQuery } from '@dxos/react-client/echo';
17
11
  import { useIdentity } from '@dxos/react-client/halo';
18
- import { useThemeContext, useTranslation } from '@dxos/react-ui';
12
+ import { useTranslation } from '@dxos/react-ui';
19
13
  import { useAttended } from '@dxos/react-ui-attention';
20
14
  import { StackItem } from '@dxos/react-ui-stack';
21
15
  import { Tabs } from '@dxos/react-ui-tabs';
22
- import { AnchoredTo } from '@dxos/schema';
16
+ import { mx } from '@dxos/react-ui-theme';
17
+ import { AnchoredTo } from '@dxos/types';
23
18
 
24
19
  import { ThreadCapabilities } from '../capabilities';
25
- import { CommentsContainer } from '../components';
20
+ import { CommentsContainer, type CommentsContainerProps } from '../components';
26
21
  import { meta } from '../meta';
27
- import { ThreadAction, ThreadType } from '../types';
22
+ import { Thread, ThreadAction } from '../types';
28
23
 
29
24
  export const ThreadComplementary = ({ subject }: { subject: any }) => {
30
25
  const { t } = useTranslation(meta.id);
31
26
  const { dispatchPromise: dispatch } = useIntentDispatcher();
32
27
  const identity = useIdentity();
33
- const { tx } = useThemeContext();
34
- const subjectId = fullyQualifiedId(subject);
28
+ const subjectId = Obj.getDXN(subject).toString();
35
29
 
36
30
  const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);
37
31
  const drafts = state.drafts[subjectId];
@@ -51,18 +45,18 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
51
45
  );
52
46
 
53
47
  const space = getSpace(subject);
54
- const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
48
+ const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo.AnchoredTo));
55
49
  const anchors = objectsAnchoredTo
56
50
  .toSorted((a, b) => sort?.(a, b) ?? 0)
57
- .filter((anchor) => Obj.instanceOf(ThreadType, Relation.getSource(anchor)))
51
+ .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))
58
52
  .concat(drafts ?? []);
59
53
 
60
54
  const attended = useAttended();
61
55
 
62
56
  const handleAttend = useCallback(
63
- (anchor: AnchoredTo) => {
64
- const thread = Relation.getSource(anchor) as ThreadType;
65
- const threadId = fullyQualifiedId(thread);
57
+ (anchor: AnchoredTo.AnchoredTo) => {
58
+ const thread = Relation.getSource(anchor) as Thread.Thread;
59
+ const threadId = Obj.getDXN(thread).toString();
66
60
 
67
61
  if (state.current !== threadId) {
68
62
  state.current = threadId;
@@ -73,7 +67,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
73
67
  void dispatch(
74
68
  createIntent(LayoutAction.ScrollIntoView, {
75
69
  part: 'current',
76
- subject: fullyQualifiedId(subject),
70
+ subject: Obj.getDXN(subject).toString(),
77
71
  options: {
78
72
  cursor: anchor.anchor,
79
73
  ref: threadId,
@@ -86,31 +80,68 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
86
80
  );
87
81
 
88
82
  const handleComment = useCallback(
89
- async (anchor: AnchoredTo, text: string) => {
83
+ async (anchor: AnchoredTo.AnchoredTo, text: string) => {
90
84
  await dispatch(
91
- createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),
85
+ createIntent(ThreadAction.AddMessage, {
86
+ anchor,
87
+ subject,
88
+ sender: { identityDid: identity?.did },
89
+ text,
90
+ }),
92
91
  );
93
92
 
94
- const thread = Relation.getSource(anchor) as ThreadType;
95
- state.current = fullyQualifiedId(thread);
93
+ const thread = Relation.getSource(anchor) as Thread.Thread;
94
+ state.current = Obj.getDXN(thread).toString();
96
95
  },
97
96
  [dispatch, identity, subject],
98
97
  );
99
98
 
100
99
  const handleResolve = useCallback(
101
- (anchor: AnchoredTo) =>
102
- dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as ThreadType })),
100
+ (anchor: AnchoredTo.AnchoredTo) =>
101
+ dispatch(
102
+ createIntent(ThreadAction.ToggleResolved, {
103
+ thread: Relation.getSource(anchor) as Thread.Thread,
104
+ }),
105
+ ),
103
106
  [dispatch],
104
107
  );
105
108
 
106
109
  const handleThreadDelete = useCallback(
107
- (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),
110
+ (anchor: AnchoredTo.AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),
108
111
  [dispatch, subject],
109
112
  );
110
113
 
111
114
  const handleMessageDelete = useCallback(
112
- (anchor: AnchoredTo, messageId: string) =>
113
- dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),
115
+ (anchor: AnchoredTo.AnchoredTo, messageId: string) =>
116
+ dispatch(
117
+ createIntent(ThreadAction.DeleteMessage, {
118
+ anchor,
119
+ subject,
120
+ messageId,
121
+ }),
122
+ ),
123
+ [dispatch, subject],
124
+ );
125
+
126
+ const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
127
+ async (anchor, messageId) => {
128
+ const thread = Relation.getSource(anchor) as Thread.Thread;
129
+ const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
130
+ const message = thread.messages[messageIndex]?.target;
131
+ const proposal = message?.blocks.find((block) => block._tag === 'proposal');
132
+ if (!proposal || !anchor.anchor) {
133
+ return;
134
+ }
135
+
136
+ await dispatch(
137
+ createIntent(CollaborationActions.AcceptProposal, {
138
+ subject,
139
+ anchor: anchor.anchor,
140
+ proposal,
141
+ }),
142
+ );
143
+ await dispatch(createIntent(ThreadAction.ToggleResolved, { thread }));
144
+ },
114
145
  [dispatch, subject],
115
146
  );
116
147
 
@@ -124,6 +155,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
124
155
  onResolve={handleResolve}
125
156
  onMessageDelete={handleMessageDelete}
126
157
  onThreadDelete={handleThreadDelete}
158
+ onAcceptProposal={handleAcceptProposal}
127
159
  />
128
160
  );
129
161
 
@@ -132,10 +164,13 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
132
164
  <Tabs.Root
133
165
  value={showResolvedThreads ? 'all' : 'unresolved'}
134
166
  orientation='horizontal'
135
- classNames='contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
167
+ classNames={[
168
+ 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
169
+ ]}
136
170
  onValueChange={onChangeViewState}
137
171
  >
138
- <Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>
172
+ {/* TODO(burdon): Standardize (like Tollbar). */}
173
+ <Tabs.Tablist classNames={mx('bg-toolbarSurface border-b border-subduedSeparator')}>
139
174
  <Tabs.Tab value='unresolved' classNames='text-sm'>
140
175
  {t('show unresolved label')}
141
176
  </Tabs.Tab>
@@ -143,8 +178,10 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
143
178
  {t('show all label')}
144
179
  </Tabs.Tab>
145
180
  </Tabs.Tablist>
146
- <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
147
- <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
181
+ <div className='overflow-y-auto'>
182
+ <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
183
+ <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
184
+ </div>
148
185
  </Tabs.Root>
149
186
  </StackItem.Content>
150
187
  );
@@ -4,14 +4,13 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- // import { useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormContainer } from '@dxos/react-ui-form';
7
+ import { useTranslation } from '@dxos/react-ui';
8
+ import { ControlPage } from '@dxos/react-ui-form';
9
9
 
10
- // import { meta } from '../meta';
10
+ import { meta } from '../meta';
11
11
  import type { ThreadSettingsProps } from '../types';
12
12
 
13
- export const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {
14
- // const { t } = useTranslation(meta.id);
15
-
16
- return <DeprecatedFormContainer></DeprecatedFormContainer>;
13
+ export const ThreadSettings = ({ settings: _settings }: { settings: ThreadSettingsProps }) => {
14
+ const { t: _t } = useTranslation(meta.id);
15
+ return <ControlPage></ControlPage>;
17
16
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';
5
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';
6
6
  import { type Extension } from '@codemirror/state';
7
7
 
8
8
  import { tags } from '@dxos/react-ui-editor';
@@ -27,7 +27,10 @@ const parser = StreamLanguage.define<{ count: number }>({
27
27
  });
28
28
 
29
29
  const styles = HighlightStyle.define([
30
- { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },
30
+ {
31
+ tag: tags.tagName,
32
+ class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),
33
+ },
31
34
  ]);
32
35
 
33
36
  export const command: Extension = [parser, syntaxHighlighting(styles)];
@@ -6,16 +6,17 @@ import { Obj, Ref } from '@dxos/echo';
6
6
  import { IdentityDid } from '@dxos/keys';
7
7
  import { faker } from '@dxos/random';
8
8
  import { type Identity } from '@dxos/react-client/halo';
9
- import { DataType } from '@dxos/schema';
9
+ import { Message } from '@dxos/types';
10
10
 
11
- import { ThreadType } from '../types';
11
+ import { Thread } from '../types';
12
12
 
13
- export const createCommentThread = (identity: Identity): ThreadType => {
14
- return Obj.make(ThreadType, {
13
+ export const createCommentThread = (identity: Identity): Thread.Thread => {
14
+ return Thread.make({
15
+ name: 'Comment',
15
16
  messages: faker.helpers.multiple(
16
17
  () =>
17
18
  Ref.make(
18
- Obj.make(DataType.Message, {
19
+ Obj.make(Message.Message, {
19
20
  created: new Date().toISOString(),
20
21
  sender: {
21
22
  identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
@@ -25,5 +26,26 @@ export const createCommentThread = (identity: Identity): ThreadType => {
25
26
  ),
26
27
  { count: { min: 2, max: 3 } },
27
28
  ),
29
+ status: 'active',
30
+ });
31
+ };
32
+
33
+ export const createProposalThread = (identity: Identity): Thread.Thread => {
34
+ return Thread.make({
35
+ name: 'Proposal',
36
+ messages: faker.helpers.multiple(
37
+ () =>
38
+ Ref.make(
39
+ Obj.make(Message.Message, {
40
+ created: new Date().toISOString(),
41
+ sender: {
42
+ identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
43
+ },
44
+ blocks: [{ _tag: 'proposal', text: faker.lorem.sentences(3) }],
45
+ }),
46
+ ),
47
+ { count: { min: 1, max: 1 } },
48
+ ),
49
+ status: 'active',
28
50
  });
29
51
  };
@@ -6,17 +6,17 @@ import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
  import { computed, effect } from '@preact/signals-core';
8
8
 
9
- import { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
9
+ import { type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
10
10
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
- import { type DocumentType } from '@dxos/plugin-markdown/types';
12
- import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
11
+ import { type Markdown } from '@dxos/plugin-markdown/types';
12
+ import { createDocAccessor, getSource, getSpace, getTextInRange } from '@dxos/react-client/echo';
13
13
  import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
14
- import { AnchoredTo } from '@dxos/schema';
14
+ import { AnchoredTo } from '@dxos/types';
15
15
 
16
- import { ThreadAction, ThreadType, type ThreadState } from '../types';
16
+ import { Thread, ThreadAction, type ThreadState } from '../types';
17
17
 
18
18
  // TODO(burdon): Factor out.
19
- const getName = (doc: DocumentType, anchor: string): string | undefined => {
19
+ const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
20
20
  if (doc.content) {
21
21
  const [start, end] = anchor.split(':');
22
22
  return getTextInRange(createDocAccessor(doc.content.target!, ['content']), start, end);
@@ -26,7 +26,7 @@ const getName = (doc: DocumentType, anchor: string): string | undefined => {
26
26
  /**
27
27
  * Construct plugins.
28
28
  */
29
- export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: PromiseIntentDispatcher): Extension => {
29
+ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?: PromiseIntentDispatcher): Extension => {
30
30
  const space = doc && getSpace(doc);
31
31
  if (!doc || !space || !dispatch) {
32
32
  // Include no-op comments extension here to ensure that the facets are always present when they are expected.
@@ -34,16 +34,16 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
34
34
  return [comments()];
35
35
  }
36
36
 
37
- const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo));
37
+ const query = space.db.query(Query.select(Filter.ids(doc.id)).targetOf(AnchoredTo.AnchoredTo));
38
38
  const unsubscribe = query.subscribe();
39
39
 
40
40
  const anchors = computed(() =>
41
41
  query.objects
42
42
  .filter((anchor) => {
43
43
  const thread = Relation.getSource(anchor);
44
- return Obj.instanceOf(ThreadType, thread) && thread.status !== 'resolved';
44
+ return Obj.instanceOf(Thread.Thread, thread) && thread.status !== 'resolved';
45
45
  })
46
- .concat(state.drafts[fullyQualifiedId(doc)] ?? []),
46
+ .concat(state.drafts[Obj.getDXN(doc).toString()] ?? []),
47
47
  );
48
48
 
49
49
  return [
@@ -60,7 +60,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
60
60
  // Only update if the name has changed, otherwise this will cause an infinite loop.
61
61
  // Skip if the name is empty; this means comment text was deleted, but thread name should remain.
62
62
  const name = getName(doc, anchor.anchor);
63
- const thread = Relation.getSource(anchor) as ThreadType;
63
+ const thread = Relation.getSource(anchor) as Thread.Thread;
64
64
  if (name && name !== thread.name) {
65
65
  thread.name = name;
66
66
  }
@@ -70,24 +70,33 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
70
70
  }),
71
71
 
72
72
  createExternalCommentSync(
73
- fullyQualifiedId(doc),
73
+ Obj.getDXN(doc).toString(),
74
74
  (sink) => effect(() => sink()),
75
75
  () =>
76
76
  anchors.value
77
77
  .filter((anchor) => anchor.anchor)
78
- .map((anchor) => ({ id: fullyQualifiedId(Relation.getSource(anchor)), cursor: anchor.anchor })),
78
+ .map((anchor) => ({
79
+ id: Obj.getDXN(Relation.getSource(anchor)).toString(),
80
+ cursor: anchor.anchor,
81
+ })),
79
82
  ),
80
83
 
81
84
  comments({
82
- id: fullyQualifiedId(doc),
85
+ id: Obj.getDXN(doc).toString(),
83
86
  onCreate: ({ cursor }) => {
84
87
  const name = getName(doc, cursor);
85
- void dispatch(createIntent(ThreadAction.Create, { anchor: cursor, name, subject: doc }));
88
+ void dispatch(
89
+ createIntent(ThreadAction.Create, {
90
+ anchor: cursor,
91
+ name,
92
+ subject: doc,
93
+ }),
94
+ );
86
95
  },
87
96
  onDelete: ({ id }) => {
88
- const draft = state.drafts[fullyQualifiedId(doc)];
97
+ const draft = state.drafts[Obj.getDXN(doc).toString()];
89
98
  if (draft) {
90
- const index = draft.findIndex((thread) => fullyQualifiedId(thread) === id);
99
+ const index = draft.findIndex((thread) => Obj.getDXN(thread).toString() === id);
91
100
  if (index !== -1) {
92
101
  draft.splice(index, 1);
93
102
  }
@@ -99,9 +108,9 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
99
108
  }
100
109
  },
101
110
  onUpdate: ({ id, cursor }) => {
102
- const draft = state.drafts[fullyQualifiedId(doc)]?.find((thread) => fullyQualifiedId(thread) === id);
111
+ const draft = state.drafts[Obj.getDXN(doc).toString()]?.find((thread) => Obj.getDXN(thread).toString() === id);
103
112
  if (draft) {
104
- const thread = Relation.getSource(draft) as ThreadType;
113
+ const thread = Relation.getSource(draft) as Thread.Thread;
105
114
  thread.name = getName(doc, cursor);
106
115
  draft.anchor = cursor;
107
116
  }
@@ -109,7 +118,7 @@ export const threads = (state: ThreadState, doc?: DocumentType, dispatch?: Promi
109
118
  const relation = query.objects.find((object) => getSource(object).id === id);
110
119
  if (relation) {
111
120
  const thread = getSource(relation);
112
- if (Obj.instanceOf(ThreadType, thread)) {
121
+ if (Obj.instanceOf(Thread.Thread, thread)) {
113
122
  thread.name = getName(doc, cursor);
114
123
  relation.anchor = cursor;
115
124
  }
@@ -0,0 +1,58 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Array from 'effect/Array';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Function from 'effect/Function';
8
+ import * as Schema from 'effect/Schema';
9
+
10
+ import { ArtifactId, computeDiffsWithCursors } from '@dxos/assistant';
11
+ import { Obj, Ref, Relation } from '@dxos/echo';
12
+ import { createDocAccessor } from '@dxos/echo-db';
13
+ import { DatabaseService, defineFunction } from '@dxos/functions';
14
+ import { DXN } from '@dxos/keys';
15
+ import { Markdown } from '@dxos/plugin-markdown/types';
16
+ import { AnchoredTo, Message } from '@dxos/types';
17
+
18
+ import { Thread } from '../types';
19
+
20
+ export default defineFunction({
21
+ key: 'dxos.org/function/thread/create-proposals',
22
+ name: 'Create Proposals',
23
+ description: 'Proposes a set of changes to a document.',
24
+ inputSchema: Schema.Struct({
25
+ id: ArtifactId,
26
+ diffs: Schema.Array(Schema.String).annotations({
27
+ description: 'The diffs to propose for the document.',
28
+ }),
29
+ }),
30
+ outputSchema: Schema.Void,
31
+ handler: Effect.fn(function* ({ data: { id, diffs: _diffs } }) {
32
+ const object = yield* DatabaseService.resolve(DXN.parse(id), Markdown.Document);
33
+ const content = yield* Effect.promise(() => object.content.load());
34
+ const accessor = createDocAccessor(content, ['content']);
35
+
36
+ yield* Function.pipe(
37
+ computeDiffsWithCursors(accessor, _diffs),
38
+ Array.map(
39
+ Effect.fnUntraced(function* ({ cursor, text }) {
40
+ const proposal = Obj.make(Message.Message, {
41
+ created: new Date().toISOString(),
42
+ sender: { role: 'assistant' },
43
+ blocks: [{ _tag: 'proposal', text }],
44
+ });
45
+ const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
46
+ const relation = Relation.make(AnchoredTo.AnchoredTo, {
47
+ [Relation.Source]: thread,
48
+ [Relation.Target]: object,
49
+ anchor: cursor,
50
+ });
51
+ yield* DatabaseService.add(thread);
52
+ yield* DatabaseService.add(relation);
53
+ }),
54
+ ),
55
+ Effect.allWith({ concurrency: 'unbounded' }),
56
+ );
57
+ }),
58
+ });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { default as createProposals } from './create-proposals';
@@ -4,18 +4,15 @@
4
4
 
5
5
  import { useCallback } from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { type Live } from '@dxos/live-object';
9
10
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
10
11
  import { getSpace } from '@dxos/react-client/echo';
11
12
  import { useOnTransition } from '@dxos/react-ui';
12
- import { type DataType } from '@dxos/schema';
13
+ import { type ContentBlock } from '@dxos/types';
13
14
 
14
- export const useOnEditAnalytics = (
15
- message: Live<any>,
16
- textBlock: DataType.MessageBlock.Text | undefined,
17
- editing: boolean,
18
- ) => {
15
+ export const useOnEditAnalytics = (message: Live<any>, textBlock: ContentBlock.Text | undefined, editing: boolean) => {
19
16
  const { dispatchPromise: dispatch } = useIntentDispatcher();
20
17
 
21
18
  const onEdit = useCallback(() => {
@@ -3,7 +3,9 @@
3
3
  //
4
4
 
5
5
  export * from './analytics';
6
+
7
+ export * from './useBlackCanvasStreamTrack';
6
8
  export * from './useDebugMode';
9
+ export * from './useInaudibleAudioStreamTrack';
7
10
  export * from './useStatus';
8
11
  export * from './useVideoStreamTrack';
9
- export * from './useInaudibleAudioStreamTrack';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import { scheduleTask } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
9
+
10
+ import { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';
11
+
12
+ export const useBlackCanvasStreamTrack = () => {
13
+ const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
14
+ useEffect(() => {
15
+ const ctx = new Context();
16
+ scheduleTask(ctx, async () => {
17
+ const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });
18
+ setBlackCanvasStreamTrack(blackCanvasStreamTrack);
19
+ });
20
+
21
+ return () => {
22
+ void ctx.dispose();
23
+ };
24
+ }, []);
25
+
26
+ return blackCanvasStreamTrack;
27
+ };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useState, useEffect } from 'react';
5
+ import { useEffect, useState } from 'react';
6
6
 
7
7
  // TODO(burdon): Standardize across plugins/composer.
8
8
  export const useDebugMode = () => {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { type RefObject, useEffect, useRef, useState } from 'react';
6
6
 
7
- export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement>, videoSrc: string) => {
7
+ export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement | null>, videoSrc: string) => {
8
8
  // Get video stream track.
9
9
  const [videoStreamTrack, setVideoStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
10
10
  const hadRun = useRef(false);
@@ -15,13 +15,16 @@ export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement>, v
15
15
  }
16
16
  hadRun.current = true;
17
17
  videoElement.current.addEventListener('playing', () => {
18
+ if (videoStreamTrack) {
19
+ return;
20
+ }
18
21
  const stream = (videoElement.current as any).captureStream();
19
22
  const track = stream.getTracks()[0];
20
- if (track) {
23
+ if (track && !videoStreamTrack) {
21
24
  setVideoStreamTrack(track);
22
25
  }
23
26
  stream.onaddtrack = (event: MediaStreamTrackEvent) => {
24
- if (event.track.kind === 'video') {
27
+ if (event.track.kind === 'video' && !videoStreamTrack) {
25
28
  setVideoStreamTrack(event.track);
26
29
  }
27
30
  };