@dxos/plugin-thread 0.8.4-main.67995b8 → 0.8.4-main.72ec0f3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/lib/browser/ChannelContainer-MX5ABVGC.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-7F5Y6GXJ.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-HNYLII5E.mjs} +32 -33
  4. package/dist/lib/browser/app-graph-builder-HNYLII5E.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs +104 -0
  6. package/dist/lib/browser/blueprint-definition-6BKYTMJS.mjs.map +7 -0
  7. package/dist/lib/browser/{call-manager-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-BBTXGRIR.mjs +18 -0
  10. package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BQWQFTWT.mjs +612 -0
  12. package/dist/lib/browser/chunk-BQWQFTWT.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  14. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FR6MEAZI.mjs +377 -0
  16. package/dist/lib/browser/chunk-FR6MEAZI.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-INQVAYPN.mjs} +251 -246
  18. package/dist/lib/browser/chunk-INQVAYPN.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
  20. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
  22. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-KOBXMDCI.mjs} +74 -41
  24. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-NMJEVD36.mjs +168 -0
  26. package/dist/lib/browser/chunk-NMJEVD36.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-OOUDK7Q7.mjs +23 -0
  28. package/dist/lib/browser/chunk-OOUDK7Q7.mjs.map +7 -0
  29. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ZCW3NSDZ.mjs} +310 -186
  30. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +48 -38
  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-M3FMR7OD.mjs → markdown-74EUSQGV.mjs} +24 -22
  36. package/dist/lib/browser/markdown-74EUSQGV.mjs.map +7 -0
  37. package/dist/lib/browser/meta.json +1 -1
  38. package/dist/lib/browser/react-root-BVG7B2LW.mjs +28 -0
  39. package/dist/lib/browser/react-root-BVG7B2LW.mjs.map +7 -0
  40. package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-BCD5ODQ6.mjs} +37 -36
  41. package/dist/lib/browser/react-surface-BCD5ODQ6.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-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-2JJJ3IDK.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-SOCKP4ST.mjs} +32 -33
  50. package/dist/lib/node-esm/app-graph-builder-SOCKP4ST.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs +105 -0
  52. package/dist/lib/node-esm/blueprint-definition-6LEAWSC7.mjs.map +7 -0
  53. package/dist/lib/node-esm/{call-manager-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-5DLH4MWN.mjs +25 -0
  56. package/dist/lib/node-esm/chunk-5DLH4MWN.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-7KZWZS2U.mjs} +310 -186
  58. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-JF7THR7F.mjs} +251 -246
  62. package/dist/lib/node-esm/chunk-JF7THR7F.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-JJW6YMLC.mjs +613 -0
  64. package/dist/lib/node-esm/chunk-JJW6YMLC.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-PZH2EDU5.mjs} +74 -41
  66. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-TJKM5JZT.mjs +169 -0
  68. package/dist/lib/node-esm/chunk-TJKM5JZT.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-TWKGDFCS.mjs +378 -0
  70. package/dist/lib/node-esm/chunk-TWKGDFCS.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
  72. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
  74. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
  76. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
  77. package/dist/lib/node-esm/index.mjs +48 -38
  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-INKTE4MH.mjs → markdown-566XXB55.mjs} +24 -22
  82. package/dist/lib/node-esm/markdown-566XXB55.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/react-root-DCY6DKLC.mjs +29 -0
  85. package/dist/lib/node-esm/react-root-DCY6DKLC.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-WZH7OAO3.mjs} +37 -36
  87. package/dist/lib/node-esm/react-surface-WZH7OAO3.mjs.map +7 -0
  88. package/dist/lib/node-esm/{settings-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/ThreadCompanion.d.ts +5 -0
  161. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  162. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  163. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  164. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  165. package/dist/types/src/components/index.d.ts +3 -3
  166. package/dist/types/src/components/index.d.ts.map +1 -1
  167. package/dist/types/src/components/testing.d.ts +3 -2
  168. package/dist/types/src/components/testing.d.ts.map +1 -1
  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 +75 -7
  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 +69 -63
  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 +47 -33
  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 +28 -26
  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 +112 -55
  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 +6 -6
  236. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +7 -4
  237. package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +72 -35
  238. package/src/components/ThreadSettings.tsx +6 -7
  239. package/src/components/command-extension.ts +5 -2
  240. package/src/components/index.ts +4 -4
  241. package/src/components/testing.ts +27 -5
  242. package/src/extensions/threads.ts +26 -17
  243. package/src/functions/create-proposals.ts +58 -0
  244. package/src/functions/index.ts +5 -0
  245. package/src/hooks/analytics.ts +4 -7
  246. package/src/hooks/index.ts +3 -1
  247. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  248. package/src/hooks/useDebugMode.ts +1 -1
  249. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  250. package/src/meta.ts +9 -5
  251. package/src/testing/stories.ts +5 -8
  252. package/src/translations.ts +7 -4
  253. package/src/types/Channel.ts +27 -0
  254. package/src/types/Thread.ts +26 -0
  255. package/src/types/index.ts +2 -1
  256. package/src/types/types.ts +29 -28
  257. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  258. package/src/typings.d.ts +8 -0
  259. package/src/util.ts +1 -1
  260. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  261. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  262. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  263. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  265. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  267. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  269. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  271. package/dist/lib/browser/chunk-FR7KJPNY.mjs.map +0 -7
  272. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  273. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  275. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  277. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  279. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  281. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  282. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  283. package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
  284. package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
  285. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  286. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  287. package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
  288. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  289. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  291. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  292. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs.map +0 -7
  293. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  294. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  295. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  297. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  298. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  299. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  300. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  302. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  304. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  306. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  307. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  308. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  309. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
  310. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
  311. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  312. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  313. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  314. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  315. package/dist/types/src/types/schema.d.ts +0 -162
  316. package/dist/types/src/types/schema.d.ts.map +0 -1
  317. package/src/types/schema.ts +0 -33
  318. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-MX5ABVGC.mjs.map} +0 -0
  319. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-7F5Y6GXJ.mjs.map} +0 -0
  320. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-2JJJ3IDK.mjs.map} +0 -0
  321. /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';
@@ -18,7 +18,7 @@ const MIN_GALLERY_HEIGHT = 250;
18
18
 
19
19
  const DEFAULT_GAP = 8;
20
20
 
21
- const maxImageSize = 'w-[2560px] h-[1440px]';
21
+ const maxImageSize = 'is-[2560px] bs-[1440px]';
22
22
 
23
23
  /**
24
24
  * Props for the ResponsiveGrid component.
@@ -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 is-auto bs-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
- export const ThreadComplementary = ({ subject }: { subject: any }) => {
24
+ export const ThreadCompanion = ({ 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-be 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)];
@@ -4,9 +4,6 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
- export const ChannelContainer = lazy(() => import('./ChannelContainer'));
8
- export const ChatContainer = lazy(() => import('./ChatContainer'));
9
-
10
7
  // TODO(wittjosiah): Suspense boundary for sidebar?
11
8
  export * from './Call';
12
9
  export * from './CallDebugPanel';
@@ -14,5 +11,8 @@ export * from './CallSidebar';
14
11
  export * from './CommentsContainer';
15
12
  export * from './CommentsThreadContainer';
16
13
  export * from './MessageContainer';
17
- export * from './ThreadComplementary';
14
+ export * from './ThreadCompanion';
18
15
  export * from './ThreadSettings';
16
+
17
+ export const ChannelContainer = lazy(() => import('./ChannelContainer'));
18
+ export const ChatContainer = lazy(() => import('./ChatContainer'));
@@ -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,14 +6,14 @@ 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
11
  import { type Markdown } from '@dxos/plugin-markdown/types';
12
- import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
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
19
  const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
@@ -34,16 +34,16 @@ export const threads = (state: ThreadState, doc?: Markdown.Document, dispatch?:
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?: Markdown.Document, dispatch?:
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?: Markdown.Document, dispatch?:
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?: Markdown.Document, dispatch?:
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?: Markdown.Document, dispatch?:
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 = () => {